mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-02 23:15:20 +00:00
[#3242] Added bare-bones perfmon hook library
New files: arm/hooks-perfmon.rst src/hooks/dhcp/perfmon/.gitattributes src/hooks/dhcp/perfmon/.gitignore src/hooks/dhcp/perfmon/Makefile.am src/hooks/dhcp/perfmon/libloadtests/.gitignore src/hooks/dhcp/perfmon/libloadtests/Makefile.am src/hooks/dhcp/perfmon/libloadtests/load_unload_unittests.cc src/hooks/dhcp/perfmon/libloadtests/run_unittests.cc src/hooks/dhcp/perfmon/perfmon.dox src/hooks/dhcp/perfmon/perfmon_callouts.cc src/hooks/dhcp/perfmon/perfmon_log.cc src/hooks/dhcp/perfmon/perfmon_log.h src/hooks/dhcp/perfmon/perfmon_messages.cc src/hooks/dhcp/perfmon/perfmon_messages.h src/hooks/dhcp/perfmon/perfmon_messages.mes src/hooks/dhcp/perfmon/tests/.gitignore src/hooks/dhcp/perfmon/tests/Makefile.am src/hooks/dhcp/perfmon/tests/run_unittests.cc src/hooks/dhcp/perfmon/version.cc Modified: configure.ac arm/hooks-perfmon.rst arm/hooks.rst arm/logging.rst arm/rst_arm_sources.mk conf.py src/hooks/dhcp/Makefile.am
This commit is contained in:
@@ -1581,6 +1581,9 @@ AC_CONFIG_FILES([src/hooks/dhcp/stat_cmds/tests/Makefile])
|
|||||||
AC_CONFIG_FILES([src/hooks/dhcp/user_chk/Makefile])
|
AC_CONFIG_FILES([src/hooks/dhcp/user_chk/Makefile])
|
||||||
AC_CONFIG_FILES([src/hooks/dhcp/user_chk/tests/Makefile])
|
AC_CONFIG_FILES([src/hooks/dhcp/user_chk/tests/Makefile])
|
||||||
AC_CONFIG_FILES([src/hooks/dhcp/user_chk/tests/test_data_files_config.h])
|
AC_CONFIG_FILES([src/hooks/dhcp/user_chk/tests/test_data_files_config.h])
|
||||||
|
AC_CONFIG_FILES([src/hooks/dhcp/perfmon/Makefile])
|
||||||
|
AC_CONFIG_FILES([src/hooks/dhcp/perfmon/libloadtests/Makefile])
|
||||||
|
AC_CONFIG_FILES([src/hooks/dhcp/perfmon/tests/Makefile])
|
||||||
AC_CONFIG_FILES([src/lib/Makefile])
|
AC_CONFIG_FILES([src/lib/Makefile])
|
||||||
AC_CONFIG_FILES([src/lib/asiodns/Makefile])
|
AC_CONFIG_FILES([src/lib/asiodns/Makefile])
|
||||||
AC_CONFIG_FILES([src/lib/asiodns/tests/Makefile])
|
AC_CONFIG_FILES([src/lib/asiodns/tests/Makefile])
|
||||||
|
39
doc/sphinx/arm/hooks-perfmon.rst
Normal file
39
doc/sphinx/arm/hooks-perfmon.rst
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
.. ischooklib:: libdhcp_perfmon.so
|
||||||
|
.. _hooks-perfmon:
|
||||||
|
|
||||||
|
``libdhcp_perfmon.so``: PerfMon
|
||||||
|
===============================
|
||||||
|
|
||||||
|
This hook library can be loaded by either kea-dhcp4 or kea-dhcp6 servers
|
||||||
|
to extend them with the ability to track and report performance related data.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This library is currently under development and not yet functional.
|
||||||
|
|
||||||
|
Overview
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
The library, added in Kea 2.5.6, can be loaded by the :iscman:`kea-dhcp4` or
|
||||||
|
:iscman:`kea-dhcp6` daemon by adding it to the ``hooks-libraries`` element of
|
||||||
|
the server's configuration:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
{
|
||||||
|
"hooks-libraries": [
|
||||||
|
{
|
||||||
|
"library": "/usr/local/lib/libdhcp_perfmon.so",
|
||||||
|
"parameters": {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
},
|
||||||
|
...
|
||||||
|
],
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
TBD
|
@@ -527,6 +527,10 @@ loaded by the correct process per the table below.
|
|||||||
| | | a repository for the Kea configuration information. Kea |
|
| | | a repository for the Kea configuration information. Kea |
|
||||||
| | | servers use this library to fetch their configurations. |
|
| | | servers use this library to fetch their configurations. |
|
||||||
+-----------------------------------------------------------+--------------+--------------------------------------------------------------+
|
+-----------------------------------------------------------+--------------+--------------------------------------------------------------+
|
||||||
|
| :ref:`PerfMon <hooks-perfmon>` | Kea open | With this hook library, :iscman:`kea-dhcp4` server and |
|
||||||
|
| | source | :iscman:`kea-dhcp6` servers can track and report performance |
|
||||||
|
| | | data. CURRENTLY UNDER DEVELOPMENT |
|
||||||
|
+-----------------------------------------------------------+--------------+--------------------------------------------------------------+
|
||||||
| :ref:`Ping Check <hooks-ping-check>` | ISC support | With this hook library, :iscman:`kea-dhcp4` server can |
|
| :ref:`Ping Check <hooks-ping-check>` | ISC support | With this hook library, :iscman:`kea-dhcp4` server can |
|
||||||
| | customers | perform ping checks of candidate lease addresses before |
|
| | customers | perform ping checks of candidate lease addresses before |
|
||||||
| | | offering them to clients. |
|
| | | offering them to clients. |
|
||||||
@@ -611,6 +615,7 @@ sections.
|
|||||||
.. include:: hooks-legal-log.rst
|
.. include:: hooks-legal-log.rst
|
||||||
.. include:: hooks-limits.rst
|
.. include:: hooks-limits.rst
|
||||||
.. include:: hooks-cb-mysql.rst
|
.. include:: hooks-cb-mysql.rst
|
||||||
|
.. include:: hooks-perfmon.rst
|
||||||
.. include:: hooks-ping-check.rst
|
.. include:: hooks-ping-check.rst
|
||||||
.. include:: hooks-cb-pgsql.rst
|
.. include:: hooks-cb-pgsql.rst
|
||||||
.. include:: hooks-radius.rst
|
.. include:: hooks-radius.rst
|
||||||
|
@@ -427,6 +427,10 @@ libraries), or hook libraries (open source or premium).
|
|||||||
| | | message carried in |
|
| | | message carried in |
|
||||||
| | | the packet is parsed. |
|
| | | the packet is parsed. |
|
||||||
+----------------------------------+---------------------------------------+--------------------------------+
|
+----------------------------------+---------------------------------------+--------------------------------+
|
||||||
|
| ``kea-dhcp4.perfmon-hooks`` | :ischooklib:`libdhcp_perfmon.so` | Used |
|
||||||
|
| ``kea-dhcp6.perfmon-hooks`` | open-source hook library | to log messages related to |
|
||||||
|
| | | performan monitoring. |
|
||||||
|
+----------------------------------+---------------------------------------+--------------------------------+
|
||||||
| ``kea-dhcp4.ping-check-hooks`` | :ischooklib:`libdhcp_ping_check.so` | Used |
|
| ``kea-dhcp4.ping-check-hooks`` | :ischooklib:`libdhcp_ping_check.so` | Used |
|
||||||
| | subscription hook library | to log messages related to |
|
| | subscription hook library | to log messages related to |
|
||||||
| | | carrying out pre-offer ping |
|
| | | carrying out pre-offer ping |
|
||||||
|
@@ -31,6 +31,7 @@ rst_arm_sources += arm/hooks-limits.rst
|
|||||||
rst_arm_sources += arm/hooks-cb-mysql.rst
|
rst_arm_sources += arm/hooks-cb-mysql.rst
|
||||||
rst_arm_sources += arm/hooks-cb-pgsql.rst
|
rst_arm_sources += arm/hooks-cb-pgsql.rst
|
||||||
rst_arm_sources += arm/hooks-legal-log.rst
|
rst_arm_sources += arm/hooks-legal-log.rst
|
||||||
|
rst_arm_sources += arm/hooks-perfmon.rst
|
||||||
rst_arm_sources += arm/hooks-ping-check.rst
|
rst_arm_sources += arm/hooks-ping-check.rst
|
||||||
rst_arm_sources += arm/hooks-radius.rst
|
rst_arm_sources += arm/hooks-radius.rst
|
||||||
rst_arm_sources += arm/hooks-rbac.rst
|
rst_arm_sources += arm/hooks-rbac.rst
|
||||||
|
@@ -96,6 +96,7 @@ exclude_patterns = [
|
|||||||
'arm/hooks-lease-cmds.rst',
|
'arm/hooks-lease-cmds.rst',
|
||||||
'arm/hooks-lease-query.rst',
|
'arm/hooks-lease-query.rst',
|
||||||
'arm/hooks-limits.rst',
|
'arm/hooks-limits.rst',
|
||||||
|
'arm/hooks-perfmon.rst',
|
||||||
'arm/hooks-ping-check.rst',
|
'arm/hooks-ping-check.rst',
|
||||||
'arm/hooks-radius.rst',
|
'arm/hooks-radius.rst',
|
||||||
'arm/hooks-rbac.rst',
|
'arm/hooks-rbac.rst',
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
SUBDIRS = bootp flex_option high_availability lease_cmds
|
SUBDIRS = bootp flex_option high_availability lease_cmds perfmon
|
||||||
|
|
||||||
if HAVE_MYSQL
|
if HAVE_MYSQL
|
||||||
SUBDIRS += mysql_cb
|
SUBDIRS += mysql_cb
|
||||||
|
2
src/hooks/dhcp/perfmon/.gitattributes
vendored
Normal file
2
src/hooks/dhcp/perfmon/.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/perfmon_messages.cc -diff merge=ours
|
||||||
|
/perfmon_messages.h -diff merge=ours
|
1
src/hooks/dhcp/perfmon/.gitignore
vendored
Normal file
1
src/hooks/dhcp/perfmon/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/html
|
86
src/hooks/dhcp/perfmon/Makefile.am
Normal file
86
src/hooks/dhcp/perfmon/Makefile.am
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
SUBDIRS = . tests libloadtests
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
|
||||||
|
AM_CPPFLAGS += $(BOOST_INCLUDES)
|
||||||
|
AM_CXXFLAGS = $(KEA_CXXFLAGS)
|
||||||
|
|
||||||
|
# Ensure that the message file and doxygen file is included in the distribution
|
||||||
|
EXTRA_DIST = perfmon_messages.mes
|
||||||
|
EXTRA_DIST += perfmon.dox
|
||||||
|
|
||||||
|
CLEANFILES = *.gcno *.gcda
|
||||||
|
|
||||||
|
# convenience archive
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libperfmon.la
|
||||||
|
|
||||||
|
libperfmon_la_SOURCES = perfmon_callouts.cc
|
||||||
|
libperfmon_la_SOURCES += perfmon_log.cc perfmon_log.h
|
||||||
|
libperfmon_la_SOURCES += perfmon_messages.cc perfmon_messages.h
|
||||||
|
libperfmon_la_SOURCES += version.cc
|
||||||
|
|
||||||
|
libperfmon_la_CXXFLAGS = $(AM_CXXFLAGS)
|
||||||
|
libperfmon_la_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
|
||||||
|
# install the shared object into $(libdir)/kea/hooks
|
||||||
|
lib_hooksdir = $(libdir)/kea/hooks
|
||||||
|
lib_hooks_LTLIBRARIES = libdhcp_perfmon.la
|
||||||
|
|
||||||
|
libdhcp_perfmon_la_SOURCES =
|
||||||
|
libdhcp_perfmon_la_LDFLAGS = $(AM_LDFLAGS)
|
||||||
|
libdhcp_perfmon_la_LDFLAGS += -avoid-version -export-dynamic -module
|
||||||
|
libdhcp_perfmon_la_LIBADD = libperfmon.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/dhcpsrv/libkea-dhcpsrv.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/process/libkea-process.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/eval/libkea-eval.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/dhcp_ddns/libkea-dhcp_ddns.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/stats/libkea-stats.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/config/libkea-cfgclient.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/http/libkea-http.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/dhcp/libkea-dhcp++.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/hooks/libkea-hooks.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/database/libkea-database.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/cc/libkea-cc.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/dns/libkea-dns++.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/cryptolink/libkea-cryptolink.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/log/libkea-log.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/util/libkea-util.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(top_builddir)/src/lib/exceptions/libkea-exceptions.la
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(LOG4CPLUS_LIBS)
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(CRYPTO_LIBS)
|
||||||
|
libdhcp_perfmon_la_LIBADD += $(BOOST_LIBS)
|
||||||
|
|
||||||
|
# If we want to get rid of all generated messages files, we need to use
|
||||||
|
# make maintainer-clean. The proper way to introduce custom commands for
|
||||||
|
# that operation is to define maintainer-clean-local target. However,
|
||||||
|
# make maintainer-clean also removes Makefile, so running configure script
|
||||||
|
# is required. To make it easy to rebuild messages without going through
|
||||||
|
# reconfigure, a new target messages-clean has been added.
|
||||||
|
maintainer-clean-local:
|
||||||
|
rm -f perfmon_messages.h perfmon_messages.cc
|
||||||
|
|
||||||
|
# To regenerate messages files, one can do:
|
||||||
|
#
|
||||||
|
# make messages-clean
|
||||||
|
# make messages
|
||||||
|
#
|
||||||
|
# This is needed only when a .mes file is modified.
|
||||||
|
messages-clean: maintainer-clean-local
|
||||||
|
|
||||||
|
if GENERATE_MESSAGES
|
||||||
|
|
||||||
|
# Define rule to build logging source files from message file
|
||||||
|
messages: perfmon_messages.h perfmon_messages.cc
|
||||||
|
@echo Message files regenerated
|
||||||
|
|
||||||
|
perfmon_messages.h perfmon_messages.cc: perfmon_messages.mes
|
||||||
|
$(top_builddir)/src/lib/log/compiler/kea-msg-compiler $(top_srcdir)/src/hooks/dhcp/perfmon/perfmon_messages.mes
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
messages perfmon_messages.h perfmon_messages.cc:
|
||||||
|
@echo Messages generation disabled. Configure with --enable-generate-messages to enable it.
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
1
src/hooks/dhcp/perfmon/libloadtests/.gitignore
vendored
Normal file
1
src/hooks/dhcp/perfmon/libloadtests/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
hook_load_unittests
|
55
src/hooks/dhcp/perfmon/libloadtests/Makefile.am
Normal file
55
src/hooks/dhcp/perfmon/libloadtests/Makefile.am
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
SUBDIRS = .
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
|
||||||
|
AM_CPPFLAGS += -I$(top_builddir)/src/hooks/dhcp/perfmon -I$(top_srcdir)/src/hooks/dhcp/perfmon
|
||||||
|
AM_CPPFLAGS += $(BOOST_INCLUDES)
|
||||||
|
AM_CPPFLAGS += -DLIBDHCP_PERFMON_SO=\"$(abs_top_builddir)/src/hooks/dhcp/perfmon/.libs/libdhcp_perfmon.so\"
|
||||||
|
AM_CXXFLAGS = $(KEA_CXXFLAGS)
|
||||||
|
|
||||||
|
if USE_STATIC_LINK
|
||||||
|
AM_LDFLAGS = -static
|
||||||
|
endif
|
||||||
|
|
||||||
|
EXTRA_DIST =
|
||||||
|
|
||||||
|
CLEANFILES = *.gcno *.gcda
|
||||||
|
|
||||||
|
TESTS_ENVIRONMENT = \
|
||||||
|
$(LIBTOOL) --mode=execute $(VALGRIND_COMMAND)
|
||||||
|
|
||||||
|
if HAVE_GTEST
|
||||||
|
|
||||||
|
TESTS = hook_load_unittests
|
||||||
|
|
||||||
|
hook_load_unittests_SOURCES =
|
||||||
|
hook_load_unittests_SOURCES += load_unload_unittests.cc
|
||||||
|
hook_load_unittests_SOURCES += run_unittests.cc
|
||||||
|
hook_load_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) $(LOG4CPLUS_INCLUDES)
|
||||||
|
hook_load_unittests_CXXFLAGS = $(AM_CXXFLAGS)
|
||||||
|
hook_load_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
|
||||||
|
|
||||||
|
hook_load_unittests_LDADD = $(top_builddir)/src/lib/dhcpsrv/libkea-dhcpsrv.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/process/libkea-process.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/eval/libkea-eval.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/dhcp_ddns/libkea-dhcp_ddns.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/stats/libkea-stats.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/config/libkea-cfgclient.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/http/libkea-http.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/dhcp/libkea-dhcp++.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/hooks/libkea-hooks.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/database/libkea-database.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/cc/libkea-cc.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/dns/libkea-dns++.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/cryptolink/libkea-cryptolink.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/log/libkea-log.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/util/libkea-util.la
|
||||||
|
hook_load_unittests_LDADD += $(top_builddir)/src/lib/exceptions/libkea-exceptions.la
|
||||||
|
hook_load_unittests_LDADD += $(LOG4CPLUS_LIBS)
|
||||||
|
hook_load_unittests_LDADD += $(CRYPTO_LIBS)
|
||||||
|
hook_load_unittests_LDADD += $(BOOST_LIBS)
|
||||||
|
hook_load_unittests_LDADD += $(GTEST_LDADD)
|
||||||
|
|
||||||
|
noinst_PROGRAMS = $(TESTS)
|
||||||
|
|
||||||
|
endif
|
64
src/hooks/dhcp/perfmon/libloadtests/load_unload_unittests.cc
Normal file
64
src/hooks/dhcp/perfmon/libloadtests/load_unload_unittests.cc
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
/// @file This file contains tests which exercise the load and unload
|
||||||
|
/// functions in the perfmon hook library. In order to test the load
|
||||||
|
/// function, one must be able to pass it hook library parameters. The
|
||||||
|
/// the only way to populate these parameters is by actually loading the
|
||||||
|
/// library via HooksManager::loadLibraries().
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <cc/data.h>
|
||||||
|
#include <dhcpsrv/cfgmgr.h>
|
||||||
|
#include <hooks/hooks_manager.h>
|
||||||
|
#include <process/daemon.h>
|
||||||
|
#include <testutils/gtest_utils.h>
|
||||||
|
#include <testutils/lib_load_test_fixture.h>
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace isc;
|
||||||
|
using namespace isc::hooks;
|
||||||
|
using namespace isc::data;
|
||||||
|
using namespace isc::dhcp;
|
||||||
|
using namespace isc::process;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
/// @brief Test fixture for testing loading and unloading the stat cmds library
|
||||||
|
class PerfMonLibLoadTest : public isc::test::LibLoadTest {
|
||||||
|
public:
|
||||||
|
/// @brief Constructor
|
||||||
|
PerfMonLibLoadTest() : LibLoadTest(LIBDHCP_PERFMON_SO) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Destructor
|
||||||
|
virtual ~PerfMonLibLoadTest() {
|
||||||
|
unloadLibraries();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Simple V4 test that checks the library can be loaded and unloaded several times.
|
||||||
|
TEST_F(PerfMonLibLoadTest, validLoad4) {
|
||||||
|
validDaemonTest("kea-dhcp4");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple V6 test that checks the library can be loaded and unloaded several times.
|
||||||
|
TEST_F(PerfMonLibLoadTest, validLoad6) {
|
||||||
|
validDaemonTest("kea-dhcp6", AF_INET6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple V6 test that checks the library cannot by loaded by invalid daemons.
|
||||||
|
TEST_F(PerfMonLibLoadTest, invalidDaemonLoad) {
|
||||||
|
invalidDaemonTest("kea-ctrl-agent");
|
||||||
|
invalidDaemonTest("kea-dhcp-ddns");
|
||||||
|
invalidDaemonTest("bogus");
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end of anonymous namespace
|
20
src/hooks/dhcp/perfmon/libloadtests/run_unittests.cc
Normal file
20
src/hooks/dhcp/perfmon/libloadtests/run_unittests.cc
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// Copyright (C) 2022 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the End User License
|
||||||
|
// Agreement. See COPYING file in the premium/ directory.
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <log/logger_support.h>
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char* argv[]) {
|
||||||
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
isc::log::initLogger();
|
||||||
|
|
||||||
|
int result = RUN_ALL_TESTS();
|
||||||
|
|
||||||
|
return (result);
|
||||||
|
}
|
43
src/hooks/dhcp/perfmon/perfmon.dox
Normal file
43
src/hooks/dhcp/perfmon/perfmon.dox
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
@page libdhcp_perfmon Kea PerfMon Hooks Library
|
||||||
|
|
||||||
|
@section libdhcp_perfmonIntro Introduction
|
||||||
|
|
||||||
|
Welcome to Kea PerfMon Hooks Library. This documentation is addressed to
|
||||||
|
developers who are interested in the internal operation of the PerfMon
|
||||||
|
library. This file provides information needed to understand and perhaps extend
|
||||||
|
this library.
|
||||||
|
|
||||||
|
This documentation is stand-alone: you should have read and understood the <a
|
||||||
|
href="https://reports.kea.isc.org/dev_guide/">Kea Developer's Guide</a> and in
|
||||||
|
particular its section about hooks.
|
||||||
|
|
||||||
|
@section perfmon PerfMon Overview
|
||||||
|
|
||||||
|
PerfMon (or perfmon) is a Hook library that can be loaded by
|
||||||
|
either kea-dhcp4 and kea-dhcp6 servers to extend them with the
|
||||||
|
ability to track and report performance related data.
|
||||||
|
|
||||||
|
The initial purpose of this library is provide supplemental data and
|
||||||
|
commands for monitoring the performance of kea-dhcp4 and kea-dhcp6
|
||||||
|
servers in real time.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
THIS LIBRARY IS CURRENTLY UNDER DEVELOPMENT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@section perfmonMTCompatibility Multi-Threading Compatibility
|
||||||
|
|
||||||
|
The PerfMon Hook library is compatible with multi-threading.
|
||||||
|
|
||||||
|
*/
|
98
src/hooks/dhcp/perfmon/perfmon_callouts.cc
Normal file
98
src/hooks/dhcp/perfmon/perfmon_callouts.cc
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
// Functions accessed by the hooks framework use C linkage to avoid the name
|
||||||
|
// mangling that accompanies use of the C++ compiler as well as to avoid
|
||||||
|
// issues related to namespaces.
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <perfmon_log.h>
|
||||||
|
#include <cc/command_interpreter.h>
|
||||||
|
#include <dhcpsrv/cfgmgr.h>
|
||||||
|
#include <hooks/hooks.h>
|
||||||
|
#include <process/daemon.h>
|
||||||
|
|
||||||
|
using namespace isc::dhcp;
|
||||||
|
using namespace isc::hooks;
|
||||||
|
using namespace isc::process;
|
||||||
|
using namespace isc::perfmon;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
/// @brief This callout is called at the "pkt4_send" hook.
|
||||||
|
///
|
||||||
|
/// @param handle CalloutHandle which provides access to context.
|
||||||
|
///
|
||||||
|
/// @return 0 upon success, non-zero otherwise.
|
||||||
|
int pkt4_send(CalloutHandle& handle) {
|
||||||
|
CalloutHandle::CalloutNextStep status = handle.getStatus();
|
||||||
|
if (status == CalloutHandle::NEXT_STEP_DROP ||
|
||||||
|
status == CalloutHandle::NEXT_STEP_SKIP) {
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief This callout is called at the "pkt6_send" hook.
|
||||||
|
///
|
||||||
|
/// @param handle CalloutHandle which provides access to context.
|
||||||
|
///
|
||||||
|
/// @return 0 upon success, non-zero otherwise.
|
||||||
|
int pkt6_send(CalloutHandle& handle) {
|
||||||
|
CalloutHandle::CalloutNextStep status = handle.getStatus();
|
||||||
|
if (status == CalloutHandle::NEXT_STEP_DROP ||
|
||||||
|
status == CalloutHandle::NEXT_STEP_SKIP) {
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief This function is called when the library is loaded.
|
||||||
|
///
|
||||||
|
/// @param handle library handle
|
||||||
|
/// @return 0 when initialization is successful, 1 otherwise
|
||||||
|
int load(LibraryHandle& /* handle */) {
|
||||||
|
// Make the hook library not loadable by d2 or ca.
|
||||||
|
uint16_t family = CfgMgr::instance().getFamily();
|
||||||
|
const std::string& proc_name = Daemon::getProcName();
|
||||||
|
if (family == AF_INET) {
|
||||||
|
if (proc_name != "kea-dhcp4") {
|
||||||
|
isc_throw(isc::Unexpected, "Bad process name: " << proc_name
|
||||||
|
<< ", expected kea-dhcp4");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (proc_name != "kea-dhcp6") {
|
||||||
|
isc_throw(isc::Unexpected, "Bad process name: " << proc_name
|
||||||
|
<< ", expected kea-dhcp6");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @todo register commands
|
||||||
|
/// handle.registerCommandCallout("command-here", handler_here);
|
||||||
|
|
||||||
|
LOG_INFO(perfmon_logger, PERFMON_INIT_OK);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief This function is called when the library is unloaded.
|
||||||
|
///
|
||||||
|
/// @return 0 if deregistration was successful, 1 otherwise
|
||||||
|
int unload() {
|
||||||
|
LOG_INFO(perfmon_logger, PERFMON_DEINIT_OK);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief This function is called to retrieve the multi-threading compatibility.
|
||||||
|
///
|
||||||
|
/// @return 1 which means compatible with multi-threading.
|
||||||
|
int multi_threading_compatible() {
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end extern "C"
|
18
src/hooks/dhcp/perfmon/perfmon_log.cc
Normal file
18
src/hooks/dhcp/perfmon/perfmon_log.cc
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <perfmon_log.h>
|
||||||
|
|
||||||
|
namespace isc {
|
||||||
|
namespace perfmon {
|
||||||
|
|
||||||
|
isc::log::Logger perfmon_logger("perfmon-hooks");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
23
src/hooks/dhcp/perfmon/perfmon_log.h
Normal file
23
src/hooks/dhcp/perfmon/perfmon_log.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#ifndef PERFMON_LOG_H
|
||||||
|
#define PERFMON_LOG_H
|
||||||
|
|
||||||
|
#include <log/logger_support.h>
|
||||||
|
#include <log/macros.h>
|
||||||
|
#include <perfmon_messages.h>
|
||||||
|
|
||||||
|
namespace isc {
|
||||||
|
namespace perfmon {
|
||||||
|
|
||||||
|
extern isc::log::Logger perfmon_logger;
|
||||||
|
|
||||||
|
} // end of isc::perfmon
|
||||||
|
} // end of isc namespace
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
25
src/hooks/dhcp/perfmon/perfmon_messages.cc
Normal file
25
src/hooks/dhcp/perfmon/perfmon_messages.cc
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// File created from ../../../../src/hooks/dhcp/perfmon/perfmon_messages.mes
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <log/message_types.h>
|
||||||
|
#include <log/message_initializer.h>
|
||||||
|
|
||||||
|
extern const isc::log::MessageID PERFMON_DEINIT_FAILED = "PERFMON_DEINIT_FAILED";
|
||||||
|
extern const isc::log::MessageID PERFMON_DEINIT_OK = "PERFMON_DEINIT_OK";
|
||||||
|
extern const isc::log::MessageID PERFMON_INIT_FAILED = "PERFMON_INIT_FAILED";
|
||||||
|
extern const isc::log::MessageID PERFMON_INIT_OK = "PERFMON_INIT_OK";
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const char* values[] = {
|
||||||
|
"PERFMON_DEINIT_FAILED", "unloading PerfMon hooks library failed: %1",
|
||||||
|
"PERFMON_DEINIT_OK", "unloading PerfMon hooks library successful",
|
||||||
|
"PERFMON_INIT_FAILED", "loading PerfMon hooks library failed: %1",
|
||||||
|
"PERFMON_INIT_OK", "loading PerfMon hooks library successful",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const isc::log::MessageInitializer initializer(values);
|
||||||
|
|
||||||
|
} // Anonymous namespace
|
||||||
|
|
13
src/hooks/dhcp/perfmon/perfmon_messages.h
Normal file
13
src/hooks/dhcp/perfmon/perfmon_messages.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// File created from ../../../../src/hooks/dhcp/perfmon/perfmon_messages.mes
|
||||||
|
|
||||||
|
#ifndef PERFMON_MESSAGES_H
|
||||||
|
#define PERFMON_MESSAGES_H
|
||||||
|
|
||||||
|
#include <log/message_types.h>
|
||||||
|
|
||||||
|
extern const isc::log::MessageID PERFMON_DEINIT_FAILED;
|
||||||
|
extern const isc::log::MessageID PERFMON_DEINIT_OK;
|
||||||
|
extern const isc::log::MessageID PERFMON_INIT_FAILED;
|
||||||
|
extern const isc::log::MessageID PERFMON_INIT_OK;
|
||||||
|
|
||||||
|
#endif // PERFMON_MESSAGES_H
|
19
src/hooks/dhcp/perfmon/perfmon_messages.mes
Normal file
19
src/hooks/dhcp/perfmon/perfmon_messages.mes
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Copyright (C) 2024 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
|
||||||
|
% PERFMON_DEINIT_FAILED unloading PerfMon hooks library failed: %1
|
||||||
|
This error message indicates an error unloading the PerfMon hooks
|
||||||
|
library. The details of the error are provided as argument of
|
||||||
|
the log message.
|
||||||
|
|
||||||
|
% PERFMON_DEINIT_OK unloading PerfMon hooks library successful
|
||||||
|
This info message indicates that the PerfMon hooks library has been
|
||||||
|
removed successfully.
|
||||||
|
|
||||||
|
% PERFMON_INIT_FAILED loading PerfMon hooks library failed: %1
|
||||||
|
This error message indicates an error during loading the PerfMon
|
||||||
|
hooks library. The details of the error are provided as argument of
|
||||||
|
the log message.
|
||||||
|
|
||||||
|
% PERFMON_INIT_OK loading PerfMon hooks library successful
|
||||||
|
This info message indicates that the PerfMon hooks library has been
|
||||||
|
loaded successfully. Enjoy!
|
1
src/hooks/dhcp/perfmon/tests/.gitignore
vendored
Normal file
1
src/hooks/dhcp/perfmon/tests/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
perfmon_unittests
|
56
src/hooks/dhcp/perfmon/tests/Makefile.am
Normal file
56
src/hooks/dhcp/perfmon/tests/Makefile.am
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
SUBDIRS = .
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
|
||||||
|
AM_CPPFLAGS += -I$(top_builddir)/src/hooks/dhcp/perfmon -I$(top_srcdir)/src/hooks/dhcp/perfmon
|
||||||
|
AM_CPPFLAGS += $(BOOST_INCLUDES)
|
||||||
|
AM_CPPFLAGS += -DPERFMON_LIB_SO=\"$(abs_top_builddir)/src/hooks/dhcp/perfmon/.libs/libdhcp_perfmon.so\"
|
||||||
|
AM_CPPFLAGS += -DINSTALL_PROG=\"$(abs_top_srcdir)/install-sh\"
|
||||||
|
|
||||||
|
AM_CXXFLAGS = $(KEA_CXXFLAGS)
|
||||||
|
|
||||||
|
if USE_STATIC_LINK
|
||||||
|
AM_LDFLAGS = -static
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Unit test data files need to get installed.
|
||||||
|
EXTRA_DIST =
|
||||||
|
|
||||||
|
CLEANFILES = *.gcno *.gcda
|
||||||
|
|
||||||
|
TESTS_ENVIRONMENT = $(LIBTOOL) --mode=execute $(VALGRIND_COMMAND)
|
||||||
|
|
||||||
|
LOG_COMPILER = $(LIBTOOL)
|
||||||
|
AM_LOG_FLAGS = --mode=execute
|
||||||
|
|
||||||
|
TESTS =
|
||||||
|
if HAVE_GTEST
|
||||||
|
TESTS += perfmon_unittests
|
||||||
|
|
||||||
|
perfmon_unittests_SOURCES = run_unittests.cc
|
||||||
|
#perfmon_unittests_SOURCES += perfmon_unittests.cc
|
||||||
|
|
||||||
|
perfmon_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) $(LOG4CPLUS_INCLUDES)
|
||||||
|
|
||||||
|
perfmon_unittests_LDFLAGS = $(AM_LDFLAGS) $(CRYPTO_LDFLAGS) $(GTEST_LDFLAGS)
|
||||||
|
|
||||||
|
perfmon_unittests_CXXFLAGS = $(AM_CXXFLAGS)
|
||||||
|
|
||||||
|
perfmon_unittests_LDADD = $(top_builddir)/src/hooks/dhcp/perfmon/libperfmon.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/process/libkea-process.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/stats/libkea-stats.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/dhcp/libkea-dhcp++.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/hooks/libkea-hooks.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/database/libkea-database.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/cc/libkea-cc.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/dns/libkea-dns++.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/cryptolink/libkea-cryptolink.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/log/libkea-log.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/util/libkea-util.la
|
||||||
|
perfmon_unittests_LDADD += $(top_builddir)/src/lib/exceptions/libkea-exceptions.la
|
||||||
|
perfmon_unittests_LDADD += $(LOG4CPLUS_LIBS)
|
||||||
|
perfmon_unittests_LDADD += $(CRYPTO_LIBS)
|
||||||
|
perfmon_unittests_LDADD += $(BOOST_LIBS)
|
||||||
|
perfmon_unittests_LDADD += $(GTEST_LDADD)
|
||||||
|
endif
|
||||||
|
noinst_PROGRAMS = $(TESTS)
|
19
src/hooks/dhcp/perfmon/tests/run_unittests.cc
Normal file
19
src/hooks/dhcp/perfmon/tests/run_unittests.cc
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <log/logger_support.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char* argv[]) {
|
||||||
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
isc::log::initLogger();
|
||||||
|
int result = RUN_ALL_TESTS();
|
||||||
|
|
||||||
|
return (result);
|
||||||
|
}
|
17
src/hooks/dhcp/perfmon/version.cc
Normal file
17
src/hooks/dhcp/perfmon/version.cc
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <hooks/hooks.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
/// @brief returns Kea hooks version.
|
||||||
|
int version() {
|
||||||
|
return (KEA_HOOKS_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user