# SageMaker Endpoint Low Invocations

> Low-traffic SageMaker endpoints get a one-tier-smaller ml.* downsize: in service, uncommitted, with per-day invocations above zero but under the low-traffic ceiling across a covered 30-day window. ZopNight prices savings as cost times (1 minus target/current rate), refusing GPU and floor SKUs; the old fabricated 30% fallback is gone.

Source: https://zop.dev/integrations/aws/recommendations/sagemaker-endpoint-low-invocations
Updated: 2026-08-19

---

## When endpoint traffic is low but not zero

- resource.Type: sagemaker-endpoint, Status inservice
- metric (authoritative, A1): [Invocations / InvocationsPerInstance](https://docs.aws.amazon.com/sagemaker/latest/dg/monitoring-cloudwatch.html) (AWS/SageMaker, VariantName dim) via SetMultiMetrics, read instead of the never-populated invocations_low tag (which was tag-gated-dead; no producer writes it). The legacy invocations_low=true tag remains only as a documented secondary fallback when the metric series is unavailable.
in-service endpoint AND not covered by a Reservation/Savings Plan (reservationCoverageMap, keyed by resource UID, the same fleet-wide map RC-1611/RC-1613 use; on-demand rate deltas overstate the true saving on committed endpoints) AND measured invocation traffic is low-but-nonzero, read from the Total-only InvocationsSum series, whose days-of-history is gated via sumStatCoverageDays(m) ≥ MinMaxCoverageDays (this SUM/avg band is the only band a Aggregation:"Total" series populates; its MaxCoverageDays is structurally 0, so the prior MaxCoverageDays gate was permanently false and the rule never fired), with the low-traffic test on the true per-day rate (Σfinite datapoints / windowDays, 0 \< perDay ≤ sagemakerEndpointLowInvocationsPerDay), never on the ~1.0 Average statistic, AND a concrete one-tier-smaller ml.* target exists AND both the current and target rates are present in the SKU map AND positive cost. Exactly-zero traffic (Average == 0) is excluded: that is RC-1613's delete case, not this downsize case; without the exclusive lower bound a present-reading-exactly-zero series would co-fire both rules with contradictory levers on the same resource.

## Pricing a one-tier-smaller ml.* downsize

real-Δ-or-abstain (user directive 2026-06-27: no flat-fraction fallback for a cost rule). [ml.* SKUs are priced separately from raw EC2](https://aws.amazon.com/sagemaker/pricing/) in the catalog, so look the full ml.\<family>.\<size> key up directly: savings = cost × (1 − dst/src) computed inline (the DeriveCatalogDiffSavings formula, no fraction-fallback escape hatch). Abstains (returns nil) when targetSuggestion yields no concrete one-tier-smaller ml.* rung (floor SKUs, GPU SKUs, where suggestSmallerEC2 refuses any GPU rung, non-ml.* prefixes, unknown families), when either rate is missing, or when the math is degenerate (dst ≥ src). These are exactly the branches where the old model.RealDeltaSavings → DeriveCatalogDiffSavings path fabricated a flat 30% of cost. RecommendTarget: the cert-only sagemakerEndpointFloorUpsize (which turned a floor SKU into a cost-increasing larger SKU) is removed (2026-06-26; mirrors RC-004/RC-1207); a floor/off-ladder/non-ml.* SKU returns nil so the resize template skips a no-op workflow.

## Downsizing the endpoint safely

1. Review CloudWatch InvocationsPerInstance metric
2. Consider downsizing to a smaller instance type
3. Evaluate SageMaker Serverless Inference for sporadic traffic
4. Use auto-scaling policies to match capacity to demand

## The invocation series behind the check

Invocations + InvocationsPerInstance, 30-day lookback (MultiMetricsAware)
