This commit completes all three optimization issues from the Blueprint v2.0 roadmap, achieving 100% compliance (23/23 checks) with the optimized blueprint. ## Issue #26: Configure Alembic Database Migration ✅ ### Database Migration Framework - Created alembic.ini with SQLite default and production PostgreSQL support - Implemented async-capable alembic/env.py with SQLAlchemy 2.0 integration - Added script.py.mako template following naming convention: YYYYMMDD_HHMM_<revision>_<slug> ### SQLAlchemy Models - Created backend/models/__init__.py with async engine and session factory - Added backend/models/user.py (User model with authentication fields) - Added backend/models/item.py (Item model with user relationship) - Models follow best practices: indexed columns, timezone-aware timestamps ### Initial Migration - Created alembic/versions/20250101_0001_initial_schema.py - Implements Expand pattern (nullable columns, safe for zero-downtime) - Creates users and items tables with proper constraints and indexes ### Kubernetes Integration - Updated values-infra-db.yaml with database.migrations configuration - Added PreSync migration job settings (ttl: 300s, backoff: 3) - Configured resource limits for migration jobs ### Documentation - Created comprehensive docs/database/migration-guide.md (365 lines) - Covers: Expand/Contract pattern, K8s migrations, troubleshooting - Includes production best practices and rollback strategies ## Issue #27: Integrate OpenTelemetry Distributed Tracing ✅ ### OpenTelemetry SDK Integration - Added 6 OpenTelemetry packages to requirements.txt: * opentelemetry-api, opentelemetry-sdk (core) * opentelemetry-instrumentation-fastapi (auto-instrumentation) * opentelemetry-exporter-otlp (OTLP exporter) * opentelemetry-instrumentation-sqlalchemy, httpx (DB and HTTP tracing) ### Backend Application Rewrite (backend/main.py) - Implemented configure_opentelemetry() function: * Creates Resource with SERVICE_NAME, SERVICE_VERSION, DEPLOYMENT_ENVIRONMENT * Configures TracerProvider with BatchSpanProcessor * Sets up OTLPSpanExporter to send to OpenTelemetry Collector - Auto-instrumented FastAPI with FastAPIInstrumentor.instrument_app(app) - Added manual span example in root endpoint with custom attributes ### Enhanced Structured Logging - Created JSONFormatter with trace_id and span_id injection - Logs now include: * trace_id (32-char hex from OpenTelemetry span context) * span_id (16-char hex) * service, env, namespace, pod (for Grafana filtering) - Enables log-trace correlation in Grafana/Loki ### Kubernetes Configuration - Updated values-infra-db.yaml with OTEL environment variables: * OTEL_ENABLED=true * OTEL_SERVICE_NAME=gold-template * OTEL_EXPORTER_OTLP_ENDPOINT (pointing to otel-collector in tracing namespace) * OTEL_TRACES_SAMPLER=parentbased_traceidratio (10% sampling) ## Issue #28: Create Grafana Dashboard ✅ ### Comprehensive Observability Dashboard - Created deployment/grafana/dashboards/gold-template.json (582 lines) - Dashboard: "Gold Template - Application Observability" - UID: gold-template-observability ### Dashboard Panels (6 Total) 1. **Request Rate (RPS)** - Time series - PromQL: rate(http_requests_total{namespace="$namespace"}[5m]) - Legend: {{method}} {{endpoint}} - Unit: reqps 2. **Error Rate** - Gauge - PromQL: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) - Thresholds: green < 5% < yellow < 10% < red - Unit: percentunit 3. **Response Time (P50, P95, P99)** - Time series - PromQL: histogram_quantile(0.50/0.95/0.99, rate(http_request_duration_seconds_bucket[5m])) - Shows mean and max in legend table - Unit: seconds 4. **Memory Usage** - Time series - PromQL: container_memory_usage_bytes / container_spec_memory_limit_bytes - Per-pod breakdown - Unit: percentunit 5. **CPU Usage** - Time series - PromQL: rate(container_cpu_usage_seconds_total[5m]) - Per-pod breakdown - Unit: percentunit 6. **Application Logs** - Loki logs panel - LogQL: {namespace="$namespace"} | json | line_format "{{.timestamp}} [{{.level}}] {{.message}} (trace_id={{.trace_id}})" - Shows structured logs with trace_id for correlation ### Dashboard Features - Template variables: namespace (gold-template/dev/prod), pod (multi-select) - Auto-refresh: 30s - Time range: Last 1 hour (default) - Tags: gold-template, fastapi, observability - Datasources: Prometheus, Loki (via variables ${DS_PROMETHEUS}, ${DS_LOKI}) ## Compliance Verification - Ran .claude/skills/blueprint-checker/checker.py - **Score: 23/23 (100%)** ✅ - All categories passing: * Observability: 7/7 (Prometheus, logs, trace_id, OpenTelemetry, ServiceMonitor) * Database: 4/4 (Alembic, migrations, PreSync job, infra DB) * Deployment: 4/4 (Argo CD, Helm, multi-env, Dockerfile) * CI/CD: 4/4 (GitHub Actions, GitOps, quality checks, security scans) * Code Quality: 4/4 (dependencies, tests, docs, env example) ## Technical Highlights - **Zero-Downtime Migrations:** Expand/Contract pattern with PreSync hooks - **Full Observability:** Metrics + Traces + Logs (Golden Signals + trace correlation) - **Production-Ready:** Async SQLAlchemy, structured logging, resource limits - **GitOps Compliant:** All changes via Git, Argo CD auto-sync - **Multi-Environment:** Separate configs for dev/prod with different sampling rates ## Files Changed - Created: alembic.ini, alembic/env.py, alembic/script.py.mako - Created: alembic/versions/20250101_0001_initial_schema.py - Created: backend/models/__init__.py, user.py, item.py - Modified: backend/main.py (complete rewrite with OpenTelemetry) - Modified: requirements.txt (+6 OpenTelemetry packages) - Modified: deployment/helm/gold-template/values-infra-db.yaml - Created: deployment/grafana/dashboards/gold-template.json - Created: docs/database/migration-guide.md Closes #26 Closes #27 Closes #28 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
103 lines
2.2 KiB
YAML
103 lines
2.2 KiB
YAML
# Configuration for using infra namespace databases
|
|
replicaCount: 2
|
|
|
|
image:
|
|
repository: localhost:5000/gold-template
|
|
pullPolicy: Always
|
|
tag: "latest"
|
|
|
|
# PostgreSQL from infra namespace
|
|
database:
|
|
enabled: true
|
|
host: postgres-service.infra.svc.cluster.local
|
|
port: 5432
|
|
name: goldtemplate
|
|
type: postgresql
|
|
|
|
# Database migrations configuration
|
|
migrations:
|
|
enabled: true
|
|
logLevel: INFO
|
|
ttlSecondsAfterFinished: 300
|
|
backoffLimit: 3
|
|
resources:
|
|
limits:
|
|
cpu: 500m
|
|
memory: 512Mi
|
|
requests:
|
|
cpu: 100m
|
|
memory: 128Mi
|
|
|
|
# Redis from infra namespace
|
|
redis:
|
|
enabled: true
|
|
host: redis-service.infra.svc.cluster.local
|
|
port: 6379
|
|
|
|
# Environment variables
|
|
env:
|
|
- name: DATABASE_HOST
|
|
value: "postgres-service.infra.svc.cluster.local"
|
|
- name: DATABASE_PORT
|
|
value: "5432"
|
|
- name: DATABASE_NAME
|
|
value: "goldtemplate"
|
|
- name: REDIS_HOST
|
|
value: "redis-service.infra.svc.cluster.local"
|
|
- name: REDIS_PORT
|
|
value: "6379"
|
|
- name: LOG_LEVEL
|
|
value: "INFO"
|
|
- name: METRICS_ENABLED
|
|
value: "true"
|
|
|
|
# OpenTelemetry configuration
|
|
- name: OTEL_ENABLED
|
|
value: "true"
|
|
- name: OTEL_SERVICE_NAME
|
|
value: "gold-template"
|
|
- name: OTEL_SERVICE_VERSION
|
|
value: "1.0.0"
|
|
- name: OTEL_EXPORTER_OTLP_ENDPOINT
|
|
value: "otel-collector-opentelemetry-collector.tracing.svc.cluster.local:4317"
|
|
- name: OTEL_TRACES_SAMPLER
|
|
value: "parentbased_traceidratio"
|
|
- name: OTEL_TRACES_SAMPLER_ARG
|
|
value: "0.1" # 10% sampling rate
|
|
|
|
# Secrets for database credentials
|
|
secretEnv:
|
|
- name: DATABASE_USER
|
|
secretName: gold-template-db-secret
|
|
secretKey: username
|
|
- name: DATABASE_PASSWORD
|
|
secretName: gold-template-db-secret
|
|
secretKey: password
|
|
- name: REDIS_PASSWORD
|
|
secretName: gold-template-redis-secret
|
|
secretKey: password
|
|
|
|
# Enable Prometheus monitoring
|
|
serviceMonitor:
|
|
enabled: true
|
|
interval: 30s
|
|
scrapeTimeout: 10s
|
|
|
|
# Pod annotations for Prometheus
|
|
podAnnotations:
|
|
prometheus.io/scrape: "true"
|
|
prometheus.io/port: "8000"
|
|
prometheus.io/path: "/metrics"
|
|
|
|
# Disable local persistence (using infra databases)
|
|
persistence:
|
|
enabled: false
|
|
|
|
resources:
|
|
limits:
|
|
cpu: 1000m
|
|
memory: 1Gi
|
|
requests:
|
|
cpu: 200m
|
|
memory: 256Mi
|