Skip to content

feat(status-pages): add third-party outage signals from updog.ai - #83

Merged
platinummonkey merged 4 commits into
mainfrom
feat/status-pages-third-party
Feb 18, 2026
Merged

feat(status-pages): add third-party outage signals from updog.ai#83
platinummonkey merged 4 commits into
mainfrom
feat/status-pages-third-party

Conversation

@platinummonkey

@platinummonkey platinummonkey commented Feb 18, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds pup status-pages third-party subcommand that fetches third-party service outage signals from updog.ai, giving users visibility into external service health (AWS, GCP, Stripe, etc.) that may affect their Datadog integrations.

Changes

  • New cmd/status_pages_third_party.go — command, types, filtering, sparkline chart, custom table rendering
  • New cmd/status_pages_third_party_test.go — 23 tests covering sparkline, table, search, errors
  • Updated cmd/status_pages_test.go — subcommand registration test includes third-party

Usage

# List all third-party outage signals (JSON)
pup status-pages third-party

# Table view with 30-day colored sparkline chart
pup status-pages third-party --output=table

# Search by provider name or display name
pup status-pages third-party --search=amazon --output=table

# Show only providers with active outages
pup status-pages third-party --active --output=table

Table output

┌──────────┬────────────────────────┬─────────┬────────────────────────────────┬─────────────┐
│ PROVIDER │ DISPLAY NAME           │ SERVICE │ UPTIME                         │ STATUS      │
├──────────┼────────────────────────┼─────────┼────────────────────────────────┼─────────────┤
│ aws-s3   │ Amazon S3              │ S3      │ ████████████████████████████░█ │ active      │
│ stripe   │ Stripe                 │         │ ██████████████████████████████ │ operational │
│ gcp      │ Google Cloud Platform  │         │ ██████████████████████████████ │ operational │
└──────────┴────────────────────────┴─────────┴────────────────────────────────┴─────────────┘

Each character in the UPTIME column = 1 day over the last 30 days:

  • Green █ — operational
  • Red █ — outage detected
  • Dim · — before monitoring started

Design Notes

  • No Datadog authentication required — public updog.ai API
  • --search matches both provider_name and display_name (case-insensitive)
  • buildSparkline() uses ANSI green/red/dim for terminal color output
  • timeNow var is injectable for deterministic test assertions
  • JSON/YAML output returns full provider data with outage history

Test plan

  • 23 tests pass — sparkline (5 cases), status (4), filter (8), table (2), e2e runs (7 incl. search-by-display-name)
  • Existing status-pages tests updated and passing
  • Full test suite passes with -race detection
  • go build ./... succeeds

🤖 Generated with Claude Code

platinummonkey and others added 4 commits February 18, 2026 17:17
Add `pup status-pages third-party` subcommand that fetches and displays
third-party service outage signals from updog.ai, giving users visibility
into external service health that may affect their Datadog integrations.

- Fetch outage data from https://updog.ai/data/third-party-outages.json
- Support --provider flag for case-insensitive provider filtering
- Support --active flag to show only providers with unresolved outages
- No Datadog authentication required (public third-party data)
- Full test coverage with httptest server mocking

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…arch

Enhance the third-party outages command with a custom table format showing
provider name, display name, service, ASCII signal (▲ UP / ▼ DOWN), and
status. Rename --provider to --search for clarity since it matches against
both provider_name and display_name fields.

- Custom table rendering with providerStatus() for signal derivation
- ▲ UP for operational, ▼ DOWN for any unresolved outage
- --search flag matches provider name and display name (case-insensitive)
- JSON/YAML output unchanged (full provider data)
- 21 tests covering table rendering, signals, search, and edge cases

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace simple UP/DOWN text signal with a 30-day sparkline chart using
colored Unicode block characters. Each character represents one day:
green █ = operational, red █ = outage, dim · = before monitoring started.

- buildSparkline() generates per-provider 30-day uptime chart
- ANSI green/red/dim coloring for at-a-glance visual scanning
- Injectable timeNow for deterministic test assertions
- 23 tests including sparkline rendering, color output, edge cases

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@platinummonkey
platinummonkey merged commit 8ac5afa into main Feb 18, 2026
4 checks passed
@platinummonkey
platinummonkey deleted the feat/status-pages-third-party branch February 18, 2026 23:32
platinummonkey added a commit that referenced this pull request Feb 24, 2026
Ports the uptime sparkline and filtered table output from PR #83 into
the Rust implementation. The previous Rust code dumped raw JSON and
silently ignored --search/--active flags.

- Add typed structs for updog.ai response deserialization
- Implement filter_providers() — case-insensitive search on provider_name
  or display_name, optional active-outage-only filter
- Implement build_sparkline() — 30-day colored chart (green=operational,
  red=outage, dim·=pre-monitoring), time-injectable for testability
- Replace comfy-table with a hand-rolled ASCII table: comfy-table counts
  ANSI escape bytes as visible width, inflating the UPTIME column; the
  manual renderer computes column widths from plain strings and inserts
  the sparkline verbatim so ANSI codes never distort alignment
- Wire --search and --active flags through to third_party_list() in both
  main.rs and test_commands.rs
- Add 14 unit tests covering filtering, sparkline edge cases, and table
  layout (headers, data, block chars)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant