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"));
        }
Пример #3
0
        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>());
        }
Пример #5
0
        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");
            }
        }