From e645f0865d2512798d865a0d84fc96e6b28f3724 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 1 Oct 2026 16:59:49 +0300 Subject: [PATCH] 090 s3 from cmdb, inmem DECIMAL fix --- Application.cfc | 3 +- MemoryDbHelper.cfc | 3 +- etc/notes.txt | 8 +++ payg.cfm | 151 ++++++++++++++++++++++++++++----------------- 4 files changed, 105 insertions(+), 60 deletions(-) diff --git a/Application.cfc b/Application.cfc index e3081d4..22f1149 100644 --- a/Application.cfc +++ b/Application.cfc @@ -24,6 +24,7 @@ + @@ -88,7 +89,7 @@ - + diff --git a/MemoryDbHelper.cfc b/MemoryDbHelper.cfc index e5a9676..cf40737 100644 --- a/MemoryDbHelper.cfc +++ b/MemoryDbHelper.cfc @@ -1,4 +1,5 @@ component { + /*0.04 precision fix DECIMAL(128,32) maybe too memory consumable*/ /*0.03 precision fix*/ /*0.02 timestamp support*/ /** @@ -71,7 +72,7 @@ component { case "BIGINT": return "BIGINT"; case "DOUBLE": case "FLOAT": case "REAL": return "DOUBLE"; case "BOOLEAN": case "BIT": return "BIT"; - case "DECIMAL": case "NUMERIC": return "DECIMAL"; + case "DECIMAL": case "NUMERIC": return "DECIMAL(128,32)"; case "TIMESTAMP": case "DATE": case "TIME": return "TIMESTAMP"; default: return "LONGVARCHAR"; // И тут тоже } diff --git a/etc/notes.txt b/etc/notes.txt index 8989813..b2cd725 100644 --- a/etc/notes.txt +++ b/etc/notes.txt @@ -1 +1,9 @@ +Задача: S3 перепривязать через CMDB (по именованию аккаунта - не работает (суффиксы, вводимые руками, не гарантированы от ошибок, примеры есть) +Половинчатое решение: мы можем вытащить из CMDB контрагента для S3. +- Сделать источник данных к CMDB (сразу прод?) +- Сделать джойн и либо добавить найденные в CMDB связи с WZ, либо +На самом деле нужно сделать связь инстанса S3 со строкой спецификации. +Контракты и спецификации в CMDB сейчас пустышки, а надо вязать с настоящими контрактами и спецификациями, только тогда возможен правильный биллинг. +Затащить контракты и спецификации в CMDB из CRM? Какие записи отобрать? + 12:58 09.10.2025 дополнительное соглашение к сделке. Шедевр \ No newline at end of file diff --git a/payg.cfm b/payg.cfm index fb5cf61..fe19b62 100644 --- a/payg.cfm +++ b/payg.cfm @@ -238,7 +238,8 @@ HOT_FREE_LIMIT 1 10 1 100 when bucket_stat.placement_id = 2 then 'paas.s3.cphc' else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code ,bucket_stat.placement_id - ,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ + --,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ + ,bucket_stat.owner as s3_user_name ,bucket_info.name as bucket from s3billing.bucket_stat join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id @@ -246,7 +247,7 @@ HOT_FREE_LIMIT 1 10 1 100 where bucket_stat.placement_id in (1,2) AND bucket_stat.timestamp_addition >= AND bucket_stat.timestamp_addition < - + AND 'WZ'||lpad(bucket_stat.owner, 5, '0') like /*выглядит очень неэффективным запросом*/ group by bucket_stat.owner, bucket_stat.placement_id, bucket_info.name @@ -306,8 +307,9 @@ select else '['|| TO_CHAR(bucket_info.placement_id,'FM9') ||']' end as code --*** зачем делать там ключ bigint ,bucket_info.placement_id --category.name - , bucket_info.name as bucket - ,'WZ'||lpad(user_info.name, 5, '0') as wz + ,bucket_info.name as bucket + ,user_info.name as s3_user_name + --,'dummy' AS WZ from s3billing.usage_bucket_by_user join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id join s3billing.category on usage_bucket_by_user.category_id=category.id @@ -336,7 +338,22 @@ select qS3OpsTrfAge:#getTickCount()-request.startTickCount# + + WITH current_state AS ( + SELECT *, ROW_NUMBER() OVER (PARTITION BY instance_uid ORDER BY version DESC) as rn + FROM instance_state + ) + SELECT s.instance_data->'job'->>'contragentCode' as wz, s.instance_data->'job'->>'userId' AS user_id, e.display_name + FROM current_state s + JOIN instance e on (s.instance_uid=e.instance_uid) + WHERE rn = 1 AND e.service_id=12 + +qS3User:#getTickCount()-request.startTickCount# + + + + @@ -364,6 +381,9 @@ select WHERE NOT vm.is_template AND p.ts >= AND p.ts < + + AND vm.client_id ilike + GROUP BY vm.client_id, item.key, c.code, vm.obj_id ORDER BY vm.client_id, item.key, c.code, vm.obj_id; @@ -381,67 +401,75 @@ select qGpuAge:#getTickCount()-request.startTickCount# + + + + + + + + + select wz, code || '.vcpu' as code, core_h as raw_metric, core_h as metric, 'core-h' as unit, vdc as dimension1 + from qComputing + + where code || '.vcpu' like + + union all + select wz, code || '.ram', gb_h as raw_metric, gb_h as metric, 'GByte-h' as unit, vdc as dimension1 + from qComputing + + where code || '.ram' like + + union all + select wz, code, gb_m_used as raw_metric, gb_m_used as metric, 'GByte-m' as unit, vdc ||':'|| profile as dimension1 + from qStorage + + where code like + - -select wz, code || '.vcpu' as code, core_h as raw_metric, core_h as metric, 'core-h' as unit, vdc as dimension1 -from qComputing - - where code || '.vcpu' like - + union all + select wz, code || '.vol',vol_b as raw_metric, vol_gb as metric, 'GByte-m' as unit, bucket as dimension1 + from qS3Vol s + left outer join qS3User u ON (s.s3_user_name = u.user_id) + + where code || '.vol' like + -union all -select wz, code || '.ram', gb_h as raw_metric, gb_h as metric, 'GByte-h' as unit, vdc as dimension1 -from qComputing - - where code || '.ram' like - + union all + select wz, code || '.get', get as raw_metric, get_10k as metric, '10k' as unit, bucket as dimension1 + from qS3OpsTrf s + left outer join qS3User u ON (s.s3_user_name = u.user_id) + + where code || '.get' like + -union all -select wz, code, gb_m_used as raw_metric, gb_m_used as metric, 'GByte-m' as unit, vdc ||':'|| profile as dimension1 -from qStorage - - where code like - + union all + select wz, code || '.put', put as raw_metric, put_10k as metric, '10k' as unit, bucket as dimension1 + from qS3OpsTrf s + left outer join qS3User u ON (s.s3_user_name = u.user_id) + + where code || '.put' like + -union all -select wz, code || '.vol', vol_b as raw_metric, vol_gb as metric, 'GByte-m' as unit, bucket as dimension1 -from qS3Vol - - where code || '.vol' like - + union all + select wz, code || '.trf', bytes_sent as raw_metric, bytes_sent_gb as metric, 'GByte' as unit, bucket as dimension1 + from qS3OpsTrf s + left outer join qS3User u ON (s.s3_user_name = u.user_id) + + where code || '.trf' like + -union all -select wz, code || '.get', get as raw_metric, get_10k as metric, '10k' as unit, bucket as dimension1 -from qS3OpsTrf - - where code || '.get' like - + union all + select wz, code, gpu_h as raw_metric, gpu_h as metric, 'h' as unit, obj_id as dimension1 + from qGpu + + where code like + -union all -select wz, code || '.put', put as raw_metric, put_10k as metric, '10k' as unit, bucket as dimension1 -from qS3OpsTrf - - where code || '.put' like - - -union all -select wz, code || '.trf', bytes_sent as raw_metric, bytes_sent_gb as metric, 'GByte' as unit, bucket as dimension1 -from qS3OpsTrf - - where code || '.trf' like - - -union all -select wz, code, gpu_h as raw_metric, gpu_h as metric, 'h' as unit, obj_id as dimension1 -from qGpu - - where code like - - -order by wz, code + order by wz, code @@ -455,7 +483,6 @@ order by wz, code - @@ -474,6 +501,11 @@ FULL JOIN, потому что нам нужны бесхозные записи Группировка: по контрагенту, ---> + + /*EXPLAIN PLAN FOR*/ @@ -522,8 +554,10 @@ SELECT s.user_description CASE s.type WHEN 1 THEN 'install' WHEN 2 THEN 'fix' WHEN 3 THEN 'payg' ELSE NULL END as pricing_model +,'***' as delim,s.* FROM qUnifiedMetric m +INNER FULL @@ -739,7 +773,7 @@ S3 операции и трафик: Итого #code#: - #accum_metric_dimension_1##round(final_metric_dimension_1,3)# + #round(final_metric_dimension_1,3)# #free_tier# #max(ceiling(final_metric_dimension_1) - free_tier, 0)# #unit# [#ed_izm#] @@ -768,6 +802,7 @@ S3 операции и трафик: +