select (select max(ts) from vmreports.compute) as ts_compute ,(select max(ts) from vmreports.host) as ts_host with usage as ( select c."Cluster" as cluster ,count(c."UUID_VM") as vms ,sum(c."VM_vCPU_count") as vm_cores ,sum(c."VM_vCPU_count"*c."VM_is_ON") as vm_cores_on ,sum(c."VM_vCPU_count"*c."VDC_CPU_Speed") as vm_ghz ,sum(c."VM_vCPU_count"*c."VDC_CPU_Speed"*c."VM_is_ON") as vm_ghz_on ,sum(c."VM_CPU_Reserv_GHz") as vm_ghz_reserved ,sum(c."VM_vCPU_count"*c."VDC_CPU_Speed"*c."VM_CPU_Reserv_perc"/100) as vm_ghz_reserved_c ,sum(c."VM_vCPU_count"*c."VDC_CPU_Speed"*(case when c."VM_CPU_Reserv_perc" IS null then 20 when c."VM_CPU_Reserv_perc"<=20 then 20 else c."VM_CPU_Reserv_perc" end)/100) as vm_ghz_promised -- promised - зарезервированные ГГц, если включить минимальное согласованное резервирование ,sum(c."VM_RAM_Allocated"*c."VM_is_ON") as vm_ram_alloc_on ,sum(c."VM_RAM_Allocated") as vm_ram_alloc ,sum(c."VM_RAM_Used") as vm_ram_used ,sum(c."VM_CPU_Used_AVG") as vm_ghz_usage ,sum(c."VM_is_ON") as vms_on ,sum(s."Disk_Allocated") as disk_allocated ,sum(s."Disk_Used") as disk_used from vmreports.compute c left outer join vmreports.storage s on(c."UUID_VM"=s."VM_UUID") where c.ts=(select max(ts) from vmreports.compute) AND s.ts=(select max(ts) from vmreports.storage) group by c."Cluster"), cluster_stat as ( SELECT h."Cluster" as cluster ,h."Cluster_v2" as cluster_v2 ,m.models ,COUNT(*) as hosts_total ,COUNT(*)-1 as hosts_ha /*не вполне корректно, хосты разного размера, отказ по-разному влияет*/ ,sum(CASE WHEN "Maintenance"='inMaintenance' THEN 1 ELSE 0 END) as hosts_in_maintenance ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN 1 ELSE 0 END) as hosts_in_service ,sum("CPU_Cores") as cores ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPU_Cores" ELSE 0 END) as cores_in_service ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPU_Cores"*"CPU_Speed" ELSE 0 END) as ghz_in_service ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPUtoVM" ELSE 0 END) as ghz_provisioned ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "RAMtoVM" ELSE 0 END) as gb_provisioned --,sum("CPU_Used_AVG") as host_ghz_usage --,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPU_Used_AVG" ELSE 0 END) as host_ghz_usage ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPU_Used" ELSE 0 END) as host_ghz_usage ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "RAM_Total" ELSE 0 END) as ram_in_service ,avg(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPU_Speed" ELSE 0 END) as ghz ,max("CPUtoVM") as ghz_subtract_ha ,max("RAMtoVM") as gb_subtract_ha ,sum("RAM_Total")/sum("CPU_Cores") as gb_per_core ,CASE WHEN sum("CPU_Cores"*"CPU_Speed") > 0 THEN sum("CPU_Used_AVG")/sum("CPU_Cores"*"CPU_Speed")*100 ELSE NULL END as cpu_usage_perc FROM vmreports.host h LEFT OUTER JOIN ( SELECT hi."Cluster", STRING_AGG(DISTINCT hi."Model" || ' [' || (hi.cnt::text) || '] ',', ') as models FROM ( SELECT hii."Cluster", hii."Model", count(hii."Model") as cnt FROM vmreports.host hii WHERE hii.ts=(SELECT max(ts) FROM vmreports.host) GROUP BY hii."Cluster", hii."Model" ) hi GROUP BY hi."Cluster" ) m ON (h."Cluster"=m."Cluster") WHERE ts=(SELECT max(ts) FROM vmreports.host) GROUP BY h."Cluster", h."Cluster_v2", m.models ORDER BY h."Cluster" ), cluster_naming (cluster,commercial_name) AS (VALUES ('cl01-vsan','msk1, Intel Cascade Lake 2,9 ГГц') ,('cl02','msk1, Intel Cascade Lake 3,1 ГГц') ,('cl04-vsan','msk1, AMD Milan 2,8 ГГц') ,('cl05-1c','msk1, AMD Raphael 4,5 ГГц') ,('cl06-vsan','msk1, Intel Ice Lake 2,8 ГГц') ,('cl07-vsan','msk1, AMD Genoa 4,0 ГГц') ), vsan as ( SELECT "ClusterNew" as cluster_v2, "Total" as total, "Usable" as usable, "Used" as used, "EffectiveFree" as effective_free FROM vmreports.vsan_storage WHERE ts=(SELECT max(ts) FROM vmreports.vsan_storage) ) select h.cluster as cluster_v1 h.cluster_v2 n.commercial_name h.models coalesce(h.hosts_total,0) as hosts_total coalesce(h.hosts_ha,0) as hosts_ha coalesce(h.hosts_in_maintenance,0) as hosts_in_maintenance coalesce(h.hosts_in_service,0) as hosts_in_service coalesce(h.cores,0) as cores coalesce(h.cores_in_service,0) as cores_in_service coalesce(h.ghz_in_service,0) as ghz_in_service coalesce(h.host_ghz_usage,0) as host_ghz_usage coalesce(u.vm_ghz_usage,0) as vm_ghz_usage coalesce(h.ghz,0) as ghz coalesce(h.ram_in_service,0) as ram_in_service coalesce(h.cpu_usage_perc,0) as cpu_usage_perc coalesce(h.cores,0) as cores_total coalesce(h.ghz_provisioned - CASE WHEN hosts_in_maintenance > 0 THEN 0 ELSE h.ghz_subtract_ha END,0) as GHz_Provisioned coalesce(h.gb_provisioned - CASE WHEN hosts_in_maintenance > 0 THEN 0 ELSE h.gb_subtract_ha END,0) as GB_Provisioned coalesce(u.vm_ghz_reserved,0) as vm_ghz_reserved coalesce(u.vm_ghz_promised,0) as vm_ghz_promised coalesce(round((u.vm_ghz_promised/h.ghz_provisioned)::numeric,2)*100,0) as GHz_provision_rate coalesce(u.vm_ram_alloc,0) as vm_ram_alloc coalesce(u.vm_ram_alloc_on,0) as vm_ram_alloc_on coalesce(u.vm_ram_used,0) as vm_ram_used coalesce(round((u.vm_ram_alloc/h.gb_provisioned)::numeric,2)*100,0) as GB_alloc_perc coalesce(round((u.vm_ram_used/h.gb_provisioned)::numeric,2)*100,0) as GB_usage_perc coalesce(round((u.vm_cores/h.cores)::numeric,1),0) as oversubscription coalesce(u.vm_cores,0) as vm_cores coalesce(u.vm_cores_on,0) as vm_cores_on coalesce(u.vms,0) as vms coalesce(u.vms_on,0) as vms_on coalesce(u.vm_ghz_usage/h.ghz_in_service*100,0) as vm_cpu_usage_perc coalesce(h.gb_per_core,0) as gb_per_core coalesce(s.total,0) as total coalesce(s.usable,0) as usable coalesce(s.used,0) as used coalesce(s.effective_free,0) as effective_free coalesce(u.disk_allocated,0) as disk_allocated coalesce(u.disk_used,0) as disk_used from cluster_stat h left outer join usage u on (h.cluster=u.cluster) left outer join cluster_naming n on (h.cluster=n.cluster) left outer join vsan s on (h.cluster_v2=s.cluster_v2) where 1=1 order by select sum(hosts_total) as hosts_total ,sum(hosts_ha) as hosts_ha ,sum(hosts_in_maintenance) as hosts_in_maintenance ,sum(host_ghz_usage) as host_ghz_usage ,sum(cores_total) as cores_total ,sum(cores_in_service) as cores_in_service ,sum(ghz_in_service) as ghz_in_service ,sum(ghz_provisioned) as ghz_provisioned ,sum(ram_in_service) as ram_in_service ,sum(gb_provisioned) as gb_provisioned ,sum(cores_in_service) as cores_in_service ,sum(vm_cores) as vm_cores ,sum(vm_cores_on) as vm_cores_on ,sum(vm_ghz_usage) as vm_ghz_usage ,sum(vm_ghz_reserved) as vm_ghz_reserved ,sum(vm_ghz_promised) as vm_ghz_promised ,sum(vm_ram_alloc) as vm_ram_alloc ,sum(vm_ram_used) as vm_ram_used ,sum(vms) as vms ,sum(vms_on) as vms_on ,sum(cores*ghz)/sum(cores) as ghz ,sum(disk_allocated) as disk_allocated ,sum(disk_used) as disk_used from qRead Cloud Capacity

