summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/CMakeLists.txt4
-rw-r--r--common/include/http_healthcheck.h24
-rw-r--r--common/src/http_healthcheck.cpp66
-rw-r--r--conf/packet_adapter.conf6
-rw-r--r--platform/src/packet_adapter.cpp4
-rw-r--r--vendor/CMakeLists.txt17
-rw-r--r--vendor/libevent-2.1.8-stable.tar.gzbin0 -> 1026485 bytes
7 files changed, 120 insertions, 1 deletions
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index a14f32a..c80dfb8 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -2,10 +2,12 @@ add_library(common
src/log.cpp
src/packet_io.cpp
src/packet_parser.cpp
- src/packet_inject.cpp)
+ src/packet_inject.cpp
+ src/http_healthcheck.cpp)
target_include_directories(common PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include)
target_link_libraries(common PUBLIC mrzcpd)
target_link_libraries(common PUBLIC MESA_prof_load)
target_link_libraries(common PUBLIC MESA_handle_logger)
+target_link_libraries(common PUBLIC libevent-static)
add_subdirectory(test) \ No newline at end of file
diff --git a/common/include/http_healthcheck.h b/common/include/http_healthcheck.h
new file mode 100644
index 0000000..a883984
--- /dev/null
+++ b/common/include/http_healthcheck.h
@@ -0,0 +1,24 @@
+#ifndef _HTTP_HEALTHCHECK_H
+#define _HTTP_HEALTHCHECK_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*
+ * [http_healthcheck_server]
+ * enable=1
+ * port=8080
+ * addr="0.0.0.0"
+ * path="/status"
+ */
+
+void http_healthcheck_server_start(const char *profile);
+void http_healthcheck_server_stop();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/common/src/http_healthcheck.cpp b/common/src/http_healthcheck.cpp
new file mode 100644
index 0000000..30d1fd5
--- /dev/null
+++ b/common/src/http_healthcheck.cpp
@@ -0,0 +1,66 @@
+#include <string.h>
+#include <limits.h>
+#include <pthread.h>
+
+#include "event2/event.h"
+#include "event2/buffer.h"
+#include "event2/http.h"
+#include "http_healthcheck.h"
+#include <MESA/MESA_prof_load.h>
+
+struct http_status_ctx
+{
+ pthread_t pthread;
+ struct event_base *base;
+
+ unsigned int enable;
+ unsigned int port;
+ char addr[PATH_MAX];
+ char path[PATH_MAX];
+ uint64_t is_error;
+} g_ctx = {0};
+
+static void http_callback(struct evhttp_request *req, void *arg)
+{
+ evhttp_send_reply(req, HTTP_OK, "", NULL);
+}
+
+static void *http_healthcheck_thread(void *arg)
+{
+ printf("http_healthcheck_thread running (%s:%d/%s)\n", g_ctx.addr, g_ctx.port, g_ctx.path);
+
+ g_ctx.base = event_base_new();
+ struct evhttp *http = evhttp_new(g_ctx.base);
+ evhttp_set_cb(http, g_ctx.path, http_callback, NULL);
+ evhttp_bind_socket(http, g_ctx.addr, g_ctx.port);
+ event_base_dispatch(g_ctx.base);
+ evhttp_free(http);
+ event_base_free(g_ctx.base);
+
+ printf("http_healthcheck_thread exit\n");
+ return NULL;
+}
+
+void http_healthcheck_server_start(const char *profile)
+{
+ MESA_load_profile_uint_def(profile, "http_healthcheck_server", "enable", &g_ctx.enable, 0);
+ MESA_load_profile_uint_def(profile, "http_healthcheck_server", "port", &g_ctx.port, 8080);
+ MESA_load_profile_string_def(profile, "http_healthcheck_server", "addr", g_ctx.addr, sizeof(g_ctx.addr), "127.0.0.1");
+ MESA_load_profile_string_def(profile, "http_healthcheck_server", "path", g_ctx.path, sizeof(g_ctx.path), "/status");
+
+ if (!g_ctx.enable)
+ {
+ return;
+ }
+
+ pthread_create(&g_ctx.pthread, NULL, http_healthcheck_thread, (void *)&g_ctx);
+}
+
+void http_healthcheck_server_stop()
+{
+ if (g_ctx.enable)
+ {
+ event_base_loopbreak(g_ctx.base);
+ pthread_join(g_ctx.pthread, NULL);
+ }
+}
diff --git a/conf/packet_adapter.conf b/conf/packet_adapter.conf
index a019c54..2457091 100644
--- a/conf/packet_adapter.conf
+++ b/conf/packet_adapter.conf
@@ -9,3 +9,9 @@ app_device=eth_nf_packet_adapter
[stat]
output_file=log/packet_adapter.fs2
statsd_cycle=2
+
+[http_healthcheck_server]
+enable=1
+port=8080
+addr="0.0.0.0"
+path="/status"
diff --git a/platform/src/packet_adapter.cpp b/platform/src/packet_adapter.cpp
index 3075c81..6c83e19 100644
--- a/platform/src/packet_adapter.cpp
+++ b/platform/src/packet_adapter.cpp
@@ -10,6 +10,7 @@
#include "packet_io.h"
#include "packet_stat.h"
#include "packet_handle.h"
+#include "http_healthcheck.h"
#define LOG_MAIN "PacketAdapter"
@@ -225,6 +226,8 @@ int main(int argc, char **argv)
}
}
+ http_healthcheck_server_start(profile);
+
while (!runtime->need_stop)
{
packet_stat_flush(runtime->stat, &runtime->metrics);
@@ -232,6 +235,7 @@ int main(int argc, char **argv)
}
error:
+ http_healthcheck_server_stop();
packet_stat_destory(runtime->stat);
packet_io_destory(runtime->handle);
LOG_CLOSE();
diff --git a/vendor/CMakeLists.txt b/vendor/CMakeLists.txt
index cea1615..016bf90 100644
--- a/vendor/CMakeLists.txt
+++ b/vendor/CMakeLists.txt
@@ -20,6 +20,23 @@ add_dependencies(gmock googletest)
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libgmock.a)
set_property(TARGET gmock PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
+# Libevent 2.1.8
+ExternalProject_Add(libevent PREFIX libevent
+ URL ${CMAKE_CURRENT_SOURCE_DIR}/libevent-2.1.8-stable.tar.gz
+ URL_MD5 f3eeaed018542963b7d2416ef1135ecc
+ CONFIGURE_COMMAND ./configure --prefix=<INSTALL_DIR> --disable-shared --disable-samples
+ BUILD_COMMAND make LDFLAGS="-ldl"
+ BUILD_IN_SOURCE 1s)
+
+ExternalProject_Get_Property(libevent INSTALL_DIR)
+file(MAKE_DIRECTORY ${INSTALL_DIR}/include)
+
+add_library(libevent-static STATIC IMPORTED GLOBAL)
+add_dependencies(libevent-static libevent)
+set_property(TARGET libevent-static PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libevent.a)
+set_property(TARGET libevent-static PROPERTY IMPORTED_INTERFACE_LINK_LIBRARIES pthread)
+set_property(TARGET libevent-static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
+
# MESA Framework
set(MESA_FRAMEWORK_LIB_DIR /opt/MESA/lib)
set(MESA_FRAMEWORK_INCLUDE_DIR /opt/MESA/include)
diff --git a/vendor/libevent-2.1.8-stable.tar.gz b/vendor/libevent-2.1.8-stable.tar.gz
new file mode 100644
index 0000000..2004f84
--- /dev/null
+++ b/vendor/libevent-2.1.8-stable.tar.gz
Binary files differ