Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
a9d442c
Merge pull request #1 from Cro22/develop
Cro22 Apr 12, 2026
c925b53
Merge pull request #2 from Cro22/develop
Cro22 Apr 12, 2026
b085538
Merge pull request #3 from Cro22/develop
Cro22 Apr 12, 2026
8642c0c
Merge pull request #4 from Cro22/develop
Cro22 Apr 12, 2026
e4e5dc5
Merge pull request #5 from Cro22/develop
Cro22 Apr 19, 2026
b2b2f3a
Merge pull request #6 from Cro22/develop
Cro22 Apr 19, 2026
4709c09
Create LICENSE
Cro22 Apr 19, 2026
e19a7d1
Merge remote-tracking branch 'origin/develop' into develop
Cro22 Apr 19, 2026
49ff513
Merge pull request #7 from Cro22/develop
Cro22 Apr 19, 2026
8d3887d
docs: enhance README with CloudOracle's analysis-first approach and c…
Cro22 Apr 19, 2026
6c35f24
Merge pull request #8 from Cro22/develop
Cro22 Apr 19, 2026
022c13a
Update README.md
Cro22 Apr 19, 2026
988c7c4
Merge pull request #9 from Cro22/main
Cro22 Apr 19, 2026
c5e34ff
refactor: improve configuration loading and introduce API client inte…
Cro22 May 7, 2026
04bcb1d
feat: implement resilient LLM API calls with retry logic and configur…
Cro22 May 7, 2026
f143fc7
feat: add integration tests for resource insertion, upsert behavior, …
Cro22 May 7, 2026
30a6e65
chore: add .gitkeep to maintain empty directory structure
Cro22 May 7, 2026
57fdfca
Merge pull request #10 from Cro22/develop
Cro22 May 7, 2026
1335156
feat: add Terraform plan parsing and validation logic with test cases
Cro22 May 7, 2026
9c9a46c
feat: implement AWS resource attribute extraction for EC2, RDS, and EBS
Cro22 May 7, 2026
61a63cc
feat: add support for AWS Lambda, NAT Gateway, and RDS Cluster Instan…
Cro22 May 7, 2026
ba1169f
feat: implement AWS Pricing API client for product lookups with pagin…
Cro22 May 7, 2026
0c47503
feat: implement disk-based caching for AWS Pricing API product lookups
Cro22 May 7, 2026
989db0a
feat: add EC2 cost estimation logic with support for root EBS volume …
Cro22 May 8, 2026
b198f8e
feat: implement EBS pricing lookup and estimation for various volume …
Cro22 May 8, 2026
48372b0
feat: implement cost estimation for Terraform resource changes with C…
Cro22 May 8, 2026
2290b50
feat: add integration tests and new utility tools for pricing workflows
Cro22 May 8, 2026
8e3b296
feat: add markdown templates for various cloud cost impact scenarios
Cro22 May 8, 2026
22666da
feat: ensure Markdown blocks are separated by blank lines for proper …
Cro22 May 8, 2026
e45998d
Merge pull request #12 from Cro22/feature/terraform
Cro22 May 9, 2026
bf10fee
feat: refactor LLM narrative generation to separate summary and text …
Cro22 May 9, 2026
48bb794
feat: enhance caveat handling by grouping assumptions by resource in …
Cro22 May 9, 2026
3a42517
chore: remove legacy `checkpoint135` code, Terraform configuration, a…
Cro22 May 9, 2026
6beea5c
feat: add `pr-check` subcommand for rendering Terraform plans as Mark…
Cro22 May 9, 2026
62dd731
feat: implement GitHub REST API client for PR comment management
Cro22 May 9, 2026
d5fcaaf
feat: add support for posting Terraform plan comments to GitHub via P…
Cro22 May 9, 2026
a0ea88d
feat: add CloudOracle GitHub Action for Terraform cost analysis and u…
Cro22 May 9, 2026
3ac3e34
test: add in-repo Action self-test workflow with toy Terraform plan
Cro22 May 9, 2026
32789f0
Merge pull request #14 from Cro22/feature/action-self-test
Cro22 May 9, 2026
70d7ab8
fix: update environment variable from ANTHROPIC_API_KEY to GEMINI_API…
Cro22 May 9, 2026
47d1e91
Merge pull request #15 from Cro22/feature/action-self-test
Cro22 May 9, 2026
145c8ba
feat: update Terraform version to latest in cost self-test workflow
Cro22 May 9, 2026
d984a90
Merge pull request #17 from Cro22/feature/action-self-test
Cro22 May 9, 2026
f16bf5d
fix(action): read INPUT_* env vars via printenv to handle dashes
Cro22 May 9, 2026
4723f59
Merge pull request #16 from Cro22/develop
Cro22 May 9, 2026
ae30963
Merge pull request #18 from Cro22/feature/action-self-test
Cro22 May 9, 2026
1d5ff3b
Merge pull request #19 from Cro22/develop
Cro22 May 9, 2026
a70068a
chore: remove probe-pricing utility and Terraform e2e test configuration
Cro22 May 9, 2026
1e326a0
Merge pull request #20 from Cro22/feature/action-self-test
Cro22 May 9, 2026
c886c60
Merge pull request #21 from Cro22/develop
Cro22 May 9, 2026
eaa9b33
docs: add configuration and testing documentation for CloudOracle
Cro22 May 15, 2026
53c3ad1
feat(api): authenticated /api/v1 cost endpoints for the insights agent
Cro22 May 18, 2026
8450086
feat(insights-agent): bootstrap Python project with LLM provider abst…
Cro22 May 18, 2026
9d841cd
feat(insights-agent): HTTP client and LangChain tools for /api/v1 cos…
Cro22 May 18, 2026
4cb3317
feat(insights-agent): ReAct graph wiring tools to the LLM
Cro22 May 18, 2026
5f4a484
chore: ignore .claude harness directory
Cro22 May 18, 2026
7969861
feat(insights-agent): CLI entry point for single-turn agent runs
Cro22 May 18, 2026
781ddd4
docs(insights-agent): full subproject README + root section with arch…
Cro22 May 18, 2026
f6c71e9
chore: translate Spanish comments and milestone references to English
Cro22 May 19, 2026
3805ad9
feat(insights-agent): recommendations tool + /api/v1/recommendations …
Cro22 May 30, 2026
59c7dce
feat(insights-agent): cost-trends tool + /api/v1/cost-trends endpoint
Cro22 May 30, 2026
01883f6
feat(insights-agent): inventory tool + /api/v1/inventory endpoint
Cro22 May 30, 2026
156af0b
feat(insights-agent): RAG over a FinOps corpus with pgvector (milesto…
Cro22 May 30, 2026
024db07
feat(insights-agent): hand-rolled supervisor multi-agent graph (miles…
Cro22 May 30, 2026
b507c4e
feat(insights-agent): cost caps, layered validation, deterministic fa…
Cro22 May 30, 2026
c7a1d6f
feat(insights-agent): FastAPI HTTP surface, completing milestone 8.5
Cro22 May 30, 2026
5f47f41
feat(billing): AWS Cost Explorer source behind a billing.Source abstr…
Cro22 May 31, 2026
f2ddb6b
chore: enforce LF via .gitattributes; add v3 Insights Agent guide
Cro22 May 31, 2026
6ec3bdf
docs(readme): make v3 the current focus with a clearly labeled section
Cro22 May 31, 2026
1b1001b
fix(insights-agent): synthesizer dropped specialist findings
Cro22 May 31, 2026
80091d9
docs(readme): add top-level architecture diagram; v3 is done, not cur…
Cro22 May 31, 2026
ccfa7cf
fix(llm): correct Claude max_tokens JSON tag; align docs with after_u…
Cro22 Jun 9, 2026
806eada
feat(billing): add GCP BigQuery billing-export cost source
Cro22 Aug 24, 2026
67e3b1d
feat(pricing): price google_compute_instance in Terraform plans (GCP v2)
Cro22 Aug 24, 2026
bca115d
feat(pricing): price google_compute_disk in Terraform plans (GCP v2)
Cro22 Aug 24, 2026
1de3791
feat(pricing): price google_sql_database_instance in Terraform plans …
Cro22 Aug 24, 2026
41ba62e
docs(v2): document GCP pricing support in pr-check
Cro22 Aug 24, 2026
6427431
Merge pull request #27 from Cro22/feat/gcp-billing-bigquery
Cro22 Aug 24, 2026
70ebd6b
Merge pull request #28 from Cro22/feat/gcp-v2-compute
Cro22 Aug 24, 2026
07cd09c
merge: bring GCP v2 disk + Cloud SQL + docs onto feature/3.0
Cro22 Aug 25, 2026
2d69b7f
docs: pin the Action example to the floating @v2 tag
Cro22 Aug 25, 2026
7c47a56
docs(readme): refresh test badge and tech stack for GCP work
Cro22 Aug 25, 2026
1a65603
merge: reconcile feature/3.0 with main for PR #32
Cro22 Aug 25, 2026
675c0d9
ci: fix Action self-test — GCP plan fixture, drop terraform + AWS creds
Cro22 Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/examples/terraform-plan-no-llm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:

- run: terraform show -json tf.plan > tf-plan.json

- uses: Cro22/CloudOracle@v2.0.0
- uses: Cro22/CloudOracle@v2
with:
plan-file: tf-plan.json
no-llm: 'true'
2 changes: 1 addition & 1 deletion .github/examples/terraform-plan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
# each changed resource, asks the LLM for a 1-3 sentence narrative,
# and posts/upserts a comment on the PR using the workflow token.
- name: CloudOracle cost analysis
uses: Cro22/CloudOracle@v2.0.0
uses: Cro22/CloudOracle@v2
with:
plan-file: tf-plan.json
region: us-east-2
Expand Down
52 changes: 17 additions & 35 deletions .github/workflows/cost-self-test.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
name: Action self-test (Cost Comment)

# In-repo smoke test for the CloudOracle Action. Runs the Action
# against the toy Terraform plan in e2e-test/, using `uses: ./` so
# Docker builds the image from the current checkout instead of
# pulling a published tag. This catches regressions in the Action
# manifest, Dockerfile.action, entrypoint.sh, or the pr-check
# command before they reach a tagged release.
# In-repo smoke test for the CloudOracle Action. Runs the Action against the
# committed GCP plan fixture in e2e-test/plan.json, using `uses: ./` so Docker
# builds the image from the current checkout instead of pulling a published
# tag. This catches regressions in the Action manifest, Dockerfile.action,
# entrypoint.sh, or the pr-check command before they reach a tagged release.
#
# The fixture is GCP-only on purpose: GCP resources are priced from the
# embedded static table, so the self-test needs no cloud credentials and no
# Terraform — deterministic and secret-free. It runs with --no-llm so it
# doesn't depend on an LLM key either. The Action auto-posts the cost comment
# to the PR via the default github.token.

on:
pull_request:
Expand Down Expand Up @@ -33,35 +38,12 @@ jobs:
steps:
- uses: actions/checkout@v4

- uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-2

- uses: hashicorp/setup-terraform@v3
with:
terraform_version: latest

- name: Terraform init
working-directory: e2e-test
run: terraform init

- name: Terraform plan
working-directory: e2e-test
run: terraform plan -out=tf.plan

- name: Convert plan to JSON
working-directory: e2e-test
run: terraform show -json tf.plan > tf-plan.json

# `uses: ./` builds Dockerfile.action from the checked-out tree,
# so any changes to the Action code on this branch are exercised
# end-to-end before publishing a tag.
# `uses: ./` builds Dockerfile.action from the checked-out tree, so any
# changes to the Action code on this branch are exercised end-to-end
# against the committed GCP plan before publishing a tag.
- name: CloudOracle (in-repo build)
uses: ./
with:
plan-file: e2e-test/tf-plan.json
region: us-east-2
env:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
plan-file: e2e-test/plan.json
region: us-central1
no-llm: 'true'
15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CloudOracle

![Tests](https://img.shields.io/badge/tests-469%20unit%20%2B%2021%20integration-brightgreen)![Go Version](https://img.shields.io/badge/go-1.25-blue) ![License](https://img.shields.io/badge/license-Apache%20License%202.0-green)
![Tests](https://img.shields.io/badge/tests-581%20unit%20%2B%2022%20integration-brightgreen)![Go Version](https://img.shields.io/badge/go-1.25-blue) ![License](https://img.shields.io/badge/license-Apache%20License%202.0-green)

**One FinOps toolkit, three surfaces over the same cost data** — audit what you spend, predict what a PR will cost, and ask about both in plain language.

Expand All @@ -23,7 +23,7 @@ flowchart LR
A Go FinOps toolkit spanning three modes — two from the same `oracle` binary, plus a polyglot Python agent extension:

- **v1 — Audit existing cloud spend.** Ingest live EC2/RDS/EBS/Lambda inventory from AWS, GCP, or Azure into Postgres, run deterministic rules over it, and produce an executive PDF + dashboard with an LLM-narrated summary. See **[docs/v1-guide.md](docs/v1-guide.md)**.
- **v2 — Predict cost impact of a Terraform PR before merge.** Read `terraform show -json plan.tfplan`, look every changing resource up against the AWS Pricing API, and post (or upsert) a Markdown comment on the PR with the net monthly delta, top movers, and a 1–3 sentence LLM narrative. Ships as a GitHub Action and as the `oracle pr-check` subcommand. See **[docs/v2-guide.md](docs/v2-guide.md)**.
- **v2 — Predict cost impact of a Terraform PR before merge.** Read `terraform show -json plan.tfplan`, price every changing resource (AWS via the live Pricing API; GCP via an embedded static price table), and post (or upsert) a Markdown comment on the PR with the net monthly delta, top movers, and a 1–3 sentence LLM narrative. Ships as a GitHub Action and as the `oracle pr-check` subcommand. See **[docs/v2-guide.md](docs/v2-guide.md)**.
- **v3 — Insights Agent.** Polyglot Go + Python extension adding agentic FinOps analysis on top of v1/v2 cost data — a hand-rolled LangGraph supervisor over specialist agents, RAG over a FinOps corpus (pgvector), production guardrails, real billing via AWS Cost Explorer, and a CLI + HTTP surface. See **[v3 — Insights Agent](#v3--insights-agent)** below, **[docs/v3-guide.md](docs/v3-guide.md)**, and **[insights-agent/README.md](insights-agent/README.md)**.

## v3 — Insights Agent
Expand Down Expand Up @@ -104,7 +104,7 @@ jobs:
- uses: hashicorp/setup-terraform@v3
- run: terraform init && terraform plan -out=tf.plan
- run: terraform show -json tf.plan > tf-plan.json
- uses: Cro22/CloudOracle@v2.0.0
- uses: Cro22/CloudOracle@v2
with:
plan-file: tf-plan.json
env:
Expand All @@ -131,8 +131,8 @@ The synthetic provider needs no credentials. To run against AWS / GCP / Azure, s
| Language | Go 1.25 |
| Database | PostgreSQL 16 (Alpine) |
| DB Driver | pgx v5 (connection pool) |
| AWS SDK | aws-sdk-go-v2 (EC2, RDS, Lambda, STS) |
| GCP SDK | Google Cloud Go (Compute, SQL, Functions) |
| AWS SDK | aws-sdk-go-v2 (EC2, RDS, Lambda, STS, Pricing, Cost Explorer) |
| GCP SDK | Google Cloud Go (Compute, SQL, Functions, BigQuery) |
| Azure SDK | Azure SDK for Go (Compute, SQL, App Service) |
| Concurrency | `golang.org/x/sync/errgroup` |
| Logging | `log/slog` (structured, text/JSON) |
Expand Down Expand Up @@ -161,13 +161,14 @@ The synthetic provider needs no credentials. To run against AWS / GCP / Azure, s
- [X] **Milestone 8.3** — pgvector + RAG over a curated FinOps corpus: packaged markdown knowledge base, Gemini embeddings (mirroring the LLM-provider ABC), `langchain-postgres` PGVector store (compose image → `pgvector/pgvector:pg16`), `insights-agent-ingest` CLI, and a `finops_knowledge_search` tool the agent uses for conceptual/policy questions with source citations. Optional via `DATABASE_URL`; retrieval path unit-tested offline with an in-memory store
- [X] **Milestone 8.4** — Hand-rolled supervisor multi-agent graph replacing `create_react_agent`: a `StateGraph` where a tool-call-routing supervisor delegates to three specialist workers (cost analyst, savings advisor, concept expert — each its own hand-rolled ReAct loop) and a synthesizer composes the answer, with a hop cap. Driveable end-to-end by the scripted fake model; `create_react_agent` kept as the simple graph
- [X] **Milestone 8.5** — Production guardrails: per-run cost/usage caps (`RunLimits`); layered semantic answer validation (deterministic figure-grounding against tool observations, then an optional LLM judge); deterministic no-LLM fallback on run failure or failed validation; and a FastAPI HTTP surface (`POST /ask`, `GET /health`, optional `X-API-Key`) sharing one `GeminiAgentRunner` with the CLI
- [X] **Milestone 8.7** — Real billing integration behind a `billing.Source` abstraction: the v1 cost endpoints now consume normalized cost records, with the snapshot approximation as the default source and an **AWS Cost Explorer** source (real unblended cost, `data_source: billing_aws_cost_explorer`) selectable via `CLOUDORACLE_BILLING_PROVIDER=aws_cost_explorer`. GCP (BigQuery export) and Azure (Cost Management) sources can plug into the same interface next
- [X] **Milestone 8.7** — Real billing integration behind a `billing.Source` abstraction: the v1 cost endpoints now consume normalized cost records, with the snapshot approximation as the default source and an **AWS Cost Explorer** source (real unblended cost, `data_source: billing_aws_cost_explorer`) selectable via `CLOUDORACLE_BILLING_PROVIDER=aws_cost_explorer`, plus a **GCP BigQuery billing-export** source (real net cost, `data_source: billing_gcp_bigquery`) selectable via `CLOUDORACLE_BILLING_PROVIDER=gcp_bigquery`. Azure (Cost Management) can plug into the same interface next

### v2 — Terraform PR cost analysis

- [X] Terraform plan parser — `internal/iac` reads `terraform show -json` into a typed `Plan` model with action classification (create / update / replace / delete / no-op); unknown-until-apply attributes surface as JSON `null` and are treated as missing (a missing *required* attribute routes the resource to `Skipped`)
- [X] AWS Pricing API client + cache — `internal/pricing.Client` wraps AWS SDK v2 `pricing:GetProducts`; `internal/pricing.Cache` adds a 7-day disk cache keyed by service+filters
- [X] Per-resource estimators — EC2, EBS, RDS, Aurora cluster instance, Lambda, NAT gateway with breakdown line items and assumption notes
- [X] Per-resource estimators (AWS) — EC2, EBS, RDS, Aurora cluster instance, Lambda, NAT gateway with breakdown line items and assumption notes
- [X] **GCP pricing** — `google_compute_instance` (+ boot disk, Spot upper-bound), `google_compute_disk`, and `google_sql_database_instance` (Cloud SQL Postgres/MySQL: custom/shared/legacy tiers, storage, REGIONAL HA), priced from an embedded static table (`internal/pricing/gcp_prices.json`, us-central1 base + region multipliers) rather than a live API — deterministic, credential-free, capped at `medium` confidence with a drift caveat. `google_*` types dispatch through `internal/iac/gcp` + the estimators in `internal/pricing/gcp_*.go`
- [X] CostDiff aggregator — `internal/diff.Analyze` collapses per-resource estimates into a plan-wide picture with Created / Deleted / Updated / Replaced / Skipped slices, top movers, and aggregate confidence
- [X] Markdown renderer — `internal/diff.RenderMarkdown` produces the canonical PR comment (header / top movers table / full breakdown / caveats / marker footer), templated and golden-tested
- [X] LLM-narrated PR comment — `RenderMarkdownWithLLM` swaps the templated narrative for a 1–3 sentence LLM output with caveat grouping, sanity checks (length cap, preamble strip, paragraph-break warn), and silent fallback to the templated text on any failure
Expand Down
17 changes: 13 additions & 4 deletions cmd/oracle/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -699,17 +699,26 @@ func runServe(ctx context.Context, pool *db.Pool, cfg config.Config, args []stri
defer stop()

var serverOpts []api.ServerOption
if cfg.API.BillingProvider == config.BillingAWSCostExplorer {
// Don't fail startup over a billing-source problem: fall back to the
// snapshot approximation so the API still serves, and make the degradation
// loud.
switch cfg.API.BillingProvider {
case config.BillingAWSCostExplorer:
src, err := billing.NewAWSCostExplorerSource(runCtx, cfg.Cloud.AWSRegion, cfg.Cloud.AWSProfile)
if err != nil {
// Don't fail startup over a billing-source problem: fall back to the
// snapshot approximation so the API still serves, and make the
// degradation loud.
slog.Warn("falling back to snapshot cost source: AWS Cost Explorer init failed", "error", err)
} else {
slog.Info("v1 cost endpoints using AWS Cost Explorer (real billed cost)")
serverOpts = append(serverOpts, api.WithBillingSource(src))
}
case config.BillingGCPBigQuery:
src, err := billing.NewGCPBigQuerySource(runCtx, cfg.Cloud.GCPProject, cfg.Cloud.GCPBillingDataset, cfg.Cloud.GCPBillingTable)
if err != nil {
slog.Warn("falling back to snapshot cost source: GCP BigQuery init failed", "error", err)
} else {
slog.Info("v1 cost endpoints using GCP BigQuery billing export (real billed cost)")
serverOpts = append(serverOpts, api.WithBillingSource(src))
}
}

server := api.NewServer(pool, cfg.API, serverOpts...)
Expand Down
29 changes: 29 additions & 0 deletions docs/cloud-providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,35 @@ go run ./cmd/oracle serve --port 8080

Since this path hasn't been exercised end-to-end, expect to debug the SDK call mapping on first run.

### Real billing via the BigQuery export

The steps above cover *inventory* (what you have). For *real billed cost* on the
v1 cost endpoints, point `oracle serve` at the GCP billing export in BigQuery —
the GCP counterpart to AWS Cost Explorer.

1. In the console, enable **Cloud Billing → Billing export → BigQuery export**
(Standard usage cost). GCP starts writing a
`gcp_billing_export_v1_<BILLING_ACCOUNT_ID>` table into the dataset you choose.
Export data is not backfilled, so cost only appears from the day you enable it.
2. Grant the service account `roles/bigquery.dataViewer` on the dataset and
`roles/bigquery.jobUser` on the project (needed to run the query). ADC is the
same as for inventory — `GOOGLE_APPLICATION_CREDENTIALS` or `gcloud auth
application-default login`.
3. Point CloudOracle at it:

```bash
export CLOUDORACLE_BILLING_PROVIDER=gcp_bigquery
export GOOGLE_CLOUD_PROJECT=your-project-id # project that owns the dataset
export CLOUDORACLE_GCP_BILLING_DATASET=billing # dataset holding the export
export CLOUDORACLE_GCP_BILLING_TABLE=gcp_billing_export_v1_0123AB_CDEF45_6789GH
go run ./cmd/oracle serve --port 8080
```

The cost endpoints then report `data_source: billing_gcp_bigquery` (net cost =
list cost plus credits, grouped by service). If the client fails to initialize,
the server logs a warning and falls back to the `snapshots` approximation rather
than refusing to start.

## Azure (untested against a live account)

> Implemented but not verified against a real Azure subscription.
Expand Down
4 changes: 3 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ Reference for every environment variable CloudOracle reads. All vars are loaded
| `SYNTHETIC_COUNT` | `100` | Default number of synthetic resources to generate |
| `SYNTHETIC_ACCOUNT` | `synthetic-account` | Default account ID for synthetic data |
| `CLOUD_SERVICE_TIMEOUT` | `30s` | Per-service timeout for each cloud API call (Go duration string) |
| `CLOUDORACLE_BILLING_PROVIDER` | `snapshots` | Cost source for the v1 endpoints: `snapshots` (the projected-cost approximation) or `aws_cost_explorer` (real AWS unblended cost via the Cost Explorer API; uses `AWS_REGION`/`AWS_PROFILE`). On init failure it logs and falls back to `snapshots`. |
| `CLOUDORACLE_BILLING_PROVIDER` | `snapshots` | Cost source for the v1 endpoints: `snapshots` (the projected-cost approximation), `aws_cost_explorer` (real AWS unblended cost via the Cost Explorer API; uses `AWS_REGION`/`AWS_PROFILE`), or `gcp_bigquery` (real GCP net cost from the billing export in BigQuery; uses `GOOGLE_CLOUD_PROJECT` + the two `CLOUDORACLE_GCP_BILLING_*` vars below). On init failure it logs and falls back to `snapshots`. |
| `CLOUDORACLE_GCP_BILLING_DATASET` | _(unset)_ | BigQuery dataset holding the GCP billing export (required when `CLOUDORACLE_BILLING_PROVIDER=gcp_bigquery`) |
| `CLOUDORACLE_GCP_BILLING_TABLE` | _(unset)_ | Billing-export table name, e.g. `gcp_billing_export_v1_0123AB_CDEF45_6789GH` (required when `CLOUDORACLE_BILLING_PROVIDER=gcp_bigquery`) |
| `DB_HOST` | `localhost` | PostgreSQL host |
| `DB_PORT` | `5432` | PostgreSQL port |
| `DB_USER` | `oracle` | Database user |
Expand Down
Loading
Loading