diff --git a/Application.cfc b/Application.cfc index 2d4d27c..4d9abe2 100644 --- a/Application.cfc +++ b/Application.cfc @@ -13,10 +13,10 @@ - - + - + + @@ -87,7 +87,7 @@ - + diff --git a/etc/db/gpu.20260820.sql b/etc/db/gpu.20260820.sql index c7d4f40..7722092 100644 --- a/etc/db/gpu.20260820.sql +++ b/etc/db/gpu.20260820.sql @@ -44,91 +44,13 @@ 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 часа + count(distinct obj) + sum(p.value)/12. as vm_h -- 5 minute sampling 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/inc/menu.cfm b/inc/menu.cfm index 9776730..7beaa6b 100644 --- a/inc/menu.cfm +++ b/inc/menu.cfm @@ -25,6 +25,7 @@ + diff --git a/payg.cfm b/payg.cfm index abfcc51..fb5cf61 100644 --- a/payg.cfm +++ b/payg.cfm @@ -754,7 +754,7 @@ S3 операции и трафик: - и + Итого #wz# #contragent#: #accum_cost_svc# diff --git a/vm_gpu_rpt.cfm b/vm_gpu_rpt.cfm index 972c9be..80bf328 100644 --- a/vm_gpu_rpt.cfm +++ b/vm_gpu_rpt.cfm @@ -5,7 +5,7 @@ - + @@ -16,165 +16,55 @@ - - - - - - - - - + select - p.ts::date, - count(distinct p.obj_uuid) as unique_vm_cnt, - count(distinct p.obj_uuid) FILTER (WHERE p.value=1) as unique_vm_cnt_on, - 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 + + DATE_TRUNC('hour',p.ts) as ts_hour + count(distinct p.obj_uuid) as unique_vm_cnt + count(distinct p.obj_uuid) FILTER (WHERE p.value=1) as unique_vm_cnt_on + round((sum(p.value)/12.)::numeric,1) as vm_h + round((sum(p.value)/12.*24.19)::numeric,2) as cost_wo_disk + round((count(distinct obj_id)*8.00)::numeric,2) as disk_cost + round((sum(p.value)/12.)::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 >= - AND p.ts < - - AND vm.client_id like - - GROUP BY p.ts::date -ORDER BY 1 + /*watch time zone, accounting by MSK*/ + AND p.ts >= + AND p.ts < + AND vm.client_id='WZ01516' + GROUP BY DATE_TRUNC('hour',p.ts) + ORDER BY 1; - - -qComputing:#getTickCount()-request.startTickCount# - + - - select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource + + select max(ts) as dt_load from gpu.vm_power_state -qComputingAge:#getTickCount()-request.startTickCount# - - - - - - - - -qCharge:#getTickCount()-request.startTickCount# - - - - +qGpuAge:#getTickCount()-request.startTickCount# - + - + - Отчет по PAYG + Отчет по включенным ВМ с GPU @@ -182,28 +72,21 @@ ORDER BY 1 -Факт потребления по основной базе биллинга, спецификации из DWH. Без детализации по бакетам, VDC и т.д. -Все запросы кэшированы на 25 минут.
-Внимание! округление вверх при расчете метрик get, put S3. Расчетные суммы могут содержать погрешности округления, поэтому окончательный расчет стоимости (количество * цену) должен выполняться в бухгалтерской программе. -Если у клиента больше 1 действующего допника с услугами PAYG, то данные в отчете могут быть замножены, в этом случае считать вручную -
-Даты актуальности пока проверять вручную. Обращать внимание на замножение строк. +
Период с по -Только PAYG checked/> -WZ по вхождению, с регистром -Код по вхождению + +
-Часов в периоде: #hours# Строк в отчете: #qCharge.recordCount#
+Часов в периоде: #hours# Строк в отчете: #qRead.recordCount#
Актуальность данных: -VCD Computing: class="err">>#dateFormat(qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(qComputingAge.dt_load,'HH:mm:ss.lXX')# -VCD Storage: class="err">>#dateFormat(qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(qStorageAge.dt_load,'HH:mm:ss.lXX')# -S3 хранение: class="err">>#dateFormat(qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3VolAge.dt_load,'HH:mm:ss.lXX')# -S3 операции и трафик: class="err">>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3OpsTrfAge.dt_load,'HH:mm:ss.lXX')# +GPU-VM Power State: class="err">#dateFormat(qGpuAge.dt_load,'YYYY-MM-DD')# #timeFormat(qGpuAge.dt_load,'HH:mm:ss.lXX')# +
@@ -212,156 +95,31 @@ S3 операции и трафик: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - + - - - + + + + + + + - - - - - - - - - - - - - - - class="gray"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
УслугаАртикул специф.Кол-во специф.Артикул метр.ДетализацияКол-во метр.Free Tier.Опл. объемЕд.изм.Цена ₽ со скид., с НДССтоимость ₽ с НДС   КомпонентПольз. наим.GPL с НДССкидка%Дата НОУДата КОУКлюч строкиСырая метрикаПриведен­ная метрикаЦена ₽ до ск. с НДСЦена ₽ co ск. с НДС без окр.Service QuantityService DiscountComponent QuantityComponent DiscountДоговорДопникСделкаКонечникЧасУникальных ВМВМ вклВМ-часовСтоимость без дискаСтоимость дискаКруглосуточных ВМ
- - #wz# - #contragent# - (сводка) - - ответственный: - class="err">#responsible# #responsible_email# - #dateFormat(ts_hour,"YYYY-MM-DD")# #timeFormat(ts_hour,"HH:MM")##unique_vm_cnt##unique_vm_cnt_on##vm_h##cost_wo_disk##disk_cost##avg_roundclock_vm#
#currentRow##abstract_service#: #modifier# style="background:lightgreen;color:black;">#s_code#"err r""r">#component_quantity##m_code##dimension1##request.roundSafe(metric,3)##free_tier##unit# [#ed_izm#]#gaussianRound(discounted_price,2)##component##user_description##gaussianRoundSafe(price,2)##component_discount##dateFormat(serviceStart,'YYYY-MM-DD')##dateFormat(serviceEnd,'YYYY-MM-DD')##line_key##request.roundSafe(raw_metric,3)##request.roundSafe(metric,3)##price##discounted_price##service_quantity##service_discount##component_quantity##component_discount##contract##additional_agreement##deal##WZE#
Итого #code#:#round(final_metric_dimension_1,3)##free_tier##max(ceiling(final_metric_dimension_1) - free_tier, 0)##unit# [#ed_izm#]#current_price##gaussianRoundSafe(cost_dimension_1,2)#
Итого #wz# #contragent#:#accum_cost_svc#
- +