Skip to content

FRD-071: Ingress Status Card Widget

FieldValue
OwnerDavid Holmes
StatusDraft
Last Updated2026-05-26
Target Releasev2.0.0 (P2)
T-Shirt SizeS
TypeWidget

Document Summary

A compact status card for a single Kubernetes ingress resource, showing domain, TLS certificate expiry, health status, and request rate. Displays a warning badge when the certificate expires within 30 days. Complements the existing IngressCertificatePostureStrip which shows a grid of multiple ingress entries.


Introduction

Overview

SRE teams need at-a-glance visibility into ingress health for individual services. The existing IngressCertificatePostureStrip renders a grid of multiple entries but lacks request-rate data and single-card focus. This widget provides a detailed single-ingress view with health, certificate status, and traffic metrics.

Goals

  • Display a single ingress resource’s domain, TLS cert expiry, health, and request rate.
  • Show a warning badge when the TLS certificate expires within 30 days.
  • Show an error badge when the certificate is expired.
  • Include request-rate metric with trend indicator.
  • Ship Storybook stories for healthy, expiring, expired, and unhealthy states.

Non-Goals

  • Ingress configuration or editing.
  • Certificate renewal execution (consumer handles via callback).
  • Multi-ingress grid view (handled by IngressCertificatePostureStrip).
  • Detailed request logs or traffic analysis.

Scope

In Scope

ItemDescription
IngressStatusCard componentSingle-card view of ingress health and cert status
Domain displayPrimary hostname
TLS cert expiryDays until expiration with urgency badge
Health statusBadge showing healthy/degraded/down
Request rateCurrent requests/sec with optional trend arrow
Warning badgeAutomatically shown when cert expires within configurable threshold
Storybook storiesHealthy, CertExpiring, CertExpired, Degraded, Down, HighTraffic

Out of Scope

ItemRationale
Certificate renewalBackend concern; consumer handles via callback
Ingress configurationAdmin UI; separate from monitoring
Traffic analysisRequires time-series data; separate widget
Multiple ingress displayHandled by IngressCertificatePostureStrip

Users and Pain Points

UserPain Point
SRE engineersNo single-card ingress view with cert expiry and traffic data
Platform teamsIngressCertificatePostureStrip lacks request-rate context
On-call engineersNeed quick visibility into individual ingress health during incidents

Definitions

TermDefinition
IngressA Kubernetes resource that manages external access to services
TLS certificateThe SSL/TLS certificate securing HTTPS traffic for the domain
Request rateThe number of HTTP requests per second hitting the ingress
Health statusThe operational state of the ingress (healthy, degraded, down)

Current State

ingress-certificate-posture-strip.tsx renders a grid of IngressCertificateEntry cards showing host, certificate name, issuer, expiry, routes, and status. It uses IngressCertificateStatus (healthy, expiring, expired, misconfigured). It does not include request-rate data or single-card focus.


Proposed Solution

Create an IngressStatusCard widget at src/components/widgets/sre-devops/ingress-status-card.tsx that:

  1. Accepts an IngressStatus object with domain, cert expiry, health, and request rate.
  2. Renders a compact card with domain as the primary label.
  3. Shows TLS cert expiry as days remaining with automatic urgency badge.
  4. Displays health status as a semantic badge.
  5. Shows request rate with an optional trend indicator (up/down/stable).
  6. Automatically shows a warning when cert expires within certWarningDays (default 30).

Requirements

The card must calculate cert-expiry urgency from the expiry date. It must visually match the existing IngressCertificatePostureStrip styling for consistency.


Functional Requirements

IDRequirementPriority
FR-01Display the ingress domain as the card’s primary labelMust
FR-02Show TLS certificate expiry as “X days” with urgency badgeMust
FR-03Show warning badge when cert expires within certWarningDays (default 30)Must
FR-04Show error badge when cert is expiredMust
FR-05Display health status badge (healthy, degraded, down)Must
FR-06Display current request rate (e.g., “1.2k req/s”)Must
FR-07Show trend indicator (up arrow, down arrow, or dash for stable)Should
FR-08Show certificate issuer nameShould
FR-09Call onRenewCert callback when a renewal action is triggeredShould
FR-10Call onViewDetails for navigation to a detailed ingress viewShould
FR-11Support a loading prop with skeleton contentShould

