Skip to content

refactor(analytics)!: rename analytics-api service to analytics, drop env-key crutches - #1579

Merged
cyberantonz merged 2 commits into
constructorfabric:mainfrom
cyberantonz:analytics-api-rename
Jul 3, 2026
Merged

refactor(analytics)!: rename analytics-api service to analytics, drop env-key crutches#1579
cyberantonz merged 2 commits into
constructorfabric:mainfrom
cyberantonz:analytics-api-rename

Conversation

@cyberantonz

Copy link
Copy Markdown
Contributor

Fixes #1565.

Why

The gear name analytics-api produced env override keys with a hyphen (APP__gears__analytics-api__config__*), which dash entrypoints and k8s envFrom silently drop — the root cause of the PR #1546 boot failures, worked around with an underscore alias + fold shim. Renaming to the dash-free analytics fixes it at the root. Upstream toolkit report: constructorfabric/gears-rust#4175.

What

Scope A — gear rename + crutch removal

  • Gear name/config key analytics-apianalytics (gear.rs, config/insight.yaml, helm configmap)
  • Deleted fold_gear_env_alias + deep_merge + call site + tests in main.rs
  • Env keys are now the natural APP__gears__analytics__config__* in docker-compose, umbrella secrets.yaml, and compose-app-secrets.sh

Scope B — ConfigMap collision

  • The gear ConfigMap now renders as <fullname>-gears-config, no longer colliding with the config Secret name

Scope C — full service rename

  • Dir services/analytics-apiservices/analytics; crate + binary analytics
  • Compose service/hostname analytics, container insight-analytics, ANALYTICS_IMAGE/ANALYTICS_PORT knobs; api-gateway upstream http://analytics:8081
  • Helm: subchart insight-analytics 0.2.0; umbrella 0.3.0 — BREAKING: values key analyticsApianalytics, config Secret insight-analytics-api-configinsight-analytics-config, image ghcr.io/constructorfabric/insight-analytics, k8s resource names follow the new fullname
  • CI: build-images / ci / e2e workflows, scripts/ci/components.py
  • e2e: lib/analytics_api.pylib/analytics.py, fixtures, compose rig
  • Docs/specs + cypilot registry paths updated; unchanged by design: cpt traceability IDs, GTS namespaces gts.cf.insight.analytics_api.*, OpenAPI operation_ids analytics_api.* (wire format), historical migrations

Verification

  • cargo build/clippy/fmt/test -p analytics all green
  • helm template renders with default + local gitops values; subchart re-vendored
  • docker compose config -q passes
  • --print-config confirms APP__gears__analytics__config__database_url lands under gears.analytics.config

Deploy notes

  • The old Secret insight-analytics-api-config carries helm.sh/resource-policy: keep — clean it up manually after rollout
  • insight-gitops needs its matching update (values key + composed Secret name) and an .insight-version bump to 0.3.0 once this chart is published — prepared separately
  • First deploy of chart 0.3.0 replaces Deployment/Service (new names), so expect a brief blip; ghcr package insight-analytics is created on first CI publish from this PR

🤖 Generated with Claude Code

… env-key crutches

Fixes constructorfabric#1565.

The gear name analytics-api produced env override keys with a hyphen
(APP__gears__analytics-api__config__*), which dash entrypoints and k8s
envFrom silently drop. Renaming gear + service to the dash-free
"analytics" fixes this at the root (upstream report:
constructorfabric/gears-rust#4175).

Scope A — gear rename + crutch removal:
- gear name/config key analytics-api -> analytics (gear.rs, insight.yaml,
  helm configmap)
- delete fold_gear_env_alias/deep_merge shim + tests in main.rs
- env keys become APP__gears__analytics__config__* in compose, umbrella
  secrets.yaml, compose-app-secrets.sh; obsolete workaround comments gone

Scope B — the gear ConfigMap renders as <fullname>-gears-config, ending
the name collision with the config Secret.

Scope C — full service rename:
- dir services/analytics-api -> services/analytics; crate/binary
  analytics; Dockerfiles, .dockerignore, entrypoint
- compose service/hostname analytics, container insight-analytics,
  ANALYTICS_IMAGE/ANALYTICS_PORT knobs; api-gateway upstream
  http://analytics:8081
- helm subchart insight-analytics 0.2.0; umbrella 0.3.0 (BREAKING:
  values key analyticsApi -> analytics, Secret
  insight-analytics-api-config -> insight-analytics-config, image
  ghcr.io/constructorfabric/insight-analytics, k8s names follow
  fullname)
- CI: build-images/ci/e2e workflows + scripts/ci/components.py
- e2e: lib/analytics_api.py -> lib/analytics.py, fixtures, compose rig
- docs/specs + cypilot registry paths (cpt IDs, GTS namespaces, and
  OpenAPI operation_ids unchanged)

Verified: cargo build/clippy/fmt/test -p analytics green; helm template
renders with default + local gitops values; docker compose config -q ok;
--print-config confirms APP__gears__analytics__config__database_url
lands under gears.analytics.config.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Anton Zelenov <antonz@constructor.tech>
@cyberantonz
cyberantonz requested a review from a team as a code owner July 3, 2026 09:35
@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 188 files, which is 38 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 433a8e7f-c9a1-454b-9876-a1d1721586c8

📥 Commits

Reviewing files that changed from the base of the PR and between 84862c5 and 6644bd7.

⛔ Files ignored due to path filters (2)
  • charts/insight/Chart.lock is excluded by !**/*.lock
  • src/backend/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (188)
  • .claude/skills/metric-test/SKILL.md
  • .env.compose.example
  • .github/workflows/build-images.yml
  • .github/workflows/ci.yml
  • .github/workflows/e2e-bronze-to-api.yml
  • CONTRIBUTING.md
  • README.md
  • charts/insight/Chart.yaml
  • charts/insight/README.md
  • charts/insight/templates/NOTES.txt
  • charts/insight/templates/_helpers.tpl
  • charts/insight/templates/clickhouse-init-svcdbs-job.yaml
  • charts/insight/templates/clickhouse-migrate-job.yaml
  • charts/insight/templates/platform-config.yaml
  • charts/insight/templates/secrets.yaml
  • charts/insight/values.schema.json
  • charts/insight/values.yaml
  • cypilot/config/artifacts.toml
  • deploy/compose/clickhouse-user-defaults.xml
  • deploy/gitops/README.md
  • deploy/gitops/environments/functional-ci/values.yaml
  • deploy/gitops/environments/local/sealed-secrets/insight/insight-db-creds-sealedsecret.yaml.template
  • deploy/gitops/environments/local/values.yaml.template
  • deploy/gitops/scripts/compose-app-secrets.sh
  • deploy/gitops/secrets-store.yaml.template
  • deploy/gitops/system/grafana/values.yaml
  • deploy/gitops/system/redis/SECRETS.md
  • deploy/gitops/system/redis/values.yaml
  • deploy/seed/silver.py
  • dev-compose.sh
  • docker-compose.yml
  • docs/components/backend/analytics/DESIGN.md
  • docs/components/backend/analytics/openapi.json
  • docs/components/backend/api-gateway/router/DESIGN.md
  • docs/components/backend/identity-resolution/identity/specs/ADR/0009-post-profile-with-uniqueness-invariant.md
  • docs/components/backend/identity-resolution/identity/specs/DESIGN.md
  • docs/components/backend/identity-resolution/identity/specs/PRD.md
  • docs/components/backend/specs/DESIGN.md
  • docs/components/connectors/support/zendesk/specs/PRD.md
  • docs/components/connectors/support/zendesk/zendesk.md
  • docs/components/deployment/gitops/README.md
  • docs/components/deployment/specs/ADR/0001-chart-publishing-on-merge.md
  • docs/components/deployment/specs/DESIGN.md
  • docs/components/deployment/specs/PRD.md
  • docs/domain/bronze-to-api-e2e/specs/DECOMPOSITION.md
  • docs/domain/bronze-to-api-e2e/specs/DESIGN.md
  • docs/domain/bronze-to-api-e2e/specs/PRD.md
  • docs/domain/bronze-to-api-e2e/specs/feature-csv-rig/FEATURE.md
  • docs/domain/identity-resolution/specs/DESIGN.md
  • docs/domain/ingestion/specs/ADR/0006-service-owned-migrations.md
  • docs/domain/ingestion/specs/DESIGN.md
  • docs/domain/metric-catalog/specs/ADR/ADR-001-query-catalog-junction-fk.md
  • docs/domain/metric-catalog/specs/ADR/ADR-002-metric-key-on-wire-for-fe-bridge.md
  • docs/domain/metric-catalog/specs/ADR/ADR-003-link-map-on-catalog-read-response.md
  • docs/domain/metric-catalog/specs/DESIGN.md
  • docs/domain/metric-catalog/specs/PRD.md
  • docs/domain/metric-catalog/specs/PRD_human_readable.md
  • scripts/ci/changed.py
  • scripts/ci/components.py
  • src/backend/.dockerignore
  • src/backend/Cargo.toml
  • src/backend/docker-entrypoint.sh
  • src/backend/services/analytics-api/helm/Chart.yaml
  • src/backend/services/analytics-api/helm/templates/_helpers.tpl
  • src/backend/services/analytics-api/src/main.rs
  • src/backend/services/analytics/Cargo.toml
  • src/backend/services/analytics/Dockerfile
  • src/backend/services/analytics/config/insight.yaml
  • src/backend/services/analytics/fix-seed-aggregation.sql
  • src/backend/services/analytics/helm/Chart.yaml
  • src/backend/services/analytics/helm/templates/_helpers.tpl
  • src/backend/services/analytics/helm/templates/configmap.yaml
  • src/backend/services/analytics/helm/templates/deployment.yaml
  • src/backend/services/analytics/helm/templates/service.yaml
  • src/backend/services/analytics/helm/values.yaml
  • src/backend/services/analytics/src/api/admin/error_map.rs
  • src/backend/services/analytics/src/api/admin/handlers.rs
  • src/backend/services/analytics/src/api/admin/mod.rs
  • src/backend/services/analytics/src/api/canonical_json.rs
  • src/backend/services/analytics/src/api/catalog.rs
  • src/backend/services/analytics/src/api/error.rs
  • src/backend/services/analytics/src/api/handlers.rs
  • src/backend/services/analytics/src/api/http_live_tests.rs
  • src/backend/services/analytics/src/api/mod.rs
  • src/backend/services/analytics/src/api/tenant_resolution_tests.rs
  • src/backend/services/analytics/src/auth.rs
  • src/backend/services/analytics/src/config.rs
  • src/backend/services/analytics/src/domain/admin_threshold/audit_emitter.rs
  • src/backend/services/analytics/src/domain/admin_threshold/dto.rs
  • src/backend/services/analytics/src/domain/admin_threshold/live_tests.rs
  • src/backend/services/analytics/src/domain/admin_threshold/lock_enforcer.rs
  • src/backend/services/analytics/src/domain/admin_threshold/mod.rs
  • src/backend/services/analytics/src/domain/admin_threshold/repository.rs
  • src/backend/services/analytics/src/domain/admin_threshold/service.rs
  • src/backend/services/analytics/src/domain/auth.rs
  • src/backend/services/analytics/src/domain/catalog/live_tests.rs
  • src/backend/services/analytics/src/domain/catalog/mod.rs
  • src/backend/services/analytics/src/domain/catalog/reader.rs
  • src/backend/services/analytics/src/domain/catalog/resolver.rs
  • src/backend/services/analytics/src/domain/catalog/response.rs
  • src/backend/services/analytics/src/domain/metric.rs
  • src/backend/services/analytics/src/domain/mod.rs
  • src/backend/services/analytics/src/domain/query.rs
  • src/backend/services/analytics/src/domain/schema_validator/backoff.rs
  • src/backend/services/analytics/src/domain/schema_validator/error_code.rs
  • src/backend/services/analytics/src/domain/schema_validator/live_tests.rs
  • src/backend/services/analytics/src/domain/schema_validator/mod.rs
  • src/backend/services/analytics/src/domain/schema_validator/parse.rs
  • src/backend/services/analytics/src/domain/schema_validator/probe.rs
  • src/backend/services/analytics/src/domain/schema_validator/repository.rs
  • src/backend/services/analytics/src/domain/schema_validator/status.rs
  • src/backend/services/analytics/src/domain/threshold.rs
  • src/backend/services/analytics/src/gear.rs
  • src/backend/services/analytics/src/infra/cache/catalog_cache.rs
  • src/backend/services/analytics/src/infra/cache/live_tests.rs
  • src/backend/services/analytics/src/infra/cache/mod.rs
  • src/backend/services/analytics/src/infra/db/check_probe.rs
  • src/backend/services/analytics/src/infra/db/entities.rs
  • src/backend/services/analytics/src/infra/db/mod.rs
  • src/backend/services/analytics/src/infra/db/product_default_probe.rs
  • src/backend/services/analytics/src/infra/identity/mod.rs
  • src/backend/services/analytics/src/infra/mod.rs
  • src/backend/services/analytics/src/main.rs
  • src/backend/services/analytics/src/migration/m20260414_000001_init.rs
  • src/backend/services/analytics/src/migration/m20260422_000001_seed_metrics.rs
  • src/backend/services/analytics/src/migration/m20260423_000001_seed_metrics_honest_nulls.rs
  • src/backend/services/analytics/src/migration/m20260428_000001_collab_metrics_update.rs
  • src/backend/services/analytics/src/migration/m20260429_000001_task_delivery_silver_rewrite.rs
  • src/backend/services/analytics/src/migration/m20260430_000001_update_git_bullet.rs
  • src/backend/services/analytics/src/migration/m20260507_000001_seed_crm_metrics.rs
  • src/backend/services/analytics/src/migration/m20260515_000001_task_delivery_bullet_rewrite.rs
  • src/backend/services/analytics/src/migration/m20260518_000001_collab_bullet_rewrite.rs
  • src/backend/services/analytics/src/migration/m20260519_000001_ai_bullet_rewrite.rs
  • src/backend/services/analytics/src/migration/m20260520_000001_code_quality_bullet_rewrite.rs
  • src/backend/services/analytics/src/migration/m20260522_000001_metric_catalog.rs
  • src/backend/services/analytics/src/migration/m20260522_000002_metric_threshold.rs
  • src/backend/services/analytics/src/migration/m20260522_000003_threshold_lock_audit.rs
  • src/backend/services/analytics/src/migration/m20260527_000001_seed_metric_catalog.rs
  • src/backend/services/analytics/src/migration/m20260527_000002_seed_metric_views.rs
  • src/backend/services/analytics/src/migration/m20260529_000001_metric_query_catalog_link.rs
  • src/backend/services/analytics/src/migration/m20260601_000001_ai_claude_team_metrics.rs
  • src/backend/services/analytics/src/migration/m20260601_000002_seed_claude_team_metrics_catalog.rs
  • src/backend/services/analytics/src/migration/m20260603_000001_seed_crm_metric_catalog.rs
  • src/backend/services/analytics/src/migration/m20260603_000002_link_crm_query_catalog.rs
  • src/backend/services/analytics/src/migration/m20260604_000001_task_delivery_bullet_distribution.rs
  • src/backend/services/analytics/src/migration/m20260604_000002_collab_bullet_distribution.rs
  • src/backend/services/analytics/src/migration/m20260604_000004_code_quality_bullet_distribution.rs
  • src/backend/services/analytics/src/migration/m20260604_000005_git_bullet_distribution.rs
  • src/backend/services/analytics/src/migration/m20260604_000006_ic_kpis_peer_median.rs
  • src/backend/services/analytics/src/migration/m20260604_000009_member_metric_values.rs
  • src/backend/services/analytics/src/migration/m20260606_000001_dept_metric_distributions.rs
  • src/backend/services/analytics/src/migration/m20260609_000001_ai_chatgpt_team_metrics.rs
  • src/backend/services/analytics/src/migration/m20260609_000002_seed_chatgpt_team_metrics_catalog.rs
  • src/backend/services/analytics/src/migration/m20260610_000001_fix_ai_label_drift.rs
  • src/backend/services/analytics/src/migration/m20260611_000001_ai_bullet_dept_reconcile.rs
  • src/backend/services/analytics/src/migration/m20260612_000001_support_metrics.rs
  • src/backend/services/analytics/src/migration/m20260612_000001_team_git_bullet.rs
  • src/backend/services/analytics/src/migration/m20260612_000002_seed_support_catalog.rs
  • src/backend/services/analytics/src/migration/m20260612_000003_link_support_query_catalog.rs
  • src/backend/services/analytics/src/migration/m20260618_000001_ai_claude_team_overage_metric.rs
  • src/backend/services/analytics/src/migration/m20260618_000002_seed_claude_team_overage_catalog.rs
  • src/backend/services/analytics/src/migration/m20260620_000001_seed_wiki_metrics.rs
  • src/backend/services/analytics/src/migration/m20260620_000002_seed_wiki_catalog.rs
  • src/backend/services/analytics/src/migration/m20260623_000001_ai_personal_queries.rs
  • src/backend/services/analytics/src/migration/m20260623_000002_seed_ai_personal_metric_catalog.rs
  • src/backend/services/analytics/src/migration/m20260624_000001_collab_zulip_chat.rs
  • src/backend/services/analytics/src/migration/m20260624_000002_seed_zulip_collab_catalog.rs
  • src/backend/services/analytics/src/migration/m20260624_000003_ic_chart_loc_git_breakdown.rs
  • src/backend/services/analytics/src/migration/mod.rs
  • src/backend/services/api-gateway/Dockerfile
  • src/backend/services/api-gateway/config/insight.yaml
  • src/backend/services/api-gateway/config/no-auth.yaml
  • src/backend/services/api-gateway/src/proxy.rs
  • src/ingestion/connectors/ai/chatgpt-team/README.md
  • src/ingestion/tests/e2e/README.md
  • src/ingestion/tests/e2e/api/test_session_smoke.py
  • src/ingestion/tests/e2e/compose/Dockerfile.runner
  • src/ingestion/tests/e2e/compose/docker-compose.cache.yml
  • src/ingestion/tests/e2e/compose/docker-compose.runner.yml
  • src/ingestion/tests/e2e/conftest.py
  • src/ingestion/tests/e2e/lib/analytics.py
  • src/ingestion/tests/e2e/lib/collect_metrics.py
  • src/ingestion/tests/e2e/lib/config.py
  • src/ingestion/tests/e2e/lib/mariadb.py
  • src/ingestion/tests/e2e/lib/metric_coverage.py
  • src/ingestion/tests/e2e/lib/metric_seed.py
  • src/ingestion/tests/e2e/metrics/test_fixtures.py
  • src/ingestion/tests/e2e/seed/metrics.yaml

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

… tests running

The rename PR touched api-gateway paths for the first time since the
coverage gate landed, which made changed.py schedule its Cobertura
producer — and exposed two pre-existing traps:

1. insight-api-gateway has zero unit tests, so its report gates the
   component at 0/209 = 0% and hard-fails the overall gate.
2. Its report also contains the linked oidc-authn-plugin dependency
   files at 0 hits (no cover_ignore_regex, unlike analytics), so the
   UNCHANGED oidc-authn-plugin component got bucketed at 0/125 = 0%.

Fix, mirroring the documented identity cover=False decision:
- components.py: api-gateway gets cover=False (+ a (libs|plugins)
  cover_ignore_regex for when coverage is re-enabled).
- changed.py: rust entries now honor the registry cover flag (was
  dotnet-only) and carry a new test flag (true when the crate itself
  changed) so cover=False crates still run plain cargo test on change;
  lint-only fanout entries stay lint-only.
- ci.yml: new "Test (no coverage)" step for test && !cover entries;
  refreshed a stale fold_gear_env_alias comment.

Verified: python3 scripts/ci/changed.py against origin/main yields
analytics lint+cover+test, api-gateway lint+test (no cover),
oidc-authn-plugin/insight-clickhouse lint-only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Anton Zelenov <antonz@constructor.tech>
@cyberantonz
cyberantonz merged commit 5c7f37a into constructorfabric:main Jul 3, 2026
30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

analytics-api: rename gear analytics-api → analytics + remove env-key crutches

2 participants