123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /*
- * Copyright (C) 2019 Weber Yann
- *
- * This file is part of PyFCGI.
- *
- * PyFCGI is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * any later version.
- *
- * PyFCGI is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with PyFCGI. If not, see <http://www.gnu.org/licenses/>.
- */
- /**@file stats.h
- * @ingroup monitoring */
- #ifndef _STATS__H___
- #define _STATS__H___
- #include "config.h"
-
- #include <fcgiapp.h>
-
- #include <stdarg.h>
- #include <signal.h>
- #include <string.h>
-
- #define PYFCGI_STATS_SZ (900)
- #define PYFCGI_STATS_SIGALRM 30
-
- typedef struct pyfcgi_stats_s pyfcgi_stats_t;
- typedef struct pyfcgi_stats_sample_s pyfcgi_stats_sample_t;
- typedef struct pyfcgi_stats_shm_s pyfcgi_stats_shm_t;
-
- #include "conf.h"
- #include "logger.h"
-
- /**@brief Stores data for stats on 15min (900s) */
- struct pyfcgi_stats_sample_s
- {
- /**@brief One sample per seconds */
- int samples[PYFCGI_STATS_SZ];
- /**@brief Current sample */
- int cur;
- };
-
- struct pyfcgi_stats_s
- {
- /**@brief Request per seconds on 15 minutes */
- pyfcgi_stats_sample_t reqs;
- /**@brief Worker count */
- pyfcgi_stats_sample_t wcount;
- /**@brief Load */
- pyfcgi_stats_sample_t load;
-
- /**@brief Repeating 1s timer sending SIGALRM */
- timer_t timerid;
-
- /**@brief Old SIGALRM handler */
- struct sigaction oldact;
-
- /**@brief Buffer to format the statistics before sending them */
- char *buff;
- size_t buff_ptr;
- size_t buff_len;
- };
-
- struct pyfcgi_stats_shm_s
- {
- int nworker;
- int pool_load;
- };
-
- /**@brief Starts collecting statistics
- *
- * Set an handler for SIGALRM and set a repeating alarm each seconds
- * @warning designed to be called from monitor server process
- * @return -1 on error else 0
- */
- int pyfcgi_stats_init();
-
- /**@brief SIGALRM signal handler
- * @param int signum
- */
- void pyfcgi_stats_collector(int);
-
- /**@brief Format all stats in a buffer
- * @note uses the pyfcgi_stats.statsbuff buffer */
- size_t pyfcgi_stats_format();
-
- /**@brief Print in buffer using buff_ptr index
- *@note exit on mem alloc failure
- */
- void pyfcgi_stats_buffprintf(const char *fmt, ...);
-
- /**@brief Allocate the buffer with at least given space
- * @param size_t sz the minimum buffer size
- * @note allocation size is rounded
- * @return 0 if OK else -1
- */
- int pyfcgi_stats_reqbuff(size_t);
-
- /**@brief Returns statistics about a 900s ringbuffer
- *
- * @param const int[PYFCGI_STATS_SZ] data : a 900 ringbuffer stats samples
- * @param int* idx_nxt next data index in ring buffer (allow interrupt
- * detection : when *idx_nxt changes)
- * @param int *last : last sample
- * @param double[4] avgs : average samples on 1, 5, 10 and 15 minutes
- * @return 0 if no error else -1 and set errno to EINTR
- */
- int pyfcgi_stats_avg(const int[PYFCGI_STATS_SZ], int*, int*, double[4]);
- /**@brief Same than @ref pyfcgi_stats_avg but normalize average when
- * uptime is bellow 900
- * @see pyfcgi_stats_avg
- */
- int pyfcgi_stats_avg_const(const int[PYFCGI_STATS_SZ], int*, int*, double[4]);
-
- /**@brief Returns the formated buffer
- * @todo make @ref pyfcgi_stats_format() implement this functionnality
- * to remove this function... */
- const char *pyfcgi_stats_buff(const char **, size_t*);
-
- int pyfcgi_stats_get_shm(pyfcgi_stats_shm_t*);
-
- #endif
|