// 2019 - ntop.org var schema_2_label = {}; var data_2_label = {}; var graph_i18n = {}; export function initLabelMaps(_schema_2_label, _data_2_label, _graph_i18n) { schema_2_label = _schema_2_label; data_2_label = _data_2_label; graph_i18n = _graph_i18n; }; function getSerieLabel(schema, serie, visualization, serie_index) { var data_label = serie.label; var new_label = data_2_label[data_label]; if(visualization && visualization.metrics_labels && visualization.metrics_labels[serie_index]) return visualization.metrics_labels[serie_index]; if(serie.ext_label) { if(new_label) return serie.ext_label + " (" + new_label + ")"; else return serie.ext_label; } else if((schema == "top:local_senders") || (schema == "top:local_receivers")) { if(serie.ext_label) return serie.ext_label; else return serie.tags.host } else if(schema.startsWith("top:")) { // topk graphs if(serie.tags.protocol) return serie.tags.protocol; else if(serie.tags.category) return serie.tags.category; else if(serie.tags.l4proto) return serie.tags.l4proto; else if(serie.tags.dscp_class) return serie.tags.dscp_class; else if(serie.tags.device && serie.tags.if_index) { // SNMP interface if(serie.ext_label != "") return serie.ext_label; else return "(" + serie.tags.if_index + ")"; } else if(serie.tags.device && serie.tags.port) // Flow device return serie.tags.port; else if(serie.tags.exporter && serie.tags.ifname) // Event exporter return serie.tags.ifname; else if(serie.tags.profile) return serie.tags.profile; else if(serie.tags.check) return serie.tags.check; else if(serie.tags.command) return serie.tags.command.substring(4).toUpperCase(); } else if(data_label != "bytes") { // single series if(serie.tags.protocol) return serie.tags.protocol + " (" + new_label + ")"; else if(serie.tags.category) return serie.tags.category + " (" + new_label + ")"; else if(serie.tags.device && serie.tags.if_index) // SNMP interface return serie.ext_label + " (" + new_label + ")"; else if(serie.tags.device && serie.tags.port) // Flow device return serie.tags.port + " (" + new_label + ")"; } else { if(serie.tags.protocol) return serie.tags.protocol; else if(serie.tags.category) return serie.tags.category; else if(serie.tags.profile) return serie.tags.profile; else if(data_label == "bytes") { if(schema.contains("volume")) return graph_i18n.traffic_volume; else return graph_i18n.traffic; } } if(schema_2_label[schema]) return NtopUtils.capitaliseFirstLetter(schema_2_label[schema]); if(new_label) return NtopUtils.capitaliseFirstLetter(new_label); // default return NtopUtils.capitaliseFirstLetter(data_label); } // Value formatter function getValueFormatter(schema, metric_type, series, custom_formatter, stats) { if(series && series.length && series[0].label) { if(custom_formatter) { var formatters = []; if(typeof(custom_formatter) != "object") custom_formatter = [custom_formatter]; for(var i=0; i count) { console.error("points mismatch: serie '" + getSerieLabel(schema_name, series[i]) + "' has " + data.length + " points, expected " + count); rv = false; } else if(data.length < count) { /* upsample */ series[i].data = upsampleSerie(data, count); } } return rv; } function upsampleSerie(serie, num_points) { if(num_points <= serie.length) return serie; var res = []; var intervals = num_points / serie.length; function lerp(v0, v1, t) { return (1 - t) * v0 + t * v1; } for(var i=0; i>", v); res.push(v); } return res.slice(0, num_points); } // the stacked total serie function buildTotalSerie(data_series) { var series = []; for(var i=0; i 0.1) return res; } function buildTimeArray(start_time, end_time, step) { var arr = []; for(var t=start_time; t $.now()) $("#btn-jump-time-ahead").addClass("disabled"); else $("#btn-jump-time-ahead").removeClass("disabled"); } function showQuerySlow() { $("#query-slow-alert").show(); } function hideQuerySlow() { $("#query-slow-alert").hide(); } function chart_data_sum(series) { return(series.reduce(function(acc, x) { return(acc + x.values.reduce( function(acc, pt) { return(acc + pt[1] || 0); }, 0) ) }, 0)); } function redrawExtraLines(chart, chart_id, extra_lines) { /* Remove the previous extra lines */ d3.selectAll(chart_id + " line.extra-line").remove(); if(extra_lines.length > 0) { var xValueScale = chart.xAxis.scale(); var yValueScale = chart.yAxis1.scale(); var g = d3.select(chart_id + " .stack1Wrap"); for(var i=0; i