# `Otel.Metrics.Aggregation.LastValue`
[🔗](https://github.com/yangbancode/otel/blob/main/lib/otel/metrics/aggregation/last_value.ex#L1)

Last value aggregation. Keeps the most recent measurement.

ETS entry format:
`{key, value, timestamp, start_time, reservoir_state}`.
Uses `ets:insert_new` + `ets:update_element` (overwrite) —
last writer wins, which is the correct semantic for gauges.

The fifth slot holds the exemplar reservoir state
(`Otel.Metrics.Exemplar.Reservoir.SimpleFixedSize`) so a single
ETS row carries everything `collect/3` needs.

Gauge data points have no aggregation temporality.

# `aggregate`

```elixir
@spec aggregate(
  metrics_tab :: :ets.table(),
  key :: term(),
  value :: number(),
  opts :: map()
) :: :ok
```

# `collect`

```elixir
@spec collect(
  metrics_tab :: :ets.table(),
  stream_key :: String.t(),
  opts :: map()
) :: [Otel.Metrics.Aggregation.datapoint()]
```

# `offer_exemplar`

```elixir
@spec offer_exemplar(
  metrics_tab :: :ets.table(),
  key :: term(),
  value :: number(),
  time :: non_neg_integer(),
  filtered_attrs :: %{required(String.t()) =&gt; term()},
  ctx :: Otel.Ctx.t()
) :: :ok
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
