diff --git a/README.md b/README.md index deabdaf3..5785bc56 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ The pricing DB dump is downloaded from Infracost's API as that simplifies the ta ## Deployment -It should take around 15 mins to deploy the Cloud Pricing API. Two deployment methods are supported: +Two deployment methods are supported: 1. If you have a Kubernetes cluster, we recommend using [our Helm Chart](https://github.com/infracost/helm-charts/tree/master/charts/cloud-pricing-api). 2. If you prefer to deploy in a VM, we recommend using [Docker compose](#docker-compose). @@ -136,7 +136,7 @@ See [the Infracost docs](https://www.infracost.io/docs/cloud_pricing_api/self_ho ## Troubleshooting -Please see [this section](https://www.infracost.io/docs/cloud_pricing_api/self_hosted/#troubleshooting) and join our [community Slack channel](https://www.infracost.io/community-chat), we'll help you very quickly 😄 +Please see [this section](https://www.infracost.io/docs/cloud_pricing_api/self_hosted/#troubleshooting). ## Contributing diff --git a/package.json b/package.json index 770953f0..3d0b421b 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "data:dump": "node dist/cmd/dataDump.js", "data:download": "node dist/cmd/dataDownload.js", "data:load": "node dist/cmd/dataLoad.js", + "data:patchEmissions": "node dist/cmd/dataPatchEmissions.js", "data:status": "node dist/cmd/dataStatus.js", "job:init": "npm run db:setup && npm run job:update", "job:update": "npm run data:download && npm run data:load", @@ -21,6 +22,7 @@ "data:dump:dev": "ts-node src/cmd/dataDump.ts", "data:download:dev": "ts-node src/cmd/dataDownload.ts", "data:load:dev": "ts-node src/cmd/dataLoad.ts", + "data:patchEmissions:dev": "ts-node src/cmd/dataPatchEmissions.ts", "data:status:dev": "ts-node src/cmd/dataStatus.ts", "job:init:dev": "npm run db:setup:dev && npm run job:update:dev", "job:update:dev": "npm run data:download:dev && npm run data:load:dev", diff --git a/src/cmd/dataPatchEmissions.ts b/src/cmd/dataPatchEmissions.ts new file mode 100644 index 00000000..e3d7ded2 --- /dev/null +++ b/src/cmd/dataPatchEmissions.ts @@ -0,0 +1,66 @@ +import ProgressBar from 'progress'; +import config from '../config'; +import emissionsCoef from '../data/emissions/coefficients.json'; +import { PoolClient } from 'pg'; + +async function run(): Promise { + const pool = await config.pg(); + + const client = await pool.connect(); + + const progressBar = new ProgressBar( + '-> loading [:bar] :percent (:etas remaining)', + { + width: 40, + complete: '=', + incomplete: ' ', + renderThrottle: 500, + total: Object.keys(emissionsCoef).length, + } + ); + + // For each coefficient in the JSON file, update the corresponding products. + config.logger.info('Updating product emissions'); + + for (const [key, coefficient] of Object.entries(emissionsCoef)) { + const [_, skuId, region] = key.split('_'); + await updateProductEmissions(client, skuId, region, coefficient); + progressBar.tick(); + } +} + +const updateProductEmissions = async ( + client: PoolClient, + skuId: string, + region: string, + coefficient: number +): Promise => { + const emissionData = JSON.stringify([ + { + emissionHash: 'emissionHash', + unit: 'kgCO2e', + emissions: coefficient, + startUsageAmount: 0, + }, + ]); + + await client.query( + ` + UPDATE "products" + SET "emissions" = $1 + WHERE "sku" = $2 AND "region" = $3 + `, + [emissionData, skuId, region] + ); +}; + +config.logger.info('Starting: loading data into DB'); +run() + .then(() => { + config.logger.info('Completed: loading data into DB'); + process.exit(0); + }) + .catch((err) => { + config.logger.error(err); + process.exit(1); + }); diff --git a/src/data/emissions/coefficients.json b/src/data/emissions/coefficients.json new file mode 100644 index 00000000..15179ac2 --- /dev/null +++ b/src/data/emissions/coefficients.json @@ -0,0 +1,473 @@ +{ + "AI Pipeline job: Managed Pipeline job count_europe-west1_2B84-9CF1-241F": 0.00159886260090177, + "AI Pipeline job: Managed Pipeline job count_europe-west4_2B84-9CF1-241F": 0.9165183341205394, + "Active HSM ECDSA P-256 key versions_asia-east1_1017-1BAF-7159": 0.135400483876477, + "Active HSM ECDSA P-256 key versions_europe-west1_1017-1BAF-7159": 0.03823608584215827, + "Active HSM ECDSA P-256 key versions_us-central1_1017-1BAF-7159": 0.12389739488282613, + "Active HSM ECDSA P-256 key versions_us-central2_1017-1BAF-7159": 0.11360386597256136, + "Active HSM ECDSA P-256 key versions_us-east1_1017-1BAF-7159": 0.13972359324658445, + "Active HSM ECDSA P-256 key versions_us-west1_1017-1BAF-7159": 0.019905544837763176, + "Active Storage (europe-west1)_europe-west1_33C2-A84B-3BEF": 0.0011699208715442936, + "Active Storage (europe-west2)_europe-west2_23B9-5D3C-A7BB": 0.0009619903245413824, + "Active Storage (europe-west3)_europe-west3_AE2B-06A2-A77E": 0.00556276534635279, + "Active Storage (europe-west4)_europe-west4_60BE-5B2B-987E": 0.0008828209437615587, + "Active Storage (us-central1)_us-central1_0018-A5A0-9D6D": 0.0005666744329146836, + "Active Storage_europe_947D-3B46-7781": 0.0037806238082855096, + "Active Storage_us_947D-3B46-7781": 0.0011769817578016863, + "Archive Class A Operations_europe-west1_990C-ED9B-B8C9": 0.006632179884700689, + "Archive Class B Operations_europe-west1_FFB9-8661-27DD": 0.0002397052298830029, + "Archive Data Retrieval_europe-west1_27A1-EBA4-49E8": 0.0008675054697270449, + "Archive Storage Belgium (Early Delete)_europe-west1_7603-88E7-1A6E": 2.3845508183143613e-5, + "Archive Storage Belgium_europe-west1_1A2D-77C9-8F73": 0.0005686853789074812, + "AutoML Content Classification Deployed Model Time_europe-west4_1677-BBE0-848C": 0.006342559958070977, + "AutoML Content Classification Model Deployment for AutoML Natural Language or AI Platform (Unified)_europe-west4_1677-BBE0-848C": 0.00026572934104250893, + "AutoML Content Classification Model Deployment for AutoML Natural Language or Vertex AI_europe-west4_1677-BBE0-848C": 0.0001475607845042733, + "AutoML Content Classification Model Deployment for AutoML Natural Language or Vertex AI_us-central1_1677-BBE0-848C": 0.0005872906841889028, + "AutoML Content Classification Model Training for AutoML Natural Language or Vertex AI_europe-west4_41FE-745B-850A": 0.0016114013211338564, + "AutoML Content Classification Model Training for AutoML Natural Language or Vertex AI_us-central1_41FE-745B-850A": 0.039469644509681635, + "AutoML Content Classification Online Predictions Operations for AutoML Natural Language or Vertex AI_europe-west4_A478-2B66-9176": 0.023175065853480385, + "AutoML Entity Extraction Model Deployment for AutoML Natural Language or AI Platform (Unified)_us-central1_C5B0-CEAF-5DDB": 0.0002284445744848589, + "AutoML Entity Extraction Model Training for AutoML Natural Language or AI Platform (Unified)_us-central1_A537-DFB1-85F9": 0.026026670607714724, + "AutoML Image Classification Model Deployment for AutoML Vision or Vertex AI_us-central1_845C-15E7-5C4D": 0.0934786378181491, + "AutoML Image Classification Model Training for AutoML Vision or Vertex AI_us-central1_E5FA-2AC8-4EE2": 0.8868071690069121, + "Autopilot Kubernetes Clusters_europe-west1_F52D-A61F-C7D1": 3.6010779500261614, + "Balanced PD Capacity in Frankfurt_europe-west3_B1B5-0BAA-CB31": 0.9753377611011828, + "Balanced PD Capacity in London_europe-west2_D7FE-969C-E339": 0.025601718014761014, + "Balanced PD Capacity in Warsaw_europe-central2_7F37-4B04-C4BF": 0.46315116481615193, + "Balanced PD Capacity_europe-west1_6AE1-525F-8B80": 0.02740195275461696, + "Balanced PD Capacity_us-central1_6AE1-525F-8B80": 0.3897749950277161, + "BigQuery Flat Rate Flex for Europe (multi-region)_eu_E076-703D-6128": 0.00042955069533896545, + "BigQuery Flat Rate Flex for US (multi-region)_us_6FE6-D064-82C6": 0.0004703714235461772, + "BigQuery Storage API - Read Anonymous Bytes Scanned_europe-west3_242C-E02F-1FC9": 0.15601105115584693, + "BigQuery Storage API - Read Bytes Scanned (EU)_europe_D844-AFFE-86A2": 0.01735284242959857, + "BigQuery Storage API - Read Bytes Scanned (US)_us_AB59-C5C0-8570": 0.020283842650388153, + "BigQuery Storage API - Read Bytes Scanned (europe-west3)_europe-west3_0181-407F-286E": 0.04325633819064613, + "BigQuery Storage API - Read_europe_7747-C1C7-5FD5": 0.04432397226602733, + "BigQuery Storage API - Read_us_7747-C1C7-5FD5": 0.021409027664547012, + "CPU Allocation Time (Always-on CPU) in europe-west3_europe-west3_23A0-BA06-660E": 2.776440915832255e-8, + "CPU Allocation Time (tier 2)_europe-west2_085C-A237-027A": 3.8006564752108816e-6, + "CPU Allocation Time (tier 2)_europe-west3_085C-A237-027A": 4.675536664468458e-6, + "CPU Allocation Time_europe-west1_4856-B847-F1EB": 4.060755773314177e-7, + "CPU Allocation Time_europe-west4_4856-B847-F1EB": 9.772513374992882e-9, + "CPU Allocation Time_us-central1_4856-B847-F1EB": 6.919335231210567e-9, + "CPU Time (tier 2)_europe-west3_C3E5-5E41-F455": 7.467784211778124e-6, + "CPU Time_europe-west1_C024-9C10-2A5B": 1.4142192495124327e-6, + "CPU Time_europe-west2_C024-9C10-2A5B": 1.5830765587080694e-6, + "CPU Time_us-central1_C024-9C10-2A5B": 1.477792441982601e-5, + "CPU Time_us-east1_C024-9C10-2A5B": 1.5826503811550608e-5, + "Cloud Composer Compute CPUs (europe-west3)_europe-west3_1FCA-0053-3649": 2.536612197457044e-5, + "Cloud Composer Compute Memory (europe-west3)_europe-west3_A15E-F23A-1D64": 0.007957859631584345, + "Cloud Composer Compute Storage (europe-west3)_europe-west3_DE0D-F426-5FA7": 0.00798153137472059, + "Cloud Composer Data storage in Belgium_europe-west1_25C3-91C3-11F3": 0.21430403788324331, + "Cloud Composer Database Storage (europe-west3)._europe-west3_BECF-82BC-3BE3": 3.3756684738994247, + "Cloud Composer SQL vCPU time in Belgium_europe-west1_8278-F923-5C4B": 0.004532416937237546, + "Cloud Composer SQL vCPU time in London_europe-west2_B5B7-F3FB-E9A9": 0.021506772814270787, + "Cloud Composer SQL vCPU time in Warsaw_europe-central2_1378-336A-5C16": 0.05321461707454405, + "Cloud Composer data storage in London_europe-west2_BB2C-D8AF-20D1": 1.0667359315878309, + "Cloud Composer data storage in Warsaw_europe-central2_EEAA-0242-2650": 2.639445006897386, + "Cloud Composer vCPU time in Belgium_europe-west1_4C39-D447-B489": 0.004251165881617156, + "Cloud Composer vCPU time in London_europe-west2_111B-9A18-84B6": 0.0, + "Cloud Composer vCPU time in Warsaw_europe-central2_9BF7-3A3A-1E91": 0.05321461707454406, + "Cloud SQL for MySQL: Zonal - 1 vCPU + 3.75GB RAM in Americas_us-central1_03B0-9810-7408": 0.004550704532209571, + "Cloud SQL for MySQL: Zonal - 1 vCPU + 3.75GB RAM in EMEA_europe-west1_286F-1408-A35E": 0.0017403278877204241, + "Cloud SQL for MySQL: Zonal - 1 vCPU + 3.75GB RAM in London_europe-west2_077A-6F24-04B4": 0.003718974363877543, + "Cloud SQL for MySQL: Zonal - 2 vCPU + 7.5GB RAM in EMEA_europe-west1_B197-CD0E-F646": 0.0029628967612259174, + "Cloud SQL for MySQL: Zonal - IP address reservation in EMEA_europe-west1_BD0C-CBE1-61F5": 0.004043106014887387, + "Cloud SQL for MySQL: Zonal - Low cost storage in EMEA_europe-west1_FFDB-EFBA-D2F6": 0.02810675637776607, + "Cloud SQL for MySQL: Zonal - Low cost storage in Frankfurt_europe-west3_66A1-2E4C-0D95": 0.0, + "Cloud SQL for MySQL: Zonal - Micro instance in APAC_asia-east1_AF49-0F96-9D80": 0.0008038030194159149, + "Cloud SQL for MySQL: Zonal - Micro instance in Americas_us-west1_65AF-E01F-7427": 0.0001329459276239758, + "Cloud SQL for MySQL: Zonal - Micro instance in EMEA_europe-west1_DECA-2B50-44AE": 0.0002662121087363627, + "Cloud SQL for MySQL: Zonal - RAM in EMEA_europe-west1_A8F3-9054-7B81": 0.00490790706785933, + "Cloud SQL for MySQL: Zonal - RAM in Frankfurt_europe-west3_0D2D-FD15-F6C8": 0.0010646799406784757, + "Cloud SQL for MySQL: Zonal - RAM in London_europe-west2_BA84-2E60-2039": 0.0008848689738785903, + "Cloud SQL for MySQL: Zonal - Small instance in EMEA_europe-west1_FFCF-DEA5-451E": 0.0013013823280116214, + "Cloud SQL for MySQL: Zonal - Standard storage in APAC_asia-east1_1393-84CE-E1E0": 0.05787302182688926, + "Cloud SQL for MySQL: Zonal - Standard storage in Americas_us-central1_F0A1-2B08-FA36": 0.32728922721799253, + "Cloud SQL for MySQL: Zonal - Standard storage in Americas_us-west1_F0A1-2B08-FA36": 0.009568492096646489, + "Cloud SQL for MySQL: Zonal - Standard storage in EMEA_europe-west1_873D-A7DC-E74F": 0.0024157903856202203, + "Cloud SQL for MySQL: Zonal - Standard storage in London_europe-west2_8AA6-0F3F-991C": 0.2037389773186395, + "Cloud SQL for MySQL: Zonal - vCPU in EMEA_europe-west1_4A83-AFCC-FA43": 0.005411253880334166, + "Cloud SQL for MySQL: Zonal - vCPU in Frankfurt_europe-west3_275A-4493-AC9F": 0.0, + "Cloud SQL for MySQL: Zonal - vCPU in London_europe-west2_F0CF-9545-2AEC": 0.0057516488018497115, + "Cloud SQL for PostgreSQL: Regional - IP address reservation in EMEA_europe-west1_F00A-E2D0-C414": 0.0011071081479223986, + "Cloud SQL for PostgreSQL: Regional - RAM in EMEA_europe-west1_C690-8FB3-59EE": 0.0014778747780655208, + "Cloud SQL for PostgreSQL: Regional - Standard storage in EMEA_europe-west1_D901-4910-1FD2": 0.13862107402280938, + "Cloud SQL for PostgreSQL: Regional - vCPU in EMEA_europe-west1_84B5-2F8B-3A6D": 0.0052858994339659935, + "Cloud SQL for PostgreSQL: Zonal - IP address reservation in Americas_us-central1_3151-8F6A-75C1": 0.0008036323270622399, + "Cloud SQL for PostgreSQL: Zonal - IP address reservation in EMEA_europe-west1_2DC7-81C8-697F": 0.003966917451766873, + "Cloud SQL for PostgreSQL: Zonal - Low cost storage in EMEA_europe-west1_C698-9A59-834C": 0.026722668311057407, + "Cloud SQL for PostgreSQL: Zonal - Micro instance in Americas_us-central1_C2D4-F7DF-B8D0": 0.0005466567865648736, + "Cloud SQL for PostgreSQL: Zonal - Micro instance in EMEA_europe-west1_4C57-F0D3-6029": 0.0002467859886189442, + "Cloud SQL for PostgreSQL: Zonal - RAM in Americas_us-central1_93DA-3F55-CB04": 0.0009949114230470122, + "Cloud SQL for PostgreSQL: Zonal - RAM in EMEA_europe-west1_8A88-5E4B-2265": 0.0003000212352530994, + "Cloud SQL for PostgreSQL: Zonal - RAM in Frankfurt_europe-west3_EC68-EB32-4DE5": 0.002074097949061165, + "Cloud SQL for PostgreSQL: Zonal - RAM in Warsaw_europe-central2_AE14-248A-4E4B": 0.0, + "Cloud SQL for PostgreSQL: Zonal - Small instance in EMEA_europe-west1_79B6-5148-74CC": 0.0028351094141324086, + "Cloud SQL for PostgreSQL: Zonal - Standard storage in Americas_us-central1_C18F-7FE0-0717": 0.03825121891811142, + "Cloud SQL for PostgreSQL: Zonal - Standard storage in EMEA_europe-west1_B14E-2B60-F10B": 0.009377130308373607, + "Cloud SQL for PostgreSQL: Zonal - Standard storage in Frankfurt_europe-west3_E15A-F63C-64EE": 0.11274587825362377, + "Cloud SQL for PostgreSQL: Zonal - Standard storage in Warsaw_europe-central2_0743-3BA4-1E28": 0.1174104353440562, + "Cloud SQL for PostgreSQL: Zonal - vCPU in Americas_us-central1_965E-7C36-08E6": 0.0, + "Cloud SQL for PostgreSQL: Zonal - vCPU in EMEA_europe-west1_2154-E036-4CB2": 0.0012400772986731088, + "Cloud SQL for PostgreSQL: Zonal - vCPU in Frankfurt_europe-west3_935B-B3CF-C03F": 0.007968174916245664, + "Cloud SQL for PostgreSQL: Zonal - vCPU in Warsaw_europe-central2_7021-8638-52E8": 0.015780778931800285, + "Cloud SQL: Backups in Frankfurt_europe-west3_A44D-6319-68F6": 52.66795252648228, + "Cloud SQL: Backups in London_europe-west2_F2C3-43B1-30A7": 8.1624738298087, + "Cloud SQL: Backups in Warsaw_europe-central2_D1A5-025C-19C9": 915.4752743786408, + "Coldline Class A Operations_europe-west2_A1F1-940B-6E1A": 3.1515904695244257e-6, + "Coldline Class A Operations_us-west1_A1F1-940B-6E1A": 3.2890110335875e-6, + "Coldline Class B Operations_europe-west2_C73D-E5EA-F13D": 0.0001455420552304897, + "Coldline Class B Operations_us-west1_C73D-E5EA-F13D": 5.060016974748993e-6, + "Coldline Data Retrieval_europe-west2_1C42-50D6-1B1D": 0.09695083824700436, + "Coldline Data Retrieval_us-west1_1C42-50D6-1B1D": 0.0005222384711245766, + "Coldline Storage Europe Multi-region_europe_6CCC-4CDD-383C": 0.00010365424548050862, + "Coldline Storage London (Early Delete)_europe-west2_FC58-7872-97F8": 0.002212724882310122, + "Coldline Storage London_europe-west2_2316-6FDA-8E11": 0.8640686356238295, + "Coldline Storage Oregon (Early Delete)_us-west1_30E0-4198-95E0": 5.171677174660897e-6, + "Coldline Storage Oregon_us-west1_E209-9471-B5A2": 0.00042850527661822066, + "Compute optimized Core running in EMEA_europe-west1_E6D3-3221-80B3": 0.0, + "Compute optimized Core running in Zurich_europe-west6_2B93-9A67-0964": 0.0016488156450331457, + "Compute optimized Ram running in EMEA_europe-west1_72E8-3980-C96D": 0.0, + "Compute optimized Ram running in Zurich_europe-west6_C0BD-78A7-3057": 0.00041220390906438506, + "Content Bytes Transformed_europe-west1_3D4B-3FC2-6136": 0.05826387243135053, + "Custom Extended Instance Ram running in EMEA_europe-west1_1EB9-1221-1475": 0.003392115463703654, + "Custom Extended Instance Ram running in London_europe-west2_3E1C-D283-78BA": 0.0035614091147310014, + "Custom Instance Core running in Americas_us-central1_ACBC-6999-A1C4": 0.003628124146086249, + "Custom Instance Core running in EMEA_europe-west1_606D-D514-8E64": 0.0038175558129299758, + "Custom Instance Core running in Frankfurt_europe-west3_47BE-44D0-C86F": 0.004368470628786204, + "Custom Instance Core running in London_europe-west2_201A-CE43-C161": 0.010855692336041157, + "Custom Instance Core running in Zurich_europe-west6_6301-E865-C5F5": 0.007186655601996406, + "Custom Instance Ram running in Americas_us-central1_51E2-59BD-7A6E": 0.0016113807628847562, + "Custom Instance Ram running in EMEA_europe-west1_0F35-41DB-4950": 0.0015597897214350254, + "Custom Instance Ram running in Frankfurt_europe-west3_6971-C36E-2B52": 0.0014531971644531764, + "Custom Instance Ram running in London_europe-west2_7B74-5AE0-3F99": 0.0009446839620180553, + "Custom Instance Ram running in Zurich_europe-west6_4D06-A8A0-31AB": 0.0, + "DNS Query (port 53)_global_6DFF-5025-A128": 1.1485580591204959e-8, + "DNS Query (port 53)_us-central1_6DFF-5025-A128": 1.854989690584731e-8, + "Data Fusion Basic_europe-west1_E74D-F7A2-0BF5": 0.19381647594140614, + "Data Fusion Basic_europe-west6_E74D-F7A2-0BF5": 0.13879889248236343, + "Data Fusion Developer_europe-west1_88BC-986D-9A22": 0.02345227590462592, + "E2 Instance Core running in Americas_us-central1_CF4E-A0C7-E3BF": 0.0027797205427006876, + "E2 Instance Core running in Americas_us-east1_CF4E-A0C7-E3BF": 0.013633316309230894, + "E2 Instance Core running in Americas_us-west1_CF4E-A0C7-E3BF": 0.0004532833225481289, + "E2 Instance Core running in EMEA_europe-west1_9FE0-8F60-A9F0": 0.001355798806954465, + "E2 Instance Core running in London_europe-west2_0F2A-2FA8-3F6A": 0.0028067676287752384, + "E2 Instance Core running in Warsaw_europe-central2_955B-B00E-ED15": 0.0065109560939080055, + "E2 Instance Ram running in Americas_us-central1_F449-33EC-A5EF": 0.0007393884693855075, + "E2 Instance Ram running in Americas_us-east1_F449-33EC-A5EF": 0.0034081003976832104, + "E2 Instance Ram running in Americas_us-west1_F449-33EC-A5EF": 4.9550833182429684e-5, + "E2 Instance Ram running in EMEA_europe-west1_F268-6CE7-AC16": 0.0002038464243891767, + "E2 Instance Ram running in London_europe-west2_5D70-7762-2DE7": 0.0007020934000066512, + "E2 Instance Ram running in Warsaw_europe-central2_56D3-3D40-B0F6": 0.0012999323781004448, + "EU-based Storage egress via peered/interconnect network_europe-west1_900C-8E7C-91F5": 1.2453515932724863, + "EU-based Storage egress via peered/interconnect network_europe_900C-8E7C-91F5": 1.7320571025438167, + "External Steps_europe-west4_041E-F822-A7B3": 0.0001667107470933, + "External Steps_us-central1_041E-F822-A7B3": 0.00987965709516545, + "Feature Store online serving node._europe-west1_74D1-6081-582A": 0.22889037296773654, + "HTTP Load Balancing: Global Forwarding Rule Additional Service Charge_global_01CB-E623-2700": 7.634813876393835e-8, + "HTTP Load Balancing: Global Forwarding Rule Minimum Service Charge_global_EF0E-76F7-44D6": 9.92963796436038e-6, + "HTTP Load Balancing: Global Forwarding Rule Service Charge_global_57A2-52DE-9B03": 1.455509069096289e-6, + "Internal Steps_europe-west4_C039-AD90-8AD6": 4.1677686773325e-5, + "Internal Steps_us-central1_C039-AD90-8AD6": 0.0, + "Jobs_asia-northeast1_A5D6-43A2-28A7": 0.00027541776867012383, + "Jobs_europe-west1_A5D6-43A2-28A7": 6.571267638534924e-5, + "Jobs_europe-west3_A5D6-43A2-28A7": 0.0002092630655083959, + "Large Cloud Composer Environment Fee (europe-west3)._europe-west3_0124-3094-E384": 44.15865907632624, + "Load Balanced HTTP/HTTPS Request_europe-west1_2060-D6B4-19F1": 0.0003573190421164181, + "Load Balanced HTTP/HTTPS Request_europe-west2_2060-D6B4-19F1": 0.005153795950309114, + "Load Balanced HTTP/HTTPS Request_europe-west3_2060-D6B4-19F1": 3.2463672389047134e-5, + "Load Balanced HTTP/HTTPS Request_europe-west4_2060-D6B4-19F1": 0.0009616339427648468, + "Load Balanced HTTP/HTTPS Request_europe_2060-D6B4-19F1": 1.7165447198308357e-6, + "Load Balanced HTTP/HTTPS Request_us-central1_2060-D6B4-19F1": 0.009849514136514826, + "Local Disk Time PD Standard Belgium_europe-west1_FEB1-430E-1D7F": 2.4429779767164475e-6, + "Local Disk Time PD Standard Frankfurt_europe-west3_9D5A-0986-D95F": 0.0, + "Local Disk Time PD Standard Iowa_us-central1_74FC-29F5-37EE": 0.00014460976391545625, + "Local Disk Time PD Standard London_europe-west2_9A36-67EB-EA3E": 3.085139612107088e-5, + "Local Disk Time PD Standard Netherlands_europe-west4_CA4C-5EE7-B56C": 0.00015244950196452849, + "Local Disk Time PD Standard Oregon_us-west1_CC8C-0FF3-26FE": 2.5910531340685433e-6, + "Long Term Storage (europe-west1)_europe-west1_465E-3EFE-5DA1": 0.000116761068709196, + "Long Term Storage (europe-west4)_europe-west4_D9D4-AA34-A2DA": 0.017697244116002736, + "Long Term Storage (us-central1)_us-central1_55B3-2F73-B6A3": 0.0004530255735399029, + "Long Term Storage_europe_993F-6B6B-DCC4": 0.00028241270867721154, + "Long Term Storage_us_993F-6B6B-DCC4": 0.0003952256219010597, + "Managed Notebooks CPU for GCE usage - N1 Highmem Cores in europe-west1_europe-west1_7D42-D1AE-2AC9": 0.044536364668940086, + "Managed Notebooks CPU for GCE usage - N1 Standard Cores in europe-west1_europe-west1_3D59-2BE5-0DA0": 0.00702801904212183, + "Managed Notebooks CPU_europe-west1_0D7B-1B2C-569C": 0.007109031342336363, + "Managed Notebooks Disk for GCE usage - Standard Persistent Disk in europe-west1_europe-west1_8CE3-93F4-82A5": 0.17492881130664362, + "ManagedZone_global_8C22-6FC3-D478": 0.03882211992083108, + "ManagedZone_us-central1_8C22-6FC3-D478": 0.06802042404979813, + "Medium Cloud Composer Environment Fee (europe-west3)._europe-west3_43F1-9367-5DA6": 0.15503862013135772, + "Memory-optimized Instance Core running in EMEA_europe-west1_8756-8763-C679": 0.04843259707358597, + "Memory-optimized Instance Ram running in EMEA_europe-west1_A187-AA4A-8383": 0.0, + "Metadata storage_europe-west1_AEEB-1CC1-1A3A": 42.063252928370176, + "Metadata storage_europe-west4_AEEB-1CC1-1A3A": 25.33681017645342, + "Metadata storage_us-central1_AEEB-1CC1-1A3A": 958.8137651976895, + "Micro Instance with burstable CPU running in Americas_us-central1_5CE5-087B-6C3C": 0.000775523628924693, + "Micro Instance with burstable CPU running in Americas_us-east1_5CE5-087B-6C3C": 0.0007123408084525332, + "Micro Instance with burstable CPU running in EMEA_europe-west1_5619-DD14-5F41": 0.017568380654196757, + "Micro Instance with burstable CPU running in Frankfurt_europe-west3_91C1-5F17-3531": 0.0011421229342300585, + "Micro Instance with burstable CPU running in London_europe-west2_389D-815E-FE97": 0.0007627560161420567, + "Micro Instance with burstable CPU running in Zurich_europe-west6_6863-F40A-3E86": 0.0658176350973555, + "Multi-Region Standard Class A Operations_europe-west1_9ADA-9AED-1B24": 8.865985629283211e-5, + "Multi-Region Standard Class A Operations_europe_9ADA-9AED-1B24": 5.888937800638356e-8, + "Multi-Region Standard Class A Operations_us_9ADA-9AED-1B24": 2.3462286400677167e-6, + "Multi-Region Standard Class B Operations_asia_8AE7-5BBD-8F38": 4.077183632483333e-5, + "Multi-Region Standard Class B Operations_europe_8AE7-5BBD-8F38": 3.603846583513831e-7, + "Multi-Region Standard Class B Operations_us_8AE7-5BBD-8F38": 1.4877720195637887e-6, + "N1 Predefined Instance Core running in Americas_us-central1_2E27-4F75-95CD": 0.0033202743631316088, + "N1 Predefined Instance Core running in Americas_us-east1_2E27-4F75-95CD": 0.008204857095423927, + "N1 Predefined Instance Core running in Americas_us-west1_2E27-4F75-95CD": 0.0006994556797413562, + "N1 Predefined Instance Core running in EMEA_europe-west1_9431-52B1-2C4F": 0.0013846264615234233, + "N1 Predefined Instance Core running in Frankfurt_europe-west3_A9C0-BADB-1C34": 0.0030172561660470622, + "N1 Predefined Instance Core running in London_europe-west2_E3BF-72A4-1954": 0.008070431303655269, + "N1 Predefined Instance Core running in Netherlands_europe-west4_62A6-21EE-5C6A": 0.012732278500164156, + "N1 Predefined Instance Core running in Warsaw_europe-central2_8131-C7CF-24C6": 0.008511560356459627, + "N1 Predefined Instance Core running in Zurich_europe-west6_718A-81BA-2CBB": 0.0012712570022921322, + "N1 Predefined Instance Ram running in Americas_us-central1_6C71-E844-38BC": 0.0008763959641530753, + "N1 Predefined Instance Ram running in Americas_us-east1_6C71-E844-38BC": 0.0013761703320749655, + "N1 Predefined Instance Ram running in Americas_us-west1_6C71-E844-38BC": 0.0001690621640441651, + "N1 Predefined Instance Ram running in EMEA_europe-west1_39F4-0112-6F39": 0.00040493935953505526, + "N1 Predefined Instance Ram running in Frankfurt_europe-west3_5C8C-3C2D-B331": 0.0008855778584487194, + "N1 Predefined Instance Ram running in London_europe-west2_FCA7-22FF-B1CC": 0.0018083591264779748, + "N1 Predefined Instance Ram running in Netherlands_europe-west4_7919-4540-EDB2": 0.0, + "N1 Predefined Instance Ram running in Warsaw_europe-central2_1B51-BAD1-3C07": 0.0022697435604509854, + "N1 Predefined Instance Ram running in Zurich_europe-west6_000F-E31B-1D6F": 0.0003389962434911295, + "N2 Custom Instance Core running in EMEA_europe-west1_0976-7487-062C": 0.0009981665401406837, + "N2 Custom Instance Ram running in EMEA_europe-west1_CA5F-A13B-29EA": 0.00019343981583265553, + "N2 Instance Core running in EMEA_europe-west1_9F61-45D7-D4FB": 0.02105838943255836, + "N2 Instance Ram running in EMEA_europe-west1_A109-54C1-7CB0": 0.00045881163199959973, + "N2D AMD Instance Core running in London_europe-west2_1B12-3BA5-80A4": 0.003342076298480347, + "N2D AMD Instance Ram running in London_europe-west2_462E-70CF-C7AF": 0.0008384845237838656, + "NA-based Storage egress via peered/interconnect network_us_B1FE-19F7-6D1B": 0.004394293309150449, + "NAT Gateway: Data processing charge in Belgium_europe-west1_B8EE-57B6-C8D6": 0.004536388080524662, + "NAT Gateway: Uptime charge in Belgium_europe-west1_5555-55CD-27F2": 0.0002911966692593798, + "NAT Gateway: Uptime charge in Iowa_us-central1_EEBA-994B-7855": 0.0024557026380488825, + "Nearline Class A Operations_europe-west1_05B5-EE18-5022": 8.68317027431179e-8, + "Nearline Class A Operations_europe-west3_05B5-EE18-5022": 2.6287535141056306e-5, + "Nearline Class A Operations_europe_05B5-EE18-5022": 1.1453871975881645e-6, + "Nearline Class B Operations_europe-west1_D0C7-E6E8-6579": 1.11851466989958e-6, + "Nearline Class B Operations_europe-west3_D0C7-E6E8-6579": 3.8391098233397035e-5, + "Nearline Class B Operations_europe_D0C7-E6E8-6579": 1.83721701990591e-6, + "Nearline Data Retrieval_europe-west1_8D92-97F6-DDF3": 0.045653086678735896, + "Nearline Data Retrieval_europe-west3_8D92-97F6-DDF3": 34.73700991109475, + "Nearline Data Retrieval_europe_8D92-97F6-DDF3": 0.03770088371771031, + "Nearline Storage Belgium_europe-west1_D78D-ECDE-752A": 0.0023936606370987584, + "Nearline Storage Europe Multi-region_europe_4CF0-069A-15D9": 0.000428097487000277, + "Nearline Storage Frankfurt_europe-west3_4783-1B32-D7D2": 0.0003274071585785557, + "Nearline Storage London_europe-west2_3C81-A91C-A94F": 0.00027221123837879203, + "Network Internal Load Balancing: Data Processing Charge in EMEA_europe-west1_7691-4A40-3458": 157.75598124793552, + "Network Internal Load Balancing: Data Processing Charge in EMEA_europe-west1_90A3-1544-207D": 326.0653399167692, + "Neural Translation Model Predictions In Translation V3_global_E205-31DB-F1F4": 8.153143925079381e-9, + "Neural Translation Model Predictions_global_D90A-CFB2-7CCD": 6.233441274834278e-10, + "Notebooks CPU_europe-west1-b_380C-720B-578B": 0.0003667224929458546, + "Notebooks CPU_europe-west3-a_380C-720B-578B": 0.001835137982293349, + "Notebooks CPU_europe-west4-a_380C-720B-578B": 0.0, + "Notebooks CPU_us-central1-c_380C-720B-578B": 0.0021110257553837303, + "Notebooks CPU_us-east1-b_380C-720B-578B": 0.0011622991689651727, + "Notebooks CPU_us-west1-b_380C-720B-578B": 0.00027875482483013744, + "Notebooks GPU Standard_europe-west1-b_34FB-D077-9DC2": 0.0740633512914129, + "Number of 'general' type pages processed_us_4713-E183-53CC": 0.003043663066299912, + "Number of invoice statements process by Invoice parser or Utility parser_eu_0C4C-6AEA-66CB": 0.005624910943184871, + "Number of pages processed for OCR processor._eu_03C7-7B42-6CC7": 0.0, + "Nvidia Tesla K80 GPU running in Americas_us-west1_ADAE-1096-790D": 0.005978999547190665, + "Nvidia Tesla K80 GPU running in EMEA_europe-west1_561D-5CA8-AC38": 0.11202661458817056, + "Nvidia Tesla P100 GPU attached to preemptible VMs running in Netherlands_europe-west4_F46A-C3D7-C37D": 0.06587276376379456, + "Nvidia Tesla P100 GPU running in EMEA_europe-west1_BC3B-5BAC-8EC2": 0.18269380858613826, + "Nvidia Tesla T4 GPU running in EMEA_europe-west1_6FAF-ADE7-FB07": 0.14111590645709884, + "Nvidia Tesla T4 GPU running in London_europe-west2_9BDF-0244-DB2A": 0.6381183680244739, + "Nvidia Tesla T4 GPU running in Netherlands_europe-west4_E3F0-571B-0753": 0.025452599046687674, + "Nvidia Tesla V100 GPU running in Americas_us-west1_DC0B-9926-40C5": 0.33716614340246115, + "Online Prediction N1 Predefined Instance Core running in Americas_us-central1_F3F1-9122-BB7C": 0.0, + "Online Prediction N1 Predefined Instance Ram running in Americas_us-central1_9FAF-8195-AA62": 0.07892788578560658, + "Online Prediction Node-Hours (Europe) for mls1-c1-m2._europe-west1_9C53-68EB-EF90": 0.0, + "Online Prediction Node-Hours (US) for mls1-c1-m2._us-central1_B701-0A6B-A907": 0.7454065002709068, + "Online Prediction Node-Hours (US) for mls1-c4-m2._us-central1_F6B5-83F9-FFBF": 287.1291494696075, + "Online Predictions (Europe/Asia)_europe-west1_8181-2807-F03A": 0.8336068310884823, + "Online Predictions (Europe/Asia)_europe-west2_8181-2807-F03A": 1.2312057171547812, + "Online Predictions_us-central1_B260-4CEC-49C6": 1.514950600752377e-8, + "Online Predictions_us-west1_B260-4CEC-49C6": 1.0696081245112985, + "Online/Batch Prediction N1 Predefined Instance Core running in Americas for AI Platform or AI Platform (Unified)_us-central1_F3F1-9122-BB7C": 0.020863856985633304, + "Online/Batch Prediction N1 Predefined Instance Core running in Americas for AI Platform or AI Platform (Unified)_us-west1_F3F1-9122-BB7C": 0.0032254985307899136, + "Online/Batch Prediction N1 Predefined Instance Core running in Americas for AI Platform or Vertex AI_us-central1_F3F1-9122-BB7C": 0.01466545737382456, + "Online/Batch Prediction N1 Predefined Instance Core running in EMEA for AI Platform or AI Platform (Unified)_europe-west1_ED3B-E4B6-5847": 0.007032115114956815, + "Online/Batch Prediction N1 Predefined Instance Core running in EMEA for AI Platform or Vertex AI_europe-west1_ED3B-E4B6-5847": 0.0041608477887560315, + "Online/Batch Prediction N1 Predefined Instance Core running in London for AI Platform or AI Platform (Unified)_europe-west2_BA61-9552-C45E": 0.014927228775332625, + "Online/Batch Prediction N1 Predefined Instance Core running in London for AI Platform or Vertex AI_europe-west2_BA61-9552-C45E": 0.01912958048411228, + "Online/Batch Prediction N1 Predefined Instance Core running in Netherlands for AI Platform or Vertex AI_europe-west4_2017-774A-ED27": 0.017214139067702045, + "Online/Batch Prediction N1 Predefined Instance Ram running in Americas for AI Platform or AI Platform (Unified)_us-central1_9FAF-8195-AA62": 0.004945060009955721, + "Online/Batch Prediction N1 Predefined Instance Ram running in Americas for AI Platform or AI Platform (Unified)_us-west1_9FAF-8195-AA62": 0.0, + "Online/Batch Prediction N1 Predefined Instance Ram running in Americas for AI Platform or Vertex AI_us-central1_9FAF-8195-AA62": 0.0035715866180250715, + "Online/Batch Prediction N1 Predefined Instance Ram running in EMEA for AI Platform or AI Platform (Unified)_europe-west1_F15B-24BB-8BC8": 0.006331144521098782, + "Online/Batch Prediction N1 Predefined Instance Ram running in EMEA for AI Platform or Vertex AI_europe-west1_F15B-24BB-8BC8": 0.001033355776498428, + "Online/Batch Prediction N1 Predefined Instance Ram running in London for AI Platform or AI Platform (Unified)_europe-west2_F4D0-BC6E-CF95": 0.004442579038270588, + "Online/Batch Prediction N1 Predefined Instance Ram running in London for AI Platform or Vertex AI_europe-west2_F4D0-BC6E-CF95": 0.003559873640228296, + "Online/Batch Prediction N1 Predefined Instance Ram running in Netherlands for AI Platform or Vertex AI_europe-west4_E562-BA7F-4AFF": 0.0027810586784529088, + "Outgoing Bandwidth_us-central1_04F2-6383-80BD": 0.12150820826070738, + "Preemptible E2 Instance Core running in EMEA_europe-west1_5FAA-2D1B-B96D": 0.0, + "Preemptible E2 Instance Core running in London_europe-west2_7DC7-6365-092D": 17.897147150077146, + "Preemptible E2 Instance Ram running in EMEA_europe-west1_3A30-24A2-2E3A": 0.0, + "Preemptible E2 Instance Ram running in London_europe-west2_5602-A5DB-3699": 4.468860120706041, + "Preemptible N1 Predefined Instance Core running in EMEA_europe-west1_04D9-CEFB-F0AA": 0.0007592280636650796, + "Preemptible N1 Predefined Instance Core running in London_europe-west2_5E35-3492-165F": 0.001164337946407335, + "Preemptible N1 Predefined Instance Core running in Netherlands_europe-west4_9188-48E6-B63D": 0.0064256582722060675, + "Preemptible N1 Predefined Instance Ram running in EMEA_europe-west1_10A0-7F67-697B": 0.00010926333046600306, + "Preemptible N1 Predefined Instance Ram running in London_europe-west2_BCAF-CC85-AEB8": 0.0002816600980754566, + "Preemptible N1 Predefined Instance Ram running in Netherlands_europe-west4_B5CD-75E5-0CC1": 0.0012665945843063086, + "Prometheus Samples Ingested_europe-west1_A4E4-DF03-CDB6": 1.0656298577735673e-8, + "RAM Time Belgium_europe-west1_3BC3-5EF8-60CF": 0.00041796379840194095, + "RAM Time Frankfurt_europe-west3_AAFA-D7BA-AFCB": 0.0001970007300908421, + "RAM Time Iowa_us-central1_414B-800F-B5A9": 0.00133353875204148, + "RAM Time London_europe-west2_B863-8072-8721": 0.0010451385973421115, + "RAM Time Netherlands_europe-west4_4065-9A96-4F92": 0.0010163186274155505, + "RAM Time Oregon_us-west1_6A71-DD8A-64D4": 0.00017273568228156767, + "Redis Capacity Basic M1 Belgium_europe-west1_ED04-130F-C092": 1.465087664238355e-5, + "Redis Capacity Basic M1 Iowa/South Carolina/Oregon_us-east1_38BC-F861-2EB5": 5.5411233427006e-6, + "Regional Kubernetes Clusters_europe-west1_B561-BFBD-1264": 0.01103686659889099, + "Regional Kubernetes Clusters_europe-west2_B561-BFBD-1264": 0.022815401116876577, + "Regional Kubernetes Clusters_us-west1_B561-BFBD-1264": 0.0, + "Regional Standard Class A Operations (Note: first 5,000 ops are free)_europe-west1_4DBF-185F-A415": 0.0, + "Regional Standard Class A Operations_asia-east1_4DBF-185F-A415": 3.971391502125727e-7, + "Regional Standard Class A Operations_asia-southeast1_4DBF-185F-A415": 2.0897093652381444e-7, + "Regional Standard Class A Operations_europe-central2_4DBF-185F-A415": 2.5711992794686093e-7, + "Regional Standard Class A Operations_europe-west1_4DBF-185F-A415": 2.677973603550263e-8, + "Regional Standard Class A Operations_europe-west2_4DBF-185F-A415": 1.286613270002727e-7, + "Regional Standard Class A Operations_europe-west3_4DBF-185F-A415": 5.961733087730299e-7, + "Regional Standard Class A Operations_europe-west4_4DBF-185F-A415": 1.3698934138039437e-7, + "Regional Standard Class A Operations_europe-west6_4DBF-185F-A415": 1.857056281875445e-7, + "Regional Standard Class A Operations_europe_4DBF-185F-A415": 7.038173992239559e-7, + "Regional Standard Class A Operations_us-central1_4DBF-185F-A415": 1.6551066062470095e-7, + "Regional Standard Class A Operations_us-east1_4DBF-185F-A415": 2.6511253598713024e-7, + "Regional Standard Class A Operations_us-west1_4DBF-185F-A415": 2.363404098522257e-8, + "Regional Standard Class A Operations_us_4DBF-185F-A415": 0.0, + "Regional Standard Class B Operations (Note: first 50,000 ops are free)_europe-west1_7870-010B-2763": 1.2354816754820183e-5, + "Regional Standard Class B Operations_asia-east1_7870-010B-2763": 1.184450097125217e-7, + "Regional Standard Class B Operations_asia-southeast1_7870-010B-2763": 2.865623369838619e-7, + "Regional Standard Class B Operations_europe-central2_7870-010B-2763": 0.0, + "Regional Standard Class B Operations_europe-north1_7870-010B-2763": 2.590854515438024e-9, + "Regional Standard Class B Operations_europe-west1_7870-010B-2763": 4.366137626091791e-8, + "Regional Standard Class B Operations_europe-west2_7870-010B-2763": 9.018512467386764e-7, + "Regional Standard Class B Operations_europe-west3_7870-010B-2763": 4.094108844825223e-6, + "Regional Standard Class B Operations_europe-west4_7870-010B-2763": 1.518030604280612e-6, + "Regional Standard Class B Operations_europe-west6_7870-010B-2763": 0.0, + "Regional Standard Class B Operations_global_7870-010B-2763": 7.046391901363069e-9, + "Regional Standard Class B Operations_us-central1_7870-010B-2763": 1.344724267556366e-7, + "Regional Standard Class B Operations_us-east1_7870-010B-2763": 8.817177432147496e-8, + "Regional Standard Class B Operations_us-west1_7870-010B-2763": 3.0196796501582944e-8, + "SSD backed Local Storage_europe-west1_62AF-A39E-269B": 0.011932855935622337, + "SSD backed PD Capacity in Zurich_europe-west6_6B82-25FC-503C": 0.04034141134317368, + "SSD backed PD Capacity_europe-west1_B188-61DD-52E4": 0.004530804079795567, + "Secret version replica storage_europe-west1_7756-ADEF-84F4": 0.0001604343018624578, + "Secret version replica storage_europe-west3_7756-ADEF-84F4": 0.0018346314936767958, + "Secret version replica storage_us-central1_7756-ADEF-84F4": 0.0006409686044627413, + "Shuffle chargeable data processed for Belgium_europe-west1_D2CE-CEF1-8F9C": 0.0015672077061169374, + "Shuffle chargeable data processed for Frankfurt_europe-west3_134A-4702-1B38": 0.0, + "Shuffle chargeable data processed for Iowa_us-central1_1934-87A3-3120": 0.2101352511955191, + "Shuffle chargeable data processed for London_europe-west2_F2D4-78C7-C302": 32631.08874053693, + "Shuffle chargeable data processed for Netherlands_europe-west4_4F5D-9865-16AE": 2593.7188301627607, + "Small Cloud Composer Environment Fee (europe-west3)._europe-west3_0061-2C2A-70B4": 0.06660373498678751, + "Small Instance with 1 VCPU running in Americas_us-central1_82AF-89FC-240D": 0.004322092779325244, + "Small Instance with 1 VCPU running in EMEA_europe-west1_0DA7-1812-F2F5": 0.010235794847227135, + "Small Instance with 1 VCPU running in Frankfurt_europe-west3_7BDC-D342-257A": 0.0028617239799495833, + "Small Instance with 1 VCPU running in London_europe-west2_6D07-090C-335C": 2.006865619608875, + "Spot Preemptible N1 Predefined Instance Core running in EMEA_europe-west1_04D9-CEFB-F0AA": 0.0004149478345151143, + "Spot Preemptible N1 Predefined Instance Ram running in EMEA_europe-west1_10A0-7F67-697B": 7.053849868577407e-5, + "Standard Storage Asia Multi-region_asia_E653-0A40-3B69": 0.0007965159774785811, + "Standard Storage Asia Regional_asia-east1_BAE2-255B-64A7": 0.0, + "Standard Storage Europe Multi-region_europe_EC40-8747-D6FF": 0.001087116803386133, + "Standard Storage Europe Regional_europe-west1_A703-5CB6-E0BF": 0.000233993337558376, + "Standard Storage Finland/Netherlands Dual-region_eur4_E67D-A4FA-4CF3": 0.0004585048643726299, + "Standard Storage Finland_europe-north1_8A7F-592F-3FE7": 0.00015124869891836867, + "Standard Storage Frankfurt_europe-west3_F272-7933-F065": 0.0005970648684150052, + "Standard Storage London_europe-west2_BB55-3E5A-405C": 0.001781421691080806, + "Standard Storage Netherlands_europe-west4_89D8-0CF9-9F2E": 0.005688481604776103, + "Standard Storage Singapore_asia-southeast1_76BA-5CAD-4338": 0.20790267056168127, + "Standard Storage US Multi-region_us_0D5D-6E23-4250": 0.0010076296096100572, + "Standard Storage US Regional_us-central1_E5F0-6A5D-7BAD": 0.0003072656281052082, + "Standard Storage US Regional_us-east1_E5F0-6A5D-7BAD": 0.02968546429702902, + "Standard Storage US Regional_us-west1_E5F0-6A5D-7BAD": 0.00010449117388172755, + "Standard Storage Warsaw_europe-central2_109D-AA78-91BA": 1.1652066464496593, + "Standard Storage Zurich_europe-west6_91B5-8ABC-06EC": 0.0003895072570256944, + "Storage Image_europe-west1_DAA2-253C-6680": 0.42838552935018914, + "Storage Image_us-central1_DAA2-253C-6680": 0.003861007815210056, + "Storage Machine Image_europe-west1_A652-E97D-AB77": 0.0699679014574616, + "Storage PD Capacity in Finland_europe-north1_CEF4-0773-7924": 0.00017582707098630097, + "Storage PD Capacity in Frankfurt_europe-west3_7A7B-EA46-2897": 0.02500299043766332, + "Storage PD Capacity in London_europe-west2_BF1A-6647-009D": 0.006512544101050774, + "Storage PD Capacity in Netherlands_europe-west4_AE8C-46C3-4994": 0.0015564980447847813, + "Storage PD Capacity in Sao Paulo_southamerica-east1_DF49-E005-E705": 0.000833596554653056, + "Storage PD Capacity in Singapore_asia-southeast1_0572-568A-4FC4": 0.0010350916727511305, + "Storage PD Capacity in Warsaw_europe-central2_5881-96B1-93E3": 0.0027867632765645775, + "Storage PD Capacity in Zurich_europe-west6_17A8-D0A4-D7E5": 0.033889724153283424, + "Storage PD Capacity_asia-east1_D973-5D65-BAB2": 0.0, + "Storage PD Capacity_europe-west1_D973-5D65-BAB2": 0.0016250242857476704, + "Storage PD Capacity_us-central1_D973-5D65-BAB2": 0.029011514912674872, + "Storage PD Capacity_us-east1_D973-5D65-BAB2": 0.0012223555093123979, + "Storage PD Capacity_us-west1_D973-5D65-BAB2": 0.0017432219209411015, + "Storage PD Snapshot in European Union_europe_9ECE-16D9-A2B4": 0.0017664409093037243, + "Storage PD Snapshot_europe-west1_66AB-BA17-351C": 0.06238947153422955, + "Storage PD Snapshot_europe-west1_817F-F5A3-514E": 0.13984151664397917, + "Storage PD Snapshot_us-central1_66AB-BA17-351C": 5.579391388778391, + "Streaming Insert (europe-west1)_europe-west1_8DDC-7E2E-02F5": 0.0001213279592510891, + "Streaming Insert (europe-west4)_europe-west4_8AC0-C352-9C7E": 9.300566995027515e-6, + "Streaming Insert_europe_934C-4547-E59A": 1.953792808464699e-6, + "Streaming Insert_us_934C-4547-E59A": 2.999978611354272e-6, + "Streaming data processed for Belgium_europe-west1_0186-E173-6D23": 0.0013019297541073185, + "Subscriptions message backlog_global_3EAB-48F3-A0D5": 0.028792905389234336, + "Subscriptions retained acknowledged messages_global_3C0B-A83B-E6EE": 0.012800825293258966, + "Text Detection Operations_europe-west1_CC5B-B143-D056": 8.77655526534035e-6, + "Text query operation for interacting with Dialogflow CX agents_europe-west2_2DA2-9861-0744": 7.377489093591631e-5, + "Text session for interacting with Dialogflow CX agents_europe-west2_A1CC-751A-CDCC": 0.0024442199519990643, + "Training Unit-Hours (Europe/Asia) for AI Platform or AI Platform (Unified)_europe-west1_886A-68FF-EE9D": 0.5464499133284015, + "Training Unit-Hours (Europe/Asia) for AI Platform or AI Platform (Unified)_europe-west2_886A-68FF-EE9D": 257.98232993725316, + "Training Unit-Hours (Europe/Asia) for AI Platform or AI Platform (Unified)_europe-west4_886A-68FF-EE9D": 0.4297221815093545, + "Training Unit-Hours (Europe/Asia) for AI Platform or Vertex AI_europe-west1_886A-68FF-EE9D": 0.6769796965778372, + "Training Unit-Hours (Europe/Asia) for AI Platform or Vertex AI_europe-west4_886A-68FF-EE9D": 0.6918093448144896, + "Training Unit-Hours for AI Platform or AI Platform (Unified)_us-central1_F91B-90A2-CF35": 0.31743388219831165, + "Training Unit-Hours for AI Platform or AI Platform (Unified)_us-west1_F91B-90A2-CF35": 49.685022557944244, + "Training Unit-Hours for AI Platform or Vertex AI_us-central1_F91B-90A2-CF35": 0.19883389619728598, + "VM state: suspended RAM in EMEA_europe-west1_D50B-484D-C2A2": 0.00015404478938241603, + "Vertex AI: AutoML Image Classification Model Training_us-central1_9D55-7787-F4B0": 0.525616802809556, + "Vertex AI: AutoML Structured Data Model Training_europe-west1_AC9D-BD60-6F67": 2.4679539771242, + "Vertex AI: Online/Batch Prediction N1 Predefined Instance Core running in EMEA for AI Platform_europe-west1_6B7D-3B6D-6338": 0.009179203075176206, + "Vertex AI: Online/Batch Prediction N1 Predefined Instance Core running in Netherlands for AI Platform_europe-west4_A482-DD61-9F4C": 0.016366352286907963, + "Vertex AI: Online/Batch Prediction N1 Predefined Instance Ram running in EMEA for AI Platform_europe-west1_967C-BEC2-A4F7": 0.002447665971557117, + "Vertex AI: Online/Batch Prediction N1 Predefined Instance Ram running in Netherlands for AI Platform_europe-west4_D564-0029-7DB4": 0.00468992755443468, + "Vertex AI: Online/Batch Prediction Nvidia Tesla K80 GPU running in EMEA for AI Platform_europe-west1_ECD9-F804-B844": 0.06627312230647767, + "Vertex AI: Training/Pipelines on E2 Instance Core running in EMEA_europe-west1_F3DD-769C-08F8": 0.01084119840824816, + "Vertex AI: Training/Pipelines on E2 Instance Core running in Netherlands_europe-west4_7EE0-1307-7CDA": 6.020336655535654, + "Vertex AI: Training/Pipelines on E2 Instance Ram running in EMEA_europe-west1_7268-29E8-085B": 0.0027102996020620398, + "Vertex AI: Training/Pipelines on E2 Instance Ram running in Netherlands_europe-west4_13F7-2048-163D": 1.5050841638839134, + "Vertex AI: Training/Pipelines on N1 Predefined Instance Core running in Americas_us-central1_2A57-4214-1832": 0.020867386273694468, + "Vertex AI: Training/Pipelines on N1 Predefined Instance Core running in EMEA_europe-west1_6C4C-87AA-CA35": 0.5770233130578624, + "Vertex AI: Training/Pipelines on N1 Predefined Instance Core running in Netherlands_europe-west4_48AB-35F4-009F": 33.396659012871886, + "Vertex AI: Training/Pipelines on N1 Predefined Instance Ram running in Americas_us-central1_DE93-D712-2AE4": 0.005365209000503747, + "Vertex AI: Training/Pipelines on N1 Predefined Instance Ram running in EMEA_europe-west1_9F52-EE28-6E64": 0.1539922451627861, + "Vertex AI: Training/Pipelines on N1 Predefined Instance Ram running in Netherlands_europe-west4_6044-F246-06F3": 5.137947540441831, + "Vertex AI: Training/Pipelines on N2 Instance Core running in EMEA_europe-west1_EE98-9C23-32CB": 0.0, + "Vertex AI: Training/Pipelines on N2 Instance Ram running in EMEA_europe-west1_142D-1894-6B73": 0.2638751139929829, + "Vertex AI: Training/Pipelines on Nvidia Tesla K80 GPU running in Americas_us-central1_9005-5962-1FA7": 0.2758382431079855, + "Vertex AI: Training/Pipelines on Nvidia Tesla K80 GPU running in EMEA_europe-west1_AE09-C38E-768A": 2.3448790918491835, + "Vertex AI: Training/Pipelines on SSD backed PD Capacity in Netherlands_europe-west4_5BB8-03BD-5F83": 149.5897694698481, + "Vertex AI: Training/Pipelines on SSD backed PD Capacity_europe-west1_A005-98FE-36CC": 14.12536939228423, + "Vertex AI: Training/Pipelines on SSD backed PD Capacity_us-central1_A005-98FE-36CC": 0.632492297346404, + "Vpn Tunnel_europe-west1_F0F2-AD13-F11A": 0.005739093169807371, + "Zonal Kubernetes Clusters_europe-central2-a_6B92-A835-08AB": 0.06191163501755005, + "Zonal Kubernetes Clusters_europe-west1-b_6B92-A835-08AB": 0.009272912995397307, + "Zonal Kubernetes Clusters_europe-west1-d_6B92-A835-08AB": 0.011380225460214277, + "Zonal Kubernetes Clusters_europe-west2-a_6B92-A835-08AB": 0.016696239746597726, + "Zonal Kubernetes Clusters_europe-west2-b_6B92-A835-08AB": 0.02537068314053299, + "Zonal Kubernetes Clusters_europe-west4-b_6B92-A835-08AB": 0.030199664689238778, + "Zonal Kubernetes Clusters_us-central1-a_6B92-A835-08AB": 0.023880887125244894, + "Zonal Kubernetes Clusters_us-central1-b_6B92-A835-08AB": 0.030172996890567443, + "Zonal Kubernetes Clusters_us-central1-c_6B92-A835-08AB": 0.02723936084355022, + "Zonal Kubernetes Clusters_us-east1-c_6B92-A835-08AB": 0.035914832974202386, + "vCPU Time Batch Belgium_europe-west1_161E-6FF0-CFDE": 0.0018781784675716044, + "vCPU Time Batch Frankfurt_europe-west3_FA77-1E01-AA8D": 0.0007396368374135509, + "vCPU Time Batch Iowa_us-central1_A613-4169-2E08": 0.004448618059945409, + "vCPU Time Batch London_europe-west2_A9B8-BA0E-0306": 0.00294400328586005, + "vCPU Time Batch Netherlands_europe-west4_678D-F403-CE7C": 0.0038122384801867275, + "vCPU Time Batch Oregon_us-west1_4A1E-85F7-BB33": 0.0006480480681919254, + "vCPU Time Streaming Belgium_europe-west1_70DD-3D9E-03F7": 0.001589286132233631, + "vCPU Time Streaming Iowa_us-central1_7DA8-1ADF-661B": 0.005000914816259563 +} diff --git a/src/db/query.ts b/src/db/query.ts index 99293b3a..750203fa 100644 --- a/src/db/query.ts +++ b/src/db/query.ts @@ -1,6 +1,6 @@ // In order to make upserting more efficient, prices in postgres are stored as a map of priceHash -> prices. import format from 'pg-format'; -import { Price, Product, ProductAttributes } from './types'; +import { Emission, Price, Product, ProductAttributes } from './types'; import config from '../config'; type AttributeFilter = { @@ -10,7 +10,7 @@ type AttributeFilter = { value_regex?: string; }; -type ProductWithPriceMap = { +type ProductWithPriceAndEmissionsMap = { productHash: string; sku: string; vendorName: string; @@ -19,10 +19,11 @@ type ProductWithPriceMap = { productFamily: string; attributes: ProductAttributes; prices: { [priceHash: string]: Price[] }; + emissions: { [emissionHash: string]: Emission[] }; }; -function flattenPrices(p: ProductWithPriceMap): Product { - return { ...p, prices: Object.values(p.prices).flat() }; +function flattenPrices(p: ProductWithPriceAndEmissionsMap): Product { + return { ...p, prices: Object.values(p.prices).flat(), emissions: Object.values(p.emissions).flat() }; } // eslint-disable-next-line import/prefer-default-export @@ -53,7 +54,7 @@ export async function findProducts( } const response = await pool.query(sql); - const products = response.rows as ProductWithPriceMap[]; + const products = response.rows as ProductWithPriceAndEmissionsMap[]; return products.map((product) => flattenPrices(product)); } diff --git a/src/db/setup.ts b/src/db/setup.ts index fc1a7476..17dfa3e4 100644 --- a/src/db/setup.ts +++ b/src/db/setup.ts @@ -18,9 +18,10 @@ export async function createProductsTable( service text NOT NULL, "productFamily" text DEFAULT ''::text NOT NULL, attributes jsonb NOT NULL, - prices jsonb NOT NULL, + prices jsonb NOT NULL, + emissions jsonb NOT NULL DEFAULT '[]'::jsonb, CONSTRAINT %I PRIMARY KEY("productHash") - ) + ) `, tableName, `${tableName}_pkey` @@ -72,7 +73,7 @@ export async function createStatsTable( total_runs bigint DEFAULT 0, ci_runs bigint DEFAULT 0, non_ci_runs bigint DEFAULT 0 - ) + ) `, tableName ) @@ -101,7 +102,7 @@ export async function createInstallsTable( ( install_id uuid PRIMARY KEY NOT NULL, created_at timestamp DEFAUlT NOW() NOT NULL - ) + ) `, tableName ) diff --git a/src/db/types.ts b/src/db/types.ts index 57eda363..2f14cd72 100644 --- a/src/db/types.ts +++ b/src/db/types.ts @@ -9,6 +9,7 @@ export type Product = { productFamily: string; attributes: ProductAttributes; prices: Price[]; + emissions: Emission[]; }; export type Price = { @@ -26,3 +27,14 @@ export type Price = { termOfferingClass?: string; description?: string; }; + +export type Emission = { + emissionHash: string; + unit: string; + emissions: string; + effectiveDateStart: string; + effectiveDateEnd?: string; + startUsageAmount?: string; + endUsageAmount?: string; + description?: string; +} diff --git a/src/resolvers.ts b/src/resolvers.ts index 313e9b73..c6e02e80 100644 --- a/src/resolvers.ts +++ b/src/resolvers.ts @@ -1,6 +1,6 @@ import { IResolvers } from '@graphql-tools/utils'; import mingo from 'mingo'; -import { Price, Product } from './db/types'; +import { Emission, Price, Product } from './db/types'; import currency, { CURRENCY_CODES } from './utils/currency'; import { findProducts } from './db/query'; import { ApplicationOptions } from './app'; @@ -28,6 +28,10 @@ interface PricesArgs { filter: Filter; } +interface EmissionsArgs { + filter: Filter; +} + type TransformedProductAttribute = { key: string; value: string; @@ -77,6 +81,14 @@ const getResolvers = ( return prices; }, + emissions: async (product: Product, args: EmissionsArgs): Promise => { + + const emissions = mingo + .find(product.emissions, transformFilter(args.filter)) + .all() as Emission[]; + + return emissions; + }, }, Price: // For every alternate currency, add a resolver that converts from USD. diff --git a/src/scrapers/awsBulk.ts b/src/scrapers/awsBulk.ts index c851aa71..2a17d69b 100644 --- a/src/scrapers/awsBulk.ts +++ b/src/scrapers/awsBulk.ts @@ -207,6 +207,7 @@ function parseProduct(productJson: ProductJson) { sku: productJson.sku, attributes: productJson.attributes, prices: [], + emissions: [], }; product.productHash = generateProductHash(product); diff --git a/src/scrapers/azureRetail.ts b/src/scrapers/azureRetail.ts index 4523335c..efa3f591 100644 --- a/src/scrapers/azureRetail.ts +++ b/src/scrapers/azureRetail.ts @@ -139,6 +139,7 @@ function parseProduct(productJson: ProductJson): Product { meterName: productJson.meterName, }, prices: [], + emissions: [], }; product.productHash = generateProductHash(product); diff --git a/src/scrapers/gcpCatalog.ts b/src/scrapers/gcpCatalog.ts index f7287523..221b9c2c 100644 --- a/src/scrapers/gcpCatalog.ts +++ b/src/scrapers/gcpCatalog.ts @@ -191,6 +191,7 @@ function parseProduct(productJson: ProductJson, region: string): Product { resourceGroup: productJson.category.resourceGroup, }, prices: [], + emissions: [], }; product.productHash = generateProductHash(product); diff --git a/src/scrapers/gcpMachineTypes.ts b/src/scrapers/gcpMachineTypes.ts index b877a9e9..04df52eb 100644 --- a/src/scrapers/gcpMachineTypes.ts +++ b/src/scrapers/gcpMachineTypes.ts @@ -129,6 +129,7 @@ async function scrape(): Promise { machineType: name, }, prices: [], + emissions: [], }; product.productHash = generateProductHash(product); diff --git a/src/typeDefs.ts b/src/typeDefs.ts index 4b473675..eb5e9a1f 100644 --- a/src/typeDefs.ts +++ b/src/typeDefs.ts @@ -18,6 +18,17 @@ const typeDefs = gql` termOfferingClass: String } + type Emission { + emissionHash: String! + unit: String! + emissions: String! + effectiveDateStart: String + effectiveDateEnd: String + startUsageAmount: String + endUsageAmount: String + description: String + } + type Product { productHash: String! vendorName: String! @@ -27,6 +38,7 @@ const typeDefs = gql` sku: String! attributes: [Attribute] prices(filter: PriceFilter): [Price] + emissions(filter: EmissionFilter): [Emission] } type Attribute { @@ -61,6 +73,14 @@ const typeDefs = gql` termOfferingClass: String } + input EmissionFilter { + unit: String + description: String + description_regex: String + startUsageAmount: String + endUsageAmount: String + } + type Query { products(filter: ProductFilter): [Product] } diff --git a/tsconfig.json b/tsconfig.json index f7a0052b..7e808531 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "lib": ["esnext"], "esModuleInterop": true, "declaration": true, + "resolveJsonModule": true, }, "include": [ "src/**/*"