select (select max(ts) from vmreports.compute) as ts_compute ,(select max(ts) from vmreports.host) as ts_host with capacity as ( select "Cluster" as cluster, count(*) as hosts, sum(cores) as cores, round(sum(ghz)::numeric,1) as ghz, round(sum(ram)) as ram from ( select "Cluster", "Host" , avg("Host_CPU_Cores"*"Host_CPU_Sockets") as cores, avg("Host_CPU_Cores"*"Host_CPU_Sockets"*"Host_CPU_Speed") as ghz, avg("Host_RAM"*.85) as ram from vmreports.compute where ts=(select max(ts) from vmreports.compute) group by "Cluster","Host" order by "Cluster","Host" ) host group by "Cluster"), usage as ( select "Cluster" as cluster ,count("UUID_VM") as vms ,sum("VM_vCPU_count") as vm_cores ,(sum("VM_vCPU_count"*"VDC_CPU_Speed")) as vm_ghz ,(sum("VM_CPU_Reserv_GHz")) as vm_ghz_reserved ,(sum("VM_vCPU_count"*"VDC_CPU_Speed"*"VM_CPU_Reserv_perc"/100)) as vm_ghz_reserved_c ,(sum("VM_vCPU_count"*"VDC_CPU_Speed"*(case when "VM_CPU_Reserv_perc" IS null then 20 when "VM_CPU_Reserv_perc"<=20 then 20 else "VM_CPU_Reserv_perc" end)/100)) as vm_ghz_promised -- promised - зарезервированные ГГц, если включить минимальное согласованное резервирование ,(sum("VM_RAM_Allocated")) as vm_ram_alloc ,(sum("VM_RAM_Used")) as vm_ram_used ,sum("VM_CPU_Used_AVG") as vm_ghz_usage from vmreports.compute where ts=(select max(ts) from vmreports.compute) group by "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"*"CPU_Sockets") as cores ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPU_Cores"*"CPU_Sockets" ELSE 0 END) as cores_in_service ,sum(CASE WHEN "Maintenance"='notInMaintenance' THEN "CPU_Cores"*"CPU_Sockets"*"CPU_Speed" ELSE 0 END) as ghz_in_service ,sum("CPU_Used_AVG") 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 ,CASE WHEN sum("CPU_Cores"*"CPU_Sockets"*"CPU_Speed") > 0 THEN sum("CPU_Used_AVG")/sum("CPU_Cores"*"CPU_Sockets"*"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 ГГц') ) select h.cluster as cluster_v1 h.cluster_v2 n.commercial_name h.models h.hosts_total h.hosts_ha h.hosts_in_maintenance h.hosts_in_service h.cores h.cores_in_service h.ghz_in_service h.host_ghz_usage u.vm_ghz_usage h.ghz h.ram_in_service h.cpu_usage_perc c.hosts c.cores as Cores_Capacity c.ghz as GHz_Capacity u.vm_ghz_reserved u.vm_ghz_promised round((u.vm_ghz_promised/c.ghz)::numeric,2)*100 as GHz_provision_rate c.ram as RAM_Capacity u.vm_ram_alloc u.vm_ram_used round((u.vm_ram_alloc/c.ram)::numeric,2)*100 as GB_alloc_perc round((u.vm_ram_used/c.ram)::numeric,2)*100 as GB_usage_perc round((u.vm_cores/c.cores)::numeric,1) as oversubscription u.vm_cores u.vms u.vm_ghz_usage/h.ghz_in_service*100 as vm_cpu_usage_perc from cluster_stat h left outer join usage u on (h.cluster=u.cluster) left outer join capacity c on (h.cluster=c.cluster) left outer join cluster_naming n on (h.cluster=n.cluster) where 1=1 order by select sum(hosts_total) as hosts_total ,sum(hosts_ha) as hosts_ha ,sum(cores_in_service) as cores_in_service ,sum(ghz_in_service) as ghz_in_service ,sum(GHz_Capacity) as GHz_Capacity ,sum(ram_in_service) as ram_in_service ,sum(RAM_Capacity) as RAM_Capacity ,sum(cores_in_service) as cores_in_service ,sum(vm_cores) as vm_cores ,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 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")#
ВМ шт. Средн. ВМ core | GB
#cluster_v1# #cluster_v2# #commercial_name# #models# #numberFormat(ghz,".0")# #hosts_total# #hosts_ha# #hosts_in_maintenance# #hosts_in_service# #cores_in_service# #numberFormat(ghz_in_service,".0")# #numberFormat(host_ghz_usage,".0")# #numberFormat(vm_ghz_usage,".0")# #numberFormat(ram_in_service,"0")# #numberFormat(cpu_usage_perc,"0")# #numberFormat(vm_cpu_usage_perc,"0")# #oversubscription# #hosts# #Cores_Capacity# #numberFormat(GHz_Capacity,".0")# #numberFormat(vm_ghz_reserved,".0")# #numberFormat(vm_ghz_promised,".0")# #vm_cores# #numberFormat(GHz_provision_rate,"0")# #numberFormat(RAM_Capacity,"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")# #numberFormat(vm_ram_alloc/vms,".0")#
Итого #hosts_total# #hosts_ha# #cores_in_service# #numberFormat(ghz_in_service,".0")# #numberFormat(ram_in_service,"0")# #numberFormat(vm_cores/cores_in_service,".0")# #numberFormat(GHz_Capacity,".0")# #numberFormat(vm_ghz_reserved,".0")# #numberFormat(vm_ghz_promised,".0")# #vm_cores# #numberFormat(RAM_Capacity,"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")# #numberFormat(vm_ram_alloc/vms,".0")#
Пока выводим избыточный набор колонок для контроля. Кроме того, еще не выбрали, какие колонки удобнее и релевантнее
* CPU GHz provision rate % - отношение зарезервированной частоты (с учетом 20% резерва по умолчанию) к наличной частоте процессоров
* Расхождения в оценке объема RAM частично связаны с разной оценкой затрат памяти на собственные нужды гипервизора
--->