diff --git a/Application.cfc b/Application.cfc
index 64d957b..bc6b460 100644
--- a/Application.cfc
+++ b/Application.cfc
@@ -86,7 +86,7 @@
-
+
diff --git a/contragent_rpt.cfm b/contragent_rpt.cfm
index b2087db..f9c33f2 100644
--- a/contragent_rpt.cfm
+++ b/contragent_rpt.cfm
@@ -333,7 +333,7 @@ ORDER BY d.siv_uid, p.__id
FROM qCompute
-
Compute факт #dateFormat(qCompute.ts,'YYYY-MM-DD')# #timeFormat(qCompute.ts,'HH:MM:SS')#
+
Compute факт class="err">#dateFormat(qCompute.ts,'YYYY-MM-DD')# #timeFormat(qCompute.ts,'HH:MM:SS')#
@@ -399,7 +399,7 @@ ORDER BY d.siv_uid, p.__id
FROM qStorage
-
Storage факт #dateFormat(qStorage.ts,'YYYY-MM-DD')# #timeFormat(qStorage.ts,'HH:MM:SS')#
+
Storage факт class="err">#dateFormat(qStorage.ts,'YYYY-MM-DD')# #timeFormat(qStorage.ts,'HH:MM:SS')#
@@ -449,11 +449,10 @@ ORDER BY d.siv_uid, p.__id
FROM vmreports.vm_gpu g
WHERE g.ts=(select max(ts) from vmreports.vm_gpu)
AND lower(g."ClientID")=lower()
-
-
GPU факт #dateFormat(qGpu.ts,'YYYY-MM-DD')# #timeFormat(qGpu.ts,'HH:MM:SS')#
+
GPU факт class="err">#dateFormat(qGpu.ts,'YYYY-MM-DD')# #timeFormat(qGpu.ts,'HH:MM:SS')#
diff --git a/etc/db/gpu.20260820.sql b/etc/db/gpu.20260820.sql
new file mode 100644
index 0000000..c7d4f40
--- /dev/null
+++ b/etc/db/gpu.20260820.sql
@@ -0,0 +1,134 @@
+
+ select upper(trim(vm.client_id)) as wz
+ ,item.key as gpu_model
+ ,sum(item.value::int*p.value)/12. as gpu_h -- 5 minute sampling
+ ,avg(item.value::int*p.value)*744 as gpu_ha -- 5 minute sampling
+ from gpu.vm
+ JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid)
+ CROSS JOIN LATERAL jsonb_each(vm.gpu) AS item(key, value)
+ where 1=1
+ AND p.ts >= '2026-07-01'
+ AND p.ts < '2026-07-31'
+ group by vm.client_id, item.key
+ order by vm.client_id, item.key;
+
+ --select * from gpu.vm_power_state limit 100;
+ --select * from gpu.vm limit 100;
+
+ select count(*), sum(value) from gpu.vm_power_state p
+ where 1=1
+ AND p.ts >= '2026-07-01'
+ AND p.ts < '2026-07-31'
+ group by obj_uuid
+
+ select item.key as gpu_model,
+ case
+ WHEN org_vdc LIKE '%-v1cl1%' THEN 'iaas.ngc.i29'
+ WHEN org_vdc LIKE '%-v1cl2%' THEN 'iaas.ngc.i31'
+ WHEN org_vdc LIKE '%-v1cl4%' THEN 'iaas.ngc.a28'
+ WHEN org_vdc LIKE '%-v1cl5%' THEN 'iaas.ngc.a45'
+ WHEN org_vdc LIKE '%-v1cl6%' THEN 'iaas.ngc.i28'
+ WHEN org_vdc LIKE '%-v1cl7%' THEN 'iaas.ngc.a40'
+ --WHEN org_vdc LIKE '%-v2cl2-1c%' THEN '1c'
+ else '['||org_vdc||']' end as code
+ from gpu.vm
+ CROSS JOIN LATERAL jsonb_each(vm.gpu) AS item(key, value)
+ group by item.key, code
+ ORDER BY 1
+
+
+ select client_id, org, obj_id, org_vdc, item.key as gpu_model, item.value as gpu_cnt
+ from gpu.vm
+ CROSS JOIN LATERAL jsonb_each(vm.gpu) AS item(key, value)
+ ORDER BY client_id, org, obj_id
+
+
+ select
+ count(distinct obj_id) as unique_vm_cnt,
+ sum(p.value)/12. as vm_h, -- 5 minute sampling
+ sum(p.value)/12.*32.18 as cost,
+ sum(p.value)/12./744 as avg_month_vm -- в августе 744 часа
+ from gpu.vm
+ JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid)
+ where 1=1
+ AND p.ts >= '2026-08-01'
+ AND p.ts < '2026-08-31'
+ AND vm.client_id='WZ01516'
+ -- упражнение: посчитать, сколько средних ВМ, включенных круглые сутки, создаст такой же движ за время оказания сервиса
+
+ select
+ p.ts::date,
+ count(distinct obj_id) as unique_vm_cnt,
+ round((sum(p.value)/12.)::numeric,1) as vm_h, -- 5 minute sampling
+ round((sum(p.value)/12.*32.18)::numeric,2) as cost,
+ round((sum(p.value)/12./24)::numeric, 1) as avg_roundclock_vm
+ from gpu.vm
+ JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid)
+ where 1=1
+ AND p.ts >= '2026-08-01'
+ AND p.ts < '2026-08-31'
+ AND vm.client_id='WZ01516'
+ GROUP BY p.ts::date
+ ORDER BY 1
+
+ select
+ p.ts::date,
+ count(distinct obj_id) as unique_vm_cnt,
+ round((sum(p.value)/12.)::numeric,1) as vm_h, -- 5 minute sampling
+ round((sum(p.value)/12.*32.18)::numeric,2) as cost,
+ round((sum(p.value)/12.*32.18*(1-0.02*400/32.18))::numeric,2) as cost_wo_disk,
+ round((count(distinct obj_id)*0.02*400*24)::numeric,2) as disk_cost_simplified, -- считаем все ВМ, включавшиеся за данные сутки
+ round((sum(p.value)/12./24)::numeric, 1) as avg_roundclock_vm
+ from gpu.vm
+ JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid)
+ where 1=1
+ AND p.ts >= '2026-08-01'
+ AND p.ts < '2026-08-31'
+ AND vm.client_id='WZ01516'
+ GROUP BY p.ts::date
+ ORDER BY 1
+
+ select
+ p.ts::date,
+ count(distinct obj_id) as unique_vm_cnt,
+ (select count(distinct obj_id) from gpu.vm vm1
+ JOIN gpu.vm_power_state p1 on (vm1.obj_uuid=p1.obj_uuid)
+ WHERE vm1.client_id='WZ01516' AND p1.ts <= p.ts::date) as unique_vm_acc,
+ round((sum(p.value)/12.)::numeric,1) as vm_h, -- 5 minute sampling
+ round((sum(p.value)/12.*32.18)::numeric,2) as cost,
+ round((sum(p.value)/12.*32.18*(1-0.02*400/32.18))::numeric,2) as cost_wo_disk,
+ round((count(distinct obj_id)*0.02*400*24)::numeric,2) as disk_cost_simplified, -- считаем все ВМ, включавшиеся за данные сутки
+ round((sum(p.value)/12./24)::numeric, 1) as avg_roundclock_vm
+ from gpu.vm
+ JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid)
+ where 1=1
+ AND p.ts >= '2026-08-01'
+ AND p.ts < '2026-08-31'
+ AND vm.client_id='WZ01516'
+ GROUP BY p.ts::date
+ ORDER BY 1
+
+
+ with daily as (
+ select
+ p.ts::date as dt,
+ count(distinct obj_id) as unique_vm_cnt,
+ round((sum(p.value)/12.)::numeric,1) as vm_h, -- 5 minute sampling
+ round((sum(p.value)/12.*32.18)::numeric,2) as cost,
+ round((sum(p.value)/12.*32.18*(1-0.02*400/32.18))::numeric,2) as cost_wo_disk,
+ round((count(distinct obj_id)*0.02*400*24)::numeric,2) as disk_cost_simplified, -- считаем все ВМ, включавшиеся за данные сутки
+ round((sum(p.value)/12./24)::numeric, 1) as avg_roundclock_vm
+ from gpu.vm
+ JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid)
+ where 1=1
+ AND p.ts >= '2026-08-01'
+ AND p.ts < '2026-08-31'
+ AND vm.client_id='WZ01516'
+ GROUP BY p.ts::date
+ ORDER BY 1
+ ),
+ acc as (select p.ts::date as dt, count(distinct obj_id) as unique_vm_accum from gpu.vm
+ JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid)
+ WHERE vm.client_id='WZ01516'
+ group by p.ts::date)
+ select * from daily join acc on daily.dt<=acc.dt
diff --git a/payg.cfm b/payg.cfm
index c35dcf7..eeaff40 100644
--- a/payg.cfm
+++ b/payg.cfm
@@ -144,6 +144,8 @@ select * from elma.deals_services where __id='019edf9c-c23d-7ad6-a990-643dd09579
order by m.clientid, vdc.name;
+
+
qComputing:#getTickCount()-request.startTickCount#
@@ -265,22 +267,13 @@ select
OR category.name LIKE 'options%'
) THEN ops ELSE 0 END
) as get
- ,ceil(sum(
+ ,(sum(
CASE WHEN
(category.name LIKE 'get%'
OR category.name LIKE 'head%'
OR category.name LIKE 'options%'
) THEN ops ELSE 0 END
- )/10000) as get_10k
- ,greatest(ceil(sum(
- CASE WHEN
- (category.name LIKE 'get%'
- OR category.name LIKE 'head%'
- OR category.name LIKE 'options%'
- ) THEN ops ELSE 0 END
- )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 10 ELSE 0 END, 0
- ) as get_10k_free_tier_subtracted
-
+ )/10000) as get_10k
,sum(
CASE WHEN
(category.name LIKE 'put%'
@@ -289,29 +282,16 @@ select
OR category.name LIKE 'list%'
) THEN ops ELSE 0 END
) as put
- ,ceil(sum(
+ ,(sum(
CASE WHEN
(category.name LIKE 'put%'
OR category.name LIKE 'post%'
OR category.name LIKE 'patch%'
OR category.name LIKE 'list%'
) THEN ops ELSE 0 END
- )/10000) as put_10k
- ,greatest(ceil(sum(
- CASE WHEN
- (category.name LIKE 'put%'
- OR category.name LIKE 'post%'
- OR category.name LIKE 'patch%'
- OR category.name LIKE 'list%'
- ) THEN ops ELSE 0 END
- )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 1 ELSE 0 END, 0
- ) as put_10k_free_tier_subtracted
-
+ )/10000) as put_10k
,(sum(bytes_sent)) as bytes_sent
- ,ceil(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
- ,greatest(ceil(sum(bytes_sent)/1024/1024/1024) - CASE WHEN bucket_info.placement_id = 1 THEN 100 ELSE 0 END, 0
- ) as bytes_sent_GB_free_tier_subtracted
-
+ ,(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
,case
when bucket_info.placement_id = 1 then 'paas.s3.ceph'
when bucket_info.placement_id = 2 then 'paas.s3.cphc'
@@ -525,10 +505,10 @@ WZ по вхождению подс
Часов в периоде: #hours# Строк в отчете: #qCharge.recordCount#
Актуальность данных:
-VCD Computing: #dateFormat(qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(qComputingAge.dt_load,'HH:MM:SS')#
-VCD Storage: #dateFormat(qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(qStorageAge.dt_load,'HH:MM:SS')#
-S3 хранение: #dateFormat(qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3VolAge.dt_load,'HH:MM:SS')#
-S3 операции и трафик: #dateFormat(qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3OpsTrfAge.dt_load,'HH:MM:SS')#
+VCD Computing: class="err">>#dateFormat(qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(qComputingAge.dt_load,'HH:MM:SS')#
+VCD Storage: class="err">>#dateFormat(qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(qStorageAge.dt_load,'HH:MM:SS')#
+S3 хранение: class="err">>#dateFormat(qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3VolAge.dt_load,'HH:MM:SS')#
+S3 операции и трафик: class="err">>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3OpsTrfAge.dt_load,'HH:MM:SS')#