public void MultipleValueLogEventsIncludesProperties()
        {
            using (TestCorrelator.CreateContext())
            {
                var options = new SerilogMetricsReporterOptions {
                    LogEventLevel = LogEventLevel.Verbose
                };
                var writer     = new SerilogMetricSnapshotWriter(options);
                var columns    = new [] { "A", "B", "C" };
                var values     = new object[] { 1, 2, 3 };
                var metricTags = MetricTags.FromSetItemString("foo:10,bar:20");

                writer.Write("context", "name", columns, values, metricTags, DateTime.UtcNow);

                var tagsProperty = metricTags.Keys.Zip(metricTags.Values, (key, value) =>
                                                       new KeyValuePair <ScalarValue, LogEventPropertyValue>(
                                                           new ScalarValue(key), new ScalarValue(value)));

                var properties = new Dictionary <string, LogEventPropertyValue>()
                {
                    { "context", new ScalarValue("context") },
                    { "name", new ScalarValue("name") },
                    { "A", new ScalarValue(1) },
                    { "B", new ScalarValue(2) },
                    { "C", new ScalarValue(3) },
                    { "tags", new DictionaryValue(tagsProperty) }
                };

                TestCorrelator.GetLogEventsFromCurrentContext()
                .Should().ContainSingle()
                .Which.Properties.Should().BeEquivalentTo(properties);
            }
        }
        public void FlushIntervalMustBeGreaterThanZero()
        {
            var options = new SerilogMetricsReporterOptions
            {
                FlushInterval = TimeSpan.MinValue
            };

            // ReSharper disable once ObjectCreationAsStatement
            Action constructor = () => new SerilogMetricsReporter(options);

            constructor.Should().Throw <ArgumentException>();
        }
        public void UsesFilterFromOptions()
        {
            var filter = Mock.Of <IFilterMetrics>();

            var options = new SerilogMetricsReporterOptions
            {
                Filter = filter
            };

            var reporter = new SerilogMetricsReporter(options);

            reporter.Filter.Should().BeSameAs(filter);
        }
        public void UsesFlushIntervalFromOptions()
        {
            var tenSeconds = TimeSpan.FromSeconds(10);

            var options = new SerilogMetricsReporterOptions
            {
                FlushInterval = tenSeconds
            };

            var reporter = new SerilogMetricsReporter(options);

            reporter.FlushInterval.Should().Be(tenSeconds);
        }
        public void SingleValueLogEventsAreWrittenAtSpecifiedLevel(LogEventLevel logEventLevel)
        {
            using (TestCorrelator.CreateContext())
            {
                var options = new SerilogMetricsReporterOptions {
                    LogEventLevel = logEventLevel
                };
                var writer = new SerilogMetricSnapshotWriter(options);
                writer.Write("context", "name", 123, MetricTags.Empty, DateTime.UtcNow);

                TestCorrelator.GetLogEventsFromCurrentContext()
                .Should().ContainSingle()
                .Which.Level.Should().Be(logEventLevel);
            }
        }
        /// <summary>
        ///     Add the <see cref="SerilogMetricsReporter" /> allowing metrics to be reported to Serilog.
        /// </summary>
        /// <param name="metricReporterProviderBuilder">
        ///     The <see cref="IMetricsReportingBuilder" /> used to configure metrics reporters.
        /// </param>
        /// <param name="setupAction">The Serilog reporting options to use.</param>
        /// <returns>
        ///     An <see cref="IMetricsBuilder" /> that can be used to further configure App Metrics.
        /// </returns>
        public static IMetricsBuilder ToSerilog(
            this IMetricsReportingBuilder metricReporterProviderBuilder,
            Action <SerilogMetricsReporterOptions> setupAction)
        {
            if (metricReporterProviderBuilder == null)
            {
                throw new ArgumentNullException(nameof(metricReporterProviderBuilder));
            }

            var options = new SerilogMetricsReporterOptions();

            setupAction?.Invoke(options);

            var reporter = new SerilogMetricsReporter(options);

            return(metricReporterProviderBuilder.Using(reporter));
        }
        public void SingleValueLogEventsAreWrittenAtSpecifiedTime()
        {
            using (TestCorrelator.CreateContext())
            {
                var options = new SerilogMetricsReporterOptions {
                    LogEventLevel = LogEventLevel.Verbose
                };
                var writer    = new SerilogMetricSnapshotWriter(options);
                var timestamp = DateTime.UtcNow;

                writer.Write("context", "name", "value", 123, MetricTags.Empty, timestamp);

                TestCorrelator.GetLogEventsFromCurrentContext()
                .Should().ContainSingle()
                .Which.Timestamp.Should().Be(timestamp);
            }
        }
        public void SingleValueLogEventsUseMessageTemplate()
        {
            using (TestCorrelator.CreateContext())
            {
                var options = new SerilogMetricsReporterOptions
                {
                    LogEventLevel    = LogEventLevel.Verbose,
                    MessageTemplates = { Fallback = "Metric {name} in context {context}" }
                };
                var writer    = new SerilogMetricSnapshotWriter(options);
                var timestamp = DateTime.UtcNow;

                writer.Write("context", "name", 123, MetricTags.Empty, timestamp);

                TestCorrelator.GetLogEventsFromCurrentContext()
                .Should().ContainSingle()
                .Which.RenderMessage().Should().Be("Metric \"name\" in context \"context\"");
            }
        }
        public void MultipleValueLogEventsUseMessageTemplate()
        {
            using (TestCorrelator.CreateContext())
            {
                var options = new SerilogMetricsReporterOptions
                {
                    LogEventLevel    = LogEventLevel.Verbose,
                    MessageTemplates = { Fallback = "Metric {name} in context {context}" }
                };
                var writer  = new SerilogMetricSnapshotWriter(options);
                var columns = new [] { "A", "B", "C" };
                var values  = new object[] { 1, 2, 3 };

                writer.Write("context", "name", columns, values, MetricTags.Empty, DateTime.UtcNow);

                TestCorrelator.GetLogEventsFromCurrentContext()
                .Should().ContainSingle()
                .Which.RenderMessage().Should().Be("Metric \"name\" in context \"context\"");
            }
        }
 public SerilogMetricsReporterOptionsTests()
 {
     _options = new SerilogMetricsReporterOptions();
 }