From: Sebastien GODARD Date: Fri, 3 Jun 2016 12:19:24 +0000 (+0200) Subject: SVG: Add SCG output for ICMPv4 network errors statistics X-Git-Tag: v11.3.5~18 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a532df62a8609c583bcd5d764475070a5ee9b0f;p=sysstat SVG: Add SCG output for ICMPv4 network errors statistics These graphs correspond to the output of "sar -n EICMP". Signed-off-by: Sebastien GODARD --- diff --git a/activity.c b/activity.c index de6ca9c..4e8a1f0 100644 --- a/activity.c +++ b/activity.c @@ -734,10 +734,11 @@ struct activity net_eicmp_act = { .f_render = render_net_eicmp_stats, .f_xml_print = xml_print_net_eicmp_stats, .f_json_print = json_print_net_eicmp_stats, + .f_svg_print = svg_print_net_eicmp_stats, .hdr_line = "ierr/s;oerr/s;idstunr/s;odstunr/s;itmex/s;otmex/s;" "iparmpb/s;oparmpb/s;isrcq/s;osrcq/s;iredir/s;oredir/s", .name = "A_NET_EICMP", - .g_nr = 0, + .g_nr = 6, #endif .nr = 1, .nr2 = 1, diff --git a/svg_stats.c b/svg_stats.c index 4dd987a..523555e 100644 --- a/svg_stats.c +++ b/svg_stats.c @@ -2350,6 +2350,114 @@ __print_funct_t svg_print_net_icmp_stats(struct activity *a, int curr, int actio } } +/* + *************************************************************************** + * Display ICMPv4 network errors statistics in SVG. + * + * IN: + * @a Activity structure with statistics. + * @curr Index in array for current sample statistics. + * @action Action expected from current function. + * @svg_p SVG specific parameters: Current graph number (.@graph_no), + * flag indicating that a restart record has been previously + * found (.@restart) and time used for the X axis origin + * (@ust_time_ref). + * @itv Interval of time in jiffies (only with F_MAIN action). + * @record_hdr Pointer on record header of current stats sample. + *************************************************************************** + */ +__print_funct_t svg_print_net_eicmp_stats(struct activity *a, int curr, int action, struct svg_parm *svg_p, + unsigned long long itv, struct record_header *record_hdr) +{ + struct stats_net_eicmp + *sneic = (struct stats_net_eicmp *) a->buf[curr], + *sneip = (struct stats_net_eicmp *) a->buf[!curr]; + int group[] = {2, 2, 2, 2, 2, 2}; + char *title[] = {"ICMPv4 network errors statistics (1)", "ICMPv4 network errors statistics (2)", + "ICMPv4 network errors statistics (3)", "ICMPv4 network errors statistics (4)", + "ICMPv4 network errors statistics (5)", "ICMPv4 network errors statistics (6)"}; + char *g_title[] = {"ierr/s", "oerr/s", + "idstunr/s", "odstunr/s", + "itmex/s", "otmex/s", + "iparmpb/s", "oparmpb/s", + "isrcq/s", "osrcq/s", + "iredir/s", "oredir/s"}; + static double *spmin, *spmax; + static char **out; + static int *outsize; + + if (action & F_BEGIN) { + /* + * Allocate arrays that will contain the graphs data + * and the min/max values. + */ + out = allocate_graph_lines(12, &outsize, &spmin, &spmax); + } + + if (action & F_MAIN) { + /* Check for min/max values */ + save_extrema(0, 12, 0, (void *) a->buf[curr], (void *) a->buf[!curr], + itv, spmin, spmax); + + /* ierr/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->InErrors, sneic->InErrors, itv), + out, outsize, svg_p->restart); + /* oerr/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->OutErrors, sneic->OutErrors, itv), + out + 1, outsize + 1, svg_p->restart); + /* idstunr/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->InDestUnreachs, sneic->InDestUnreachs, itv), + out + 2, outsize + 2, svg_p->restart); + /* odstunr/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->OutDestUnreachs, sneic->OutDestUnreachs, itv), + out + 3, outsize + 3, svg_p->restart); + /* itmex/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->InTimeExcds, sneic->InTimeExcds, itv), + out + 4, outsize + 4, svg_p->restart); + /* otmex/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->OutTimeExcds, sneic->OutTimeExcds, itv), + out + 5, outsize + 5, svg_p->restart); + /* iparmpb/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->InParmProbs, sneic->InParmProbs, itv), + out + 6, outsize + 6, svg_p->restart); + /* oparmpb/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->OutParmProbs, sneic->OutParmProbs, itv), + out + 7, outsize + 7, svg_p->restart); + /* isrcq/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->InSrcQuenchs, sneic->InSrcQuenchs, itv), + out + 8, outsize + 8, svg_p->restart); + /* osrcq/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->OutSrcQuenchs, sneic->OutSrcQuenchs, itv), + out + 9, outsize + 9, svg_p->restart); + /* iredir/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->InRedirects, sneic->InRedirects, itv), + out + 10, outsize + 10, svg_p->restart); + /* oredir/s */ + lnappend(record_hdr->ust_time - svg_p->ust_time_ref, + S_VALUE(sneip->OutRedirects, sneic->OutRedirects, itv), + out + 11, outsize + 11, svg_p->restart); + } + + if (action & F_END) { + draw_activity_graphs(a->g_nr, SVG_LINE_GRAPH, title, g_title, NULL, group, + spmin, spmax, out, outsize, svg_p, record_hdr); + + /* Free remaining structures */ + free_graphs(out, outsize, spmin, spmax); + } +} + /* *************************************************************************** * Display TCPv4 network statistics in SVG. diff --git a/svg_stats.h b/svg_stats.h index 7b3c437..650d5ed 100644 --- a/svg_stats.h +++ b/svg_stats.h @@ -53,6 +53,9 @@ __print_funct_t svg_print_net_eip_stats __print_funct_t svg_print_net_icmp_stats (struct activity *, int, int, struct svg_parm *, unsigned long long, struct record_header *); +__print_funct_t svg_print_net_eicmp_stats + (struct activity *, int, int, struct svg_parm *, unsigned long long, + struct record_header *); __print_funct_t svg_print_net_tcp_stats (struct activity *, int, int, struct svg_parm *, unsigned long long, struct record_header *);