summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2024-04-27 15:18:59 +0800
committeryangwei <[email protected]>2024-04-27 19:10:40 +0800
commit446044e5d97f84d6f0d3c78b6322ba4d1f626767 (patch)
tree24071428b09cfe5ecde4d9ca20318eb322b19f28
parentedecb5505f60497597c7a827de7e8c0c65ad4f4c (diff)
✨ feat(output detain metric): output stat in local file
-rw-r--r--.gitlab-ci.yml2
-rw-r--r--CMakeLists.txt2
-rw-r--r--bin/ssl/ssl_main.conf2
-rw-r--r--src/SSL_Analyze.c71
-rw-r--r--src/SSL_Analyze.h17
-rw-r--r--src/SSL_Message.c18
6 files changed, 87 insertions, 25 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 656ab5f..27f47cd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,7 @@ variables:
BUILD_IMAGE_CENTOS8: "git.mesalab.cn:7443/mesa_platform/build-env:rockylinux"
BUILD_PADDING_PREFIX: /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX/
INSTALL_DEPENDENCY_PLATFORM: sapp-devel libasan systemd-devel libnsl
- INSTALL_DEPENDENCY_FRAMEWORK: libMESA_handle_logger-devel libcjson-devel libMESA_field_stat2-devel framework_env libMESA_prof_load-devel libbreakpad_mini-devel libMESA_htable-devel
+ INSTALL_DEPENDENCY_FRAMEWORK: libMESA_handle_logger-devel libcjson-devel libfieldstat3-devel libMESA_field_stat2-devel framework_env libMESA_prof_load-devel libbreakpad_mini-devel libMESA_htable-devel
INSTALL_PREFIX: "/home/mesasoft/sapp_run/"
stages:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8bb0cd6..59ec5e6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -61,7 +61,7 @@ file(GLOB SRC
"src/*.cpp"
)
-set(DEPEND_DYN_LIB MESA_handle_logger MESA_field_stat2 MESA_prof_load)
+set(DEPEND_DYN_LIB MESA_handle_logger fieldstat3 MESA_prof_load)
SET_SOURCE_FILES_PROPERTIES(${SRC} PROPERTIES LANGUAGE CXX )
diff --git a/bin/ssl/ssl_main.conf b/bin/ssl/ssl_main.conf
index 2c608d6..be2d11c 100644
--- a/bin/ssl/ssl_main.conf
+++ b/bin/ssl/ssl_main.conf
@@ -1,3 +1,5 @@
[SSL]
MAX_CACHE_LEN=10240
PARSE_CERTIFICATE_DETAIL=1
+DETAIN_FRAG_CHELLO_NUM=0
+SSL_STAT_REFRESH_S=0
diff --git a/src/SSL_Analyze.c b/src/SSL_Analyze.c
index aa2e98d..266e87f 100644
--- a/src/SSL_Analyze.c
+++ b/src/SSL_Analyze.c
@@ -16,6 +16,7 @@
#include "ssl.h"
#include <MESA/MESA_prof_load.h>
#include "SSL_Proc.h"
+#include "fieldstat.h"
#include <assert.h>
@@ -206,24 +207,31 @@ extern "C" char SSL_ENTRY(const struct streaminfo *a_tcp, void**pme, int thread_
extern "C" char SSL_DETAIN_ENTRY(const struct streaminfo *a_tcp, void**pme, int thread_seq, const void *a_packet)
{
- if(g_ssl_runtime_para.detain_frag_chello_enable==0)return APP_STATE_DROPME;
+ if(g_ssl_runtime_para.detain_frag_chello_num==0)return APP_STATE_DROPME;
- if(a_tcp->ptcpdetail->serverpktnum <= MAX_DETAIN_FRAG_CHELLO_NUM)
+ if(a_tcp->ptcpdetail->serverpktnum <= (MAX_DETAIN_FRAG_CHELLO_NUM+2))
{
- struct frag_chello *pkts = (struct frag_chello *)stream_bridge_async_data_get(a_tcp, g_ssl_runtime_para.frag_chello_exdata_idx);
- if(pkts && pkts->finish==1)
- {
- struct detain_pkt *p=NULL;
- for(unsigned int i = 0; i < pkts->p_sz; i++)
- {
- p=pkts->p[i];
- if (p)MESA_detain_pkt_forward_based_on_stream(a_tcp, p);
- pkts->p[i]=NULL;
- }
- pkts->p_sz=0;
+ if (a_tcp->curdir == DIR_C2S)// only c2s packet trigger frag chello finish
+ {
+ struct frag_chello *pkts = (struct frag_chello *)stream_bridge_async_data_get(a_tcp, g_ssl_runtime_para.frag_chello_exdata_idx);
+ if (pkts && pkts->finish == 1)
+ {
+ struct detain_pkt *p = NULL;
+ for (unsigned int i = 0; i < pkts->p_sz; i++)
+ {
+ p = pkts->p[i];
+ if (p)MESA_detain_pkt_forward_based_on_stream(a_tcp, p);
+ if(g_ssl_runtime_para.fs)fieldstat_value_incrby(g_ssl_runtime_para.fs,
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_FORWARD],
+ 1);
+ pkts->p[i] = NULL;
+ }
+ pkts->p_sz = 0;
+ return APP_STATE_DROPME;
+ }
}
return APP_STATE_GIVEME;
- }
+ }
return APP_STATE_DROPME;
}
@@ -236,6 +244,12 @@ static void ssl_retain_packet_bridge_free(const struct streaminfo *stream, int b
for(unsigned int i = 0; i < pkts->p_sz; i++)
{
if (p)MESA_detain_pkt_free(p);
+ if(g_ssl_runtime_para.fs)fieldstat_value_incrby(g_ssl_runtime_para.fs,
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_FREE],
+ 1);
+ if(g_ssl_runtime_para.fs)fieldstat_value_incrby(g_ssl_runtime_para.fs,
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_TIMEOUT],
+ 1);
}
free(pkts);
}
@@ -254,11 +268,30 @@ extern "C" int SSL_INIT(void)
const char *filename="./conf/ssl/ssl_main.conf";
MESA_load_profile_int_def(filename, "SSL", "MAX_CACHE_LEN", &g_ssl_runtime_para.max_cache_len, 10240);
MESA_load_profile_int_def(filename, "SSL", "PARSE_CERTIFICATE_DETAIL", &g_ssl_runtime_para.parse_certificate_detail, 1);
- MESA_load_profile_uint_def(filename, "SSL", "DETAIN_FRAG_CHELLO_ENABLE", &g_ssl_runtime_para.detain_frag_chello_enable, 0);
-
+ MESA_load_profile_uint_def(filename, "SSL", "DETAIN_FRAG_CHELLO_NUM", &g_ssl_runtime_para.detain_frag_chello_num, 0);
+ g_ssl_runtime_para.detain_frag_chello_num= MIN(g_ssl_runtime_para.detain_frag_chello_num, MAX_DETAIN_FRAG_CHELLO_NUM);
g_ssl_runtime_para.proto_tag_id=project_producer_register("MESA_PROTO", "struct", ssl_proto_tag_free);
- if(g_ssl_runtime_para.detain_frag_chello_enable>0)
+ unsigned int refresh_s=0;
+ MESA_load_profile_uint_def(filename, "SSL", "SSL_STAT_REFRESH_S", &refresh_s, 0);
+ if(refresh_s > 0)
+ {
+ g_ssl_runtime_para.fs=fieldstat_instance_new("SSL_DECODER");
+ fieldstat_set_output_interval(g_ssl_runtime_para.fs, refresh_s * 1000);
+ fieldstat_set_local_output(g_ssl_runtime_para.fs, "./log/ssl.status", "default");
+ fieldstat_enable_prometheus_output(g_ssl_runtime_para.fs);
+ fieldstat_instance_start(g_ssl_runtime_para.fs);
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_NUM]=fieldstat_register(g_ssl_runtime_para.fs, FIELD_TYPE_COUNTER, "FRAG_CH_NUM",NULL, 0);
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_FORWARD]=fieldstat_register(g_ssl_runtime_para.fs, FIELD_TYPE_COUNTER, "FRAG_CH_FORWARD",NULL, 0);
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_FREE]=fieldstat_register(g_ssl_runtime_para.fs, FIELD_TYPE_COUNTER, "FRAG_CH_FREE",NULL, 0);
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_SESSION]=fieldstat_register(g_ssl_runtime_para.fs, FIELD_TYPE_COUNTER, "FRAG_CH_SESS",NULL, 0);
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_FINISH]=fieldstat_register(g_ssl_runtime_para.fs, FIELD_TYPE_COUNTER, "FRAG_CH_FIN",NULL, 0);
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_TIMEOUT]=fieldstat_register(g_ssl_runtime_para.fs, FIELD_TYPE_COUNTER, "FRAG_CH_TOT",NULL, 0);
+ }
+
+
+
+ if(g_ssl_runtime_para.detain_frag_chello_num>0)
{
g_ssl_runtime_para.frag_chello_exdata_idx=stream_bridge_build(SSL_FRAG_CHELLO_BRIDEGE_NAME, "w");
assert(g_ssl_runtime_para.frag_chello_exdata_idx >= 0);
@@ -270,6 +303,10 @@ extern "C" int SSL_INIT(void)
extern "C" void SSL_DESTROY(void)
{
+ if(g_ssl_runtime_para.fs != NULL)
+ {
+ fieldstat_instance_free(g_ssl_runtime_para.fs);
+ }
return;
}
diff --git a/src/SSL_Analyze.h b/src/SSL_Analyze.h
index f45e98e..f69d86a 100644
--- a/src/SSL_Analyze.h
+++ b/src/SSL_Analyze.h
@@ -51,6 +51,18 @@ struct frag_chello
unsigned int finish;
};
+
+enum fs_metric
+{
+ FS_METRIC_DETAIN_FRAG_CHELLO_NUM = 0,
+ FS_METRIC_DETAIN_FRAG_CHELLO_FORWARD,
+ FS_METRIC_DETAIN_FRAG_CHELLO_FREE,
+ FS_METRIC_DETAIN_FRAG_CHELLO_SESSION,
+ FS_METRIC_DETAIN_FRAG_CHELLO_FINISH,
+ FS_METRIC_DETAIN_FRAG_CHELLO_TIMEOUT,
+ FS_METRIC_MAX
+};
+
struct ssl_runtime_para
{
unsigned long long ssl_interested_region_flag;
@@ -63,9 +75,10 @@ struct ssl_runtime_para
int proto_tag_id ;
int max_cache_len;
int parse_certificate_detail;
- unsigned int detain_frag_chello_enable;
- unsigned int max_check_c2s_num;
+ unsigned int detain_frag_chello_num;
int frag_chello_exdata_idx;
+ struct fieldstat_instance *fs;
+ int fs_metric_id[FS_METRIC_MAX];
};
struct ssl_business_info
diff --git a/src/SSL_Message.c b/src/SSL_Message.c
index 3bbc393..57ef418 100644
--- a/src/SSL_Message.c
+++ b/src/SSL_Message.c
@@ -12,7 +12,7 @@
#include "SSL_Message.h"
#include "SSL_Proc.h"
#include "SSL_Certificate.h"
-
+#include "fieldstat.h"
#define SUITE_VALUELEN 2
@@ -988,20 +988,27 @@ int ssl_parse_version(const struct streaminfo *a_tcp, struct ssl_runtime_context
static void ssl_detain_frag_chello(const struct streaminfo *a_tcp)
{
- if(g_ssl_runtime_para.detain_frag_chello_enable == 0 || a_tcp->curdir != DIR_C2S)return;
+ if(g_ssl_runtime_para.detain_frag_chello_num == 0 || a_tcp->curdir != DIR_C2S || a_tcp->dir != DIR_DOUBLE)return;
struct frag_chello *pkts = (struct frag_chello *)stream_bridge_async_data_get(a_tcp, g_ssl_runtime_para.frag_chello_exdata_idx);
if (pkts == NULL)
{
pkts=(struct frag_chello *)calloc(sizeof(struct frag_chello), 1);
+ if(g_ssl_runtime_para.fs)fieldstat_value_incrby(g_ssl_runtime_para.fs,
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_SESSION],
+ 1);
}
if(pkts->finish == 1)return;
const void *p = get_current_rawpkt_from_streaminfo(a_tcp);
struct detain_pkt *dpkt=MESA_rawpkt_detain(a_tcp, p);
- if(dpkt)
+ if(dpkt && pkts->p_sz<g_ssl_runtime_para.detain_frag_chello_num)
{
pkts->p[pkts->p_sz]=dpkt;
pkts->p_sz+=1;
+ if(pkts->p_sz==g_ssl_runtime_para.detain_frag_chello_num)pkts->finish=1;
+ if(g_ssl_runtime_para.fs)fieldstat_value_incrby(g_ssl_runtime_para.fs,
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_NUM],
+ 1);
}
stream_bridge_async_data_put(a_tcp, g_ssl_runtime_para.frag_chello_exdata_idx, pkts);
return;
@@ -1009,9 +1016,12 @@ static void ssl_detain_frag_chello(const struct streaminfo *a_tcp)
static void ssl_detain_chello_finish(const struct streaminfo *a_tcp)
{
- if(g_ssl_runtime_para.detain_frag_chello_enable == 0)return;
+ if(g_ssl_runtime_para.detain_frag_chello_num == 0)return;
struct frag_chello *pkts = (struct frag_chello *)stream_bridge_async_data_get(a_tcp, g_ssl_runtime_para.frag_chello_exdata_idx);
if(pkts)pkts->finish=1;
+ if(g_ssl_runtime_para.fs)fieldstat_value_incrby(g_ssl_runtime_para.fs,
+ g_ssl_runtime_para.fs_metric_id[FS_METRIC_DETAIN_FRAG_CHELLO_FINISH],
+ 1);
return;
}