Example #1
0
        protected override async Task <int> Run()
        {
            if (string.IsNullOrWhiteSpace(_query))
            {
                Log.Error("A query must be specified");
                return(1);
            }

            var connection = _connectionFactory.Connect(_connection);

            var timeout = _timeoutMS.HasValue ? TimeSpan.FromMilliseconds(_timeoutMS.Value) : (TimeSpan?)null;

            if (timeout != null)
            {
                // The timeout is applied server-side; allowing an extra 10 seconds here means that the
                // user experience will be consistent - the error message will be the server's message, etc.
                connection.Client.HttpClient.Timeout = timeout.Value.Add(TimeSpan.FromSeconds(10));
            }

            if (_output.Json)
            {
                var result = await connection.Data.QueryAsync(_query, _range.Start, _range.End, _signal.Signal, timeout : timeout);

                // Some friendlier JSON output is definitely possible here
                Console.WriteLine(JsonConvert.SerializeObject(result));
            }
            else
            {
                var result = await connection.Data.QueryCsvAsync(_query, _range.Start, _range.End, _signal.Signal, timeout : timeout);

                _output.WriteCsv(result);
            }

            return(0);
        }
Example #2
0
        protected override async Task <int> Run()
        {
            if (string.IsNullOrWhiteSpace(_query))
            {
                Log.Error("A query must be specified");
                return(1);
            }

            var connection = _connectionFactory.Connect(_connection);
            var timeout    = _timeoutMS.HasValue ? TimeSpan.FromMilliseconds(_timeoutMS.Value) : (TimeSpan?)null;

            if (_output.Json)
            {
                var result = await connection.Data.QueryAsync(_query, _range.Start, _range.End, _signal.Signal, timeout : timeout);

                // Some friendlier JSON output is definitely possible here
                Console.WriteLine(JsonConvert.SerializeObject(result));
            }
            else
            {
                var result = await connection.Data.QueryCsvAsync(_query, _range.Start, _range.End, _signal.Signal, timeout : timeout);

                _output.WriteCsv(result);
            }

            return(0);
        }
Example #3
0
        protected override async Task <int> Run()
        {
            if (string.IsNullOrWhiteSpace(_query))
            {
                Log.Error("A query must be specified");
                return(1);
            }

            var connection = _connectionFactory.Connect(_connection);

            // The `rangeStartUtc` parameter of `Query[Csv]Async()` should now be optional; we can
            // remove the `.Value` when _Seq.Api_ is updated to reflect this.
            // ReSharper disable once PossibleInvalidOperationException
            if (_output.Json)
            {
                var result = await QueryAsync(connection, _query, _range.Start, _range.End, _signal.Signal, _timeoutMS);

                Console.WriteLine(result);
            }
            else
            {
                var result = await QueryAsync(connection, _query, _range.Start, _range.End, _signal.Signal, _timeoutMS, "text/csv");

                _output.WriteCsv(result);
            }

            return(0);
        }
Example #4
0
        protected override async Task <int> Run()
        {
            var connection = _connectionFactory.Connect(_connection);

            if (_id == null)
            {
                Log.Error("A dashboard id is required");
                return(1);
            }

            if (_chartTitle == null)
            {
                Log.Error("A chart name is required");
                return(1);
            }

            if (_range.Start == null && _range.End != null ||
                _range.End == null && _range.Start != null)
            {
                Log.Error("If `--start` or `--end` is specified, both must be specified");
                return(1);
            }

            if (_lastDuration == null && _range.Start == null)
            {
                Log.Error("A `--last` duration, or range `--start` and `--end`, is required");
                return(1);
            }

            if (_lastDuration != null && _range.Start != null)
            {
                Log.Error("Only one of either `--last` or a `--start`/`--end` range can be specified");
                return(1);
            }

            var dashboard = await connection.Dashboards.FindAsync(_id);

            var charts = dashboard.Charts.Where(c => c.Title == _chartTitle).ToArray();

            if (charts.Length == 0)
            {
                Log.Error("No matching chart was found");
                return(1);
            }

            if (charts.Length > 1)
            {
                Log.Error("More than one matching chart was found");
                return(1);
            }

            var chart = charts.Single();
            var query = chart.Queries.Single();

            var signal = Intersect(
                _signal.Signal,
                dashboard.SignalExpression,
                chart.SignalExpression,
                query.SignalExpression);

            TimeSpan?timeGrouping = null;

            if (_intervalDuration != null)
            {
                timeGrouping = DurationMoniker.ToTimeSpan(_intervalDuration);
            }

            DateTime rangeStart, rangeEnd;

            if (_range.Start.HasValue)
            {
                rangeStart = _range.Start.Value;
                // ReSharper disable once PossibleInvalidOperationException
                rangeEnd = _range.End.Value;
            }
            else
            {
                // Note, this is local time.
                rangeEnd = DateTime.Now;
                var last = DurationMoniker.ToTimeSpan(_lastDuration);
                rangeStart = rangeEnd - last;
                if (timeGrouping.HasValue)
                {
                    if (timeGrouping.Value >= TimeSpan.FromDays(1))
                    {
                        rangeStart = new DateTime(rangeStart.Year, rangeStart.Month, rangeStart.Day, 0, 0, 0, DateTimeKind.Local);
                    }
                    else if (timeGrouping.Value >= TimeSpan.FromHours(1))
                    {
                        rangeStart = new DateTime(rangeStart.Year, rangeStart.Month, rangeStart.Day, rangeStart.Hour, 0, 0, DateTimeKind.Local);
                    }
                    else if (timeGrouping.Value >= TimeSpan.FromMinutes(1))
                    {
                        rangeStart = new DateTime(rangeStart.Year, rangeStart.Month, rangeStart.Day, rangeStart.Hour, rangeStart.Minute, 0, DateTimeKind.Local);
                    }
                    else
                    {
                        rangeStart = new DateTime(rangeStart.Year, rangeStart.Month, rangeStart.Day, rangeStart.Hour, rangeStart.Minute, rangeStart.Second, DateTimeKind.Local);
                    }
                }
            }

            var q = BuildSqlQuery(query, rangeStart, rangeEnd, timeGrouping);

            var timeout = _timeout.ApplyTimeout(connection.Client.HttpClient);

            if (_output.Json)
            {
                var result = await connection.Data.QueryAsync(q, signal : signal, timeout : timeout);

                // Some friendlier JSON output is definitely possible here
                Console.WriteLine(JsonConvert.SerializeObject(result));
            }
            else
            {
                var result = await connection.Data.QueryCsvAsync(q, signal : signal, timeout : timeout);

                _output.WriteCsv(result);
            }

            return(0);
        }