Актуальность данных

VM: #dateFormat(ts_compute,"YYYY-MM-DD")# #timeFormat(ts_compute,"HH:MM")# Хосты: #dateFormat(ts_host,"YYYY-MM-DD")# #timeFormat(ts_host,"HH:MM")#

Свободно

Свободно ВМ размещено
RAM GB by alloc RAM GB by usage CPU GHz (текущий резерв) Ядра 20% (текущий резерв) Ядра 50% (текущий резерв) Ядра 80% (текущий резерв) vSAN GB (alloc)
#cluster_v1# #cluster_v2# #commercial_name# #hosts_total# err" style="font-size:130%"> #safeNumberFormat(gb_provisioned-vm_ram_alloc,"0")# err" style="font-size:130%">#safeNumberFormat(gb_provisioned - vm_ram_used,"0")# err" style="font-size:130%">#safeNumberFormat(ghz_provisioned-vm_ghz_reserved,".0")# err" style="font-size:130%">#safeNumberFormat((ghz_provisioned-vm_ghz_reserved)/ghz/0.2,"0")# err" style="font-size:130%">#safeNumberFormat((ghz_provisioned-vm_ghz_reserved)/ghz/0.5,"0")# err" style="font-size:130%">#safeNumberFormat((ghz_provisioned-vm_ghz_reserved)/ghz/0.8,"0")# #safeNumberFormat(effective_free,"0")# #vms#
Емкость HA вычитается из Capacity, если нет хостов в Maintenance, в противном случае вычитается ресурс хостов в Maintenance. За объем для HA принимается размер наибольшего хоста в кластере по каждому ресурсу (поэтому при выводе в Maintenance маленького хоста расчетная емкость может временно увеличиться, но это только если хосты в кластере разные. Понятнее будет, если мы как резерв будем брать максимальное значение из наибольшего хоста и суммы выведенных в Maintenance хостов)

