Description
📝 Scenario
As a FinOps practitioner, I need to leverage new FOCUS 1.2 columns in order to account for commitment discount flexibility and track capacity reservations
💎 Solution
Implement FOCUS 1.2
📋 Tasks
- Don't break when 1.2 exports show up
- Create new schema mapping file for the Cost Management export dataset version in the schemas folder
- Add file to file upload list in storage.bicep
- Add new columns to the *_raw tables per dataset in IngestionSetup_RawTables.kql
- Update Costs_transform_v1_0 to handle 1.2 to 1.0 conversion
- Update the storage reports to account for 1.2 differences
- Update ingestion database scripts
- Save a copy of the latest version of the IngestionSetup_vX_Y.kql using the latest FOCUS version
- If updating the same version, increment the release number (e.g.,
r2
)
- If updating the same version, increment the release number (e.g.,
- Rename all functions, tables, and policies in the new file to the new version (leave the old as-is)
- Update the *_final_vX_Y tables to account for any new columns
- Update the *_transform_vX_Y functions to account for any new columns
- Update the script to delete the old update policy for the *_raw tables
- Confirm the new file has the update policy set to use the latest version of the transform function and final table
- Save a copy of the latest version of the IngestionSetup_vX_Y.kql using the latest FOCUS version
- Update hub database scripts
- Add new FOCUS version section after the latest version section and before existing version sections
- Create new *_vX_Y functions per dataset that transforms older data to the new FOCUS version
- Update the unversioned functions to use the new *_vX_Y functions
- Update older versioned functions to also pull from the new *_vX_Y functions and transform to the old schema
- Update reports and dashboards
- Update the KQL reports to use the new versioned functions
- Update the ADX dashboard to use the new versioned functions
- Update the FOCUS queries in the best practices library to use the new versioned functions
- Update the Power BI connector report to FOCUS 1.1 (TBD)
- Update FOCUS documenation
- FOCUS overview
- FOCUS mapping docs
- FOCUS metadata doc
- FOCUS 1.2 conformance summary/report
- Create a doc that summarizes changes in each version
- Update other toolkit tools and resources
- Add FOCUS 1.2-preview metadata file
- Add FOCUS 1.2-preview open data sample
- Update New-FinOpsCostExport command to support 1.2-preview
- Stretch goals
- Change all decimal columns to real
- Update Recommendations schema
- Duplicate columns instead of replacing values
- [Hubs] Support Tencent FOCUS data #1274
- Verify if there are any cloud provider version updates
- Promote PBI/ADX dashboard queries into the main tables
- Fix Prices.CommitmentDiscountSpend/UsageEligibility
- [Hubs] Data ingestion transform changes #1111
ℹ️ Additional context
- Rename the following columns:
- x_InvoiceId → InvoiceId.
- x_PricingCurrency → PricingCurrency.
- x_SkuDetails → SkuPriceDetails.
- “CoreCount” for number of CPUs/vCPUs/cores/vCores.
- “DiskMaxIops” for disk I/O operations per second (IOPS).
- “DiskSpace” for disk size in GiB.
- “DiskType” for the kind of disk (e.g., SSD, HDD, NVMe).
- “GpuCount” for the number of GPUs.
- “InstanceType” for the resource size/SKU (e.g., ArmSkuName).
- “InstanceSeries” for the size family/series.
- “MemorySize” for the RAM in GiB.
- “NetworkMaxIops” for network I/O operations per second (IOPS).
- “NetworkMaxThroughput” for network max throughput for data transfer in Mbps.
- “OperatingSystem” for the OS name.
- “Redundancy” for the level of redundancy (e.g., Local, Zonal, Global).
- “StorageClass” for the tier of storage (e.g., Hot, Archive, Nearline).
- Prefix all other properties with “x_”
- x_SkuMeterName → SkuMeter.
- Add the following new columns for VM on-demand capacity reservations:
- CapacityReservationId = AdditionalInfo.VMCapacityReservationId.
- CapacityReservationStatus which will need to copy data out of AdditionalInfo.
- Add the following new columns for commitment discount utilization and coverage:
- CommitmentDiscountQuantity
- Savings plans = EffectiveCost / ExchangeRate.
- Reservations = PricingQuantity / x_PricingBlockSize * x_CommitmentDiscountNormalizedRatio.
- CommitmentDiscountUnit
- Savings plans = x_PricingCurrency (e.g., “USD”, “CNY”).
- Reservations w/o ISF = PricingUnit (e.g., “Hours”, “GB”).
- Reservations w/ ISF = "Normalized {PricingUnit}".
- x_CommitmentDiscountNormalizedRatio = AdditionalInfo.RINormalizationRatio ?? null.
- x_CommitmentDiscountSpendEligibility = “Covered” / “Eligible” / “Not Eligible”
- x_CommitmentDiscountUsageEligibility = “Covered” / “Eligible” / “Not Eligible”
- x_AmortizationClass
- “Principal” for commitment discount purchases and refunds.
- “Amortized Charge” for commitment discount usage rows.
- (null) for all other rows.
- CommitmentDiscountQuantity
- Add the following other new columns:
- ServiceSubcategory with a new mapping.
- x_ServiceModel with a new mapping.
- x_SkuPlanName = PlanName (marketplace meter metadata).
- x_SkuSize = ArmSkuName (meter metadata).
- Update the following columns to fix known bugs:
- BillingPeriodEnd is showing Oct 2 (as of Sep 26).
- ContractedUnitPrice/ContractedCost = UnitPrice for on-demand prices based on MeterId and PartNumber (EA) or PSMT (MCA).
- ListUnitPrice/ListCost = MarketPrice for on-demand prices based on MeterId/PartNumber (EA) or PSMT (MCA).
- SkuId = ProductId (same value for EA and MCA) and replace -1 with null.
- SkuPriceId = “{PriceType}{Term}{ChargeCategory}{MeterId}{ProductId}{SkuId}{MeterType}{TierId}{OfferId}_???”.
- SubAccountName = Replace "Unasigned" with null.
- x_AccountId = Replace "-2" with null.
- x_AccountName = Replace "Unassigned" with null.
- x_AccountOwnerId = Replace "Unassigned" with null.
- x_InvoiceSectionId = Replace "-2" with null.
- x_InvoiceSectionName = Replace "Unassigned" with null.
- x_PricingUnitDescription = Replace "Unassigned" with null.
- PublisherName is null for reservation usage, reservation purchases, and savings plan unused charges.
For additional information about what’s included in the FOCUS 1.1 release, refer to the FOCUS changelog.
🙋♀️ Ask for the community
We could use your help:
- Please vote this issue up (👍) to prioritize it.
- Leave comments to help us solidify the vision.