Non-Functional Requirements

IDRequirement
NFR-01Bundle size under 2 KB gzipped
NFR-02Full light/dark theme support
NFR-03Card renders within one frame

API / Interface Requirements

type IngressHealth = "healthy" | "degraded" | "down";
type RequestTrend = "up" | "down" | "stable";
interface IngressStatus {
domain: string;
certExpiresAt: string; // ISO 8601 date
certIssuer?: string;
health: IngressHealth;
requestsPerSecond: number;
requestTrend?: RequestTrend;
routes?: number;
}
interface IngressStatusCardProps {
ingress: IngressStatus;
certWarningDays?: number; // default 30
loading?: boolean;
onRenewCert?: () => void;
onViewDetails?: () => void;
className?: string;
}

Accessibility Requirements

IDRequirement
A11Y-01Card uses <article> with aria-label including domain name
A11Y-02Status badges have accessible text labels
A11Y-03Cert expiry urgency is conveyed via text, not just color
A11Y-04Trend arrows have aria-label (e.g., “trending up”)
A11Y-05Action buttons have descriptive aria-label

Content and Documentation Requirements

  • Storybook doc page explaining relationship to IngressCertificatePostureStrip.
  • Stories: Healthy, CertExpiring, CertExpired, Degraded, Down, HighTraffic, Loading.
  • JSDoc on all exported types.

Dependencies

DependencyTypeNotes
BadgeInternalStatus and urgency badges
ButtonInternalAction CTAs
IngressCertificateStatus referenceInternalAlignment with posture strip types
Icon packInternalTrend arrows, shield icon

Risks and Tradeoffs

RiskImpactMitigation
Cert expiry timezone issuesWrong urgency calculationUse UTC for all date math
Request rate stalenessMisleading metricsDocument that consumer should refresh data; show “as of” timestamp
Visual inconsistency with posture stripConfusing UXReuse badge variants and color mapping from posture strip

Open Questions

  1. Should the card include a mini sparkline for request rate history?
  2. Do we need to show the certificate’s full expiry date in addition to days remaining?
  3. Should the card support a “compact” variant for dashboard grid placement?

Acceptance Criteria

  • Card renders domain, cert expiry, health, and request rate.
  • Warning badge appears when cert expires within 30 days (configurable).
  • Error badge appears when cert is expired.
  • Health status badge shows correct semantic color.
  • Trend indicator displays correctly.
  • Action callbacks fire correctly.
  • All Storybook stories render without errors.
  • Passes axe accessibility audit with zero violations.
  • Unit tests cover urgency calculation, health states, and action callbacks.

LLM Handoff Instructions

When implementing this FRD:

  1. Create src/components/widgets/sre-devops/ingress-status-card.tsx.
  2. Calculate days until cert expiry using UTC date arithmetic.
  3. Reference ingress-certificate-posture-strip.tsx for badge variants and styling conventions.
  4. Use ArrowUpRight and ArrowDownRight from icon pack for trend indicators.
  5. Create src/components/widgets/sre-devops/ingress-status-card.stories.tsx.
  6. Create src/components/widgets/sre-devops/ingress-status-card.test.tsx.
  7. Health badge mapping: healthy=complete, degraded=pending, down=warning.
  8. Cert urgency: expired = status “expired”, within threshold = status “expiring”, otherwise = “healthy”.

Decision Log

DateDecisionRationale
2026-05-26Single-card widget separate from posture stripDifferent use case: detail view vs. overview grid
2026-05-26Request rate includedSRE teams need traffic context alongside cert/health status

Document History

DateVersionAuthorChanges
2026-05-260.1David HolmesInitial draft