Использование подробно

ВМ шт. Средняя ВМ
#cluster_v1# #cluster_v2# #commercial_name# #models# #numberFormat(ghz,".0")# #hosts_total# #hosts_ha# #hosts_in_maintenance# #numberFormat(host_ghz_usage,".0")# #numberFormat(vm_ghz_usage,".0")# #numberFormat(cpu_usage_perc,"0")# #numberFormat(vm_cpu_usage_perc,"0")# #oversubscription# #cores_total# #numberFormat(ghz_provisioned,".0")# #numberFormat(vm_ghz_reserved,".0")# #numberFormat(vm_ghz_promised,".0")# #vm_cores# #numberFormat(GHz_provision_rate,"0")# #numberFormat(gb_provisioned,"0")# #numberFormat(vm_ram_alloc,"0")# #numberFormat(vm_ram_used,"0")# #numberFormat(GB_alloc_perc,"0")# #numberFormat(GB_usage_perc,"0")# #vms# #numberFormat(vm_cores/vms,".0")# ?  core #numberFormat(vm_ghz_usage/vms_on,".0")# ?  GHz #numberFormat(vm_ghz_usage/vm_cores_on/ghz*100,"0")# ? % #numberFormat(vm_ram_alloc/vms,".0")# ? (#numberFormat(vm_ram_used/vms_on,".0")#?) GB #numberFormat(disk_allocated/vms,".0")#(#numberFormat(disk_used/vms,".0")#) ?  GB
Итого #numberFormat(ghz,".0")# #hosts_total# #hosts_ha# #hosts_in_maintenance# #numberFormat(host_ghz_usage,".0")# #numberFormat(vm_ghz_usage,".0")# #numberFormat(vm_ghz_usage*100/ghz_in_service,"0")# #numberFormat(vm_cores/cores_in_service,".0")# #numberFormat(cores_total,"0")# #numberFormat(ghz_provisioned,".0")# #numberFormat(vm_ghz_reserved,".0")# #numberFormat(vm_ghz_promised,".0")# #vm_cores# #numberFormat(gb_provisioned,"0")# #numberFormat(vm_ram_alloc,"0")# #numberFormat(vm_ram_used,"0")# #numberFormat(vm_ram_alloc/ram_in_service*100,"0")# #numberFormat(vm_ram_used/ram_in_service*100,"0")# #vms# #numberFormat(vm_cores/vms,".0")# ?  core #numberFormat(vm_ghz_usage/vms_on,".0")# ?  GHz #numberFormat(vm_ghz_usage/vm_cores_on/ghz*100,"0")# ? % #numberFormat(vm_ram_alloc/vms,".0")# ? (#numberFormat(vm_ram_used/vms_on,".0")#?) GB #numberFormat(disk_allocated/vms,".0")#(#numberFormat(disk_used/vms,".0")#) ?  GB
Пока выводим избыточный набор колонок для контроля. Кроме того, еще не выбрали, какие колонки удобнее и релевантнее
* CPU GHz provision rate % - отношение зарезервированной частоты (с учетом 20% резерва по умолчанию) к наличной частоте процессоров
* Для средней ВМ указана аллоцированная память, в скобках - используемая, далее аллоцированное дисковое пространство, в скобках используемое. Диск считается без разделения по политикам (2do). ГГц на ВМ, процент загрузки ядер (** проверить), используемая память - считается по включенным ВМ. Количество ядер, аллоцированная память и диск - по всем ВМ
--->

Техническая утилизация

RAM allloc % RAM allloc ВКЛ % Емкость vSAN GB Свободно vSAN % alloc Свободно vSAN % used
#cluster_v1# #cluster_v2# #commercial_name# #hosts_total# #numberFormat(ghz,".0")# #numberFormat(gb_per_core,".0")# #numberFormat(vms,"0")# #numberFormat(vms_on,"0")# #numberFormat(cpu_usage_perc,"0")# #numberFormat(vm_cpu_usage_perc,"0")# #oversubscription# #cores_total# #numberFormat(ghz_provisioned,".0")# #numberFormat(vm_ghz_reserved,".0")# #numberFormat(vm_ghz_usage,".0")# #vm_cores# #vm_cores_on# #numberFormat(gb_provisioned,"0")# #numberFormat(vm_ram_alloc,"0")# #numberFormat(vm_ram_alloc_on,"0")# #numberFormat(vm_ram_used,"0")# #numberFormat(GB_alloc_perc,"0")# #numberFormat(vm_ram_alloc_on/gb_provisioned*100,"0")# #numberFormat(vm_ram_used/gb_provisioned*100,"0")# #safeNumberFormat(usable,"0")# #numberFormat(effective_free/usable*100,"0")# #numberFormat((usable-used)/usable*100,"0")#