Files
dotfiles/dot_agents/skills/cloudflare/references/analytics-engine/patterns.md
T
Prad Nukala 6406208b35 shell: fish functions -> ~/.local/bin executables + bash/zsh ports; manage ~/.agents
- 16 cross-shell utilities converted to sh/bash chezmoi executables:
  ai c2p cp-appid extract_agents fab gdc gh-sonr-org-migrate ghg-clone
  ghn gho git-summary launch_omp_livediff_overlay lc-elir mdcp mdp pj
  (ghg-clone not named ghg: unrelated cargo binary owns that name)
- cwd/history helpers stay per-shell: yy c cd clip-last + ghg/ghn/gho
  cd-wrappers in bash/functions/ and zsh/functions/, loaded by rc files
- fish keeps only shell-state functions; converted ones now hit PATH
- cp-appid ignore gating moved to .local/bin path
- dot_agents/skills: 82 skills materialized from dotstate storage so
  dot_claude skill symlinks resolve on fresh bootstrap; dotstate
  profile/symlinks.json released .agents/skills .bashrc .zshrc
2026-08-10 15:15:06 -04:00

2.3 KiB

Analytics Engine Patterns

Use Cases

Use Case Key Metrics Index On
API Metering requests, bytes, compute_units api_key
Feature Usage feature, action, duration user_id
Error Tracking error_type, endpoint, count customer_id
Performance latency_ms, cache_status endpoint
A/B Testing variant, conversions user_id

API Metering (Billing)

env.ANALYTICS.writeDataPoint({
  blobs: [pathname, method, status, tier],
  doubles: [1, computeUnits, bytes, latencyMs],
  indexes: [apiKey]
});

// Query: Monthly usage by customer
// SELECT index1 AS api_key, SUM(double2) AS compute_units
// FROM usage WHERE timestamp >= DATE_TRUNC('month', NOW()) GROUP BY index1

Error Tracking

env.ANALYTICS.writeDataPoint({
  blobs: [endpoint, method, errorName, errorMessage.slice(0, 1000)],
  doubles: [1, timeToErrorMs],
  indexes: [customerId]
});

Performance Monitoring

env.ANALYTICS.writeDataPoint({
  blobs: [pathname, method, cacheStatus, status],
  doubles: [latencyMs, 1],
  indexes: [userId]
});

// Query: P95 latency by endpoint
// SELECT blob1, quantile(0.95)(double1) AS p95_ms FROM perf GROUP BY blob1

Anti-Patterns

❌ Wrong ✅ Correct
await writeDataPoint() writeDataPoint() (fire-and-forget)
indexes: [method] (low cardinality) blobs: [method], indexes: [userId]
blobs: [JSON.stringify(obj)] Store ID in blob, full object in D1/KV
Write every request at 10M/min Pre-aggregate per second
Query from Worker Query from external service/API

Best Practices

  1. Design schema upfront - Document blob/double/index assignments
  2. Always include count metric - doubles: [latency, 1] for AVG calculations
  3. Use enums for blobs - Consistent values like Status.SUCCESS
  4. Handle sampling - Use ratios (avg_latency = SUM(latency)/SUM(count))
  5. Test queries early - Validate schema before heavy writes

Schema Template

/**
 * Dataset: my_metrics
 * 
 * Blobs:
 *   blob1: endpoint, blob2: method, blob3: status
 * 
 * Doubles:
 *   double1: latency_ms, double2: count (always 1)
 * 
 * Indexes:
 *   index1: customer_id (high cardinality)
 */