diff --git a/src/metrics/collection_data.cpp b/src/metrics/collection_data.cpp
index 915f570..11ef1b0 100644
--- a/src/metrics/collection_data.cpp
+++ b/src/metrics/collection_data.cpp
@@ -84,8 +84,8 @@
 
         if (timestamp > duration.t)
         {
-            readings.front().first = std::max(readings.front().first,
-                                              timestamp - duration.t);
+            readings.front().first =
+                std::max(readings.front().first, timestamp - duration.t);
         }
     }
 
@@ -122,10 +122,9 @@
     std::vector<ReadingItem> readings;
 };
 
-std::vector<std::unique_ptr<CollectionData>>
-    makeCollectionData(size_t size, OperationType op,
-                       CollectionTimeScope timeScope,
-                       CollectionDuration duration)
+std::vector<std::unique_ptr<CollectionData>> makeCollectionData(
+    size_t size, OperationType op, CollectionTimeScope timeScope,
+    CollectionDuration duration)
 {
     using namespace std::string_literals;
 
@@ -136,10 +135,11 @@
     switch (timeScope)
     {
         case CollectionTimeScope::interval:
-            std::generate_n(std::back_inserter(result), size,
-                            [cf = makeCollectionFunction(op), duration] {
-                return std::make_unique<DataInterval>(cf, duration);
-            });
+            std::generate_n(
+                std::back_inserter(result), size,
+                [cf = makeCollectionFunction(op), duration] {
+                    return std::make_unique<DataInterval>(cf, duration);
+                });
             break;
         case CollectionTimeScope::point:
             std::generate_n(std::back_inserter(result), size,
@@ -148,8 +148,8 @@
         case CollectionTimeScope::startup:
             std::generate_n(std::back_inserter(result), size,
                             [cf = makeCollectionFunction(op)] {
-                return std::make_unique<DataStartup>(cf);
-            });
+                                return std::make_unique<DataStartup>(cf);
+                            });
             break;
     }
 
diff --git a/src/metrics/collection_data.hpp b/src/metrics/collection_data.hpp
index 251e704..1742369 100644
--- a/src/metrics/collection_data.hpp
+++ b/src/metrics/collection_data.hpp
@@ -25,8 +25,7 @@
     std::optional<double> lastValue;
 };
 
-std::vector<std::unique_ptr<CollectionData>>
-    makeCollectionData(size_t size, OperationType, CollectionTimeScope,
-                       CollectionDuration);
+std::vector<std::unique_ptr<CollectionData>> makeCollectionData(
+    size_t size, OperationType, CollectionTimeScope, CollectionDuration);
 
 } // namespace metrics
diff --git a/src/metrics/collection_function.cpp b/src/metrics/collection_function.cpp
index 21c8111..5044216 100644
--- a/src/metrics/collection_function.cpp
+++ b/src/metrics/collection_function.cpp
@@ -11,11 +11,15 @@
     double calculate(const std::vector<ReadingItem>& readings,
                      Milliseconds) const override
     {
-        return std::min_element(readings.begin(), readings.end(),
-                                [](const auto& left, const auto& right) {
-            return std::make_tuple(!std::isfinite(left.second), left.second) <
-                   std::make_tuple(!std::isfinite(right.second), right.second);
-        })->second;
+        return std::min_element(
+                   readings.begin(), readings.end(),
+                   [](const auto& left, const auto& right) {
+                       return std::make_tuple(!std::isfinite(left.second),
+                                              left.second) <
+                              std::make_tuple(!std::isfinite(right.second),
+                                              right.second);
+                   })
+            ->second;
     }
 
     double calculateForStartupInterval(std::vector<ReadingItem>& readings,
@@ -33,11 +37,15 @@
     double calculate(const std::vector<ReadingItem>& readings,
                      Milliseconds) const override
     {
-        return std::max_element(readings.begin(), readings.end(),
-                                [](const auto& left, const auto& right) {
-            return std::make_tuple(std::isfinite(left.second), left.second) <
-                   std::make_tuple(std::isfinite(right.second), right.second);
-        })->second;
+        return std::max_element(
+                   readings.begin(), readings.end(),
+                   [](const auto& left, const auto& right) {
+                       return std::make_tuple(std::isfinite(left.second),
+                                              left.second) <
+                              std::make_tuple(std::isfinite(right.second),
+                                              right.second);
+                   })
+            ->second;
     }
 
     double calculateForStartupInterval(std::vector<ReadingItem>& readings,
@@ -115,9 +123,9 @@
         return valueSum;
     }
 
-    double
-        calculateForStartupInterval(std::vector<ReadingItem>& readings,
-                                    const Milliseconds timestamp) const override
+    double calculateForStartupInterval(
+        std::vector<ReadingItem>& readings,
+        const Milliseconds timestamp) const override
     {
         const auto result = calculate(readings, timestamp);
         if (readings.size() > 2 && std::isfinite(result))
@@ -143,8 +151,8 @@
     }
 };
 
-std::shared_ptr<CollectionFunction>
-    makeCollectionFunction(OperationType operationType)
+std::shared_ptr<CollectionFunction> makeCollectionFunction(
+    OperationType operationType)
 {
     using namespace std::string_literals;
 
@@ -159,9 +167,9 @@
         case OperationType::sum:
             return std::make_shared<FunctionSummation>();
         default:
-            throw std::runtime_error("op: "s +
-                                     utils::enumToString(operationType) +
-                                     " is not supported"s);
+            throw std::runtime_error(
+                "op: "s + utils::enumToString(operationType) +
+                " is not supported"s);
     }
 }
 
diff --git a/src/metrics/collection_function.hpp b/src/metrics/collection_function.hpp
index 610f015..fdeafc3 100644
--- a/src/metrics/collection_function.hpp
+++ b/src/metrics/collection_function.hpp
@@ -20,9 +20,8 @@
 
     virtual double calculate(const std::vector<ReadingItem>& readings,
                              Milliseconds timestamp) const = 0;
-    virtual double
-        calculateForStartupInterval(std::vector<ReadingItem>& readings,
-                                    Milliseconds timestamp) const = 0;
+    virtual double calculateForStartupInterval(
+        std::vector<ReadingItem>& readings, Milliseconds timestamp) const = 0;
 };
 
 std::shared_ptr<CollectionFunction> makeCollectionFunction(OperationType);
