/// <summary> /// Rend un axe au format CSV. /// </summary> /// <param name="hyperCube">HyperCube.</param> /// <param name="context">Contexte.</param> /// <param name="writer">Writer CSV.</param> /// <param name="activeCounters">Compteur actifs.</param> /// <param name="axis">Axe.</param> private static void CreateCsvAxis(IHyperCube hyperCube, Context context, TextWriter writer, Dictionary <string, string> activeCounters, string axis) { CounterCubeCriteria criteria = new CounterCubeCriteria(axis, TimeLevel.Hour); CubeKey key = criteria.CreateCubeKey(context.EndDate); ICube cube = hyperCube.GetCube(key); if (cube != null && IsShown(context.EndDate, context.Filtre, hyperCube, criteria)) { writer.Write(axis); writer.Write(";"); double total = cube.GetCounter(Analytics.ElapsedTime).GetValue(CounterStatType.Total); writer.Write(Convert.ToString(total, CultureInfo.CurrentCulture)); writer.Write(";"); double hits = cube.GetCounter(Analytics.ElapsedTime).GetValue(CounterStatType.Hits); writer.Write(Convert.ToString(hits, CultureInfo.CurrentCulture)); writer.Write(";"); double avg; foreach (ICounterDefinition definition in hyperCube.AllDefinitions) { if (activeCounters.ContainsKey(definition.Code)) { ICounter counter = cube.GetCounter(definition.Code); avg = (counter != null) ? counter.GetValue(CounterStatType.Avg) : 0; writer.Write(string.Format(CultureInfo.CurrentCulture, "{0:0.##}", avg)); writer.Write(";"); } } writer.WriteLine(); } }
/// <summary> /// Réalise le rendu HTML contenant les sparklines du nombre de hits sur les /// 10 dernières minutes. /// </summary> /// <param name="hyperCube">Hypercube contenant les valeurs.</param> /// <param name="criteria">Critère de rendu (axe courant, date, période de temps).</param> /// <param name="writer">Writer HTML.</param> /// <param name="context">Context courant de la requête.</param> private static void PrintChartSparkLines(IHyperCube hyperCube, CounterCubeCriteria criteria, HtmlTextWriter writer, Context context) { string url = context.ChangeSort(null).GetHandlerUrl() + "&CONTENT=sparklines.png&MON_ID=" + hyperCube.Name + "&LEVEL=" + criteria.Level; writer.Write("<td class=\"monitoring\" align=\"right\">"); writer.Write("<img src=\"" + url + "\"/>"); writer.WriteLine("</td>"); }
/// <summary> /// Réalise le rendu d'un cude. /// </summary> /// <param name="hyperCube">HyperCupe à rendre.</param> /// <param name="context">Context courant de la requête.</param> /// <param name="s">Stream de sortie.</param> internal static void RenderGraph(IHyperCube hyperCube, Context context, Stream s) { TimeLevel level = TimeLevel.ValueOf(context.Level); CounterCubeCriteria criteria = new CounterCubeCriteria(context.RequestName, level); if (context.Content.Equals("sparklines.png")) { HtmlGraphHelper.RenderGraphSparklines(context, hyperCube, criteria, s); } else { throw new NotSupportedException(); } }
/// <summary> /// Rendu d'un hypercube en sparklines. /// </summary> /// <param name="context">Context courant de la requête.</param> /// <param name="hyperCube">Hypercube contenant les données.</param> /// <param name="criteria">Critères de lecture de l'hypercube.</param> /// <param name="s">Stream de sortie.</param> private static void RenderGraphSparklines(Context context, IHyperCube hyperCube, CounterCubeCriteria criteria, Stream s) { long now = context.EndDate.Ticks; long timeStampInterval = criteria.Level.TimeStampInterval; decimal[] datas = new decimal[10]; for (int i = 0; i < datas.Length; i++) { DateTime d = new DateTime(now - (i * timeStampInterval * 10000000)); ICube cube = hyperCube.GetCube(criteria.CreateCubeKey(d)); datas[datas.Length - 1 - i] = (cube == null) ? 0 : (decimal)cube.GetCounter(Analytics.ElapsedTime).GetValue(CounterStatType.Hits); } SparklinesBar sparklines = new SparklinesBar(); sparklines.CreateChart(s, datas, Color.Blue, Color.Magenta); }
/// <summary> /// Indique si l'axe d'un hypercube doit être affiché pour un niveau d'alerte. /// </summary> /// <param name="endDate">Date de fin.</param> /// <param name="filtre">Niveau d'alerte (NONE, WARNING, ERROR).</param> /// <param name="hyperCube">Hypercube contenant les données.</param> /// <param name="criteria">Critère de lecture de l'hypercube.</param> /// <returns>True si l'axe doit être affiché.</returns> private static bool IsShown(DateTime endDate, string filtre, IHyperCube hyperCube, CounterCubeCriteria criteria) { bool showIt = false; if ("NONE".Equals(filtre)) { showIt = true; } else { bool showWarning = "WARNING".Equals(filtre); ICube cube = hyperCube.GetCube(criteria.CreateCubeKey(endDate)); if (cube == null) { return(false); } foreach (ICounterDefinition counterDefinition in hyperCube.AllDefinitions) { ICounter counter = cube.GetCounter(counterDefinition.Code); if (counter == null) { continue; } // Par défaut, on n'affiche que le niveau critique double midValue = counter.GetValue(CounterStatType.Avg); showIt = (counterDefinition.CriticalThreshold >= 0 && midValue > counterDefinition.CriticalThreshold) || (showWarning && counterDefinition.WarningThreshold >= 0 && midValue > counterDefinition.WarningThreshold); if (showIt) { break; } } } return(showIt); }
/// <summary> /// Crée un axe en HTML. /// </summary> /// <param name="hyperCube">Cube.</param> /// <param name="context">Contexte.</param> /// <param name="writer">Writer HTML.</param> /// <param name="requestName">Nom de la requête.</param> /// <param name="activeCounters">Compteurs actifs.</param> /// <param name="odd">Parité.</param> /// <param name="axis">Axe.</param> /// <param name="criteria">Critères.</param> /// <param name="cube">Cube.</param> private static void CreateHtmlAxis(IHyperCube hyperCube, Context context, HtmlTextWriter writer, string requestName, Dictionary <string, string> activeCounters, bool odd, string axis, CounterCubeCriteria criteria, ICube cube) { writer.Write(HtmlPageRenderer.Indent); writer.WriteLine("<tr " + (odd ? "class=\"odd\"" : string.Empty) + '>'); writer.Write(HtmlPageRenderer.Indent2); writer.Write("<td class=\"monitoring\">"); Context localContext = context.Zoom(hyperCube.Name, axis); writer.Write(HtmlPageRenderer.GetLink(localContext, axis, !axis.Equals(requestName))); writer.WriteLine("</td>"); writer.Write(HtmlPageRenderer.Indent2); writer.Write("<td class=\"monitoring\" align=\"right\">"); double total = cube.GetCounter(Analytics.ElapsedTime).GetValue(CounterStatType.Total); writer.Write(Convert.ToString(total, CultureInfo.CurrentCulture)); writer.WriteLine("</td>"); writer.Write(HtmlPageRenderer.Indent2); double avg = cube.GetCounter(Analytics.ElapsedTime).GetValue(CounterStatType.Avg); writer.Write("<td class=\"monitoring\" align=\"right\" " + GetHtmlStyle(1000, 10000, avg) + '>'); writer.Write(string.Format(CultureInfo.CurrentCulture, "{0:0.##}", avg)); writer.WriteLine("</td>"); writer.Write(HtmlPageRenderer.Indent2); writer.Write("<td class=\"monitoring\" align=\"right\">"); double hits = cube.GetCounter(Analytics.ElapsedTime).GetValue(CounterStatType.Hits); writer.Write(Convert.ToString(hits, CultureInfo.CurrentCulture)); writer.WriteLine("</td>"); writer.Write(HtmlPageRenderer.Indent2); PrintChartSparkLines(hyperCube, new CounterCubeCriteria(axis, TimeLevel.Minute), writer, localContext); double midValue; foreach (ICounterDefinition counterDefinition in hyperCube.AllDefinitions) { if (activeCounters.ContainsKey(counterDefinition.Code)) { ICounter counter = hyperCube.GetCube(criteria.CreateCubeKey(context.EndDate)).GetCounter(counterDefinition.Code); midValue = (counter != null) ? counter.GetValue(CounterStatType.Avg) : 0; writer.Write(HtmlPageRenderer.Indent2); writer.Write("<td class=\"monitoring\" align=\"right\" " + GetHtmlStyle(counterDefinition, midValue) + '>'); writer.Write(string.Format(CultureInfo.CurrentCulture, "{0:0.##}", midValue)); writer.WriteLine("</td>"); } } writer.Write(HtmlPageRenderer.Indent); writer.WriteLine("</tr>"); }
/// <summary> /// Réalise le rendu d'un hypercube axe par axe. /// </summary> /// <param name="hyperCube">Hypercube contenant les valeurs.</param> /// <param name="context">Contexte de la requête.</param> /// <param name="writer">Writer HTML.</param> internal static void ToTable(IHyperCube hyperCube, Context context, HtmlTextWriter writer) { string requestName = context.GetRequestName(hyperCube.Name); List <string> axisList = GetAllAxis(context.EndDate, hyperCube, context.Sort); writer.WriteLine("<h2>Nombre de requêtes (" + axisList.Count + ")</h2>"); writer.Write("Filtre : "); writer.Write(HtmlPageRenderer.GetLink(context.ChangeFiltre("NONE"), "aucun", !"NONE".Equals(context.Filtre))); writer.Write(", "); writer.Write(HtmlPageRenderer.GetLink(context.ChangeFiltre("WARNING"), "warning", !"WARNING".Equals(context.Filtre))); writer.Write(", "); writer.WriteLine(HtmlPageRenderer.GetLink(context.ChangeFiltre(null), "critique", context.Filtre != null)); writer.WriteLine(string.Empty); writer.WriteLine("<table cellspacing=\"0\" cellpadding=\"3\" border=\"0\" width=\"100%\">"); writer.Write(HtmlPageRenderer.Indent); writer.WriteLine("<tr>"); writer.Write(HtmlPageRenderer.Indent2); writer.Write("<th>"); writer.Write(HtmlPageRenderer.GetLink(context.ChangeSort(null), "Requête", context.Sort != null)); writer.WriteLine("</th>"); writer.Write(HtmlPageRenderer.Indent2); writer.Write("<th>"); writer.Write(HtmlPageRenderer.GetLink(context.ChangeSort("TOTAL"), "total (ms)", !"TOTAL".Equals(context.Sort))); writer.WriteLine("</th>"); writer.Write(HtmlPageRenderer.Indent2); writer.Write("<th>"); writer.Write(HtmlPageRenderer.GetLink(context.ChangeSort(Analytics.ElapsedTime), "avg (ms)", !Analytics.ElapsedTime.Equals(context.Sort))); writer.WriteLine("</th>"); writer.Write(HtmlPageRenderer.Indent2); writer.Write("<th colspan='2'>"); writer.Write(HtmlPageRenderer.GetLink(context.ChangeSort("HITS"), "hits", !"HITS".Equals(context.Sort))); writer.WriteLine("</th>"); Dictionary <string, string> activeCounters = RenderLabels(writer, hyperCube, context, requestName); writer.Write(HtmlPageRenderer.Indent); writer.WriteLine("</tr>"); bool odd = true; foreach (string axis in axisList) { CounterCubeCriteria criteria = new CounterCubeCriteria(axis, TimeLevel.Hour); ICube cube = hyperCube.GetCube(criteria.CreateCubeKey(context.EndDate)); if (cube != null && IsShown(context.EndDate, context.Filtre, hyperCube, criteria)) { CreateHtmlAxis(hyperCube, context, writer, requestName, activeCounters, odd, axis, criteria, cube); odd = !odd; } } writer.WriteLine("</table>"); writer.WriteLine(string.Empty); writer.WriteLine("<a href=\"" + context.Export(hyperCube.Name).GetHandlerUrl() + "\">Exporter</a>"); }