src/hotspot/share/jfr/periodic/jfrNetworkUtilization.cpp
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
parent 53013 c8b2a408628b
permissions -rw-r--r--
8226511: Implement JFR Event Streaming Reviewed-by: egahlin, mseledtsov, mgronlun Contributed-by: erik.gahlin@oracle.com, mikhailo.seledtsov@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     1
/*
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     4
 *
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     8
 *
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    13
 * accompanied this code).
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    14
 *
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    18
 *
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    21
 * questions.
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    22
 *
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    23
 */
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    24
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    25
#include "precompiled.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    26
#include "logging/log.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    27
#include "jfr/jfrEvents.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    28
#include "jfr/metadata/jfrSerializer.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    29
#include "jfr/periodic/jfrNetworkUtilization.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    30
#include "jfr/periodic/jfrOSInterface.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    31
#include "jfr/utilities/jfrTime.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    32
#include "jfr/utilities/jfrTypes.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    33
#include "runtime/os_perf.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    34
#include "utilities/globalDefinitions.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    35
#include "utilities/growableArray.hpp"
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    36
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    37
struct InterfaceEntry {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    38
  char* name;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    39
  traceid id;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    40
  uint64_t bytes_in;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    41
  uint64_t bytes_out;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
    42
  mutable bool written;
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    43
};
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    44
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    45
static GrowableArray<InterfaceEntry>* _interfaces = NULL;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    46
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    47
void JfrNetworkUtilization::destroy() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    48
  if (_interfaces != NULL) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    49
    for (int i = 0; i < _interfaces->length(); ++i) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    50
      FREE_C_HEAP_ARRAY(char, _interfaces->at(i).name);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    51
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    52
    delete _interfaces;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    53
    _interfaces = NULL;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    54
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    55
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    56
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    57
static InterfaceEntry& new_entry(const NetworkInterface* iface, GrowableArray<InterfaceEntry>* interfaces) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    58
  assert(iface != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    59
  assert(interfaces != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    60
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    61
  // single threaded premise
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    62
  static traceid interface_id = 0;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    63
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    64
  const char* name = iface->get_name();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    65
  assert(name != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    66
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    67
  InterfaceEntry entry;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    68
  const size_t length = strlen(name);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    69
  entry.name = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    70
  strncpy(entry.name, name, length + 1);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    71
  entry.id = ++interface_id;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    72
  entry.bytes_in = iface->get_bytes_in();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    73
  entry.bytes_out = iface->get_bytes_out();
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
    74
  entry.written = false;
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    75
  return _interfaces->at(_interfaces->append(entry));
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    76
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    77
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    78
static GrowableArray<InterfaceEntry>* get_interfaces() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    79
  if (_interfaces == NULL) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    80
    _interfaces = new(ResourceObj::C_HEAP, mtTracing) GrowableArray<InterfaceEntry>(10, true, mtTracing);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    81
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    82
  return _interfaces;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    83
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    84
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    85
static InterfaceEntry& get_entry(const NetworkInterface* iface) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    86
  // Remember the index we started at last time, since we're most likely looking at them
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    87
  // in the same order every time.
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    88
  static int saved_index = -1;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    89
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    90
  GrowableArray<InterfaceEntry>* interfaces = get_interfaces();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    91
  assert(interfaces != NULL, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    92
  for (int i = 0; i < _interfaces->length(); ++i) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    93
    saved_index = (saved_index + 1) % _interfaces->length();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    94
    if (strcmp(_interfaces->at(saved_index).name, iface->get_name()) == 0) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    95
      return _interfaces->at(saved_index);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    96
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    97
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    98
  return new_entry(iface, interfaces);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
    99
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   100
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   101
// If current counters are less than previous we assume the interface has been reset
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   102
// If no bytes have been either sent or received, we'll also skip the event
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   103
static uint64_t rate_per_second(uint64_t current, uint64_t old, const JfrTickspan& interval) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   104
  assert(interval.value() > 0, "invariant");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   105
  if (current <= old) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   106
    return 0;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   107
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   108
  return ((current - old) * NANOSECS_PER_SEC) / interval.nanoseconds();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   109
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   110
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   111
class JfrNetworkInterfaceName : public JfrSerializer {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   112
 public:
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   113
   void serialize(JfrCheckpointWriter& writer) {} // we write each constant lazily
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   114
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   115
   void on_rotation() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   116
     for (int i = 0; i < _interfaces->length(); ++i) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   117
       const InterfaceEntry& entry = _interfaces->at(i);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   118
       if (entry.written) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   119
         entry.written = false;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   120
       }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   121
     }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   122
   }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   123
};
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   124
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   125
static bool register_network_interface_name_serializer() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   126
  assert(_interfaces != NULL, "invariant");
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   127
  return JfrSerializer::register_serializer(TYPE_NETWORKINTERFACENAME,
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   128
    false, // disallow caching; we want a callback every rotation
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   129
    new JfrNetworkInterfaceName());
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   130
}
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   131
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   132
static void write_interface_constant(const InterfaceEntry& entry) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   133
  if (entry.written) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   134
    return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   135
  }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   136
  JfrCheckpointWriter writer;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   137
  writer.write_type(TYPE_NETWORKINTERFACENAME);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   138
  writer.write_count(1);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   139
  writer.write_key(entry.id);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   140
  writer.write(entry.name);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   141
  entry.written = true;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   142
}
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   143
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   144
static bool get_interfaces(NetworkInterface** network_interfaces) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   145
  const int ret_val = JfrOSInterface::network_utilization(network_interfaces);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   146
  if (ret_val == OS_ERR) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   147
    log_debug(jfr, system)("Unable to generate network utilization events");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   148
    return false;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   149
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   150
  return ret_val != FUNCTIONALITY_NOT_IMPLEMENTED;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   151
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   152
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   153
void JfrNetworkUtilization::send_events() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   154
  ResourceMark rm;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   155
  NetworkInterface* network_interfaces;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   156
  if (!get_interfaces(&network_interfaces)) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   157
    return;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   158
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   159
  log_trace(jfr, event)("Reporting network utilization");
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   160
  static JfrTicks last_sample_instant;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   161
  const JfrTicks cur_time = JfrTicks::now();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   162
  const JfrTickspan interval = last_sample_instant == 0 ? cur_time - cur_time : cur_time - last_sample_instant;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   163
  last_sample_instant = cur_time;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   164
  for (NetworkInterface *cur = network_interfaces; cur != NULL; cur = cur->next()) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   165
    InterfaceEntry& entry = get_entry(cur);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   166
    if (interval.value() > 0) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   167
      const uint64_t current_bytes_in = cur->get_bytes_in();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   168
      const uint64_t current_bytes_out = cur->get_bytes_out();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   169
      const uint64_t read_rate = rate_per_second(current_bytes_in, entry.bytes_in, interval);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   170
      const uint64_t write_rate = rate_per_second(current_bytes_out, entry.bytes_out, interval);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   171
      if (read_rate > 0 || write_rate > 0) {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 53013
diff changeset
   172
        write_interface_constant(entry);
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   173
        EventNetworkUtilization event(UNTIMED);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   174
        event.set_starttime(cur_time);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   175
        event.set_endtime(cur_time);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   176
        event.set_networkInterface(entry.id);
53013
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50879
diff changeset
   177
        event.set_readRate(8 * read_rate);
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50879
diff changeset
   178
        event.set_writeRate(8 * write_rate);
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   179
        event.commit();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   180
      }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   181
      // update existing entry with new values
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   182
      entry.bytes_in = current_bytes_in;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   183
      entry.bytes_out = current_bytes_out;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   184
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   185
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   186
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   187
  static bool is_serializer_registered = false;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   188
  if (!is_serializer_registered) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   189
    is_serializer_registered = register_network_interface_name_serializer();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   190
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents:
diff changeset
   191
}