241 lines
11 KiB
Plaintext
241 lines
11 KiB
Plaintext
|
|
<cfset dt_finish=createDateTime(year(Now()),month(Now()),1,0,0,0)/>
|
|
<cfset dt_start=dateAdd('m',-1,dt_finish)/>
|
|
|
|
Нужно еще применить политики бесплатного минимума
|
|
<!---
|
|
<cfquery name="qCode" datasource="dwh">
|
|
select distinct p.code
|
|
from elma.deals d
|
|
join elma.deals_services siv on (d.__id=ANY(siv.deal))
|
|
join elma.service_parametrs p on (p.__id = ANY(siv.params))
|
|
join elma.companies k on (d._companies=k.__id)
|
|
join elma.additional_agreements aa on (aa.__id = ANY(siv.additional_agreement))
|
|
join elma.aggrements a on (aa.contract_uid = a.__id)
|
|
where p.type=3 AND aa.is_actual
|
|
order by p.code
|
|
</cfquery>
|
|
<cfdump var=#qCode#/>
|
|
|
|
<cfquery name="qSpec" datasource="dwh">
|
|
select k.id_klienta, p.code, p.price, p.discount, k.__name as contragent, a.__name as contract, d.__name as deal, siv.abstractive_service as abstract_service, siv.modifier, siv.user_description
|
|
,p.__name as metric, p.ed_izm
|
|
--, aa.is_actual
|
|
from elma.deals d
|
|
join elma.deals_services siv on (d.__id=ANY(siv.deal))
|
|
join elma.service_parametrs p on (p.__id = ANY(siv.params))
|
|
join elma.companies k on (d._companies=k.__id)
|
|
join elma.additional_agreements aa on (aa.__id = ANY(siv.additional_agreement))
|
|
join elma.aggrements a on (aa.contract_uid = a.__id)
|
|
where p.type=3 AND aa.is_actual
|
|
order by k.id_klienta, p.code
|
|
</cfquery>
|
|
здесь имеем список кодов с ценами и WZ. Каждому коду можно поставить в соответствие запрос, который даст по нему выборку. Изредка один запрос может вывести 2 кода, но разбить на 2 запроса легко. Кроме того, запросы можно объединить через union в один - может быть, так будет лучше читаться (быстрее выполняться не будет)
|
|
<cfdump var=#qSpec#/>
|
|
|
|
|
|
<cfquery name="qComputing" datasource="billing-vc">
|
|
select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
|
|
case
|
|
when vdc.name like '%-v1cl1-%' then 'iaas.ngc.i29'
|
|
when vdc.name like '%-v1cl2-%' then 'iaas.ngc.i31'
|
|
when vdc.name like '%-v1cl4-%' then 'iaas.ngc.a28'
|
|
when vdc.name like '%-v1cl6-%' then 'iaas.ngc.i28'
|
|
else 'unknown' end as code,
|
|
sum(cpu_used/cpu_speed)/4. as core_h,
|
|
sum(mem_used)/1024/4. as gb_h
|
|
from ngcloud_ru.capacity_resource
|
|
join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
|
|
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
|
where tenant.wzcode > 0
|
|
AND capacity_resource.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
|
AND capacity_resource.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
|
group by tenant.wzcode, vdc.name
|
|
order by tenant.wzcode, vdc.name;
|
|
</cfquery>
|
|
<cfdump var=#qComputing#/>
|
|
|
|
<cfquery name="qStorage" datasource="billing-vc">
|
|
select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
|
|
case
|
|
when vdc.name like '%-v1cl1-%' then 'iaas.ngc.i29'
|
|
when vdc.name like '%-v1cl2-%' then 'iaas.ngc.i31'
|
|
when vdc.name like '%-v1cl4-%' then 'iaas.ngc.a28'
|
|
when vdc.name like '%-v1cl6-%' then 'iaas.ngc.i28'
|
|
else 'unknown' end as code,
|
|
storage_profile_types.name as storage_profile_type_name,
|
|
sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
|
|
sum(used)/1024./4 as gb_h_used
|
|
from ngcloud_ru.capacity_storage
|
|
join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.id
|
|
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
|
join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
|
|
where tenant.wzcode > 0
|
|
AND capacity_storage.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
|
AND capacity_storage.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
|
group by tenant.wzcode, vdc.name, storage_profile_types.name
|
|
order by tenant.wzcode, vdc.name, storage_profile_types.name;
|
|
</cfquery>
|
|
<cfdump var=#qStorage#/>
|
|
|
|
<cfquery name="qS3Vol" datasource="billing-s3">
|
|
select
|
|
sum(bucket_stat.usage_rgw_main_size_actual) as vol,
|
|
case
|
|
when bucket_stat.placement_id = 1 then 'paas.s3.ceph.vol'
|
|
when bucket_stat.placement_id = 2 then 'paas.s3.cphc.vol'
|
|
else 'unknown' end as code,
|
|
'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь код приведен к целому, а потом к строке
|
|
from s3billing.bucket_stat
|
|
join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
|
|
join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
|
|
where bucket_stat.placement_id in (1,2)
|
|
AND bucket_stat.timestamp_addition >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
|
AND bucket_stat.timestamp_addition < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
|
group by bucket_stat.owner, bucket_stat.placement_id
|
|
order by bucket_stat.owner, bucket_stat.placement_id;
|
|
</cfquery>
|
|
<cfdump var=#qS3Vol#/>
|
|
|
|
<cfquery name="qS3OpsDefaultPlacement" datasource="billing-s3">
|
|
select sum(ops) as ops,
|
|
case
|
|
when category.name like 'get%' then 'get'
|
|
when category.name like 'put%' then 'put'
|
|
when category.name like 'post%' then 'post'
|
|
when category.name like 'list%' then 'list'
|
|
else 'unknown' end as op,
|
|
'WZ'||lpad(user_info.name, 5, '0') 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
|
|
join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
|
|
join s3billing.placement on bucket_info.placement_id=placement.id and placement.name='default-placement'
|
|
where 1=1
|
|
AND usage_bucket_by_user.time >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
|
AND usage_bucket_by_user.time < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
|
group by user_info.name, category.name
|
|
order by user_info.name, category.name;
|
|
</cfquery>
|
|
<cfdump var=#qS3OpsDefaultPlacement#/>
|
|
|
|
<cfquery name="qS3OpsDefault" datasource="billing-s3">
|
|
select sum(ops) as ops,
|
|
case
|
|
--when category.name like 'get%' then 'get' /*get встречается*/
|
|
when category.name like 'put%' then 'put'
|
|
--when category.name like 'post%' then 'post'
|
|
when category.name like 'list%' then 'list'
|
|
else 'unknown' end as op,
|
|
'WZ'||lpad(user_info.name, 5, '0') 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
|
|
--join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
|
|
--join s3billing.placement on bucket_info.placement_id=placement.id and placement.name='default-placement'
|
|
where s3billing.usage_bucket_by_user.bucketid='0'
|
|
AND usage_bucket_by_user.time >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
|
AND usage_bucket_by_user.time < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
|
group by user_info.name, category.name
|
|
order by user_info.name, category.name;
|
|
</cfquery>
|
|
<cfdump var=#qS3OpsDefault#/>
|
|
--->
|
|
|
|
Трафик хранится в той же таблице, что и остальной юзадж, можно было бы доставать в общем резалтсете
|
|
|
|
<cfquery name="qS3TrafficDefaultPlacement" datasource="billing-s3">
|
|
select sum(bytes_sent) as bytes,
|
|
placement.name as placement
|
|
'WZ'||lpad(user_info.name, 5, '0') 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
|
|
join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
|
|
join s3billing.placement on bucket_info.placement_id=placement.id
|
|
where 1=1
|
|
AND usage_bucket_by_user.time >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
|
AND usage_bucket_by_user.time < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
|
group by user_info.name
|
|
order by user_info.name;
|
|
</cfquery>
|
|
<cfdump var=#qS3TrafficDefaultPlacement#/>
|
|
|
|
|
|
<cfquery name="qS3TrafficDefault" datasource="billing-s3">
|
|
select sum(bytes_sent) as bytes,
|
|
'WZ'||lpad(user_info.name, 5, '0') 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
|
|
--join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
|
|
--join s3billing.placement on bucket_info.placement_id=placement.id AND placement.name='default-placement'
|
|
where s3billing.usage_bucket_by_user.bucketid='0'
|
|
AND usage_bucket_by_user.time >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
|
AND usage_bucket_by_user.time < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
|
group by user_info.name
|
|
order by user_info.name;
|
|
</cfquery>
|
|
<cfdump var=#qS3TrafficDefault#/>
|
|
|
|
<!---
|
|
задача (вызванная сыростью базы биллинга)
|
|
смапить код параметра с VDC (1:n)
|
|
iaas.ngc.i31.ram-m
|
|
iaas.ngc.a28.ram-m
|
|
|
|
cl01:
|
|
7 хостов Lenovo ThinkSystem SR650 -[7X06CTO1WW]-
|
|
2 процессора Xeon(R) Gold 6226R 16 ядер 32 потока каждый 2.9 ГГц
|
|
1.25тб озу в каждом.
|
|
В 4 из 7 есть по 4 GPU NVIDIA A16 16GB в каждом.
|
|
|
|
cl01-vsan:
|
|
16 хостов Lenovo ThinkSystem SR650 -[7X06CTO1WW]-
|
|
2 процессора Xeon(R) Gold 6226R 16 ядер 32 потока каждый 2.9 ГГц
|
|
1.25тб озу в каждом.
|
|
В 9 из 16 есть по 4 GPU NVIDIA A16 16GB в каждом.
|
|
|
|
cl02:
|
|
10 Huawei 2488H V5
|
|
4 процессора Xeon(R) Gold 6254 18 ядер 36 потоков каждый. 3.1 ГГц
|
|
2тб озу в каждом.
|
|
|
|
5 Huawei Atlas 800 (Model 3010)
|
|
2 процессора Xeon(R) Gold 6254 18 ядер 36 потоков каждый. 3.1 ГГц
|
|
1.5тб озу в каждом.
|
|
|
|
cl04-vsan:
|
|
10 Apex AR320-12
|
|
2 процессора AMD EPYC 7543 32 ядра 64 потока каждый. 2.8 ГГц
|
|
2тб озу в каждом.
|
|
18 Apex AR320-12-E7543
|
|
2 процессора AMD EPYC 7543 32 ядра 64 потока каждый. 2.8 ГГц
|
|
2тб озу в каждом.
|
|
|
|
cl05-1c:
|
|
1 Asus RS720A-E12-RS24U
|
|
2 процессора AMD EPYC 9274F 24 ядра 48 потоков каждый. 4.05 ГГц
|
|
1тб озу.
|
|
|
|
7 ручная сборка
|
|
MB Asus ProArt B650-Creator
|
|
Процессор AMD Ryzen 9 7950X 16 ядер 32 потока каждый. 4.5 ГГц
|
|
192гб озу каждый.
|
|
|
|
1 ручная сборка
|
|
процессор AMD Ryzen Threadripper PRO 5995WX 64 ядра 128 потоков каждый. 2.7 ГГц
|
|
512гб озу.
|
|
|
|
cl06-vsan:
|
|
15 R320
|
|
2 процессора Xeon(R) Gold 6342 24 ядра 48 потоков каждый. 2.8 ГГц
|
|
1тб озу каждый.
|
|
|
|
Xeon(R) Gold 6226R 2.9 ГГц
|
|
Xeon(R) Gold 6254 3.1 ГГц
|
|
AMD EPYC 7543 2.8 ГГц
|
|
AMD EPYC 9274F 4.05 ГГц
|
|
AMD Ryzen 9 7950X 4.5 ГГц
|
|
AMD Ryzen Threadripper PRO 5995WX 2.7 ГГц
|
|
Xeon(R) Gold 6342 2.8 ГГц ---> |