-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_parser.js
More file actions
127 lines (102 loc) · 4.83 KB
/
test_parser.js
File metadata and controls
127 lines (102 loc) · 4.83 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const fs = require('node:fs');
const path = require('node:path');
const { allowed_metric_contexts, metric_charts } = require('./config/netdata_metrics');
const parseNetdata = (netdata_json) => {
// Get the hostname from the first element
const hostname = netdata_json[0].hostname;
let filtered = netdata_json.filter((element) => {
// Check if hostname are the same as the first element
if (element.hostname !== hostname) return false;
// Remove unwanted elements
delete element.chart_name;
delete element.chart_family;
delete element.chart_type;
delete element.hostname;
delete element.timestamp;
delete element.labels;
delete element.prefix;
delete element.name;
// Check if the context is in the allowed_metric_contexts array
return allowed_metric_contexts.includes(element.chart_context);
});
let result = {
hostname,
individual: {},
metrics: {}
};
filtered.forEach((element) => {
const operation = metric_charts[element.chart_context];
const units = element.units;
// Handle specific cases for individual metrics
if (operation && operation.includes('individual')) {
const individualCategory = operation.split('.')[0];
const deviceMatch = element.chart_id.match(/device_(.*?)_/); // Extract device name from chart_id
const device = deviceMatch ? deviceMatch[1] : null;
if (!device) return; // Skip if no device name is found
// Dynamically create the category and device if it doesn't exist
if (!result.individual[individualCategory]) result.individual[individualCategory] = {};
if (!result.individual[individualCategory][device]) result.individual[individualCategory][device] = {};
// Combine the passed and failed metrics into a single ok status
if (element.chart_context === 'smartctl.device_smart_status') {
const statusKey = 'device_smart_status.ok';
const deviceData = result.individual[individualCategory][device];
if (!deviceData[statusKey]) deviceData[statusKey] = 0; // Default to 0, just to be save
if (element.id === 'failed' && element.value === 1) deviceData[statusKey] = 0;
if (element.id === 'passed' && element.value === 1) deviceData[statusKey] = 1;
} else {
result.individual[individualCategory][device][element.id] = element.value;
}
} else {
const key = `${element.chart_context}.${element.id}`;
if (!result.metrics[key]) {
if (operation === 'sum' || operation === 'avg') {
result.metrics[key] = { sum: 0, count: 0, units: units };
} else if (operation === 'none') {
result.metrics[key] = { value: element.value, units: units };
} else {
result.metrics[key] = { value: null, units: units }; // Handle cases for null values
}
}
// Process config specific operations
if (operation === 'sum') {
result.metrics[key].sum += element.value;
} else if (operation === 'avg') {
result.metrics[key].sum += element.value;
result.metrics[key].count += 1;
}
}
});
// Post-process avg operations to compute the final average
Object.keys(result.metrics).forEach(key => {
if (result.metrics[key].count) {
result.metrics[key].value = result.metrics[key].sum / result.metrics[key].count;
delete result.metrics[key].sum;
delete result.metrics[key].count;
}
});
// Special for cpufreq.cpufreq - aggregate across all CPUs (Cores)
let cpuFreqTotal = 0;
let cpuFreqCount = 0;
Object.keys(result.metrics).forEach(key => {
if (key.startsWith('cpufreq.cpufreq.cpu')) {
cpuFreqTotal += result.metrics[key].value;
cpuFreqCount += 1;
delete result.metrics[key]; // Remove individual CPU entries
}
});
if (cpuFreqCount > 0) {
result.metrics['cpufreq.cpufreq'] = {
value: cpuFreqTotal / cpuFreqCount,
units: 'MHz' // Default Unit
};
}
return result;
};
(async () => {
const netdata_json = fs.readFileSync(path.join(__dirname, 'netdata_request_all.json'), 'utf8');
// Filter out all elements where the context is not in the allowed_metric_contexts array
const netdata = JSON.parse(netdata_json);
const { individual, hostname, metrics } = parseNetdata(netdata);
console.log(`Hostname: ${hostname}`);
fs.writeFileSync(path.join(__dirname, 'netdata_request_filtered.json'), JSON.stringify({ individual, metrics }, null, 4));
})()