]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] Collect & provide http response codes for frontends, fix backends
authorKrzysztof Piotr Oledzki <ole@ans.pl>
Sat, 24 Oct 2009 13:36:15 +0000 (15:36 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 27 Oct 2009 20:56:47 +0000 (21:56 +0100)
This patch extends and corrects the functionality introduced by
"Collect & provide http response codes received from servers":
 - responses are now also accounted for frontends
 - backend's and frontend's counters are incremented based
   on responses sent to client, not received from servers

src/dumpstats.c
src/proto_http.c
src/session.c

index 1f0ae903573ecd65752018f13e37d45522c706fe..866f4996178959e427801a42cfeaaea91217ec44 100644 (file)
@@ -1278,16 +1278,33 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri)
                                     "<a class=lfsb href=\"#%s/Frontend\">Frontend</a></td><td colspan=3></td>"
                                     /* sessions rate : current, max, limit */
                                     "<td>%s</td><td>%s</td><td>%s</td>"
-                                    /* sessions : current, max, limit, total, lbtot */
+                                    /* sessions: current, max, limit */
                                     "<td>%s</td><td>%s</td><td>%s</td>"
-                                    "<td>%s</td><td></td>"
-                                    /* bytes : in, out */
-                                    "<td>%s</td><td>%s</td>"
+                                    "<td"
                                     "",
                                     px->id, px->id,
                                     U2H0(read_freq_ctr(&px->fe_sess_per_sec)),
                                     U2H1(px->counters.fe_sps_max), LIM2A2(px->fe_sps_lim, "-"),
-                                    U2H3(px->feconn), U2H4(px->counters.feconn_max), U2H5(px->maxconn),
+                                    U2H3(px->feconn), U2H4(px->counters.feconn_max), U2H5(px->maxconn));
+
+                               /* http response (via td title): 1xx, 2xx, 3xx, 4xx, 5xx, other */
+                               if (px->mode == PR_MODE_HTTP) {
+                                       int i;
+
+                                       chunk_printf(&msg, " title=\"rsp codes:");
+
+                                       for (i = 1; i < 6; i++)
+                                               chunk_printf(&msg, " %dxx=%lld,", i, px->counters.p.http.rsp[i]);
+
+                                       chunk_printf(&msg, " other=%lld\"", px->counters.p.http.rsp[0]);
+                               }
+
+                               chunk_printf(&msg,
+                                    /* sessions: total, lbtot */
+                                    ">%s</td><td></td>"
+                                    /* bytes : in, out */
+                                    "<td>%s</td><td>%s</td>"
+                                    "",
                                     U2H6(px->counters.cum_feconn), U2H7(px->counters.bytes_in), U2H8(px->counters.bytes_out));
 
                                chunk_printf(&msg,
@@ -1329,10 +1346,7 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri)
                                     /* rate, rate_lim, rate_max */
                                     "%u,%u,%u,"
                                     /* check_status, check_code, check_duration */
-                                    ",,,"
-                                    /* http response: 1xx, 2xx, 3xx, 4xx, 5xx, other */
-                                    ",,,,,,"
-                                    "\n",
+                                    ",,,",
                                     px->id,
                                     px->feconn, px->counters.feconn_max, px->maxconn, px->counters.cum_feconn,
                                     px->counters.bytes_in, px->counters.bytes_out,
@@ -1343,6 +1357,21 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri)
                                     relative_pid, px->uuid, STATS_TYPE_FE,
                                     read_freq_ctr(&px->fe_sess_per_sec),
                                     px->fe_sps_lim, px->counters.fe_sps_max);
+
+                               /* http response: 1xx, 2xx, 3xx, 4xx, 5xx, other */
+                               if (px->mode == PR_MODE_HTTP) {
+                                       int i;
+
+                                       for (i=1; i<6; i++)
+                                               chunk_printf(&msg, "%lld,", px->counters.p.http.rsp[i]);
+
+                                       chunk_printf(&msg, "%lld,", px->counters.p.http.rsp[0]);
+                               } else {
+                                       chunk_printf(&msg, ",,,,,,");
+                               }
+
+                               /* finish with EOL */
+                               chunk_printf(&msg, "\n");
                        }
 
                        if (buffer_feed_chunk(rep, &msg) >= 0)
index b83beb9e1ebeeb415815c7cce163f37b25c0af8c..b78fc53f5defab5875af50a48547674d812abb72 100644 (file)
@@ -3052,7 +3052,6 @@ int http_wait_for_response(struct session *s, struct buffer *rep, int an_bit)
        if (n < 1 || n > 5)
                n = 0;
        s->srv->counters.p.http.rsp[n]++;
-       s->be->counters.p.http.rsp[n]++;
 
        txn->status = strl2ui(rep->data + msg->sl.st.c, msg->sl.st.c_l);
 
index b010f59f20dc69f315d3607f1bcf1409e0d3b757..03285e25caf55508d6a7b0ff51dcf5b1da3bdc71 100644 (file)
@@ -1302,6 +1302,21 @@ resync_stream_interface:
        s->logs.t_close = tv_ms_elapsed(&s->logs.tv_accept, &now);
        session_process_counters(s);
 
+       if (s->txn.status) {
+               int n;
+
+               n = s->txn.status / 100;
+               if (n < 1 || n > 5)
+                       n = 0;
+
+               if (s->fe->mode == PR_MODE_HTTP)
+                       s->fe->counters.p.http.rsp[n]++;
+
+               if ((s->flags & SN_BE_ASSIGNED) && (s->fe != s->be) &&
+                   (s->be->mode == PR_MODE_HTTP))
+                       s->be->counters.p.http.rsp[n]++;
+       }
+
        /* let's do a final log if we need it */
        if (s->logs.logwait &&
            !(s->flags & SN_MONITOR) &&