mcpbeat

Adding Metrics

cloudflare/adding-metrics

Add new Prometheus metrics to the Cloudflare exporter. Use when adding metrics, implementing new GraphQL/REST queries, or extending metric coverage. Covers the full workflow from schema discovery through client implementation and README updates.

5k tokens
context cost
the whole folder, loaded on every use
4
files
instructions only
0
copies elsewhere
how many repositories repackaged it
173
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/cloudflare/cloudflare-prometheus-exporter --skill adding-metrics

What comes with it

15 961 bytes besides the instruction
references/gotchas.md
references/patterns.md
references/workflow.md

The instruction itself

6 sections, as written by the author

Adding Metrics

Guided workflow for adding new Prometheus metrics to the Cloudflare Prometheus Exporter. Derived from patterns in PRs #10, #13, #14, #15, and opencode session 1770403408223-happy-garden.

Decision Tree

What kind of metric are you adding?
|
+-- Uses Cloudflare GraphQL API?
|   |
|   +-- Scoped to a single account (no zones)?
|   |   -> Account-level GraphQL
|   |   -> See workflow.md, Step A
|   |
|   +-- Scoped to zones (needs zoneTag_in)?
|       -> Zone-level GraphQL
|       -> See workflow.md, Step B
|
+-- Uses Cloudflare REST API?
    -> REST API (zone-scoped DO)
    -> See workflow.md, Step C

Quick Reference: Files to Modify

| Step | File | Change |

|------|------|--------|

| 1 | src/cloudflare/gql/queries.ts | Add graphql() tagged template (skip for REST) |

| 2 | src/cloudflare/queries.ts | Add to MetricQueryNameSchema enum + category arrays |

| 3 | src/cloudflare/client.ts | Import query, add switch case, implement handler |

| 4 | src/durable-objects/MetricExporter.ts | Only if special guardrails needed (e.g. allowlists) |

| 5 | README.md | Add metric docs + update architecture diagram counts |

Key Conventions

  • Metric names: cloudflare_<scope>_<thing>_<unit> -- _total for counters, _seconds for durations
  • Label keys: snake_case always. Normalize accounts via normalizeAccountName(), zones via findZoneName()
  • Counter vs Gauge: counters for window totals (DO accumulates); gauges for snapshots/rates/ratios
  • Null safety: noUncheckedIndexedAccess is on -- null-coalesce everything: dims?.field ?? ""
  • Empty filter: Always return [...metrics].filter(m => m.values.length > 0)
  • Exhaustive switch: Both dispatch methods use const _exhaustive: never = query -- TS errors if case missing

Reading Order

| Task | Files |

|------|-------|

| Add a metric (full workflow) | workflow.md |

| Copy/paste code templates | patterns.md |

| Avoid known pitfalls | gotchas.md |

In This Reference

| File | Purpose |

|------|---------|

| workflow.md | Step-by-step checklist per metric category |

| patterns.md | Code templates for queries, handlers, and MetricDefinitions |

| gotchas.md | Pitfalls from real PRs and code reviews |

How to use it

Copy the folder

Take cloudflare/adding-metrics from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.