protected override async Task <int> Run() { var connection = _connectionFactory.Connect(_connection); if (!_deleteAllEvents) { Log.Error("The `delete-all-events` option must be specified"); return(1); } if (_afterDuration == null) { Log.Error("A duration must be specified using `after`"); return(1); } var duration = DurationMoniker.ToTimeSpan(_afterDuration); var policy = await connection.RetentionPolicies.TemplateAsync(); policy.RetentionTime = duration; policy = await connection.RetentionPolicies.AddAsync(policy); _output.WriteEntity(policy); return(0); }
public void MonikersAreParsedAndFormatted(string duration, long equivalentMilliseconds) { var ts = DurationMoniker.ToTimeSpan(duration); Assert.Equal(TimeSpan.FromMilliseconds(equivalentMilliseconds), ts); var dm = DurationMoniker.FromTimeSpan(ts); Assert.Equal(duration, dm); }
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); }