code: @Override
    public void update(List<Metric> metrics) {
      Preconditions.checkNotNull(metrics, "metrics");
      final List<Metric> newMetrics = new ArrayList<>(metrics.size());
  
      for (Metric m : metrics) {
        long offset = m.getTimestamp() % stepMillis;
        long stepBoundary = m.getTimestamp() - offset;
        String dsType = getDataSourceType(m);
        if (isGauge(dsType) || isNormalized(dsType)) {
          Metric atStepBoundary = new Metric(m.getConfig(), stepBoundary, m.getValue());
          newMetrics.add(atStepBoundary); // gauges are not normalized
        } else if (isRate(dsType)) {
          Metric normalized = normalize(m, stepBoundary);
          if (normalized != null) {
            newMetrics.add(normalized);
          }
        } else if (!isInformational(dsType)) {
          // unknown type - use a safe fallback
          newMetrics.add(m); // we cannot normalize this
        }
      }
      observer.update(newMetrics);
    }
docs: {@inheritDoc}