public List<Object> getData() {
    List<Object> data = new ArrayList<Object>();

    // Collect stats from all callbacks
    Map<String, Object> callbackResults = new HashMap<String, Object>();
    for (RealtimeStatsCallback callback : mCallbacks) {
      Map<String, Object> callbackData = callback.getStatData();
      if (callbackData != null) {
        callbackResults.putAll(callbackData);
      }
    }

    // Populate data based on callback results
    for (String name : mNames) {
      data.add(callbackResults.remove(name));
    }
    if (callbackResults.size() > 0) {
      KrawlerLog.perf.warn(
          "Detected unexpected realtime stats: " + StringUtil.join(", ", callbackResults.keySet()));
    }
    return data;
  }