aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStatsCollectorTest.java
blob: 7df5309961f8f2cb41fabe822193ad59e1cbfedc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.node.admin.container;

import com.yahoo.vespa.hosted.node.admin.task.util.file.UnixPath;
import com.yahoo.vespa.test.file.TestFileSystem;
import org.junit.Test;

import java.io.IOException;
import java.nio.file.FileSystem;
import java.util.Map;
import java.util.Optional;

import static com.yahoo.vespa.hosted.node.admin.container.CGroup.CpuStatField.SYSTEM_USAGE_USEC;
import static com.yahoo.vespa.hosted.node.admin.container.CGroup.CpuStatField.THROTTLED_PERIODS;
import static com.yahoo.vespa.hosted.node.admin.container.CGroup.CpuStatField.THROTTLED_TIME_USEC;
import static com.yahoo.vespa.hosted.node.admin.container.CGroup.CpuStatField.TOTAL_PERIODS;
import static com.yahoo.vespa.hosted.node.admin.container.CGroup.CpuStatField.TOTAL_USAGE_USEC;
import static com.yahoo.vespa.hosted.node.admin.container.CGroup.CpuStatField.USER_USAGE_USEC;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

/**
 * @author mpolden
 */
public class ContainerStatsCollectorTest {

    private final FileSystem fileSystem = TestFileSystem.create();
    private final CGroup cgroup = mock(CGroup.class);

    @Test
    public void collect() throws IOException {
        ContainerStatsCollector collector = new ContainerStatsCollector(cgroup, fileSystem, 24);
        ContainerId containerId = new ContainerId("id1");
        int containerPid = 42;
        assertTrue("No stats found", collector.collect(containerId, containerPid, "eth0").isEmpty());

        mockMemoryStats(containerId);
        mockCpuStats(containerId);
        mockNetworkStats(containerPid);

        Optional<ContainerStats> stats = collector.collect(containerId, containerPid, "eth0");
        assertTrue(stats.isPresent());
        assertEquals(new ContainerStats.CpuStats(24, 6049374780000L, 691675615472L,
                                                 262190000000L, 3L, 1L, 2L),
                     stats.get().getCpuStats());
        assertEquals(new ContainerStats.MemoryStats(470790144L, 1228017664L, 2147483648L),
                     stats.get().getMemoryStats());
        assertEquals(Map.of("eth0", new ContainerStats.NetworkStats(22280813L, 4L, 3L,
                                                                    19859383L, 6L, 5L)),
                     stats.get().getNetworks());
    }

    private void mockNetworkStats(int pid) {
        UnixPath dev = new UnixPath(fileSystem.getPath("/proc/" + pid + "/net/dev"));
        dev.createParents().writeUtf8File("Inter-|   Receive                                                |  Transmit\n" +
                               " face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed\n" +
                               "    lo: 36289258  149700    0    0    0     0          0         0 36289258  149700    0    0    0     0       0          0\n" +
                               "  eth0: 22280813  118083    3    4    0     0          0         0 19859383  115415    5    6    0     0       0          0\n");
    }

    private void mockMemoryStats(ContainerId containerId) throws IOException {
        when(cgroup.memoryUsageInBytes(eq(containerId))).thenReturn(1228017664L);
        when(cgroup.memoryLimitInBytes(eq(containerId))).thenReturn(2147483648L);
        when(cgroup.memoryCacheInBytes(eq(containerId))).thenReturn(470790144L);
    }

    private void mockCpuStats(ContainerId containerId) throws IOException {
        UnixPath proc = new UnixPath(fileSystem.getPath("/proc"));
        proc.createDirectories();

        when(cgroup.cpuStats(eq(containerId))).thenReturn(Map.of(
                TOTAL_USAGE_USEC, 691675615472L, SYSTEM_USAGE_USEC, 262190000000L, USER_USAGE_USEC, 40900L,
                TOTAL_PERIODS, 1L, THROTTLED_PERIODS, 2L, THROTTLED_TIME_USEC, 3L));

        proc.resolve("stat").writeUtf8File("cpu  7991366 978222 2346238 565556517 1935450 25514479 615206 0 0 0\n" +
                                                "cpu0 387906 61529 99088 23516506 42258 1063359 29882 0 0 0\n" +
                                                "cpu1 271253 49383 86149 23655234 41703 1061416 31885 0 0 0\n" +
                                                "cpu2 349420 50987 93560 23571695 59437 1051977 24461 0 0 0\n" +
                                                "cpu3 328107 50628 93406 23605135 44378 1048549 30199 0 0 0\n" +
                                                "cpu4 267474 50404 99253 23606041 113094 1038572 26494 0 0 0\n" +
                                                "cpu5 309584 50677 94284 23550372 132616 1033661 29436 0 0 0\n" +
                                                "cpu6 477926 56888 121251 23367023 83121 1074930 28818 0 0 0\n" +
                                                "cpu7 335335 29350 106130 23551107 95606 1066394 26156 0 0 0\n" +
                                                "cpu8 323678 28629 99171 23586501 82183 1064708 25403 0 0 0\n" +
                                                "cpu9 329805 27516 98538 23579458 89235 1061561 25140 0 0 0\n" +
                                                "cpu10 291536 26455 93934 23642345 81282 1049736 25228 0 0 0\n" +
                                                "cpu11 271103 25302 90630 23663641 85711 1048781 24291 0 0 0\n" +
                                                "cpu12 323634 63392 100406 23465340 132684 1089157 28319 0 0 0\n" +
                                                "cpu13 348085 49568 100772 23490388 114190 1079474 20948 0 0 0\n" +
                                                "cpu14 310712 51208 90461 23547980 101601 1071940 26712 0 0 0\n" +
                                                "cpu15 360405 52754 94620 23524878 79851 1062050 26836 0 0 0\n" +
                                                "cpu16 367893 52141 98074 23541314 57500 1058968 25242 0 0 0\n" +
                                                "cpu17 412756 51486 101592 23515056 47653 1044874 27467 0 0 0\n" +
                                                "cpu18 287307 25478 106011 23599505 79848 1089812 23160 0 0 0\n" +
                                                "cpu19 275001 24421 98338 23628694 79675 1084074 22083 0 0 0\n" +
                                                "cpu20 288038 24805 94432 23629908 74735 1078501 21915 0 0 0\n" +
                                                "cpu21 295373 25017 91344 23628585 75282 1071019 22026 0 0 0\n" +
                                                "cpu22 326739 25588 90385 23608217 69186 1068494 21108 0 0 0\n" +
                                                "cpu23 452284 24602 104397 23481583 72612 1052462 21985 0 0 0\n" +
                                                "intr 6645352968 64 0 0 0 1481 0 0 0 1 0 0 0 0 0 0 0 39 0 0 0 0 0 0 37 0 0 0 0 0 0 0 0 4334106 1 6949071 5814662 5415344 6939471 6961483 6358810 5271953 6718644 0 126114 126114 126114 126114 126114 126114 126114 126114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
                                                "ctxt 2495530303\n" +
                                                "btime 1611928223\n" +
                                                "processes 4839481\n" +
                                                "procs_running 4\n" +
                                                "procs_blocked 0\n" +
                                                "softirq 2202631388 4 20504999 46734 54405637 4330276 0 6951 1664780312 10130 458546345\n");
    }

}