diff options
| author | liuxueli <[email protected]> | 2020-11-12 15:57:12 +0600 |
|---|---|---|
| committer | liuxueli <[email protected]> | 2020-11-12 15:57:12 +0600 |
| commit | a04d4c877c4882827c613fa86f5de0a2f8dd3311 (patch) | |
| tree | 0472defa535b8de1a9492121d9d6533817905f87 | |
| parent | a22310659a865a17867bd3f41520ed8d3744d8e7 (diff) | |
修正函数及结构体命名方式
| -rw-r--r-- | inc/field_stat2.h | 16 | ||||
| -rw-r--r-- | src/MESA_field_stat.cpp | 2 | ||||
| -rw-r--r-- | src/field_stat_internal.h | 2 | ||||
| -rw-r--r-- | src/fs2prometheus.cpp | 216 | ||||
| -rw-r--r-- | test/fs2_test.cpp | 11 |
5 files changed, 132 insertions, 115 deletions
diff --git a/inc/field_stat2.h b/inc/field_stat2.h index a0d4542..bb942c4 100644 --- a/inc/field_stat2.h +++ b/inc/field_stat2.h @@ -107,19 +107,9 @@ int FS_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op void FS_passive_output(screen_stat_handle_t handle); - -typedef void* PROM_handle_t; - -enum PROM_option -{ - PROM_OPT_LISTEN_PORT, //default: 9273; len=sizeof(unsigned short) - PROM_OPT_OUT_PATH, //default: /metrics; len=strlen() - PROM_OPT_OUT_BY_APPNAME //0: use PROM_OPT_OUT_PATH, 1: use fs2 app_name; default: 0; len=sizeof(int) -}; - -PROM_handle_t PROM_create_handle(void); -int PROM_set_opt(PROM_handle_t handle, enum PROM_option type,const void* value,int size); -int PROM_init_handle(PROM_handle_t handle); +int FS_library_init(void); +int FS_library_set_prometheus_port(unsigned short port); +int FS_library_set_prometheus_url_path(const char *url_path); #endif diff --git a/src/MESA_field_stat.cpp b/src/MESA_field_stat.cpp index 3d49cbb..0f562aa 100644 --- a/src/MESA_field_stat.cpp +++ b/src/MESA_field_stat.cpp @@ -540,7 +540,7 @@ void FS_start(screen_stat_handle_t handle) if(_handle->output_prometheus==1) { - PROM_register((screen_stat_handle_t)_handle); + FS_library_promethues_register(handle); } return; diff --git a/src/field_stat_internal.h b/src/field_stat_internal.h index 0942bf5..c477228 100644 --- a/src/field_stat_internal.h +++ b/src/field_stat_internal.h @@ -122,6 +122,6 @@ struct FS_space_t const char* write_mode; }; -int PROM_register(screen_stat_handle_t handle); +int FS_library_promethues_register(screen_stat_handle_t handle); long long get_stat_unit_val(display_manifest_t* p, int column_seq,enum field_calc_algo calc_type,int is_refer); #endif diff --git a/src/fs2prometheus.cpp b/src/fs2prometheus.cpp index 7e1878a..80351c1 100644 --- a/src/fs2prometheus.cpp +++ b/src/fs2prometheus.cpp @@ -7,22 +7,54 @@ #include "field_stat_internal.h" #define STEP_SIZE 1024 +#define MAX_URL_PATH_LEN 128 #define MAX_FS2_HANDLE_NUM 64 -struct _prom_handle_t +struct FS_library_runtime { - int out_by_appname; - int fs2_handle_cnt; + int fs2_handle_cnt; unsigned short port; - char *path; + unsigned short init_flag; struct mg_mgr mgr; - struct mg_connection *nc; + struct mg_connection *nc; + pthread_mutex_t library_lock; + char url_path[MAX_URL_PATH_LEN]; struct FS_space_t *fs2_handle[MAX_FS2_HANDLE_NUM]; }; -struct _prom_handle_t *g_PROMETHEUS_handle; +struct FS_library_runtime *g_FS2_LIBRARY_handle; -static int PROM_histogram_summary(display_manifest_t* p, char *app_name, double * bins, int bin_num, char*payload, int payload_len) +static struct FS_library_runtime *create_runtime_handle(void) +{ + struct FS_library_runtime *_handle=(struct FS_library_runtime *)calloc(1, sizeof(struct FS_library_runtime)); + _handle->port=9273; + memcpy(_handle->url_path, "/metrics", strlen("/metrics")); + pthread_mutex_init(&_handle->library_lock, NULL); + + return _handle; +} + +static int check_http_request(struct FS_library_runtime *_handle, char *uri, int uri_len) +{ + int i=0; + if(uri_len==(int)strlen(_handle->url_path) && !(memcmp(uri, _handle->url_path, strlen(_handle->url_path)))) + { + return _handle->fs2_handle_cnt; + } + + for(i=0; i<_handle->fs2_handle_cnt; i++) + { + if(uri_len-1==(int)strlen(_handle->fs2_handle[i]->app_name) + && !(memcmp(uri+1, _handle->fs2_handle[i]->app_name, strlen(_handle->fs2_handle[i]->app_name)))) + { + return i; + } + } + + return -1; +} + +static int histgram_output_summary(display_manifest_t* p, char *app_name, double * bins, int bin_num, char*payload, int payload_len) { long long value=0; int i=0,used_len=0; @@ -30,13 +62,10 @@ static int PROM_histogram_summary(display_manifest_t* p, char *app_name, double struct hdr_histogram* h_out=NULL, *h_tmp=NULL; hdr_init(h->lowest_trackable_value, h->highest_trackable_value, h->significant_figures, &(h_tmp)); - if(h->previous_changed!=NULL) hdr_close(h->previous_changed); - - h->previous_changed=atomic_read(&(h->changing)); - h_tmp=atomic_set(&(h->changing), h_tmp);// left h_tmp is used to avoid warining [-Wunused-value] - hdr_add(h->accumulated, h->previous_changed); - h_out=h->accumulated; + hdr_add(h_tmp, h->accumulated); + hdr_add(h_tmp, h->changing); + h_out=h_tmp; for(i=0;i<bin_num;i++) { @@ -60,12 +89,14 @@ static int PROM_histogram_summary(display_manifest_t* p, char *app_name, double app_name, (long long)(h_out->total_count) ); - + + hdr_close(h_tmp); + h_tmp=NULL; return used_len; } -static void PROM_output(struct mg_connection *c, int ev, void *message, void* user_data) +static void FS_library_promethues_output(struct mg_connection *c, int ev, void *message, void* user_data) { int i=0,j=0; int payload_len=0; @@ -73,25 +104,36 @@ static void PROM_output(struct mg_connection *c, int ev, void *message, void* us long long value=0; char* payload=NULL; long long sum=0; + int output_cnt=0; struct hdr_iter iter; struct FS_space_t *fs2_handle=NULL; struct display_manifest_t *p=NULL,*p_column=NULL; - struct _prom_handle_t *_handle=(struct _prom_handle_t *)user_data; + struct FS_library_runtime *_handle=(struct FS_library_runtime *)user_data; if (ev != MG_EV_HTTP_REQUEST) { return; } struct http_message *hm = (struct http_message *)message; - if(hm->uri.len!=strlen(_handle->path) || (memcmp(hm->uri.p, _handle->path, strlen(_handle->path)))) + + int fs2_handle_idx=check_http_request(_handle, (char *)hm->uri.p, hm->uri.len); + if(fs2_handle_idx==-1) { return ; } - payload_len=STEP_SIZE; - payload=(char *)calloc(1, payload_len); - - for(i=0; i<_handle->fs2_handle_cnt; i++) + if(fs2_handle_idx==_handle->fs2_handle_cnt) + { + i=0; + output_cnt=_handle->fs2_handle_cnt; + } + else + { + i=fs2_handle_idx; + output_cnt=fs2_handle_idx; + } + + for(; i<=output_cnt; i++) { fs2_handle=_handle->fs2_handle[i]; if(fs2_handle->running==0) @@ -107,7 +149,13 @@ static void PROM_output(struct mg_connection *c, int ev, void *message, void* us { continue; } - + + if(payload_len-used_len<=100) + { + payload_len+=STEP_SIZE; + payload=(char *)realloc(payload, payload_len); + } + switch(p->style) { case FS_STYLE_STATUS: @@ -163,7 +211,7 @@ static void PROM_output(struct mg_connection *c, int ev, void *message, void* us payload=(char *)realloc(payload, payload_len); } - used_len+=PROM_histogram_summary(p, + used_len+=histgram_output_summary(p, fs2_handle->app_name, fs2_handle->histogram_bins, fs2_handle->histogram_bin_num, @@ -199,37 +247,33 @@ static void PROM_output(struct mg_connection *c, int ev, void *message, void* us default: break; } - - if(payload_len-used_len<=100) - { - payload_len+=1024; - payload=(char *)realloc(payload, payload_len); - } } pthread_mutex_unlock(&(fs2_handle->reg_lock)); } - - mg_send_head(c, 200, strlen(payload), "Content-Type: text/plain; charset=utf-8"); - mg_printf(c, "%s", payload); - free(payload); - payload=NULL; - payload_len=0; + if(payload!=NULL) + { + mg_send_head(c, 200, strlen(payload), "Content-Type: text/plain; charset=utf-8"); + mg_printf(c, "%s", payload); + + free(payload); + payload=NULL; + } return; } -void *prometheus_listen(void *arg) +void *FS_library_promethues_listen(void *arg) { char s_http_port[16]={0}; - struct _prom_handle_t *_handle=(struct _prom_handle_t *)arg; + struct FS_library_runtime *_handle=(struct FS_library_runtime *)arg; if(_handle!=NULL) { mg_mgr_init(&(_handle->mgr), NULL); snprintf(s_http_port, sizeof(s_http_port), "%hu", _handle->port); - _handle->nc = mg_bind(&(_handle->mgr), s_http_port, PROM_output, _handle); + _handle->nc = mg_bind(&(_handle->mgr), s_http_port, FS_library_promethues_output, _handle); if (_handle->nc == NULL) { printf("%s, Mongoose failed to create listener on port %s\n", (char *)"Prometheus", s_http_port); @@ -247,76 +291,62 @@ void *prometheus_listen(void *arg) } return NULL; -} +} -int PROM_init_handle(PROM_handle_t handle) -{ - pthread_t tid=0; - pthread_create(&tid, NULL, prometheus_listen, handle); +int FS_library_promethues_register(screen_stat_handle_t handle) +{ + if(handle!=NULL) + { + if(g_FS2_LIBRARY_handle->fs2_handle_cnt<MAX_FS2_HANDLE_NUM) + { + pthread_mutex_lock(&g_FS2_LIBRARY_handle->library_lock); + int i=g_FS2_LIBRARY_handle->fs2_handle_cnt; + g_FS2_LIBRARY_handle->fs2_handle[i]=(struct FS_space_t *)handle; + g_FS2_LIBRARY_handle->fs2_handle_cnt++; + pthread_mutex_unlock(&g_FS2_LIBRARY_handle->library_lock); + return 1; + } + } return 0; } -PROM_handle_t PROM_create_handle(void) -{ - struct _prom_handle_t *_handle=(struct _prom_handle_t *)calloc(1, sizeof(struct _prom_handle_t)); - _handle->port=9273; - _handle->path=(char *)"/metrics"; - g_PROMETHEUS_handle=_handle; +int FS_library_set_prometheus_port(unsigned short port) +{ + if(g_FS2_LIBRARY_handle==NULL) + { + g_FS2_LIBRARY_handle=create_runtime_handle(); + } - return (void *)_handle; + g_FS2_LIBRARY_handle->port=port; + + return 1; } - -int PROM_set_opt(PROM_handle_t handle, enum PROM_option type,const void* value,int size) +int FS_library_set_prometheus_url_path(const char *url_path) { - struct _prom_handle_t *_handle=(struct _prom_handle_t *)handle; - if(_handle!=NULL) + if(g_FS2_LIBRARY_handle==NULL) { - switch(type) - { - case PROM_OPT_LISTEN_PORT: - if(value!=NULL && size==sizeof(unsigned short)) - { - _handle->port=*(unsigned short *)value; - return 1; - } - break; - case PROM_OPT_OUT_PATH: - if(value!=NULL && size>0) - { - _handle->path=(char *)calloc(1, size+1); - memcpy(_handle->path, value, size); - return 1; - } - break; - case PROM_OPT_OUT_BY_APPNAME: - if(value!=NULL && size==sizeof(int)) - { - _handle->out_by_appname=*(int *)value; - return 1; - } - break; - default: - break; - } + g_FS2_LIBRARY_handle=create_runtime_handle(); } + if(MAX_URL_PATH_LEN>strlen(url_path)+1) + { + memcpy(g_FS2_LIBRARY_handle->url_path, url_path, strlen(url_path)); + return 1; + } + return 0; } -int PROM_register(screen_stat_handle_t handle) -{ - if(handle!=NULL && g_PROMETHEUS_handle!=NULL) - { - if(g_PROMETHEUS_handle->fs2_handle_cnt<MAX_FS2_HANDLE_NUM) - { - int i=g_PROMETHEUS_handle->fs2_handle_cnt; - g_PROMETHEUS_handle->fs2_handle[i]=(struct FS_space_t *)handle; - g_PROMETHEUS_handle->fs2_handle_cnt++; - return 1; - } - } +int FS_library_init(void) +{ + pthread_t tid=0; + + pthread_create(&tid, NULL, FS_library_promethues_listen, g_FS2_LIBRARY_handle); return 0; + } + + diff --git a/test/fs2_test.cpp b/test/fs2_test.cpp index cce1e6a..b879338 100644 --- a/test/fs2_test.cpp +++ b/test/fs2_test.cpp @@ -22,15 +22,12 @@ int main(int argc,char* argv[]) char buff[128]; int value=0,i=0,j=0,runtime_reg_num=0,runtime_reg_line_num=0,ret=0; int loops=10; - - PROM_handle_t prom_handle=PROM_create_handle(); unsigned short port=9001; - PROM_set_opt(prom_handle, PROM_OPT_LISTEN_PORT, (void *)&port, sizeof(port)); - char *path=(char *)"/prometheus"; - PROM_set_opt(prom_handle,PROM_OPT_OUT_PATH, (void *)path, strlen(path)); - - PROM_init_handle(prom_handle); + FS_library_set_prometheus_port(port); + char *url_path=(char *)"/prometheus"; + FS_library_set_prometheus_url_path(url_path); + FS_library_init(); handle=FS_create_handle(); |
