From: Willy Tarreau Date: Sat, 8 Dec 2012 16:48:47 +0000 (+0100) Subject: MINOR: stats: add a few more information on session dump X-Git-Tag: v1.5-dev15~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=55e4ecd9283ad7444b1bff83cec655ba91b43a4c;p=thirdparty%2Fhaproxy.git MINOR: stats: add a few more information on session dump We also report fd.spec_p, fd.updt and a few names instead of the values. --- diff --git a/include/proto/obj_type.h b/include/proto/obj_type.h index 44c2f834c6..ba5d534578 100644 --- a/include/proto/obj_type.h +++ b/include/proto/obj_type.h @@ -37,6 +37,17 @@ static inline enum obj_type obj_type(enum obj_type *t) return *t; } +static inline const char *obj_type_name(enum obj_type *t) +{ + switch (obj_type(t)) { + case OBJ_TYPE_LISTENER: return "LISTENER"; + case OBJ_TYPE_PROXY: return "PROXY"; + case OBJ_TYPE_SERVER: return "SERVER"; + case OBJ_TYPE_APPLET: return "APPLET"; + default: return "NONE"; + } +} + static inline struct listener *objt_listener(enum obj_type *t) { if (!t || *t != OBJ_TYPE_LISTENER) @@ -65,6 +76,17 @@ static inline struct si_applet *objt_applet(enum obj_type *t) return container_of(t, struct si_applet, obj_type); } +static inline void *obj_base_ptr(enum obj_type *t) +{ + switch (obj_type(t)) { + case OBJ_TYPE_LISTENER: return objt_listener(t); + case OBJ_TYPE_PROXY: return objt_proxy(t); + case OBJ_TYPE_SERVER: return objt_server(t); + case OBJ_TYPE_APPLET: return objt_applet(t); + default: return NULL; + } +} + #endif /* _PROTO_OBJ_TYPE_H */ /* diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index c8202bccaf..c43ef57a19 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -132,6 +132,24 @@ static inline int si_connect(struct stream_interface *si) return ret; } +/* for debugging, reports the stream interface state name */ +static inline const char *si_state_str(int state) +{ + switch (state) { + case SI_ST_INI: return "INI"; + case SI_ST_REQ: return "REQ"; + case SI_ST_QUE: return "QUE"; + case SI_ST_TAR: return "TAR"; + case SI_ST_ASS: return "ASS"; + case SI_ST_CON: return "CON"; + case SI_ST_CER: return "CER"; + case SI_ST_EST: return "EST"; + case SI_ST_DIS: return "DIS"; + case SI_ST_CLO: return "CLO"; + default: return "???"; + } +} + #endif /* _PROTO_STREAM_INTERFACE_H */ /* diff --git a/src/dumpstats.c b/src/dumpstats.c index cddadabc1c..31d24b0db5 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -3487,9 +3487,12 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct se /* fall through */ case 1: + get_localtime(sess->logs.accept_date.tv_sec, &tm); chunk_appendf(&trash, - "%p: id=%u, proto=%s", + "%p: [%02d/%s/%04d:%02d:%02d:%02d.%06d] id=%u proto=%s", sess, + tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900, + tm.tm_hour, tm.tm_min, tm.tm_sec, (int)(sess->logs.accept_date.tv_usec), sess->uniq_id, sess->listener->proto->name); @@ -3583,7 +3586,7 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct se } chunk_appendf(&trash, - " task=%p (state=0x%02x nice=%d calls=%d exp=%s%s)\n", + " task=%p (state=0x%02x nice=%d calls=%d exp=%s%s", sess->task, sess->task->state, sess->task->nice, sess->task->calls, @@ -3593,17 +3596,19 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct se TICKS_TO_MS(1000)) : "", task_in_rq(sess->task) ? ", running" : ""); - get_localtime(sess->logs.accept_date.tv_sec, &tm); chunk_appendf(&trash, - " task created [%02d/%s/%04d:%02d:%02d:%02d.%06d] (age=%s)\n", - tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900, - tm.tm_hour, tm.tm_min, tm.tm_sec, (int)(sess->logs.accept_date.tv_usec), + " age=%s)\n", human_time(now.tv_sec - sess->logs.accept_date.tv_sec, 1)); chunk_appendf(&trash, - " si[0]=%p (state=%d flags=0x%02x conn=%p exp=%s, et=0x%03x)\n", + " txn=%p flags=0x%x meth=%d status=%d req.st=%s rsp.st=%s\n", + &sess->txn, sess->txn.flags, sess->txn.meth, sess->txn.status, + http_msg_state_str(sess->txn.req.msg_state), http_msg_state_str(sess->txn.rsp.msg_state)); + + chunk_appendf(&trash, + " si[0]=%p (state=%s flags=0x%02x conn0=%p exp=%s, et=0x%03x)\n", &sess->si[0], - sess->si[0].state, + si_state_str(sess->si[0].state), sess->si[0].flags, sess->si[0].conn, sess->si[0].exp ? @@ -3613,9 +3618,9 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct se sess->si[0].err_type); chunk_appendf(&trash, - " si[1]=%p (state=%d flags=0x%02x conn=%p exp=%s, et=0x%03x)\n", + " si[1]=%p (state=%s flags=0x%02x conn1=%p exp=%s, et=0x%03x)\n", &sess->si[1], - sess->si[1].state, + si_state_str(sess->si[1].state), sess->si[1].flags, sess->si[1].conn, sess->si[1].exp ? @@ -3625,38 +3630,38 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct se sess->si[1].err_type); chunk_appendf(&trash, - " lconn=%p ctrl=%s xprt=%s data=%s\n", + " co0=%p ctrl=%s xprt=%s data=%s target=%s:%p\n", sess->si[0].conn, get_conn_ctrl_name(sess->si[0].conn), get_conn_xprt_name(sess->si[0].conn), - get_conn_data_name(sess->si[0].conn)); + get_conn_data_name(sess->si[0].conn), + obj_type_name(sess->si[0].conn->target), + obj_base_ptr(sess->si[0].conn->target)); chunk_appendf(&trash, - " target=%d flags=0x%08x fd=%d fd_spec=%02x\n", - sess->si[0].conn->target ? *sess->si[0].conn->target : 0, + " flags=0x%08x fd=%d fd_spec_e=%02x fd_spec_p=%d updt=%d\n", sess->si[0].conn->flags, sess->si[0].conn->t.sock.fd, - sess->si[0].conn->t.sock.fd >= 0 ? fdtab[sess->si[0].conn->t.sock.fd].spec_e : 0); + sess->si[0].conn->t.sock.fd >= 0 ? fdtab[sess->si[0].conn->t.sock.fd].spec_e : 0, + sess->si[0].conn->t.sock.fd >= 0 ? fdtab[sess->si[0].conn->t.sock.fd].spec_p : 0, + sess->si[0].conn->t.sock.fd >= 0 ? fdtab[sess->si[0].conn->t.sock.fd].updated : 0); chunk_appendf(&trash, - " rconn=%p ctrl=%s xprt=%s data=%s\n", + " co1=%p ctrl=%s xprt=%s data=%s target=%s:%p\n", sess->si[1].conn, get_conn_ctrl_name(sess->si[1].conn), get_conn_xprt_name(sess->si[1].conn), - get_conn_data_name(sess->si[1].conn)); + get_conn_data_name(sess->si[1].conn), + obj_type_name(sess->si[1].conn->target), + obj_base_ptr(sess->si[1].conn->target)); chunk_appendf(&trash, - " target=%d flags=0x%08x fd=%d fd_spec=%02x\n", - sess->si[1].conn->target ? *sess->si[1].conn->target : 0, + " flags=0x%08x fd=%d fd_spec_e=%02x fd_spec_p=%d updt=%d\n", sess->si[1].conn->flags, sess->si[1].conn->t.sock.fd, - sess->si[1].conn->t.sock.fd >= 0 ? fdtab[sess->si[1].conn->t.sock.fd].spec_e : 0); - - chunk_appendf(&trash, - " txn=%p flags=0x%x meth=%d status=%d req.st=%s rsp.st=%s\n", - &sess->txn, sess->txn.flags, sess->txn.meth, sess->txn.status, - http_msg_state_str(sess->txn.req.msg_state), http_msg_state_str(sess->txn.rsp.msg_state)); - + sess->si[1].conn->t.sock.fd >= 0 ? fdtab[sess->si[1].conn->t.sock.fd].spec_e : 0, + sess->si[1].conn->t.sock.fd >= 0 ? fdtab[sess->si[1].conn->t.sock.fd].spec_p : 0, + sess->si[1].conn->t.sock.fd >= 0 ? fdtab[sess->si[1].conn->t.sock.fd].updated : 0); chunk_appendf(&trash, " req=%p (f=0x%06x an=0x%x pipe=%d tofwd=%d total=%lld)\n"