report: represent numbers as numbers

Do not stringify numbers and boolean values when writing JSON.

PR-URL: https://github.com/nodejs/node/pull/25651
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Matheus Marchini <mat@mmarchini.me>
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: Beth Griggs <Bethany.Griggs@uk.ibm.com>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
This commit is contained in:
Anna Henningsen 2019-01-23 00:49:17 +01:00
parent 08e9111696
commit accd674c9a
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
3 changed files with 124 additions and 190 deletions

View File

@ -27,7 +27,7 @@ is provided below for reference.
"filename": "report.20181221.005011.8974.001.json",
"dumpEventTime": "2018-12-21T00:50:11Z",
"dumpEventTimeStamp": "1545371411331",
"processId": "8974",
"processId": 8974,
"commandLine": [
"/home/nodeuser/project/node/out/Release/node",
"--experimental-report",
@ -81,133 +81,133 @@ is provided below for reference.
" [pc=0x1930cae] [/home/nodeuser/project/node/out/Release/node]"
],
"javascriptHeap": {
"totalMemory": "6127616",
"totalCommittedMemory": "4357352",
"usedMemory": "3221136",
"availableMemory": "1521370240",
"memoryLimit": "1526909922",
"totalMemory": 6127616,
"totalCommittedMemory": 4357352,
"usedMemory": 3221136,
"availableMemory": 1521370240,
"memoryLimit": 1526909922,
"heapSpaces": {
"read_only_space": {
"memorySize": "524288",
"committedMemory": "39208",
"capacity": "515584",
"used": "30504",
"available": "485080"
"memorySize": 524288,
"committedMemory": 39208,
"capacity": 515584,
"used": 30504,
"available": 485080
},
"new_space": {
"memorySize": "2097152",
"committedMemory": "2019312",
"capacity": "1031168",
"used": "985496",
"available": "45672"
"memorySize": 2097152,
"committedMemory": 2019312,
"capacity": 1031168,
"used": 985496,
"available": 45672
},
"old_space": {
"memorySize": "2273280",
"committedMemory": "1769008",
"capacity": "1974640",
"used": "1725488",
"available": "249152"
"memorySize": 2273280,
"committedMemory": 1769008,
"capacity": 1974640,
"used": 1725488,
"available": 249152
},
"code_space": {
"memorySize": "696320",
"committedMemory": "184896",
"capacity": "152128",
"used": "152128",
"available": "0"
"memorySize": 696320,
"committedMemory": 184896,
"capacity": 152128,
"used": 152128,
"available": 0
},
"map_space": {
"memorySize": "536576",
"committedMemory": "344928",
"capacity": "327520",
"used": "327520",
"available": "0"
"memorySize": 536576,
"committedMemory": 344928,
"capacity": 327520,
"used": 327520,
"available": 0
},
"large_object_space": {
"memorySize": "0",
"committedMemory": "0",
"capacity": "1520590336",
"used": "0",
"available": "1520590336"
"memorySize": 0,
"committedMemory": 0,
"capacity": 1520590336,
"used": 0,
"available": 1520590336
},
"new_large_object_space": {
"memorySize": "0",
"committedMemory": "0",
"capacity": "0",
"used": "0",
"available": "0"
"memorySize": 0,
"committedMemory": 0,
"capacity": 0,
"used": 0,
"available": 0
}
}
},
"resourceUsage": {
"userCpuSeconds": "0.069595",
"kernelCpuSeconds": "0.019163",
"cpuConsumptionPercent": "0.000000",
"maxRss": "18079744",
"userCpuSeconds": 0.069595,
"kernelCpuSeconds": 0.019163,
"cpuConsumptionPercent": 0.000000,
"maxRss": 18079744,
"pageFaults": {
"IORequired": "0",
"IONotRequired": "4610"
"IORequired": 0,
"IONotRequired": 4610
},
"fsActivity": {
"reads": "0",
"writes": "0"
"reads": 0,
"writes": 0
}
},
"uvthreadResourceUsage": {
"userCpuSeconds": "0.068457",
"kernelCpuSeconds": "0.019127",
"cpuConsumptionPercent": "0.000000",
"userCpuSeconds": 0.068457,
"kernelCpuSeconds": 0.019127,
"cpuConsumptionPercent": 0.000000,
"fsActivity": {
"reads": "0",
"writes": "0"
"reads": 0,
"writes": 0
}
},
"libuv": [
{
"type": "async",
"is_active": "1",
"is_referenced": "0",
"is_active": true,
"is_referenced": false,
"address": "68090592",
"details": ""
},
{
"type": "timer",
"is_active": "0",
"is_referenced": "0",
"is_active": false,
"is_referenced": false,
"address": "140723513949920",
"details": "repeat: 0, timeout expired: 18075165916 ms ago"
},
{
"type": "check",
"is_active": "1",
"is_referenced": "0",
"is_active": true,
"is_referenced": false,
"address": "140723513950072",
"details": ""
},
{
"type": "idle",
"is_active": "0",
"is_referenced": "1",
"is_active": false,
"is_referenced": true,
"address": "140723513950192",
"details": ""
},
{
"type": "prepare",
"is_active": "0",
"is_referenced": "0",
"is_active": false,
"is_referenced": false,
"address": "140723513950312",
"details": ""
},
{
"type": "check",
"is_active": "0",
"is_referenced": "0",
"is_active": false,
"is_referenced": false,
"address": "140723513950432",
"details": ""
},
{
"type": "async",
"is_active": "1",
"is_referenced": "0",
"is_active": true,
"is_referenced": false,
"address": "39353856",
"details": ""
}
@ -264,7 +264,7 @@ is provided below for reference.
},
"max_locked_memory_bytes": {
"soft": "unlimited",
"hard": "65536"
"hard": 65536
},
"max_memory_size_kbytes": {
"soft": "unlimited",
@ -272,7 +272,7 @@ is provided below for reference.
},
"open_files": {
"soft": "unlimited",
"hard": "4096"
"hard": 4096
},
"stack_size_bytes": {
"soft": "unlimited",
@ -284,7 +284,7 @@ is provided below for reference.
},
"max_user_processes": {
"soft": "unlimited",
"hard": "4127290"
"hard": 4127290
},
"virtual_memory_kbytes": {
"soft": "unlimited",

View File

@ -222,7 +222,6 @@ static void WriteNodeReport(Isolate* isolate,
std::ostream& out,
Local<String> stackstr,
TIME_TYPE* tm_struct) {
std::ostringstream buf;
uv_pid_t pid = uv_os_getpid();
// Save formatting for output stream.
@ -241,7 +240,7 @@ static void WriteNodeReport(Isolate* isolate,
if (!filename.empty())
writer.json_keyvalue("filename", filename);
else
writer.json_keyvalue("filename", std::string("''"));
writer.json_keyvalue("filename", "''");
// Report dump event and module load date/time stamps
char timebuf[64];
@ -273,9 +272,7 @@ static void WriteNodeReport(Isolate* isolate,
std::to_string(ts.tv_sec * 1000 + ts.tv_usec / 1000));
#endif
// Report native process ID
buf << pid;
writer.json_keyvalue("processId", buf.str());
buf.flush();
writer.json_keyvalue("processId", pid);
// Report out the command line.
if (!node::per_process::cli_options->cmdline.empty()) {
@ -332,9 +329,7 @@ static void PrintVersionInformation(JSONWriter* writer) {
buf.str("");
#endif
// Report Process word size
buf << sizeof(void*) * 8 << " bit";
writer->json_keyvalue("wordSize", buf.str());
buf.str("");
writer->json_keyvalue("wordSize", sizeof(void*) * 8);
// Report deps component versions
PrintComponentVersions(writer);
@ -468,7 +463,7 @@ static void PrintJavaScriptStack(JSONWriter* writer,
}
int line = ss.find("\n");
if (line == -1) {
writer->json_keyvalue("message", ss.c_str());
writer->json_keyvalue("message", ss);
writer->json_objectend();
} else {
std::string l = ss.substr(0, line);
@ -518,16 +513,13 @@ static void PrintGCStatistics(JSONWriter* writer, Isolate* isolate) {
HeapSpaceStatistics v8_heap_space_stats;
writer->json_objectstart("javascriptHeap");
writer->json_keyvalue("totalMemory",
std::to_string(v8_heap_stats.total_heap_size()));
writer->json_keyvalue("totalMemory", v8_heap_stats.total_heap_size());
writer->json_keyvalue("totalCommittedMemory",
std::to_string(v8_heap_stats.total_physical_size()));
writer->json_keyvalue("usedMemory",
std::to_string(v8_heap_stats.used_heap_size()));
v8_heap_stats.total_physical_size());
writer->json_keyvalue("usedMemory", v8_heap_stats.used_heap_size());
writer->json_keyvalue("availableMemory",
std::to_string(v8_heap_stats.total_available_size()));
writer->json_keyvalue("memoryLimit",
std::to_string(v8_heap_stats.heap_size_limit()));
v8_heap_stats.total_available_size());
writer->json_keyvalue("memoryLimit", v8_heap_stats.heap_size_limit());
writer->json_objectstart("heapSpaces");
// Loop through heap spaces
@ -535,37 +527,31 @@ static void PrintGCStatistics(JSONWriter* writer, Isolate* isolate) {
for (i = 0; i < isolate->NumberOfHeapSpaces() - 1; i++) {
isolate->GetHeapSpaceStatistics(&v8_heap_space_stats, i);
writer->json_objectstart(v8_heap_space_stats.space_name());
writer->json_keyvalue("memorySize",
std::to_string(v8_heap_space_stats.space_size()));
writer->json_keyvalue("memorySize", v8_heap_space_stats.space_size());
writer->json_keyvalue(
"committedMemory",
std::to_string(v8_heap_space_stats.physical_space_size()));
v8_heap_space_stats.physical_space_size());
writer->json_keyvalue(
"capacity",
std::to_string(v8_heap_space_stats.space_used_size() +
v8_heap_space_stats.space_available_size()));
v8_heap_space_stats.space_used_size() +
v8_heap_space_stats.space_available_size());
writer->json_keyvalue("used", v8_heap_space_stats.space_used_size());
writer->json_keyvalue(
"used", std::to_string(v8_heap_space_stats.space_used_size()));
writer->json_keyvalue(
"available",
std::to_string(v8_heap_space_stats.space_available_size()));
"available", v8_heap_space_stats.space_available_size());
writer->json_objectend();
}
isolate->GetHeapSpaceStatistics(&v8_heap_space_stats, i);
writer->json_objectstart(v8_heap_space_stats.space_name());
writer->json_keyvalue("memorySize",
std::to_string(v8_heap_space_stats.space_size()));
writer->json_keyvalue("memorySize", v8_heap_space_stats.space_size());
writer->json_keyvalue(
"committedMemory",
std::to_string(v8_heap_space_stats.physical_space_size()));
"committedMemory", v8_heap_space_stats.physical_space_size());
writer->json_keyvalue(
"capacity",
std::to_string(v8_heap_space_stats.space_used_size() +
v8_heap_space_stats.space_available_size()));
writer->json_keyvalue("used",
std::to_string(v8_heap_space_stats.space_used_size()));
v8_heap_space_stats.space_used_size() +
v8_heap_space_stats.space_available_size());
writer->json_keyvalue("used", v8_heap_space_stats.space_used_size());
writer->json_keyvalue(
"available", std::to_string(v8_heap_space_stats.space_available_size()));
"available", v8_heap_space_stats.space_available_size());
writer->json_objectend();
writer->json_objectend();
writer->json_objectend();
@ -574,9 +560,6 @@ static void PrintGCStatistics(JSONWriter* writer, Isolate* isolate) {
#ifndef _WIN32
// Report resource usage (Linux/OSX only).
static void PrintResourceUsage(JSONWriter* writer) {
char buf[64];
double cpu_abs;
double cpu_percentage;
time_t current_time; // current time absolute
time(&current_time);
size_t boot_time = static_cast<time_t>(node::per_process::prog_start_time /
@ -588,87 +571,39 @@ static void PrintResourceUsage(JSONWriter* writer) {
struct rusage stats;
writer->json_objectstart("resourceUsage");
if (getrusage(RUSAGE_SELF, &stats) == 0) {
#if defined(__APPLE__) || defined(_AIX)
snprintf(buf,
sizeof(buf),
"%ld.%06d",
stats.ru_utime.tv_sec,
stats.ru_utime.tv_usec);
writer->json_keyvalue("userCpuSeconds", buf);
snprintf(buf,
sizeof(buf),
"%ld.%06d",
stats.ru_stime.tv_sec,
stats.ru_stime.tv_usec);
writer->json_keyvalue("kernelCpuSeconds", buf);
#else
snprintf(buf,
sizeof(buf),
"%ld.%06ld",
stats.ru_utime.tv_sec,
stats.ru_utime.tv_usec);
writer->json_keyvalue("userCpuSeconds", buf);
snprintf(buf,
sizeof(buf),
"%ld.%06ld",
stats.ru_stime.tv_sec,
stats.ru_stime.tv_usec);
writer->json_keyvalue("kernelCpuSeconds", buf);
#endif
cpu_abs = stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec +
stats.ru_stime.tv_sec + 0.000001 * stats.ru_stime.tv_usec;
cpu_percentage = (cpu_abs / uptime) * 100.0;
writer->json_keyvalue("cpuConsumptionPercent",
std::to_string(cpu_percentage));
writer->json_keyvalue("maxRss", std::to_string(stats.ru_maxrss * 1024));
double user_cpu = stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec;
double kernel_cpu =
stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec;
writer->json_keyvalue("userCpuSeconds", user_cpu);
writer->json_keyvalue("kernelCpuSeconds", kernel_cpu);
double cpu_abs = user_cpu + kernel_cpu;
double cpu_percentage = (cpu_abs / uptime) * 100.0;
writer->json_keyvalue("cpuConsumptionPercent", cpu_percentage);
writer->json_keyvalue("maxRss", stats.ru_maxrss * 1024);
writer->json_objectstart("pageFaults");
writer->json_keyvalue("IORequired", std::to_string(stats.ru_majflt));
writer->json_keyvalue("IONotRequired", std::to_string(stats.ru_minflt));
writer->json_keyvalue("IORequired", stats.ru_majflt);
writer->json_keyvalue("IONotRequired", stats.ru_minflt);
writer->json_objectend();
writer->json_objectstart("fsActivity");
writer->json_keyvalue("reads", std::to_string(stats.ru_inblock));
writer->json_keyvalue("writes", std::to_string(stats.ru_oublock));
writer->json_keyvalue("reads", stats.ru_inblock);
writer->json_keyvalue("writes", stats.ru_oublock);
writer->json_objectend();
}
writer->json_objectend();
#ifdef RUSAGE_THREAD
if (getrusage(RUSAGE_THREAD, &stats) == 0) {
writer->json_objectstart("uvthreadResourceUsage");
#if defined(__APPLE__) || defined(_AIX)
snprintf(buf,
sizeof(buf),
"%ld.%06d",
stats.ru_utime.tv_sec,
stats.ru_utime.tv_usec);
writer->json_keyvalue("userCpuSeconds", buf);
snprintf(buf,
sizeof(buf),
"%ld.%06d",
stats.ru_stime.tv_sec,
stats.ru_stime.tv_usec);
writer->json_keyvalue("kernelCpuSeconds", buf);
#else
snprintf(buf,
sizeof(buf),
"%ld.%06ld",
stats.ru_utime.tv_sec,
stats.ru_utime.tv_usec);
writer->json_keyvalue("userCpuSeconds", buf);
snprintf(buf,
sizeof(buf),
"%ld.%06ld",
stats.ru_stime.tv_sec,
stats.ru_stime.tv_usec);
writer->json_keyvalue("kernelCpuSeconds", buf);
#endif
cpu_abs = stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec +
stats.ru_stime.tv_sec + 0.000001 * stats.ru_stime.tv_usec;
cpu_percentage = (cpu_abs / uptime) * 100.0;
writer->json_keyvalue("cpuConsumptionPercent",
std::to_string(cpu_percentage));
double user_cpu = stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec;
double kernel_cpu =
stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec;
writer->json_keyvalue("userCpuSeconds", user_cpu);
writer->json_keyvalue("kernelCpuSeconds", kernel_cpu);
double cpu_abs = user_cpu + kernel_cpu;
double cpu_percentage = (cpu_abs / uptime) * 100.0;
writer->json_keyvalue("cpuConsumptionPercent", cpu_percentage);
writer->json_objectstart("fsActivity");
writer->json_keyvalue("reads", std::to_string(stats.ru_inblock));
writer->json_keyvalue("writes", std::to_string(stats.ru_oublock));
writer->json_keyvalue("reads", stats.ru_inblock);
writer->json_keyvalue("writes", stats.ru_oublock);
writer->json_objectend();
writer->json_objectend();
}
@ -746,19 +681,18 @@ static void PrintSystemInformation(JSONWriter* writer) {
for (size_t i = 0; i < arraysize(rlimit_strings); i++) {
if (getrlimit(rlimit_strings[i].id, &limit) == 0) {
writer->json_objectstart(rlimit_strings[i].description);
if (limit.rlim_cur == RLIM_INFINITY)
soft = std::string("unlimited");
writer->json_keyvalue("soft", "unlimited");
else
soft = std::to_string(limit.rlim_cur);
writer->json_keyvalue("soft", limit.rlim_cur);
if (limit.rlim_max == RLIM_INFINITY)
hard = std::string("unlimited");
writer->json_keyvalue("hard", "unlimited");
else
hard = std::to_string(limit.rlim_max);
writer->json_keyvalue("hard", limit.rlim_max);
writer->json_objectstart(rlimit_strings[i].description);
writer->json_keyvalue("soft", soft);
writer->json_keyvalue("hard", hard);
writer->json_objectend();
}
}
@ -784,7 +718,7 @@ static void PrintComponentVersions(JSONWriter* writer) {
writer->json_objectstart("componentVersions");
#define V(key) \
writer->json_keyvalue(#key, node::per_process::metadata.versions.key.c_str());
writer->json_keyvalue(#key, node::per_process::metadata.versions.key);
NODE_VERSIONS_KEYS(V)
#undef V

View File

@ -206,8 +206,8 @@ void WalkHandle(uv_handle_t* h, void* arg) {
writer->json_start();
writer->json_keyvalue("type", type);
writer->json_keyvalue("is_active", std::to_string(uv_is_active(h)));
writer->json_keyvalue("is_referenced", std::to_string(uv_has_ref(h)));
writer->json_keyvalue("is_active", static_cast<bool>(uv_is_active(h)));
writer->json_keyvalue("is_referenced", static_cast<bool>(uv_has_ref(h)));
writer->json_keyvalue("address",
std::to_string(reinterpret_cast<int64_t>(h)));
writer->json_keyvalue("details", data.str());