- k8s: 2 replicas, POOL_SIZE 25, cpu 2000m, mem 1Gi (was 1 replica, 5, 500m, 512Mi)
- telemetry poller 10s -> 60s; drop pg_database_size, pg_stat_statements,
pg_table_size and pg_indexes_size (these were ~7100s of cumulative DB time
on their own)
- get_latest_packet_for_callsign: bound by :packet_retention_days so partition
pruning kicks in
- get_nearby_stations_knn: ST_DWithin spatial pre-filter (default 500km) so
the GiST geography index cuts candidates before DISTINCT ON sort
(EXPLAIN: 5793ms -> 400ms)
- New migration: partial functional indexes on upper(object_name) and
upper(item_name), built per-partition CONCURRENTLY then attached to parent.
Lets get_latest_packet_for_callsign use BitmapOr across all 3 upper()
indexes instead of falling back to a scan
When the PacketProducer buffer crosses 80% capacity, signal Aprsme.Is
to switch its TCP socket to passive mode, leveraging TCP flow control
to slow APRS-IS intake. Resume active mode when buffer drains below 30%.
A 30-second safety valve timer auto-resumes if backpressure gets stuck.
Disconnect/reconnect/terminate paths all clear backpressure state.
- Add reporter_options with buckets to each distribution metric
- Remove incorrect top-level buckets configuration
- Define buckets array once and reuse for all distribution metrics
The TelemetryMetricsPrometheus library requires buckets to be specified
in reporter_options for each individual distribution metric, not at the
reporter configuration level.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Move buckets configuration from individual metrics to reporter level
- Configure default buckets for all distribution metrics in reporter options
- Remove buckets from individual metric definitions to prevent ArgumentError
- This fixes the pod crash due to "missing required buckets property" error
The TelemetryMetricsPrometheus library requires buckets to be configured
at the reporter level rather than per-metric for distribution types.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Convert unsupported summary metrics to supported types:
- Use distribution() for latency/duration measurements with appropriate buckets
- Use last_value() for current state metrics (VM memory, queue lengths)
- Use counter() for cumulative metrics (packet counts, errors)
This eliminates the TelemetryMetricsPrometheus warnings about unsupported
summary metric types while maintaining proper metric semantics.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Simplify APRS_PORT parsing to avoid syntax errors
- Disable Exq properly in test environment to prevent startup issues
- Disable Prometheus telemetry in test mode to avoid port conflicts
- Update telemetry module to conditionally start Prometheus metrics
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add telemetry_metrics_prometheus dependency
- Configure Prometheus exporter in telemetry module
- Add metrics endpoint to application endpoint
- Expose /metrics for Prometheus scraping
This enables the application to be monitored by the Prometheus stack.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>