Awesome-claude-code create-metrics-collector
Generates Metrics Collector for PHP 8.4. Creates MetricsCollectorInterface, Counter/Gauge/Histogram wrappers, PrometheusMetricsCollector, MetricsMiddleware for RED metrics. Includes unit tests.
install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/create-metrics-collector" ~/.claude/skills/dykyi-roman-awesome-claude-code-create-metrics-collector && rm -rf "$T"
manifest:
skills/create-metrics-collector/SKILL.mdsource content
Metrics Collector Generator
Creates metrics collection infrastructure for application observability and monitoring.
When to Use
| Scenario | Example |
|---|---|
| Request monitoring | Track request rate, errors, duration (RED) |
| Business metrics | Count orders, revenue, active users |
| Performance profiling | Histogram of response times |
| Health dashboards | Expose for Prometheus scraping |
Component Characteristics
MetricsCollectorInterface
- Metrics contract for increment, gauge, histogram operations
- Backend-agnostic: swap Prometheus for StatsD or custom
- Supports labels for dimensional metrics
Counter
- Monotonically increasing metric wrapper
- Tracks totals: requests, errors, processed items
- Supports labels for per-endpoint counts
Gauge
- Point-in-time value metric wrapper
- Tracks current state: active connections, queue size
- Can increase and decrease
Histogram
- Distribution metric wrapper
- Tracks request duration, response size
- Configurable bucket boundaries
PrometheusMetricsCollector
- Prometheus PHP client adapter
- Registers counters, gauges, histograms
- Thread-safe with shared storage
MetricsMiddleware
- PSR-15 middleware collecting RED metrics automatically
- Rate: total request count per endpoint
- Errors: error count by status code
- Duration: response time histogram
MetricsAction
endpoint exposing Prometheus format/metrics- Returns
with all registered metricstext/plain
NullMetricsCollector
- Null Object pattern for testing and development
- All operations are no-ops
- Drop-in replacement without side effects
Generation Process
Step 1: Generate Core Components
Path:
src/Infrastructure/Metrics/
— Metrics contractMetricsCollectorInterface.php
— Counter metric wrapperCounter.php
— Gauge metric wrapperGauge.php
— Histogram metric wrapperHistogram.php
Step 2: Generate Implementations
Path:
src/Infrastructure/Metrics/
— Prometheus adapterPrometheusMetricsCollector.php
— Null Object for testingNullMetricsCollector.php
Step 3: Generate HTTP Components
Path:
src/Infrastructure/Metrics/
— PSR-15 RED metrics middlewareMetricsMiddleware.php
—MetricsAction.php
endpoint action/metrics
Step 4: Generate Tests
— Null object behavior testsNullMetricsCollectorTest.php
— Middleware metrics testsMetricsMiddlewareTest.php
File Placement
| Component | Path |
|---|---|
| All Classes | |
| Unit Tests | |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Interface | | |
| Counter | | |
| Gauge | | |
| Histogram | | |
| Prometheus | | |
| Null Object | | |
| Middleware | | |
| Action | | |
| Test | | |
Quick Template Reference
MetricsCollectorInterface
interface MetricsCollectorInterface { /** @param array<string, string> $labels */ public function increment(string $name, array $labels = [], float $value = 1.0): void; /** @param array<string, string> $labels */ public function gauge(string $name, float $value, array $labels = []): void; /** @param array<string, string> $labels */ public function histogram(string $name, float $value, array $labels = []): void; }
MetricsMiddleware
final readonly class MetricsMiddleware implements MiddlewareInterface { public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface; }
NullMetricsCollector
final readonly class NullMetricsCollector implements MetricsCollectorInterface { public function increment(string $name, array $labels = [], float $value = 1.0): void {} public function gauge(string $name, float $value, array $labels = []): void {} public function histogram(string $name, float $value, array $labels = []): void {} }
Usage Example
// Middleware auto-collects RED metrics $middleware = new MetricsMiddleware($collector); // Manual metrics in use cases $collector->increment('orders_created_total', ['channel' => 'web']); $collector->gauge('active_connections', $pool->activeCount()); $collector->histogram('payment_duration_seconds', $elapsed, ['gateway' => 'stripe']); // Expose via /metrics endpoint $app->get('/metrics', new MetricsAction($collector));
RED Metrics Pattern
Rate ──→ http_requests_total{method, path, status} Errors ──→ http_requests_total{status=~"5.."} Duration ──→ http_request_duration_seconds{method, path}
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| High cardinality labels | Prometheus storage explosion | Limit label values, no user IDs |
| No null implementation | Cannot disable metrics in tests | NullMetricsCollector |
| Inline metric names | Typos, inconsistency | Define constants or enum |
| Missing error metrics | Cannot calculate error rate | Track status codes |
| No histogram buckets | Default buckets don't fit use case | Configure per metric |
| Metrics in domain layer | Infrastructure leak | Keep in infrastructure only |
References
For complete PHP templates and examples, see:
— MetricsCollectorInterface, Counter, Gauge, Histogram, Prometheus, Middleware templatesreferences/templates.md
— Integration examples and testsreferences/examples.md