Merge pull request #2157 from maryamtahhan/dpdkevents_upstream
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 24 Feb 2017 16:19:21 +0000 (17:19 +0100)
committerGitHub <noreply@github.com>
Fri, 24 Feb 2017 16:19:21 +0000 (17:19 +0100)
Plugin for getting DPDK ports link status and keep alive events.

1  2 
configure.ac
src/collectd.conf.in
src/collectd.conf.pod

diff --combined configure.ac
@@@ -2700,30 -2700,46 +2700,46 @@@ AC_ARG_VAR([LIBDPDK_LDFLAGS], [Linker f
  
  AC_ARG_WITH([libdpdk], [AS_HELP_STRING([--without-libdpdk], [Disable libdpdk.])])
  
- if test "x$with_libdpdk" != "xno"
- then
-       if test "x$LIBDPDK_CPPFLAGS" = "x"
-       then
-               LIBDPDK_CPPFLAGS="-I/usr/include/dpdk"
-       fi
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$LIBDPDK_CPPFLAGS $CPPFLAGS"
-       AC_CHECK_HEADERS([rte_config.h],
-               [with_libdpdk="yes"],
-               [with_libdpdk="no (rte_config.h not found)"]
-       )
-       CPPFLAGS="$SAVE_CPPFLAGS"
+ if test "x$with_libdpdk" != "xno"; then
+   if test "x$LIBDPDK_CPPFLAGS" = "x"; then
+     LIBDPDK_CPPFLAGS="-I/usr/include/dpdk"
+   fi
+   SAVE_CPPFLAGS="$CPPFLAGS"
+   CPPFLAGS="$LIBDPDK_CPPFLAGS $CPPFLAGS"
+   AC_CHECK_HEADERS([rte_config.h],
+     [
+       with_libdpdk="yes"
+       AC_COMPILE_IFELSE(
+         [
+           AC_LANG_PROGRAM(
+             [[
+               #include <rte_version.h>
+               #if RTE_VERSION < RTE_VERSION_NUM(16,7,0,0)
+               #error "required DPDK >= 16.07"
+               #endif
+             ]],
+             [[
+               return 0;
+             ]]
+           )
+         ],
+         [dpdk_keepalive="yes"],
+         [dpdk_keepalive="no (DPDK version < 16.07)"]
+       )
+     ],
+     [with_libdpdk="no (rte_config.h not found)"]
+   )
+   CPPFLAGS="$SAVE_CPPFLAGS"
  fi
  
- if test "x$with_libdpdk" = "xyes"
- then
-       SAVE_LDFLAGS="$LDFLAGS"
-       LDFLAGS="$LIBDPDK_LDFLAGS $LDFLAGS"
-       AC_CHECK_LIB([dpdk], [rte_eal_init],
-               [with_libdpdk="yes"],
-               [with_libdpdk="no (symbol 'rte_eal_init' not found)"]
-       )
-       LDFLAGS="$SAVE_LDFLAGS"
+ if test "x$with_libdpdk" = "xyes"; then
+   SAVE_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LIBDPDK_LDFLAGS $LDFLAGS"
+   AC_CHECK_LIB([dpdk], [rte_eal_init],
+     [with_libdpdk="yes"],
+     [with_libdpdk="no (symbol 'rte_eal_init' not found)"]
+   )
+   LDFLAGS="$SAVE_LDFLAGS"
  fi
  
  # }}}
@@@ -5186,11 -5202,6 +5202,11 @@@ if test "x$with_libupsclient" = "xyes"
      [with_libupsclient="no (symbol upscli_connect not found)"]
    )
  
 +  AC_CHECK_LIB([upsclient], [upscli_init],
 +    [AC_DEFINE([WITH_UPSCLIENT_27], [1], [At least version 2-7])],
 +    []
 +  )
 +
    LDFLAGS="$SAVE_LDFLAGS"
  fi
  
@@@ -5886,6 -5897,7 +5902,7 @@@ plugin_curl_xml="no
  plugin_df="no"
  plugin_disk="no"
  plugin_drbd="no"
+ plugin_dpdkevents="no"
  plugin_dpdkstat="no"
  plugin_entropy="no"
  plugin_ethstat="no"
  
  if test "x$with_libdpdk" = "xyes"
  then
+   plugin_dpdkevents="$dpdk_keepalive"
    plugin_dpdkstat="yes"
  fi
  
@@@ -6284,6 -6297,7 +6302,7 @@@ AC_PLUGIN([dbi],                 [$with
  AC_PLUGIN([df],                  [$plugin_df],              [Filesystem usage statistics])
  AC_PLUGIN([disk],                [$plugin_disk],            [Disk usage statistics])
  AC_PLUGIN([dns],                 [$with_libpcap],           [DNS traffic analysis])
+ AC_PLUGIN([dpdkevents],          [$plugin_dpdkevents],      [Events from DPDK])
  AC_PLUGIN([dpdkstat],            [$plugin_dpdkstat],        [Stats from DPDK])
  AC_PLUGIN([drbd],                [$plugin_drbd],            [DRBD statistics])
  AC_PLUGIN([email],               [yes],                     [EMail statistics])
@@@ -6709,6 -6723,7 +6728,7 @@@ AC_MSG_RESULT([    dbi . . . . . . . . 
  AC_MSG_RESULT([    df  . . . . . . . . . $enable_df])
  AC_MSG_RESULT([    disk  . . . . . . . . $enable_disk])
  AC_MSG_RESULT([    dns . . . . . . . . . $enable_dns])
+ AC_MSG_RESULT([    dpdkevents. . . . . . $enable_dpdkevents])
  AC_MSG_RESULT([    dpdkstat  . . . . . . $enable_dpdkstat])
  AC_MSG_RESULT([    drbd  . . . . . . . . $enable_drbd])
  AC_MSG_RESULT([    email . . . . . . . . $enable_email])
diff --combined src/collectd.conf.in
  #@BUILD_PLUGIN_DF_TRUE@LoadPlugin df
  #@BUILD_PLUGIN_DISK_TRUE@LoadPlugin disk
  #@BUILD_PLUGIN_DNS_TRUE@LoadPlugin dns
+ #@BUILD_PLUGIN_DPDKEVENTS_TRUE@LoadPlugin dpdkevents
  #@BUILD_PLUGIN_DPDKSTAT_TRUE@LoadPlugin dpdkstat
  #@BUILD_PLUGIN_DRBD_TRUE@LoadPlugin drbd
  #@BUILD_PLUGIN_EMAIL_TRUE@LoadPlugin email
  #     IgnoreSource "192.168.0.1"
  #     SelectNumericQueryTypes true
  #</Plugin>
+ #<Plugin "dpdkevents">
+ #  <EAL>
+ #    Coremask "0x1"
+ #    MemoryChannels "4"
+ #    ProcessType "secondary"
+ #    FilePrefix "rte"
+ #  </EAL>
+ #  <Event "link_status">
+ #    SendEventsOnUpdate true
+ #    EnabledPortMask 0xffff
+ #    PortName "interface1"
+ #    PortName "interface2"
+ #    SendNotification false
+ #  </Event>
+ #  <Event "keep_alive">
+ #    SendEventsOnUpdate true
+ #    LCoreMask "0xf"
+ #    KeepAliveShmName "/dpdk_keepalive_shm_name"
+ #    SendNotification false
+ #  </Event>
+ #</Plugin>
  
  #<Plugin dpdkstat>
  #  <EAL>
  #    ProcessType "secondary"
  #    FilePrefix "rte"
  #  </EAL>
 +#  SharedMemObj "dpdk_collectd_stats_0"
  #  EnabledPortMask 0xffff
  #  PortName "interface1"
  #  PortName "interface2"
  
  #<Plugin nut>
  #     UPS "upsname@hostname:port"
 +#     ForceSSL true
 +#     VerifyPeer true
 +#     CAPath "/path/to/folder"
  #</Plugin>
  
  #<Plugin olsrd>
  #  Socket "/var/run/openvswitch/db.sock"
  #  Interfaces "br0" "veth0"
  #  SendNotification false
 +#  DispatchValues true
  #</Plugin>
  
  #<Plugin perl>
  #     InterfaceFormat name
  #     PluginInstanceFormat name
  #     Instances 1
 +#     ExtraStats "disk pcpu"
  #</Plugin>
  
  #<Plugin vmem>
diff --combined src/collectd.conf.pod
@@@ -2383,6 -2383,128 +2383,128 @@@ Enabled by default, collects unknown (a
  
  =back
  
+ =head2 Plugin C<dpdkevents>
+ The I<dpdkevents plugin> collects events from DPDK such as link status of
+ network ports and Keep Alive status of DPDK logical cores.
+ In order to get Keep Alive events following requirements must be met:
+ - DPDK >= 16.07
+ - support for Keep Alive implemented in DPDK application. More details can
+ be found here: http://dpdk.org/doc/guides/sample_app_ug/keep_alive.html
+ B<Synopsis:>
+  <Plugin "dpdkevents">
+    <EAL>
+      Coremask "0x1"
+      MemoryChannels "4"
+      ProcessType "secondary"
+      FilePrefix "rte"
+    </EAL>
+    <Event "link_status">
+      SendEventsOnUpdate true
+      EnabledPortMask 0xffff
+      PortName "interface1"
+      PortName "interface2"
+      SendNotification false
+    </Event>
+    <Event "keep_alive">
+      SendEventsOnUpdate true
+      LCoreMask "0xf"
+      KeepAliveShmName "/dpdk_keepalive_shm_name"
+      SendNotification false
+    </Event>
+  </Plugin>
+ B<Options:>
+ =head3 The EAL block
+ =over 5
+ =item B<Coremask> I<Mask>
+ =item B<Memorychannels> I<Channels>
+ Number of memory channels per processor socket.
+ =item B<ProcessType> I<type>
+ The type of DPDK process instance.
+ =item B<FilePrefix> I<File>
+ The prefix text used for hugepage filenames. The filename will be set to
+ /var/run/.<prefix>_config where prefix is what is passed in by the user.
+ =back
+ =head3 The Event block
+ The B<Event> block defines configuration for specific event. It accepts a
+ single argument which specifies the name of the event.
+ =head4 Link Status event
+ =over 5
+ =item B<SendEventOnUpdate> I<true|false>
+ If set to true link status value will be dispatched only when it is
+ different from previously read value. This is an optional argument - default
+ value is true.
+ =item B<EnabledPortMask> I<Mask>
+ A hexidecimal bit mask of the DPDK ports which should be enabled. A mask
+ of 0x0 means that all ports will be disabled. A bitmask of all F's means
+ that all ports will be enabled. This is an optional argument - by default
+ all ports are enabled.
+ =item B<PortName> I<Name>
+ A string containing an optional name for the enabled DPDK ports. Each PortName
+ option should contain only one port name; specify as many PortName options as
+ desired. Default naming convention will be used if PortName is blank. If there
+ are less PortName options than there are enabled ports, the default naming
+ convention will be used for the additional ports.
+ =item B<SendNotification> I<true|false>
+ If set to true, link status notifications are sent, instead of link status
+ being collected as a statistic. This is an optional argument - default
+ value is false.
+ =back
+ =head4 Keep Alive event
+ =over 5
+ =item B<SendEventOnUpdate> I<true|false>
+ If set to true keep alive value will be dispatched only when it is
+ different from previously read value. This is an optional argument - default
+ value is true.
+ =item B<LCoreMask> I<Mask>
+ An hexadecimal bit mask of the logical cores to monitor keep alive state.
+ =item B<KeepAliveShmName> I<Name>
+ Shared memory name identifier that is used by secondary process to monitor
+ the keep alive cores state.
+ =item B<SendNotification> I<true|false>
+ If set to true, keep alive notifications are sent, instead of keep alive
+ information being collected as a statistic. This is an optional
+ argument - default value is false.
+ =back
  =head2 Plugin C<dpdkstat>
  
  The I<dpdkstat plugin> collects information about DPDK interfaces using the
@@@ -2398,7 -2520,6 +2520,7 @@@ B<Synopsis:
       FilePrefix "rte"
       SocketMemory "1024"
     </EAL>
 +   SharedMemObj "dpdk_collectd_stats_0"
     EnabledPortMask 0xffff
     PortName "interface1"
     PortName "interface2"
@@@ -2435,12 -2556,7 +2557,12 @@@ sockets in MB. This is an optional valu
  
  =back
  
 -=over 4
 +=over 3
 +
 +=item B<SharedMemObj> I<Mask>
 +A string containing the name of the shared memory object that should be used to
 +share stats from the DPDK secondary process to the collectd dpdkstat plugin.
 +Defaults to dpdk_collectd_stats if no other value is configured.
  
  =item B<EnabledPortMask> I<Mask>
  
@@@ -2964,10 -3080,6 +3086,10 @@@ allows to monitor instructions per cloc
  Monitor events are hardware dependant. Monitoring capabilities are detected on
  plugin initialization and only supported events are monitored.
  
 +B<Note:> I<intel_rdt> plugin is using model-specific registers (MSRs), which
 +require an additional capability to be enabled if collectd is run as a service.
 +Please refer to I<contrib/systemd.collectd.service> file for more details.
 +
  B<Synopsis:>
  
    <Plugin "intel_rdt">
@@@ -5127,35 -5239,6 +5249,35 @@@ making it through
  Add a UPS to collect data from. The format is identical to the one accepted by
  L<upsc(8)>.
  
 +=item B<ForceSSL> B<true>|B<false>
 +
 +Stops connections from falling back to unsecured if an SSL connection
 +cannot be established. Defaults to false if undeclared.
 +
 +=item B<VerifyPeer> I<true>|I<false>
 +
 +If set to true, requires a CAPath be provided. Will use the CAPath to find
 +certificates to use as Trusted Certificates to validate a upsd server certificate.
 +If validation of the upsd server certificate fails, the connection will not be
 +established. If ForceSSL is undeclared or set to false, setting VerifyPeer to true
 +will override and set ForceSSL to true.
 +
 +=item B<CAPath> I/path/to/certs/folder
 +
 +If VerifyPeer is set to true, this is required. Otherwise this is ignored.
 +The folder pointed at must contain certificate(s) named according to their hash.
 +Ex: XXXXXXXX.Y where X is the hash value of a cert and Y is 0. If name collisions
 +occur because two different certs have the same hash value, Y can be  incremented
 +in order to avoid conflict. To create a symbolic link to a certificate the following
 +command can be used from within the directory where the cert resides:
 +
 +C<ln -s some.crt ./$(openssl x509 -hash -noout -in some.crt).0>
 +
 +Alternatively, the package openssl-perl provides a command C<c_rehash> that will
 +generate links like the one described above for ALL certs in a given folder.
 +Example usage:
 +C<c_rehash /path/to/certs/folder>
 +
  =back
  
  =head2 Plugin C<olsrd>
@@@ -5516,7 -5599,6 +5638,7 @@@ B<Synopsis:
     Socket "/var/run/openvswitch/db.sock"
     Interfaces "br0" "veth0"
     SendNotification false
 +   DispatchValues true
   </Plugin>
  
  The plugin provides the following configuration options:
@@@ -5556,12 -5638,6 +5678,12 @@@ Default: empty (all interfaces on all b
  If set to true, OVS link notifications (interface status and OVS DB connection
  terminate) are sent to collectd. Default value is false.
  
 +=item B<DispatchValues> I<true|false>
 +
 +Dispatch the OVS DB interface link status value with configured plugin interval.
 +Defaults to true. Please note, if B<SendNotification> and B<DispatchValues>
 +options are false, no OVS information will be provided by the plugin.
 +
  =back
  
  B<Note:> By default, the global interval setting is used within which to
@@@ -8118,17 -8194,6 +8240,17 @@@ How many read instances you want to us
  and the sensible setting is a multiple of the B<ReadThreads> value.
  If you are not sure, just use the default setting.
  
 +=item B<ExtraStats> B<string>
 +
 +Report additional extra statistics. The default is no extra statistics, preserving
 +the previous behaviour of the plugin. If unsure, leave the default. If enabled,
 +allows the plugin to reported more detailed statistics about the behaviour of
 +Virtual Machines. The argument is a space-separated list of selectors.
 +Currently supported selectors are:
 +B<disk> report extra statistics like number of flush operations and total
 +service time for read, write and flush operations.
 +B<pcpu> report the physical user/system cpu time consumed by the hypervisor, per-vm.
 +
  =back
  
  =head2 Plugin C<vmem>