1 | 'use strict'
|
2 |
|
3 | const debug = require('debug')('doctor')
|
4 |
|
5 | function hasPerformanceIssue (issue) {
|
6 | return issue === 'performance'
|
7 | }
|
8 |
|
9 | function hasDataIssue (issue) {
|
10 | return issue === 'data'
|
11 | }
|
12 |
|
13 | function aggregateMemoryIssue (memory) {
|
14 | const memoryDataIssue = (
|
15 | hasDataIssue(memory.external) ||
|
16 | hasDataIssue(memory.rss) ||
|
17 | hasDataIssue(memory.heapTotal) ||
|
18 | hasDataIssue(memory.heapUsed)
|
19 | )
|
20 | const memoryPerformanceIssue = (
|
21 | hasPerformanceIssue(memory.external) ||
|
22 | hasPerformanceIssue(memory.rss) ||
|
23 | hasPerformanceIssue(memory.heapTotal) ||
|
24 | hasPerformanceIssue(memory.heapUsed)
|
25 | )
|
26 |
|
27 | if (memoryDataIssue) {
|
28 | return 'data'
|
29 | }
|
30 | return memoryPerformanceIssue ? 'performance' : 'none'
|
31 | }
|
32 |
|
33 | function issueCategory (issues) {
|
34 | debug('detected issues', issues)
|
35 | const memoryIssue = aggregateMemoryIssue(issues.memory)
|
36 |
|
37 | let category = 'unknown'
|
38 | if (hasDataIssue(memoryIssue) || hasDataIssue(issues.cpu) ||
|
39 | hasDataIssue(issues.handles) || hasDataIssue(issues.delay)) {
|
40 | category = 'data'
|
41 | } else if (hasPerformanceIssue(memoryIssue) &&
|
42 | !hasPerformanceIssue(issues.cpu) &&
|
43 | !hasPerformanceIssue(issues.handles)) {
|
44 | category = 'gc'
|
45 | } else if (!hasPerformanceIssue(memoryIssue) &&
|
46 | hasPerformanceIssue(issues.delay) &&
|
47 | !hasPerformanceIssue(issues.cpu) &&
|
48 | !hasPerformanceIssue(issues.handles)) {
|
49 | category = 'event-loop'
|
50 | } else if (!hasPerformanceIssue(memoryIssue) &&
|
51 | !hasPerformanceIssue(issues.delay) &&
|
52 | (hasPerformanceIssue(issues.cpu) || hasPerformanceIssue(issues.handles))) {
|
53 | category = 'io'
|
54 | } else if (!hasPerformanceIssue(memoryIssue) &&
|
55 | !hasPerformanceIssue(issues.delay) &&
|
56 | !hasPerformanceIssue(issues.cpu) &&
|
57 | !hasPerformanceIssue(issues.handles)) {
|
58 | category = 'none'
|
59 | }
|
60 |
|
61 | debug('category', category)
|
62 |
|
63 | return category
|
64 | }
|
65 | module.exports = issueCategory
|