public void TestNumberReader() { var reader = ColumnReaders.NumberReader("foo"); var m = new ParsedMetrics(new LabelDict("env")); reader(m, "1"); Assert.That(m.Metrics, Has.Exactly(1).Items); Assert.That(m.Metrics, Contains.Key("foo")); Assert.That(m.Metrics, Contains.Value(1.0)); Assert.That(m.Labels.Count, Is.EqualTo(0)); reader(m, "2.0"); Assert.That(m.Metrics, Has.Exactly(1).Items); Assert.That(m.Metrics, Contains.Key("foo")); Assert.That(m.Metrics, Contains.Value(2.0)); Assert.That(m.Labels.Count, Is.EqualTo(0)); reader(m, "2.0e1"); Assert.That(m.Metrics, Has.Exactly(1).Items); Assert.That(m.Metrics, Contains.Key("foo")); Assert.That(m.Metrics, Contains.Value(20.0)); Assert.That(m.Labels.Count, Is.EqualTo(0)); Assert.That(() => reader(m, ""), Throws.TypeOf <ParserError>()); Assert.That(() => reader(m, "nope"), Throws.TypeOf <ParserError>()); }
public void TestLabelReader() { var reader = ColumnReaders.LabelReader("foo"); var m = new ParsedMetrics(new LabelDict("env")); reader(m, "bar"); Assert.That(m.Metrics, Is.Empty); Assert.That(m.Labels.Count, Is.EqualTo(1)); Assert.That(m.Labels.Get("foo"), Is.EqualTo("bar")); }
private ParsedMetrics ConvertCsvLine(ICsvReaderRow line, LabelDict labels) { if (_readers.Count != line.Count) { throw new ParserError(); } var result = new ParsedMetrics(labels); foreach (var(reader, column) in _readers.Zip(line, (a, b) => new KeyValuePair <ColumnReader, string>(a, b))) { reader?.Invoke(result, column); } return(result); }
public void TestRequestHeaderReader() { var reader = ColumnReaders.RequestHeaderReader(); var m = new ParsedMetrics(new LabelDict("env")); reader(m, "POST /uri HTTP/1.1"); Assert.That(m.Metrics, Is.Empty); Assert.That(m.Labels.Count, Is.EqualTo(3)); Assert.That(m.Labels.Get(ColumnReaders.RequestMethod), Is.EqualTo("POST")); Assert.That(m.Labels.Get(ColumnReaders.RequestUri), Is.EqualTo("/uri")); Assert.That(m.Labels.Get(ColumnReaders.RequestHttpVersion), Is.EqualTo("HTTP/1.1")); reader(m, "GET /res?foo=bar HTTP/1.0"); Assert.That(m.Metrics, Is.Empty); Assert.That(m.Labels.Count, Is.EqualTo(3)); Assert.That(m.Labels.Get(ColumnReaders.RequestMethod), Is.EqualTo("GET")); Assert.That(m.Labels.Get(ColumnReaders.RequestUri), Is.EqualTo("/res")); Assert.That(m.Labels.Get(ColumnReaders.RequestHttpVersion), Is.EqualTo("HTTP/1.0")); Assert.That(() => reader(m, "a"), Throws.TypeOf <ParserError>()); Assert.That(() => reader(m, "a b"), Throws.TypeOf <ParserError>()); Assert.That(() => reader(m, "a b c"), Throws.Nothing); Assert.That(() => reader(m, "a b c d"), Throws.TypeOf <ParserError>()); }
private IEnumerable <ParsedMetrics> ReadAll(int msTimeout, CancellationToken cancellationToken, char quotes = '"', char columnSeparator = ' ') { using (var sshStream = new SSHStream(_stream)) using (var parser = new CsvReader(sshStream, Encoding.UTF8, new CsvReader.Config { Quotes = quotes, ColumnSeparator = columnSeparator, WithQuotes = false, ReadinBufferSize = 64 })) { while (_stream.CanRead && !cancellationToken.IsCancellationRequested) { ParsedMetrics result = null; try { var task = parser.MoveNextAsync(cancellationToken); if (!task.Wait(msTimeout, cancellationToken)) { throw new StreamStarvationException(); } if (task.Result) { result = ConvertCsvLine(parser.Current, _envLabel); } } catch (StreamStarvationException) { throw; } catch (ParserError) { } catch (OperationCanceledException) { Logger.Info("Parser cancellation requested"); break; } catch (Exception ex) { Logger.Fatal(ex, $"Unexpected exception: {ex.Message}"); } yield return(result); MetricBase.SSHBytesIn.WithLabels(_envLabel).Add(sshStream.TotalRead); sshStream.TotalRead = 0; } MetricBase.SSHBytesIn.WithLabels(_envLabel).Add(sshStream.TotalRead); sshStream.TotalRead = 0; } if (!_stream.CanRead) { Logger.Info("End of stream"); } else if (cancellationToken.IsCancellationRequested) { Logger.Info("Thread termination requested"); } else { Logger.Warn("Unknown reason for parsing cancellation"); } }