diff --git a/.github/fabricbot.json b/.github/fabricbot.json new file mode 100644 index 00000000..d94506f9 --- /dev/null +++ b/.github/fabricbot.json @@ -0,0 +1,558 @@ +{ + "version": "1.0", + "tasks": [ + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestResponder", + "version": "1.0", + "config": { + "taskName": "Do not allow PRs to be merged into main", + "eventType": "pull_request", + "eventNames": ["pull_request", "issues", "project_card"], + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isAction", + "parameters": { + "action": "opened" + } + }, + { + "name": "prTargetsBranch", + "parameters": { + "branchName": "main" + } + } + ] + }, + "actions": [ + { + "name": "addReply", + "parameters": { + "comment": "Hi @${issueAuthor}. We noticed you created this PR against `main`. We don't accept PRs against `main`. Please use `dev` or a `features/*` branch instead. To learn more, see [Select a branch](https://github.com/microsoft/cloud-hubs/tree/dev/src#-select-a-branch)." + } + }, + { + "name": "addLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + } + ] + } + }, + { + "taskName": "Label solutions", + "taskType": "trigger", + "capabilityId": "PrAutoLabel", + "subCapability": "Path", + "version": "1.0", + "config": { + "configs": [ + { + "label": "Solution: FinOps hubs", + "pathFilter": ["src/templates/finops-hub"] + }, + { + "label": "Solution: Workbooks", + "pathFilter": ["src/workbooks"] + }, + { + "label": "Solutions: Bicep Registry", + "pathFilter": ["src/bicep-registry"] + }, + { + "label": "Area: GitHub", + "pathFilter": [".github"] + } + ], + "taskName": "Solution labels" + } + }, + { + "taskType": "trigger", + "capabilityId": "InPrLabel", + "subCapability": "InPrLabel", + "version": "1.0", + "config": { + "label_inPr": "Status: 🔬 Code review", + "fixedLabelEnabled": true, + "taskName": "Label issues in review", + "label_fixed": "Status: 📦 Pending release" + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestReviewResponder", + "version": "1.0", + "config": { + "taskName": "PR changes requested - Needs attention", + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isAction", + "parameters": { + "action": "submitted" + } + }, + { + "name": "isReviewState", + "parameters": { + "state": "changes_requested" + } + } + ] + }, + "actions": [ + { + "name": "addLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + } + ], + "eventType": "pull_request", + "eventNames": ["pull_request_review"] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestResponder", + "version": "1.0", + "config": { + "taskName": "PR updated by author - Needs review", + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": { + "type": "author" + } + } + }, + { + "operator": "not", + "operands": [ + { + "name": "isAction", + "parameters": { + "action": "closed" + } + } + ] + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + } + ] + }, + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + }, + { + "name": "addLabel", + "parameters": { + "label": "Needs: Review 👀" + } + } + ], + "eventType": "pull_request", + "eventNames": ["pull_request", "issues", "project_card"] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestCommentResponder", + "version": "1.0", + "config": { + "taskName": "PR comments - Needs review", + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": { + "type": "author" + } + } + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + } + ] + }, + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + }, + { + "name": "addLabel", + "parameters": { + "label": "Needs: Review 👀" + } + } + ], + "eventType": "pull_request", + "eventNames": ["issue_comment"] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestReviewResponder", + "version": "1.0", + "config": { + "taskName": "PR review comments - Needs review", + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": { + "type": "author" + } + } + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + } + ] + }, + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + }, + { + "name": "addLabel", + "parameters": { + "label": "Needs: Review 👀" + } + } + ], + "eventType": "pull_request", + "eventNames": ["pull_request_review"] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestResponder", + "version": "1.0", + "config": { + "taskName": "PR revived - Needs review", + "conditions": { + "operator": "and", + "operands": [ + { + "operator": "not", + "operands": [ + { + "name": "isAction", + "parameters": { + "action": "closed" + } + } + ] + }, + { + "name": "hasLabel", + "parameters": { + "label": "Resolution: No activity" + } + } + ] + }, + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "Resolution: No activity" + } + }, + { + "name": "addLabel", + "parameters": { + "label": "Needs: Review 👀" + } + } + ], + "eventType": "pull_request", + "eventNames": ["pull_request", "issues", "project_card"] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestCommentResponder", + "version": "1.0", + "config": { + "taskName": "PR revived via comments - Needs review", + "conditions": { + "operator": "and", + "operands": [ + { + "name": "hasLabel", + "parameters": { + "label": "Resolution: No activity" + } + } + ] + }, + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "Resolution: No activity" + } + }, + { + "name": "addLabel", + "parameters": { + "label": "Needs: Review 👀" + } + } + ], + "eventType": "pull_request", + "eventNames": ["issue_comment"] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestReviewResponder", + "version": "1.0", + "config": { + "taskName": "PR revived via review - Needs review", + "conditions": { + "operator": "and", + "operands": [ + { + "name": "hasLabel", + "parameters": { + "label": "Resolution: No activity" + } + } + ] + }, + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "Resolution: No activity" + } + }, + { + "name": "addLabel", + "parameters": { + "label": "Needs: Review 👀" + } + } + ], + "eventType": "pull_request", + "eventNames": ["pull_request_review"] + } + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.1", + "config": { + "taskName": "PR inactive 3mo - Close", + "frequency": [ + { + "weekDay": 0, + "hours": [4, 10, 16, 22] + }, + { + "weekDay": 1, + "hours": [4, 10, 16, 22] + }, + { + "weekDay": 2, + "hours": [4, 10, 16, 22] + }, + { + "weekDay": 3, + "hours": [4, 10, 16, 22] + }, + { + "weekDay": 4, + "hours": [4, 10, 16, 22] + }, + { + "weekDay": 5, + "hours": [4, 10, 16, 22] + }, + { + "weekDay": 6, + "hours": [4, 10, 16, 22] + } + ], + "searchTerms": [ + { + "name": "isPr", + "parameters": {} + }, + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + }, + { + "name": "hasLabel", + "parameters": { + "label": "Resolution: No activity" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 91 + } + } + ], + "actions": [ + { + "name": "closeIssue", + "parameters": {} + } + ] + } + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.1", + "config": { + "taskName": "PR inactive 4 weeks - Comment and flag", + "frequency": [ + { + "weekDay": 0, + "hours": [5, 11, 17, 23] + }, + { + "weekDay": 1, + "hours": [5, 11, 17, 23] + }, + { + "weekDay": 2, + "hours": [5, 11, 17, 23] + }, + { + "weekDay": 3, + "hours": [5, 11, 17, 23] + }, + { + "weekDay": 4, + "hours": [5, 11, 17, 23] + }, + { + "weekDay": 5, + "hours": [5, 11, 17, 23] + }, + { + "weekDay": 6, + "hours": [5, 11, 17, 23] + } + ], + "searchTerms": [ + { + "name": "isPr", + "parameters": {} + }, + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Attention 👋" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 28 + } + }, + { + "name": "noLabel", + "parameters": { + "label": "Resolution: No activity" + } + } + ], + "actions": [ + { + "name": "addLabel", + "parameters": { + "label": "Resolution: No activity" + } + }, + { + "name": "addReply", + "parameters": { + "comment": "This PR has not been updated in 4 weeks. Please respond to comments and update the PR. It will be closed if not updated **in the next 2 months**." + } + } + ] + } + }, + { + "taskType": "trigger", + "capabilityId": "AutoMerge", + "subCapability": "AutoMerge", + "version": "1.0", + "config": { + "taskName": "PR automerge 3 day wait - Automerge", + "label": "Resolution: Automerge", + "silentMode": false, + "minMinutesOpen": "4320", + "mergeType": "squash", + "allowAutoMergeInstructionsWithoutLabel": true, + "deleteBranches": true, + "removeLabelOnPush": true, + "requireSpecificCheckRuns": false, + "conditionalMergeTypes": [] + } + } + ], + "userGroups": [] +} diff --git a/.github/policies/pull-requests.yml b/.github/policies/pull-requests.yml index 33d7f849..b94d1e2e 100644 --- a/.github/policies/pull-requests.yml +++ b/.github/policies/pull-requests.yml @@ -1,21 +1,18 @@ -name: PR needs review -description: Assign Needs Review label to new/updated PRs +name: PR lifecycle +description: Pull request lifecycle resource: repository -# Cheat sheet: https://github.com/microsoft/cloud-hubs/tree/main/.github/README.md#fabricbot-policies-cheat-sheet -# spell-checker:disable configuration: fabricBotConfiguration: eventResponderTasks: - # PR lifecycle: (New) > #Review > #Attenton > #Review > Close - - # 1. (New) > #Review when opened - if: - payloadType: Pull_Request - and: - - targetsBranch: - branch: main - - isOpen + - or: + - targetsBranch: + branch: dev + - targetsBranch: + branch: features/* - or: - isAction: action: Opened @@ -26,39 +23,28 @@ configuration: label: 'Needs: Review 👀' - assignTo: user: ankur-ms - - assignTo: - user: tsilvers-ms - assignTo: user: flanakin + - assignTo: + user: sreenav + - assignTo: + user: tsilvers-ms - requestReview: reviewer: ankur-ms - - requestReview: - reviewer: tsilvers-ms - requestReview: reviewer: flanakin - - # 2. #Review > #Attention when changes are requested - # - if: - # - payloadType: Pull_Request_Review - # - and: - # - targetsBranch: - # branch: main - # - isAction: - # action: Submitted - # - isReviewState: - # state: Changes_requested - # - hasLabel: - # label: 'Needs: Review 👀' - # then: - # - removeLabel: - # label: 'Needs: Review 👀' - # - addLabel: - # label: 'Needs: Attention 👋' - - # 3a. #Attenton > #Review when PR updated + - requestReview: + reviewer: sreenav + - requestReview: + reviewer: tsilvers-ms - if: - payloadType: Pull_Request - and: + - or: + - targetsBranch: + branch: dev + - targetsBranch: + branch: features/* - isActivitySender: issueAuthor: true - isAction: @@ -70,37 +56,3 @@ configuration: label: 'Needs: Attention 👋' - addLabel: label: 'Needs: Review 👀' - - # 3b. #Attenton > #Review when PR review dismissed - # - if: - # - payloadType: Pull_Request_Review - # - and: - # - isActivitySender: - # issueAuthor: true - # - isAction: - # action: Dismissed - # - hasLabel: - # label: 'Needs: Attention 👋' - # then: - # - removeLabel: - # label: 'Needs: Attention 👋' - # - addLabel: - # label: 'Needs: Review 👀' - - # 3c. #Attenton > #Review when PR comment updated - - if: - - payloadType: Pull_Request_Review_Comment - - and: - - isActivitySender: - issueAuthor: true - - isAction: - action: Updated - - hasLabel: - label: 'Needs: Attention 👋' - then: - - removeLabel: - label: 'Needs: Attention 👋' - - addLabel: - label: 'Needs: Review 👀' - - # 4. #Review > Close diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..7b0a1163 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Deploy Hub", + "type": "PowerShell", + "request": "launch", + "script": "./Deploy-Toolkit finops-hub -Build", + "cwd": "${workspaceFolder}/src/scripts", + "presentation": { + "hidden": false, + "group": "", + "order": 1, + }, + }, + ], +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 1e941667..13351134 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,6 +13,7 @@ "quickstarts", "Roadmap", "startswith", + "templating", "triaging", "Unhide" ], diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..216d8856 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "label": "Build Toolkit", + "type": "shell", + "command": "./Build-Toolkit", + "options": { + "cwd": "${workspaceFolder}/src/scripts", + }, + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true, + }, + "isBackground": false, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": false, + }, + } + ] +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c6351a75..2dd4dcb4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contributing to the FinOps toolkit +# 🛠️ Contributing to the FinOps toolkit Welcome, and thank you for your interest in contributing to the FinOps toolkit! Your time and effort is greatly appreciated, no matter how big or small the contribution is. @@ -8,20 +8,20 @@ There are many ways in which you can contribute, beyond writing code. The goal o On this page: -- [Asking questions](#asking-questions) -- [Suggesting features and reporting bugs](#suggesting-features-and-reporting-bugs) -- [Reviewing code changes](#reviewing-code-changes) -- [Making code changes](#making-code-changes) +- [🙋‍♀️ Asking questions](#️-asking-questions) +- [ℹ️ Suggesting features and reporting bugs](#ℹ️-suggesting-features-and-reporting-bugs) +- [👀 Reviewing code changes](#-reviewing-code-changes) +- [👩‍💻 Making code changes](#-making-code-changes) --- -## Asking questions +## 🙋‍♀️ Asking questions Have a question? Please ask in [Discussions](../../discussions). Avoid asking questions in issues to keep issues clean and focused on product improvements. If not sure, start a discussion and create an issue based on that discussion later, if needed.
-## Suggesting features and reporting bugs +## ℹ️ Suggesting features and reporting bugs If you have an idea or notice a bug, [search open issues](../../issues) to see if an issue already exists. @@ -31,7 +31,7 @@ If you don't find your issue, [create a new issue](../../issues/new/choose) per
-## Reviewing code changes +## 👀 Reviewing code changes If you want to help out with code, but aren't quite ready to jump in yet, start by reviewing [pull requests](../../pulls). Please don't sign off unless you've reviewed, understand, and agree with every change. If you'd like to contribute PR feedback without signing off, add comments without approving. These reviews are just as valuable as sign-off reviews because they help improve the overall quality! @@ -41,7 +41,7 @@ When possible, try to suggest code changes using **Add a suggestion** to streaml
-## Making code changes +## 👩‍💻 Making code changes If you want to contribute code changes, but aren't sure where to start, scan through [existing issues](../../issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc) to find one that interests you. Use `labels` to narrow down your search. @@ -53,7 +53,7 @@ For details about contributing code changes and submitting pull requests, see [H
-# Thank you! +# 🙏 Thank you! Your contributions to open source, large or small, make projects like this possible. Thank you for taking the time to contribute. diff --git a/README.md b/README.md index 3f061556..4cbca208 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,14 @@ -# 🛠️ Microsoft Cloud FinOps toolkit +# 🧰 FinOps toolkit - ℹ️ _This project is in the early concept phase. If interested, please contact micflan@microsoft.com._ + ℹ️ _This project is in the early concept phase. If interested, please let us know in [discussions](https://github.com/microsoft/cloud-hubs/discussions/categories/general)._ -The FinOps toolkit is a collection of customizable ARM templates used to build and deploy various cost management and optimization solutions. The main focus of the FinOps toolkit is to build a reliable, trustworthy platform for cost analytics, insights, and optimization, which we call **FinOps hubs**. +The FinOps toolkit is a collection of customizable ARM templates used to build and deploy various FinOps solutions that automate and extend native Microsoft Cost Management capabilities. The toolkit aims to include: + +- Starter kits that help you get started with Cost Management. +- Automation scripts to streamline cost configuration and management at scale. +- Advanced solutions to facilitate building custom solutions. + +While you will find numerous ARM templates within this repository, our main focus is to build a reliable, trustworthy platform for cost analytics, insights, and optimization, which we call **FinOps hubs**. FinOps hubs are **virtual command centers** for leaders throughout the organization to report on, monitor, and optimize cost based on their organizational needs. FinOps hubs focus on 3 core design principles: @@ -18,7 +24,7 @@ Looking to learn more about FinOps toolkit and how to get started? See [FinOps t
-## 👨‍💻 Contributing +## 👩‍💻 Contributing There are many ways to participate. From reporting bugs and requesting features to reviewing or even making code changes. See the [contribution guide ➡️](./CONTRIBUTING.md) @@ -38,7 +44,7 @@ This project has adopted the [Microsoft Open Source Code of Conduct](https://ope Usage of FinOps toolkit templates and modules is tracked by using a `defaultTelemetry` deployment. Microsoft may use this information to improve our products and services. You may turn off the telemetry by using the `enableDefaultTelemetry` parameter on any Bicep module. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. -> \_**NOTE:** You can review what is included in this telemetry in the Azure portal by viewing the details for any `pid-00f1n0b5-*` deployments under the Deployments section of the corresponding scope (e.g., resource group, subscription). +> _**NOTE:** You can review what is included in this telemetry in the Azure portal by viewing the details for any `pid-00f1n0b5-*` deployments under the Deployments section of the corresponding scope (e.g., resource group, subscription)._ ### Trademarks diff --git a/docs/README.md b/docs/README.md index 521e45cf..bee32671 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,139 +1,51 @@ -# FinOps toolkit documentation +# 📗 FinOps toolkit documentation -![Version: 0.0.1](https://img.shields.io/badge/version-0.0.1-blue)   ![Status: In progress](https://img.shields.io/badge/status-in_progress-blue) +![Version 0.0.1](https://img.shields.io/badge/version-v0.0.1-darkgreen) +  +[![Go to issue](https://img.shields.io/github/issues/detail/title/microsoft/cloud-hubs/104?label=roadmap)](https://github.com/microsoft/cloud-hubs/issues/104) -The **FinOps toolkit** seeks to provide a collection of customizable ARM templates that can be used to build homegrown cost management and optimization solutions. The project is in an early prerelease stage which establishes the foundation for what we call a **FinOps hub** – a reliable, trustworthy platform for cost analytics, insights, and optimization. +The FinOps toolkit is a collection of customizable Azure Resource Manager (ARM) templates used to deploy FinOps solutions that automate and extend native Microsoft Cost Management capabilities. This includes: - - -
+- Starter kits that help you get up and running with Cost Management. +- Automation scripts to streamline cost management and optimization at scale. +- Advanced solutions to facilitate building custom capabilities. On this page: -- [Summary](#summary) -- [Create a new hub](#create-a-new-hub) -- [Get started with hubs](#get-started-with-hubs) -- [Roadmap](#roadmap) -- [Get involved](#get-involved) -- [Changelog](#changelog) +- [🧰 Available tools](#-available-tools) +- [🗺️ Roadmap](#️-roadmap) +- [👩‍💻 Get involved](#-get-involved) +- [📜 Changelog](#-changelog) --- -## Summary - -The FinOps toolkit deploys a hub instance ([template](templates/finops-hub.md)), which includes the following resources: - -- Storage account (Data Lake Storage Gen2) to hold all cost data. -- Data factory to manage data ingestion and cleanup. - -Once deployed, you can create new exports in Cost Management and use out of the box Power BI reports to customize and share reports with your stakeholders. - -Screenshot of the cost summary report -Screenshot of the services cost report -Screenshot of the commitment-based discounts coverage report - -
- -## Create a new hub - -1. [Deploy the **finops-hub** template](./deploy). -2. [Create a new cost export](https://learn.microsoft.com/azure/cost-management-billing/costs/tutorial-export-acm-data?tabs=azure-portal) using the following settings: - - **Metric** = `Amortized cost` - - **Export type** = `Daily export of month-to-date costs` - > 💡 _**Tip:** Configuring a daily export starts in the current month. If you want to backfill historical data, create a one-time export and set the start/end dates to the desired date range._ - - **Storage account** = (Use subscription/resource from step 1) - - **Container** = `ms-cm-exports` - - **Directory** = (Use the resource ID of the scope you're exporting, but remove the first "/") - > ℹ️ _You are welcome to use any directory name you want. Using the scope ID is how we plan to do it in order to avoid collisions. You will see this added in a future release._ -3. Run your export. - - Exports can take up to a day to show up after first created. - - Use the **Run now** command at the top of the Cost Management Exports page. - - Your data should be available within 15 minutes or so, depending on how big your account is. -4. Download one or more of the available Power BI starter templates: - - [Cost summary](./reports/cost-summary.md) for standard cost roll-ups. - - [Commitment discounts](./reports/commitment-discounts.md) for commitment-based savings utilization and coverage. -5. [Connect Power BI to your hub](./reports/README.md#setup-a-finops-toolkit-report) - -> ![Version 0.0.2](https://img.shields.io/badge/version-0.0.2-lightgrey)   ![Status: Proposed](https://img.shields.io/badge/status-proposed-lightgrey)    [![Go to issue](https://img.shields.io/github/issues/detail/state/microsoft/cloud-hubs/60)](https://github.com/microsoft/cloud-hubs/issues/60) -> -> 🆕 _Remove steps 2 and 3 when we have self-managed exports._ - -
- -## Get started with hubs - -After deploying a hub instance, there are several ways for you to get started: - -1. Customize the built-in Power BI reports. - - Our Power BI reports are starter templates and intended to be customized. We encourage you to customize as needed. [Learn more](./reports). - -2. Create your own Power BI reports. - - If you'd like to create your own reports or add cost data to an existing report, you can either [copy queries from a toolkit report](./reports/README.md#setup-a-finops-toolkit-report) or [connect manually](./reports/README.md#connect-manually) using the Azure Data Lake Storage Gen2 connector. - - - - > ℹ️ _The schema may change multiple times before the 0.1 release. We will ensure Power BI reports have backwards compatibility, but if you access data directly, you may run into breaking changes with new releases. Familiarize yourself with [upcoming releases](https://aka.ms/finops/toolkit/roadmap) and review the [changelog](changelog.md) for breaking changes before you update._ - -3. Access the cost data from custom tools. - - Cost data is stored in an [Azure Data Lake Storage Gen2](https://learn.microsoft.com/azure/storage/blobs/data-lake-storage-introduction) account. You can use any tool that supports Azure Data Lake Storage Gen2 to access the data. Refer to the [data dictionary](./data-dictionary.md) for details about available columns. - - - - > ℹ️ _The schema may change multiple times before the 0.1 release. We will ensure Power BI reports have backwards compatibility, but if you access data directly, you may run into breaking changes with new releases. Familiarize yourself with [upcoming releases](https://aka.ms/finops/toolkit/roadmap) and review the [changelog](changelog.md) for breaking changes before you update._ - -4. Apply cost allocation logic, augment, or manipulate your cost data using Data Factory. - - [Data Factory](https://learn.microsoft.com/azure/data-factory/introduction) is used to ingest and transform data. We recommend using Data Factory as a cost-efficient solution to apply custom logic to your cost data. Use a consistent prefix for custom pipelines to ensure they don't overlap with new pipelines. Refer to [data processing](./data-processing.md) for details about how data is processed. - - > ⚠️ _Keep in mind this is the primary area we are planning to evolve in [upcoming FinOps toolkit releases](https://aka.ms/finops/toolkit/roadmap). Please familiarize yourself with our roadmap to avoid conflicts with future updates. Consider [contributing to the project](../CONTRIBUTING.md) to add support for new scenarios to avoid conflicts._ - > - > ![Version 0.0.1](https://img.shields.io/badge/version-0.0.1-lightgrey)   ![Status: In progress](https://img.shields.io/badge/status-in_progress-blue)    [![Go to issue](https://img.shields.io/github/issues/detail/state/microsoft/cloud-hubs/59)](https://github.com/microsoft/cloud-hubs/issues/59) - > - > 🆕 _Add the following sentences to the description (before "Use a consistent prefix"):_ - > - > Do not modify built-in pipelines or data in the **ms-cm-exports** container. Create a custom pipeline that monitors new data in the **ingestion** container. - -5. Generate custom alerts using Power Automate. - - You have many options for generating custom alerts. [Power Automate](https://powerautomate.microsoft.com/connectors/details/shared_azureblob/azure-blob-storage) is a great option for people who are new to automation but you can also use [Data Factory](https://learn.microsoft.com/azure/data-factory/introduction), [Functions](https://learn.microsoft.com/azure/azure-functions/functions-overview), or any other service that supports custom code or direct access to data in Azure Data Lake Storage Gen2. +## 🧰 Available tools -No matter what you choose to do, we recommend creating a new bicep module to support updating your solution. You can reference `finops-hub/main.bicep` or `hub.bicep` directly to ensure you can apply new updates as they're released. +- [FinOps hubs](./finops-hub) – Open, extensible, and scalable cost reporting. +- [Cost optimization workbook](./optimization-workbook) – Central hub for cost optimization. -If you need to change `hub.bicep`, be sure to track those changes and re-apply them when upgrading to the latest release. We generally don't recommend modifying the template or modules directly to avoid conflicts with future updates. Instead, consider contributing those changes back to the open source project. [Learn more](../CONTRIBUTING.md). +### In development -> ![Version 0.0.2](https://img.shields.io/badge/version-0.0.2-lightgrey)   ![Status: Proposed](https://img.shields.io/badge/status-proposed-lightgrey)    [![Go to issue](https://img.shields.io/github/issues/detail/state/microsoft/cloud-hubs/60)](https://github.com/microsoft/cloud-hubs/issues/60) -> -> 🆕 _Change the notes for storage to: Data is ingested into the `ms-cm-exports` container and transformed when moved into the `ingestion` container. Do not store use the `ms-cm-exports` container for anything other than Cost Management exports. If manipulating data, please do that in the `ingestion` container after the transform pipeline completes. Don't remove or rename columns, as that can break Power BI reports._ +- [Bicep Registry modules](./bicep-registry) – Official repository for Bicep modules. -If you access data in storage or are creating or customizing Power BI reports, please refer to the [data dictionary](data-dictionary.md) for details about the available columns. +Looking for more? See what's coming in the [Toolkit v1 release](https://github.com/microsoft/cloud-hubs/issues/104).
-## Roadmap +## 🗺️ Roadmap We track the short-term roadmap for FinOps toolkit as [releases](https://github.com/microsoft/cloud-hubs/labels/Type%3A%20Release%20%F0%9F%9A%80). Each release includes overarching goals, tasks broken down into sub-releases, links to discussions for each sub-release, and tentative stretch tasks. -Please use discussions if you have questions, comments, or requests for any specific release. This will ensure everything gets triaged and not lost. +Please use [discussions](https://github.com/microsoft/cloud-hubs/discussions) if you have questions, comments, or requests for any specific release.
-## Get involved +## 👩‍💻 Get involved FinOps toolkit is an open source project. We have many ideas on the long-term vision, but are more interested in learning from you and seeing how the community drives the product. There are many ways you can contribute to the project from participating in discussions and requesting features to reviewing and submitting pull requests. To get started, refer to our [Contribution guide](../CONTRIBUTING.md).
-## Changelog +## 📜 Changelog All the main changes are tracked within the [Changelog](./changelog.md). For additional details, refer to the [commit history](https://github.com/microsoft/cloud-hubs/commits/main). diff --git a/docs/bicep-registry/README.md b/docs/bicep-registry/README.md new file mode 100644 index 00000000..9afb60fd --- /dev/null +++ b/docs/bicep-registry/README.md @@ -0,0 +1,27 @@ +# 🦾 Bicep Registry modules + +[![Go to issue](https://img.shields.io/github/issues/detail/title/microsoft/cloud-hubs/104?label=roadmap)](https://github.com/microsoft/cloud-hubs/issues/104) + +Bicep modules developed within the toolkit are published to the [official Bicep Registry](https://github.com/Azure/bicep-registry-modules). These modules are not included directly in the toolkit release. + +The following modules are currently in development: + +- [Scheduled actions](./scheduled-actions) + +--- + +## Scheduled actions + +![Unreleased](https://img.shields.io/badge/version-unreleased-inactive) +  +![Scopes: Resource group, Subscription](https://img.shields.io/badge/scopes-resourceGroup,_subscription-blue) +   +[![Go to PR](https://img.shields.io/github/pulls/detail/state/Azure/bicep-registry-modules/300?label=resourceGroup%20PR)](https://github.com/bicep-registry-modules/pulls/300) +  +[![Go to PR](https://img.shields.io/github/pulls/detail/state/Azure/bicep-registry-modules/299?label=subscription%20PR)](https://github.com/bicep-registry-modules/pulls/299) + +Creates a [scheduled action](https://learn.microsoft.com/rest/api/cost-management/scheduled-actions) to notify recipients about the latest costs or when an anomaly is detected. + +Subscription and resource group modules are pending review and inclusion in the next Bicep Registry release. + +
diff --git a/docs/changelog.md b/docs/changelog.md index d81d1022..de2fd968 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,15 +1,24 @@ -# FinOps toolkit changelog +# 📜 FinOps toolkit changelog -- [Unreleased](#unreleased) +- [v0.0.1](#v001) --- + + +## v0.0.1 Added: -- [finops-hub template](templates/finops-hub.md) to deploy a storage account and Data Factory instance. -- [Cost summary report](reports/cost-summary.md) for various out-of-the-box cost breakdowns. -- [Commitment discounts report](reports/commitment-discounts.md) for commitment-based discount reports. +1. FinOps hubs + 1. [finops-hub template](finops-hub) to deploy a storage account and Data Factory instance. + 2. [Cost summary report](./finops-hub/reports/cost-summary.md) for various out-of-the-box cost breakdowns. + 3. [Commitment discounts report](./finops-hub/reports/commitment-discounts.md) for commitment-based discount reports. +2. Bicep modules + 1. [Scheduled action modules](bicep-registry/README.md#scheduled-actions) submitted to the Bicep Registry (pending release). +3. Azure Monitor workbooks + 1. [Cost optimization workbook](optimization-workbook) to centralize cost optimization.
diff --git a/docs/deploy/README.md b/docs/deploy/README.md index 734457fe..0f0a738d 100644 --- a/docs/deploy/README.md +++ b/docs/deploy/README.md @@ -1,26 +1,20 @@ -# FinOps toolkit deployment options +# 📦 FinOps toolkit deployment options -![Status: Not started](https://img.shields.io/badge/status-not%20started-red)    -[![Go to issue](https://img.shields.io/github/issues/detail/state/microsoft/cloud-hubs/26)](https://github.com/microsoft/cloud-hubs/issues/26) +The FinOps toolkit includes multiple ARM templates. Prerequisites, parameters, and post-deployment setup steps differ per template. Please refer to the template details for more information: - +Note Bicep Registry modules can be referenced directly from your Bicep code and are not deployed using the steps below. > ### ⚠️ Important > -> _The FinOps toolkit will change over time. We highly recommend saving a parameter file to ensure you can re-deploy new versions of the template with the same parameters._ +> _The FinOps toolkit will change over time. We highly recommend saving a parameter file to ensure you can re-deploy new versions with the same parameters._ On this page: - [Using custom deployment in the Azure portal](#using-custom-deployment-in-the-azure-portal) -- [Deploy from Microsoft Learn code samples](#deploy-from-microsoft-learn-code-samples) - [Deploy from Azure Quickstart Templates](#deploy-from-azure-quickstart-templates) -- [Future considerations](#future-considerations) --- @@ -29,25 +23,14 @@ On this page: The Azure portal includes a **Custom deployment** option that supports all templates available in the Azure Quickstart Templates repository. To deploy a quickstart template: 1. Open [Custom deployment](https://portal.azure.com/#create/Microsoft.Template) -2. In the **Quickstart template** dropdown, select `quickstarts/microsoft.costmanagement/finops-hub`. - +2. In the **Quickstart template** dropdown, select `quickstarts/microsoft.costmanagement/