this `io:format` can get lost in the noise or contribute to it during shrinking. In addition the use of `?assertEqual` below (noticed this was carried over from the original version) makes failures a bit noiser than they need to be and isn't very idiomatic imo. The invariant can return any value besides `true` to indicate failure. Perhaps do something like:

```erlang
Zipped = [{Metric, Excepted, folsom_metrics:get_metric_value(Metric)} || {Metric, Expected} <- MetricExpects],
Bad = [{Metric, {expected, Expected}, {actual, Actual}} || {Metric, Expected, Actual} <- Zipped, Expected /= Actual],
case Bad of
  [] -> true;
  _ -> Bad
end.
```