summaryrefslogtreecommitdiff
path: root/src/fs2prometheus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs2prometheus.cpp')
-rw-r--r--src/fs2prometheus.cpp216
1 files changed, 123 insertions, 93 deletions
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;
+
}
+
+