public static RuntimeStats merge(RuntimeStats stats1, RuntimeStats stats2)
    {
        if (stats1 == null) {
            return stats2;
        }
        if (stats2 == null) {
            return stats1;
        }
        RuntimeStats mergedStats = copyOf(stats1);
        mergedStats.mergeWith(stats2);
        return mergedStats;
    }
@Test
    public void testMerge()
    {
        RuntimeStats stats1 = new RuntimeStats();
        stats1.addMetricValue(TEST_METRIC_NAME_1, NONE, 2);
        stats1.addMetricValue(TEST_METRIC_NAME_1, NONE, 3);
        stats1.addMetricValue(TEST_METRIC_NAME_2, NONE, 1);
        stats1.addMetricValue(TEST_METRIC_NAME_2, NONE, 2);
        stats1.addMetricValue(TEST_METRIC_NAME_NANO_1, NANO, 2);
        stats1.addMetricValue(TEST_METRIC_NAME_BYTE, BYTE, 1);

        RuntimeStats stats2 = new RuntimeStats();
        stats2.addMetricValue(TEST_METRIC_NAME_2, NONE, 0);
        stats2.addMetricValue(TEST_METRIC_NAME_2, NONE, 3);
        stats2.addMetricValue(TEST_METRIC_NAME_3, NONE, 8);
        stats2.addMetricValue(TEST_METRIC_NAME_BYTE, BYTE, 3);

        RuntimeStats mergedStats = RuntimeStats.merge(stats1, stats2);
        assertRuntimeMetricEquals(
                mergedStats.getMetric(TEST_METRIC_NAME_1),
                new RuntimeMetric(TEST_METRIC_NAME_1, NONE, 5, 2, 3, 2));
        assertRuntimeMetricEquals(
                mergedStats.getMetric(TEST_METRIC_NAME_2),
                new RuntimeMetric(TEST_METRIC_NAME_2, NONE, 6, 4, 3, 0));
        assertRuntimeMetricEquals(
                mergedStats.getMetric(TEST_METRIC_NAME_3),
                new RuntimeMetric(TEST_METRIC_NAME_3, NONE, 8, 1, 8, 8));
        assertRuntimeMetricEquals(
                mergedStats.getMetric(TEST_METRIC_NAME_NANO_1),
                new RuntimeMetric(TEST_METRIC_NAME_NANO_1, NANO, 2, 1, 2, 2));
        assertRuntimeMetricEquals(
                mergedStats.getMetric(TEST_METRIC_NAME_BYTE),
                new RuntimeMetric(TEST_METRIC_NAME_BYTE, BYTE, 4, 2, 3, 1));

        stats1.mergeWith(stats2);
        mergedStats.getMetrics().values().forEach(metric -> assertRuntimeMetricEquals(metric, stats1.getMetric(metric.getName())));
        assertEquals(mergedStats.getMetrics().size(), stats1.getMetrics().size());
    }