From 302efb8012c724c853c813d06e13a71fa35d8000 Mon Sep 17 00:00:00 2001 From: Matan Heled Date: Thu, 20 Jun 2024 15:52:22 +0300 Subject: [PATCH 1/6] added oppencost AWS CUR --- .../cloud-cost/opencost/_category_.json | 4 + .../cloud-cost/opencost/aws.md | 152 ++++++++++++++++++ .../cloud-cost/{ => opencost}/opencost.md | 8 +- .../opencost/opencostCloudcostResources.png | Bin 0 -> 68337 bytes 4 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/_category_.json create mode 100644 docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md rename docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/{ => opencost}/opencost.md (98%) create mode 100644 static/img/integrations/opencost/opencostCloudcostResources.png diff --git a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/_category_.json b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/_category_.json new file mode 100644 index 000000000..3b7c8b211 --- /dev/null +++ b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "OpenCost", + "position": 5 +} diff --git a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md new file mode 100644 index 000000000..4aa6e496b --- /dev/null +++ b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md @@ -0,0 +1,152 @@ +--- +sidebar_position: 1 +tags: + - OpenCost + - AWS + - Pricing + - FinOps + - Ocean +--- + +# AWS + +## Overview + +By default, OpenCost pulls on-demand asset prices from the public AWS pricing API. The AWS Pricing API is limited in it's resolution capabilities, not allowing per-resource costs analysis and other interesting data resolutions. + +To allow for a more granular resolution of your AWS cost data, Opencost supports ingesting pricing data from [CUR reports](https://docs.aws.amazon.com/cur/latest/userguide/what-is-cur.html). + +In this guide, we will using the OpenCost price capabilities using AWS CUR, and Port's [Ocean OpenCost integration](./opencost.md), to ingest per-resourse cost entities in to our Port organization. + +## Prerequisites + +- Set up OpenCost with AWS CUR - You will need to set up OpenCost AWS Costs and Usage reports ingestion using [this guide](https://docs.kubecost.com/install-and-configure/install/cloud-integration/aws-cloud-integrations). This guide uses KubeCost documentation, but the steps are the same for setting up Opencost. + +- Install Port's [OpenCost integration](./opencost.md#installation). + +# Data model setup +When setting up Port's OpenCost integration for the first time, the integration should initialize a [blueprint](/build-your-software-catalog/customize-integrations/configure-data-model/setup-blueprint/) called `OpenCost CloudCost`. + +If the blueprint **does not** exist: +1. Navigate to your Port organization's [data model](https://app.getport.io/settings/data-model) page. +2. Click the `+ Blueprint` button. +3. Click the `Edit JSON` button. +4. Copy-paste the following blueprint JSON: + +
+ `OpenCost CloudCost` blueprint + + This blueprint represents an OpenCost CloudCost entity. + +```json showLineNumbers +{ + "identifier": "openCostCloudcost", + "description": "This blueprint represents cloud cost allocations from your OpenCost instance", + "title": "OpenCost CloudCost", + "icon": "Opencost", + "schema": { + "properties": { + "startDate": { + "title": "Start Date", + "type": "string", + "format": "date-time" + }, + "endDate": { + "title": "End Date", + "type": "string", + "format": "date-time" + }, + "listCost": { + "title": "List Cost", + "type": "number" + }, + "netCost": { + "title": "Net Cost", + "type": "number" + }, + "amortizedNetCost": { + "title": "Amortized Net Cost", + "type": "number" + }, + "invoicedCost": { + "title": "Invoiced Cost", + "type": "number" + }, + "amortizedCost": { + "title": "Amortized Cost", + "type": "number" + } + }, + "required": [] + }, + "mirrorProperties": {}, + "calculationProperties": {}, + "aggregationProperties": {}, + "relations": {} +} +``` + +
+ +# Mapping configuration +After setting up our data model, we need to update the OpenCost integration's mapping configuration. + +OpenCost cloudcost data supports all sorts of time windows, aggregations and filters. In this guide, the data that will be ingested is the cost of all `AmazonEC2` resources in the past week. + +Navigate to your [datasources page](https://app.getport.io/settings/data-sources), and click on the `Opencost` datasource. + +Add the following configuration to your datasource mapping: + + +
+ `OpenCost CloudCost` mapping configuration + + If the OpenCost integration was freshly installed, there will already be an existing `cloudcost` config block. Replace the pre-existing config with the following YAML snippet. + +```yaml showLineNumbers + - kind: cloudcost + selector: + query: .properties.providerID + aggregate: providerID + accumulate: week + window: week + filter: + service: AmazonEC2 + port: + entity: + mappings: + identifier: .properties.providerID + title: .properties.providerID + blueprint: '"openCostCloudcost"' + properties: + startDate: .window.start + endDate: .window.end + listCost: .listCost.cost + netCost: .netCost.cost + amortizedNetCost: .amortizedNetCost.cost + invoicedCost: .invoicedCost.cost + amortizedCost: .amortizedCost.cost +``` + +:::note + +The `.selector.filter.service` field is **required**, and represents the AWS service type (AWS Namespace) we want to ingest. + +We use the `.properties.providerID` field to get the ARN of the AWS resource. Some AWS resources do not have a full ARN as their ID and are ingested as regular IDs. +For example, an entity which represents an EC2 instance will be ingested to Port with a `i-abc123abc123ab` as it's identifier. + +::: + +
+ +Click `Save`. + +Now, navigate to your [OpenCost CloudCost](https://app.getport.io/openCostCloudcosts) entities page, and you should see your `AmazonEC2` resources, and their different price types. + +# Summary +Using Port Ocean's OpenCost integration, we have successfully ingested AWS resources' cost data in to our Port organization! + +

+ +

+ diff --git a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost.md b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md similarity index 98% rename from docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost.md rename to docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md index 781d8acf2..16f415922 100644 --- a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost.md +++ b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md @@ -1,9 +1,9 @@ import Tabs from "@theme/Tabs" import TabItem from "@theme/TabItem" -import Prerequisites from "../templates/\_ocean_helm_prerequisites_block.mdx" -import AzurePremise from "../templates/\_ocean_azure_premise.mdx" -import DockerParameters from "./\_opencost-docker-parameters.mdx" -import AdvancedConfig from '../../../generalTemplates/_ocean_advanced_configuration_note.md' +import Prerequisites from "../../templates/\_ocean_helm_prerequisites_block.mdx" +import AzurePremise from "../../templates/\_ocean_azure_premise.mdx" +import DockerParameters from "../\_opencost-docker-parameters.mdx" +import AdvancedConfig from '../../../../generalTemplates/_ocean_advanced_configuration_note.md' import PortApiRegionTip from "/docs/generalTemplates/_port_region_parameter_explanation_template.md" # OpenCost diff --git a/static/img/integrations/opencost/opencostCloudcostResources.png b/static/img/integrations/opencost/opencostCloudcostResources.png new file mode 100644 index 0000000000000000000000000000000000000000..daebbf8e110cc26c24de640365dadd3d0754011b GIT binary patch literal 68337 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 dU8ZDv?2+``%=rF<@ Date: Thu, 20 Jun 2024 16:34:48 +0300 Subject: [PATCH 2/6] fix paths --- .../sync-data-to-catalog/cloud-cost/opencost/aws.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md index 4aa6e496b..5966c22b2 100644 --- a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md +++ b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md @@ -16,13 +16,13 @@ By default, OpenCost pulls on-demand asset prices from the public AWS pricing AP To allow for a more granular resolution of your AWS cost data, Opencost supports ingesting pricing data from [CUR reports](https://docs.aws.amazon.com/cur/latest/userguide/what-is-cur.html). -In this guide, we will using the OpenCost price capabilities using AWS CUR, and Port's [Ocean OpenCost integration](./opencost.md), to ingest per-resourse cost entities in to our Port organization. +In this guide, we will using the OpenCost price capabilities using AWS CUR, and Port's [Ocean OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md), to ingest per-resourse cost entities in to our Port organization. ## Prerequisites - Set up OpenCost with AWS CUR - You will need to set up OpenCost AWS Costs and Usage reports ingestion using [this guide](https://docs.kubecost.com/install-and-configure/install/cloud-integration/aws-cloud-integrations). This guide uses KubeCost documentation, but the steps are the same for setting up Opencost. -- Install Port's [OpenCost integration](./opencost.md#installation). +- Install Port's [OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md#installation). # Data model setup When setting up Port's OpenCost integration for the first time, the integration should initialize a [blueprint](/build-your-software-catalog/customize-integrations/configure-data-model/setup-blueprint/) called `OpenCost CloudCost`. From 68f8bdee71a2c3815846e388a3df389dc8e6dcaa Mon Sep 17 00:00:00 2001 From: Matan Heled Date: Thu, 20 Jun 2024 16:43:13 +0300 Subject: [PATCH 3/6] fixed integration index path --- docs/integrations-index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations-index.md b/docs/integrations-index.md index 2ee3cdf87..f2133f9b7 100644 --- a/docs/integrations-index.md +++ b/docs/integrations-index.md @@ -228,7 +228,7 @@ This page contains a list of Port's available integrations, organized by the pla ## OpenCost -- [OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost.md) +- [OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md) ## Dynatrace From 0c79172ab40f9913c151776df60bfeba11f0d409 Mon Sep 17 00:00:00 2001 From: MatanHeledPort <115919235+MatanHeledPort@users.noreply.github.com> Date: Thu, 20 Jun 2024 17:58:52 +0300 Subject: [PATCH 4/6] Apply suggestions from code review Co-authored-by: Mor Paz --- .../cloud-cost/opencost/aws.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md index 5966c22b2..59e28e104 100644 --- a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md +++ b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md @@ -12,15 +12,15 @@ tags: ## Overview -By default, OpenCost pulls on-demand asset prices from the public AWS pricing API. The AWS Pricing API is limited in it's resolution capabilities, not allowing per-resource costs analysis and other interesting data resolutions. +By default, OpenCost pulls on-demand asset prices from the public AWS pricing API. The AWS Pricing API is limited in it's resolution capabilities, not allowing per-resource costs analysis and deep granularity. To allow for a more granular resolution of your AWS cost data, Opencost supports ingesting pricing data from [CUR reports](https://docs.aws.amazon.com/cur/latest/userguide/what-is-cur.html). -In this guide, we will using the OpenCost price capabilities using AWS CUR, and Port's [Ocean OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md), to ingest per-resourse cost entities in to our Port organization. +In this guide, we will use the OpenCost price capabilities using AWS CUR, and Port's [Ocean OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md), to ingest per-resource cost entities in to our Port organization. ## Prerequisites -- Set up OpenCost with AWS CUR - You will need to set up OpenCost AWS Costs and Usage reports ingestion using [this guide](https://docs.kubecost.com/install-and-configure/install/cloud-integration/aws-cloud-integrations). This guide uses KubeCost documentation, but the steps are the same for setting up Opencost. +- Set up OpenCost with AWS CUR - You will need to set up OpenCost AWS Costs and Usage reports ingestion using [this guide](https://docs.kubecost.com/install-and-configure/install/cloud-integration/aws-cloud-integrations). This guide uses KubeCost documentation, but the steps are the same for setting up OpenCost. - Install Port's [OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md#installation). @@ -91,7 +91,7 @@ If the blueprint **does not** exist: # Mapping configuration After setting up our data model, we need to update the OpenCost integration's mapping configuration. -OpenCost cloudcost data supports all sorts of time windows, aggregations and filters. In this guide, the data that will be ingested is the cost of all `AmazonEC2` resources in the past week. +OpenCost cloudcost data supports a variety of time windows, aggregations and filters. In this guide, the data that will be ingested is the cost of all `AmazonEC2` resources in the past week. Navigate to your [datasources page](https://app.getport.io/settings/data-sources), and click on the `Opencost` datasource. @@ -101,7 +101,7 @@ Add the following configuration to your datasource mapping:
`OpenCost CloudCost` mapping configuration - If the OpenCost integration was freshly installed, there will already be an existing `cloudcost` config block. Replace the pre-existing config with the following YAML snippet. + When installing the integration, a `cloudcost` config block is added automatically. Replace the pre-existing config with the following YAML snippet. ```yaml showLineNumbers - kind: cloudcost @@ -128,12 +128,13 @@ Add the following configuration to your datasource mapping: amortizedCost: .amortizedCost.cost ``` -:::note +:::note Service selector The `.selector.filter.service` field is **required**, and represents the AWS service type (AWS Namespace) we want to ingest. We use the `.properties.providerID` field to get the ARN of the AWS resource. Some AWS resources do not have a full ARN as their ID and are ingested as regular IDs. -For example, an entity which represents an EC2 instance will be ingested to Port with a `i-abc123abc123ab` as it's identifier. + +For example, an entity which represents an EC2 instance will be ingested to Port with `i-abc123abc123ab` as its identifier. ::: From d2fbd082784de9e8de21d51f8f463eb2e1693d91 Mon Sep 17 00:00:00 2001 From: Matan Heled Date: Thu, 20 Jun 2024 17:59:44 +0300 Subject: [PATCH 5/6] fix opencost casing --- .../sync-data-to-catalog/cloud-cost/opencost/aws.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md index 59e28e104..619a1d5cb 100644 --- a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md +++ b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md @@ -14,7 +14,7 @@ tags: By default, OpenCost pulls on-demand asset prices from the public AWS pricing API. The AWS Pricing API is limited in it's resolution capabilities, not allowing per-resource costs analysis and deep granularity. -To allow for a more granular resolution of your AWS cost data, Opencost supports ingesting pricing data from [CUR reports](https://docs.aws.amazon.com/cur/latest/userguide/what-is-cur.html). +To allow for a more granular resolution of your AWS cost data, OpenCost supports ingesting pricing data from [CUR reports](https://docs.aws.amazon.com/cur/latest/userguide/what-is-cur.html). In this guide, we will use the OpenCost price capabilities using AWS CUR, and Port's [Ocean OpenCost integration](/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/opencost.md), to ingest per-resource cost entities in to our Port organization. @@ -43,7 +43,7 @@ If the blueprint **does not** exist: "identifier": "openCostCloudcost", "description": "This blueprint represents cloud cost allocations from your OpenCost instance", "title": "OpenCost CloudCost", - "icon": "Opencost", + "icon": "OpenCost", "schema": { "properties": { "startDate": { @@ -93,7 +93,7 @@ After setting up our data model, we need to update the OpenCost integration's ma OpenCost cloudcost data supports a variety of time windows, aggregations and filters. In this guide, the data that will be ingested is the cost of all `AmazonEC2` resources in the past week. -Navigate to your [datasources page](https://app.getport.io/settings/data-sources), and click on the `Opencost` datasource. +Navigate to your [datasources page](https://app.getport.io/settings/data-sources), and click on the `OpenCost` datasource. Add the following configuration to your datasource mapping: From 3c1be9e77751d022d2207d7b25a11711cc05aa34 Mon Sep 17 00:00:00 2001 From: lordsarcastic Date: Mon, 9 Sep 2024 13:16:10 +0100 Subject: [PATCH 6/6] Fix: Changed filter to use v2 filter format --- .../sync-data-to-catalog/cloud-cost/opencost/aws.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md index 619a1d5cb..22b6746a5 100644 --- a/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md +++ b/docs/build-your-software-catalog/sync-data-to-catalog/cloud-cost/opencost/aws.md @@ -110,8 +110,7 @@ Add the following configuration to your datasource mapping: aggregate: providerID accumulate: week window: week - filter: - service: AmazonEC2 + filter: service:"AmazonEC2" port: entity: mappings: @@ -150,4 +149,3 @@ Using Port Ocean's OpenCost integration, we have successfully ingested AWS resou

-