Implemented basic statistics API.

This commit is contained in:
Valentin Bartenev
2022-08-29 14:27:09 +08:00
parent f2bab1b1be
commit ce26dd729e
14 changed files with 459 additions and 16 deletions

View File

@@ -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,
@@ -918,6 +922,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)