summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_router.c
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2022-08-29 14:27:09 +0800
committerValentin Bartenev <vbart@nginx.com>2022-08-29 14:27:09 +0800
commitce26dd729e6842c9ec8cc83bf091167e4c50a1ec (patch)
treed215198f765faeefd46253bd118e8d058d31fd1e /src/nxt_router.c
parentf2bab1b1be658e3456aa1cec84a1879d4b01577e (diff)
downloadunit-ce26dd729e6842c9ec8cc83bf091167e4c50a1ec.tar.gz
unit-ce26dd729e6842c9ec8cc83bf091167e4c50a1ec.tar.bz2
Implemented basic statistics API.
Diffstat (limited to 'src/nxt_router.c')
-rw-r--r--src/nxt_router.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/nxt_router.c b/src/nxt_router.c
index e1f4f6da..e7723a2d 100644
--- a/src/nxt_router.c
+++ b/src/nxt_router.c
@@ -7,6 +7,7 @@
#include <nxt_router.h>
#include <nxt_conf.h>
+#include <nxt_status.h>
#if (NXT_TLS)
#include <nxt_cert.h>
#endif
@@ -90,6 +91,8 @@ static void nxt_router_conf_data_handler(nxt_task_t *task,
nxt_port_recv_msg_t *msg);
static void nxt_router_app_restart_handler(nxt_task_t *task,
nxt_port_recv_msg_t *msg);
+static void nxt_router_status_handler(nxt_task_t *task,
+ nxt_port_recv_msg_t *msg);
static void nxt_router_remove_pid_handler(nxt_task_t *task,
nxt_port_recv_msg_t *msg);
@@ -269,6 +272,7 @@ static const nxt_port_handlers_t nxt_router_process_port_handlers = {
.get_mmap = nxt_router_get_mmap_handler,
.data = nxt_router_conf_data_handler,
.app_restart = nxt_router_app_restart_handler,
+ .status = nxt_router_status_handler,
.remove_pid = nxt_router_remove_pid_handler,
.access_log = nxt_router_access_log_reopen_handler,
.rpc_ready = nxt_port_rpc_handler,
@@ -919,6 +923,83 @@ fail:
static void
+nxt_router_status_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg)
+{
+ u_char *p;
+ size_t alloc;
+ nxt_app_t *app;
+ nxt_buf_t *b;
+ nxt_uint_t type;
+ nxt_port_t *port;
+ nxt_status_app_t *app_stat;
+ nxt_event_engine_t *engine;
+ nxt_status_report_t *report;
+
+ port = nxt_runtime_port_find(task->thread->runtime,
+ msg->port_msg.pid,
+ msg->port_msg.reply_port);
+ if (nxt_slow_path(port == NULL)) {
+ nxt_alert(task, "nxt_router_status_handler(): reply port not found");
+ return;
+ }
+
+ alloc = sizeof(nxt_status_report_t);
+
+ nxt_queue_each(app, &nxt_router->apps, nxt_app_t, link) {
+
+ alloc += sizeof(nxt_status_app_t) + app->name.length;
+
+ } nxt_queue_loop;
+
+ b = nxt_buf_mem_alloc(port->mem_pool, alloc, 0);
+ if (nxt_slow_path(b == NULL)) {
+ type = NXT_PORT_MSG_RPC_ERROR;
+ goto fail;
+ }
+
+ report = (nxt_status_report_t *) b->mem.free;
+ b->mem.free = b->mem.end;
+
+ nxt_memzero(report, sizeof(nxt_status_report_t));
+
+ nxt_queue_each(engine, &nxt_router->engines, nxt_event_engine_t, link0) {
+
+ report->accepted_conns += engine->accepted_conns_cnt;
+ report->idle_conns += engine->idle_conns_cnt;
+ report->closed_conns += engine->closed_conns_cnt;
+
+ } nxt_queue_loop;
+
+ report->apps_count = 0;
+ app_stat = report->apps;
+ p = b->mem.end;
+
+ nxt_queue_each(app, &nxt_router->apps, nxt_app_t, link) {
+ p -= app->name.length;
+
+ nxt_memcpy(p, app->name.start, app->name.length);
+
+ app_stat->name.length = app->name.length;
+ app_stat->name.start = (u_char *) (p - b->mem.pos);
+
+ app_stat->active_requests = app->active_requests;
+ app_stat->pending_processes = app->pending_processes;
+ app_stat->processes = app->processes;
+ app_stat->idle_processes = app->idle_processes;
+
+ report->apps_count++;
+ app_stat++;
+ } nxt_queue_loop;
+
+ type = NXT_PORT_MSG_RPC_READY_LAST;
+
+fail:
+
+ nxt_port_socket_write(task, port, type, -1, msg->port_msg.stream, 0, b);
+}
+
+
+static void
nxt_router_app_process_remove_pid(nxt_task_t *task, nxt_port_t *port,
void *data)
{