diff --git a/satella/instrumentation/metrics/__init__.py b/satella/instrumentation/metrics/__init__.py
index 7c782e9229ca8f18fd09ed3cc856b45c50434503..64553ac043da39e2b49142f9141fc347fa1acd08 100644
--- a/satella/instrumentation/metrics/__init__.py
+++ b/satella/instrumentation/metrics/__init__.py
@@ -31,6 +31,33 @@ def adjust_metric_level_for_root(metric_level: tp.Optional[MetricLevel],
 ALLOWED_CHARACTERS = string.ascii_uppercase + string.digits + ':' + '_' + '.'
 
 
+def _process_metric(name, name_index, metric_level, metric_level_to_set_for_children, name_part, root_metric,
+                    metric_name, metric_type, kwargs):
+    tentative_name = '.'.join(name[:name_index])
+    if tentative_name not in metrics:
+        if tentative_name == '':
+            metric = Metric('',
+                            None,
+                            adjust_metric_level_for_root(metric_level,
+                                                         metric_level_to_set_for_children),
+                            **kwargs)
+            metric.level = MetricLevel.RUNTIME
+            root_metric = metric
+        elif metric_name == tentative_name:
+            metric = METRIC_NAMES_TO_CLASSES[metric_type](name_part, root_metric,
+                                                          metric_level, **kwargs)
+        else:
+            metric = Metric(name_part, root_metric, metric_level_to_set_for_children,
+                            **kwargs)
+        metrics[tentative_name] = metric
+        if metric != root_metric:  # prevent infinite recursion errors
+            root_metric.append_child(metric)
+    else:
+        metric = metrics[tentative_name]
+    root_metric = metric
+    return metric, root_metric
+
+
 # noinspection PyPep8Naming
 def getMetric(metric_name: str = '',
               metric_type: str = 'base',
@@ -65,28 +92,8 @@ def getMetric(metric_name: str = '',
                                           existing_type=metrics[metric_name].CLASS_NAME)
 
         for name_index, name_part in itertools.chain(((0, ''),), enumerate(name, start=1)):
-            tentative_name = '.'.join(name[:name_index])
-            if tentative_name not in metrics:
-                if tentative_name == '':
-                    metric = Metric('',
-                                    None,
-                                    adjust_metric_level_for_root(metric_level,
-                                                                 metric_level_to_set_for_children),
-                                    **kwargs)
-                    metric.level = MetricLevel.RUNTIME
-                    root_metric = metric
-                elif metric_name == tentative_name:
-                    metric = METRIC_NAMES_TO_CLASSES[metric_type](name_part, root_metric,
-                                                                  metric_level, **kwargs)
-                else:
-                    metric = Metric(name_part, root_metric, metric_level_to_set_for_children,
-                                    **kwargs)
-                metrics[tentative_name] = metric
-                if metric != root_metric:  # prevent infinite recursion errors
-                    root_metric.append_child(metric)
-            else:
-                metric = metrics[tentative_name]
-            root_metric = metric
+            metric, root_metric = _process_metric(name, name_index, metric_level, metric_level_to_set_for_children,
+                                                  name_part, root_metric, metric_name, metric_type, kwargs)
 
         if metric_level is not None:
             metric.level = metric_level