[cgroups2] Report usage statistics for the cgroups v2 isolator process.

Overrides `::usage` for the `Cgroups2IsolatorProcess` so the
MesosContainerizer gets ResourceStatistics reported by the
cgroups v2 controllers processes, for example the `CpuControllerProcess`.
diff --git a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
index 762e343..a53e65c 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
@@ -674,6 +674,42 @@
 }
 
 
+Future<ResourceStatistics> Cgroups2IsolatorProcess::usage(
+    const ContainerID& containerId)
+{
+  if (!infos.contains(containerId)) {
+    return Failure("Unknown container");
+  }
+
+  vector<Future<ResourceStatistics>> usages;
+  foreachvalue (const Owned<Controller>& controller, controllers) {
+    if (infos[containerId]->controllers.contains(controller->name())) {
+      usages.push_back(controller->usage(
+          containerId,
+          infos[containerId]->cgroup));
+    }
+  }
+
+  return await(usages)
+    .then([containerId](const vector<Future<ResourceStatistics>>& _usages) {
+      ResourceStatistics result;
+
+      foreach (const Future<ResourceStatistics>& statistics, _usages) {
+        if (statistics.isReady()) {
+          result.MergeFrom(statistics.get());
+        } else {
+          LOG(WARNING) << "Skipping resource statistic for container "
+                       << containerId << " because: "
+                       << (statistics.isFailed() ? statistics.failure()
+                                                 : "discarded");
+        }
+      }
+
+      return result;
+    });
+}
+
+
 Future<ContainerStatus> Cgroups2IsolatorProcess::status(
     const ContainerID& containerId)
 {
diff --git a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
index b2d06b4..9d58b9e 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
@@ -82,6 +82,9 @@
       const google::protobuf::Map<
           std::string, Value::Scalar>& resourceLimits = {}) override;
 
+  process::Future<ResourceStatistics> usage(
+      const ContainerID& containerId) override;
+
   process::Future<ContainerStatus> status(
       const ContainerID& containerId) override;