4747extern char** environ;
4848#endif
4949
50+ constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000;
51+ constexpr double SEC_PER_MICROS = 1e-6;
52+ 
5053namespace report {
5154using node::arraysize;
5255using node::Environment;
@@ -489,20 +492,19 @@ static void PrintGCStatistics(JSONWriter* writer, Isolate* isolate) {
489492#ifndef _WIN32
490493// Report resource usage (Linux/OSX only).
491494static void PrintResourceUsage(JSONWriter* writer) {
492-   time_t current_time;  // current time absolute
493-   time(¤t_time);
494-   size_t boot_time = static_cast<time_t>(node::per_process::prog_start_time /
495-                                          (1000 * 1000 * 1000));
496-   auto uptime = difftime(current_time, boot_time);
495+   // Get process uptime in seconds
496+   uint64_t uptime =
497+       (uv_hrtime() - node::per_process::node_start_time) / (NANOS_PER_SEC);
497498  if (uptime == 0) uptime = 1;  // avoid division by zero.
498499
499500  // Process and current thread usage statistics
500501  struct rusage stats;
501502  writer->json_objectstart("resourceUsage");
502503  if (getrusage(RUSAGE_SELF, &stats) == 0) {
503-     double user_cpu = stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec;
504+     double user_cpu =
505+         stats.ru_utime.tv_sec + SEC_PER_MICROS * stats.ru_utime.tv_usec;
504506    double kernel_cpu =
505-         stats.ru_utime.tv_sec + 0.000001  * stats.ru_utime.tv_usec;
507+         stats.ru_utime.tv_sec + SEC_PER_MICROS  * stats.ru_utime.tv_usec;
506508    writer->json_keyvalue("userCpuSeconds", user_cpu);
507509    writer->json_keyvalue("kernelCpuSeconds", kernel_cpu);
508510    double cpu_abs = user_cpu + kernel_cpu;
@@ -522,9 +524,10 @@ static void PrintResourceUsage(JSONWriter* writer) {
522524#ifdef RUSAGE_THREAD
523525  if (getrusage(RUSAGE_THREAD, &stats) == 0) {
524526    writer->json_objectstart("uvthreadResourceUsage");
525-     double user_cpu = stats.ru_utime.tv_sec + 0.000001 * stats.ru_utime.tv_usec;
527+     double user_cpu =
528+         stats.ru_utime.tv_sec + SEC_PER_MICROS * stats.ru_utime.tv_usec;
526529    double kernel_cpu =
527-         stats.ru_utime.tv_sec + 0.000001  * stats.ru_utime.tv_usec;
530+         stats.ru_utime.tv_sec + SEC_PER_MICROS  * stats.ru_utime.tv_usec;
528531    writer->json_keyvalue("userCpuSeconds", user_cpu);
529532    writer->json_keyvalue("kernelCpuSeconds", kernel_cpu);
530533    double cpu_abs = user_cpu + kernel_cpu;
0 commit comments