|
|
|
|
@ -21,9 +21,7 @@
|
|
|
|
|
#include "socket.h"
|
|
|
|
|
|
|
|
|
|
static socket_t graphite_sock;
|
|
|
|
|
static const endpoint_t *graphite_ep;
|
|
|
|
|
static int connectinprogress=0;
|
|
|
|
|
static struct callmaster* cm=0;
|
|
|
|
|
//struct totalstats totalstats_prev;
|
|
|
|
|
static time_t next_run;
|
|
|
|
|
// HEAD: static time_t g_now, next_run;
|
|
|
|
|
@ -39,13 +37,17 @@ void set_prefix(char* prefix) {
|
|
|
|
|
graphite_prefix = prefix;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int connect_to_graphite_server(const endpoint_t *ep) {
|
|
|
|
|
graphite_ep = ep;
|
|
|
|
|
int connect_to_graphite_server(const endpoint_t *graphite_ep) {
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
ilog(LOG_INFO, "Connecting to graphite server %s", endpoint_print_buf(ep));
|
|
|
|
|
if (!graphite_ep) {
|
|
|
|
|
ilog(LOG_ERROR, "NULL graphite_ep");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rc = connect_socket_nb(&graphite_sock, SOCK_STREAM, ep);
|
|
|
|
|
ilog(LOG_INFO, "Connecting to graphite server %s", endpoint_print_buf(graphite_ep));
|
|
|
|
|
|
|
|
|
|
rc = connect_socket_nb(&graphite_sock, SOCK_STREAM, graphite_ep);
|
|
|
|
|
if (rc == -1) {
|
|
|
|
|
ilog(LOG_ERROR,"Couldn't make socket for connecting to graphite.");
|
|
|
|
|
return -1;
|
|
|
|
|
@ -61,10 +63,16 @@ int connect_to_graphite_server(const endpoint_t *ep) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int send_graphite_data(struct totalstats *sent_data) {
|
|
|
|
|
int send_graphite_data(struct callmaster *cm, struct totalstats *sent_data) {
|
|
|
|
|
|
|
|
|
|
int rc=0;
|
|
|
|
|
|
|
|
|
|
// sanity checks
|
|
|
|
|
if (!cm) {
|
|
|
|
|
ilog(LOG_ERROR, "NULL callmaster when trying to send data");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (graphite_sock.fd < 0) {
|
|
|
|
|
ilog(LOG_ERROR,"Graphite socket is not connected.");
|
|
|
|
|
return -1;
|
|
|
|
|
@ -172,7 +180,7 @@ static inline void copy_with_lock(struct totalstats *ts_dst, struct totalstats *
|
|
|
|
|
mutex_unlock(ts_lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void graphite_loop_run(struct callmaster* callmaster, int seconds) {
|
|
|
|
|
void graphite_loop_run(struct callmaster *cm, endpoint_t *graphite_ep, int seconds) {
|
|
|
|
|
|
|
|
|
|
int rc=0;
|
|
|
|
|
fd_set wfds;
|
|
|
|
|
@ -181,6 +189,17 @@ void graphite_loop_run(struct callmaster* callmaster, int seconds) {
|
|
|
|
|
int optval=0;
|
|
|
|
|
socklen_t optlen=sizeof(optval);
|
|
|
|
|
|
|
|
|
|
// sanity checks
|
|
|
|
|
if (!cm) {
|
|
|
|
|
ilog(LOG_ERROR, "NULL callmaster");
|
|
|
|
|
return ;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!graphite_ep) {
|
|
|
|
|
ilog(LOG_ERROR, "NULL graphite_ep");
|
|
|
|
|
return ;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (connectinprogress && graphite_sock.fd >= 0) {
|
|
|
|
|
FD_SET(graphite_sock.fd,&wfds);
|
|
|
|
|
tv.tv_sec = 0;
|
|
|
|
|
@ -197,7 +216,6 @@ void graphite_loop_run(struct callmaster* callmaster, int seconds) {
|
|
|
|
|
} else {
|
|
|
|
|
if (!FD_ISSET(graphite_sock.fd,&wfds)) {
|
|
|
|
|
ilog(LOG_WARN,"fd active but not the graphite fd.");
|
|
|
|
|
close_socket(&graphite_sock);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
rc = getsockopt(graphite_sock.fd, SOL_SOCKET, SO_ERROR, &optval, &optlen);
|
|
|
|
|
@ -221,9 +239,6 @@ void graphite_loop_run(struct callmaster* callmaster, int seconds) {
|
|
|
|
|
|
|
|
|
|
next_run = g_now.tv_sec + seconds;
|
|
|
|
|
|
|
|
|
|
if (!cm)
|
|
|
|
|
cm = callmaster;
|
|
|
|
|
|
|
|
|
|
if (graphite_sock.fd < 0 && !connectinprogress) {
|
|
|
|
|
rc = connect_to_graphite_server(graphite_ep);
|
|
|
|
|
}
|
|
|
|
|
@ -231,7 +246,7 @@ void graphite_loop_run(struct callmaster* callmaster, int seconds) {
|
|
|
|
|
if (graphite_sock.fd >= 0 && !connectinprogress) {
|
|
|
|
|
add_total_calls_duration_in_interval(cm, &graphite_interval_tv);
|
|
|
|
|
|
|
|
|
|
rc = send_graphite_data(&graphite_stats);
|
|
|
|
|
rc = send_graphite_data(cm, &graphite_stats);
|
|
|
|
|
gettimeofday(&cm->latest_graphite_interval_start, NULL);
|
|
|
|
|
if (rc<0) {
|
|
|
|
|
ilog(LOG_ERROR,"Sending graphite data failed.");
|
|
|
|
|
@ -245,6 +260,12 @@ void graphite_loop_run(struct callmaster* callmaster, int seconds) {
|
|
|
|
|
void graphite_loop(void *d) {
|
|
|
|
|
struct callmaster *cm = d;
|
|
|
|
|
|
|
|
|
|
// sanity checks
|
|
|
|
|
if (!cm) {
|
|
|
|
|
ilog(LOG_ERROR, "NULL callmaster");
|
|
|
|
|
return ;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!cm->conf.graphite_interval) {
|
|
|
|
|
ilog(LOG_WARNING,"Graphite send interval was not set. Setting it to 1 second.");
|
|
|
|
|
cm->conf.graphite_interval=1;
|
|
|
|
|
@ -253,5 +274,5 @@ void graphite_loop(void *d) {
|
|
|
|
|
connect_to_graphite_server(&cm->conf.graphite_ep);
|
|
|
|
|
|
|
|
|
|
while (!g_shutdown)
|
|
|
|
|
graphite_loop_run(cm,cm->conf.graphite_interval); // time in seconds
|
|
|
|
|
graphite_loop_run(cm, &cm->conf.graphite_ep, cm->conf.graphite_interval); // time in seconds
|
|
|
|
|
}
|
|
|
|
|
|