summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliuxueli <[email protected]>2020-11-12 15:57:12 +0600
committerliuxueli <[email protected]>2020-11-12 15:57:12 +0600
commita04d4c877c4882827c613fa86f5de0a2f8dd3311 (patch)
tree0472defa535b8de1a9492121d9d6533817905f87
parenta22310659a865a17867bd3f41520ed8d3744d8e7 (diff)
修正函数及结构体命名方式
-rw-r--r--inc/field_stat2.h16
-rw-r--r--src/MESA_field_stat.cpp2
-rw-r--r--src/field_stat_internal.h2
-rw-r--r--src/fs2prometheus.cpp216
-rw-r--r--test/fs2_test.cpp11
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();