private dynamic GetSeries(IMetricRegistry metricRegistry, IMetricAggregator metricAggregator, ExpressionCompiler expressionCompiler) { try { var model = new SeriesQueryModel(); this.BindTo(model, new BindingConfig { BodyOnly = false }); var now = DateTime.UtcNow; var from = DateTimeParser.ParseDateTime(model.From, now, now.AddHours(-1)); var until = DateTimeParser.ParseDateTime(model.Until, now, now); var environment = new Statsify.Core.Expressions.Environment { MetricRegistry = metricRegistry, QueuedMetricDatapoints = metricAggregator.Queue }; var evalContext = new EvalContext(@from, until); var metrics = new List <Core.Model.Metric>(); foreach (var expression in model.Expression.Select(HttpUtility.UrlDecode)) { var e = expressionCompiler.Parse(expression).Single(); if (e is MetricSelectorExpression) { e = new EvaluatingMetricSelectorExpression(e as MetricSelectorExpression); } // if var r = (Core.Model.Metric[])e.Evaluate(environment, evalContext); metrics.AddRange(r); } // foreach var seriesViewList = metrics. Select(m => new SeriesView { Target = m.Name, Datapoints = m.Series.Datapoints. Select(d => new[] { d.Value, d.Timestamp.ToUnixTimestamp() }). ToArray() }). ToArray(); return(Response.AsJson(seriesViewList)); } catch (Exception e) { return(Response.AsJson(new { e.Message, e.StackTrace }, HttpStatusCode.InternalServerError)); } }
public void Parse() { var sources = new[] { "summarize(alias_by_fragment(ema(servers.srv-aps3.system.processor.{total*,user*}, 50), 2, 4), 'sum', '1d', false)", "sort_by_name(alias_by_fragment(summarize(servers.*.system.processor.total_time, \"max\", \"10m\"), 1, 4))" }; const int N = 10000; var expressionCompiler = new ExpressionCompiler(); var expressions = expressionCompiler.Parse(sources[0]).ToList(); var stopwatch = Stopwatch.StartNew(); for (var n = 0; n < N; ++n) { foreach (var source in sources) { expressions = expressionCompiler.Parse(source).ToList(); } } Console.WriteLine(stopwatch.Elapsed); }