public void Should_add_exception_data_to_event()
        {
            var builder = new HerculesEventBuilder();

            sink.Put(stream, Arg.Do <Action <IHerculesEventBuilder> >(x => x(builder)));

            var e = GetExceptionWithStacktrace();

            log.Log(new LogEvent(LogLevel.Info, DateTimeOffset.UtcNow, Guid.NewGuid().ToString(), e));

            var @event = builder.BuildEvent();

            var exception = @event.Tags[LogEventTagNames.Exception]?.AsContainer;

            var topFrame = exception?[ExceptionTagNames.StackFrames]?.AsVector.AsContainerList[0];

            topFrame?[StackFrameTagNames.Function]
            ?.AsString
            .Should()
            .Be(nameof(GetExceptionWithStacktrace));

            topFrame?[StackFrameTagNames.Type]
            ?.AsString
            .Should()
            .Be($"Vostok.Logging.Hercules.Tests.{GetType().Name}");

            @event.Tags[LogEventTagNames.StackTrace]?.AsString.Should().Contain("Vostok.Logging.Hercules.Tests");
        }
        public static HerculesEvent Build([NotNull] ISpan span, [CanBeNull] IFormatProvider formatProvider = null)
        {
            var builder = new HerculesEventBuilder();

            Build(span, builder, formatProvider);
            return(builder.BuildEvent());
        }
示例#3
0
        public void Should_extract_values()
        {
            var offset          = 10.Hours();
            var timestamp       = DateTimeOffset.Now.ToOffset(offset);
            var stackTrace      = Guid.NewGuid().ToString();
            var messageTemplate = Guid.NewGuid().ToString();
            var renderedMessage = Guid.NewGuid().ToString();
            var propKey         = "prop1";
            var propValue       = 2;

            var eventBuilder = new HerculesEventBuilder();

            eventBuilder
            .SetTimestamp(timestamp)
            .AddValue(LogEventTagNames.MessageTemplate, messageTemplate)
            .AddValue(LogEventTagNames.Message, renderedMessage)
            .AddValue(LogEventTagNames.StackTrace, stackTrace)
            .AddContainer(LogEventTagNames.Properties, b => b.AddValue(propKey, propValue))
            .AddContainer(LogEventTagNames.Exception, delegate {});

            var @event = eventBuilder.BuildEvent();

            var logEventData = new LogEventData(@event);

            logEventData.Timestamp.Should().Be(timestamp);
            logEventData.MessageTemplate.Should().Be(messageTemplate);
            logEventData.Message.Should().Be(renderedMessage);
            logEventData.StackTrace.Should().Be(stackTrace);
            logEventData.Properties.Should().NotBeNull();
            logEventData.Properties[propKey].AsInt.Should().Be(propValue);
            logEventData.Exception.Should().NotBeNull();
        }
        public static HerculesEvent ToEvent(this Action <IHerculesEventBuilder> eventBuilder)
        {
            var expectedEventBuilder = new HerculesEventBuilder();

            eventBuilder(expectedEventBuilder);
            return(expectedEventBuilder.BuildEvent());
        }
        public void Setup()
        {
            utcOffset = 3.Hours();

            timestamp = new DateTimeOffset(DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified), utcOffset);

            builder = new HerculesEventBuilder();
        }
        private static void CorruptEvent(Random random, HerculesEventBuilder builder)
        {
            if (random.Next(10) == 0)
            {
                builder.RemoveTags("tags");
            }

            if (random.Next(10) == 0)
            {
                builder.AddContainer("a", b => b.AddContainer("b", bb => bb.AddValue("value", "str")));
            }
        }
        public void Should_format_OperationContextValue_as_vector_of_strings()
        {
            var builder = new HerculesEventBuilder();

            sink.Put(stream, Arg.Do <Action <IHerculesEventBuilder> >(x => x(builder)));

            log
            .WithProperty(WellKnownProperties.OperationContext, new OperationContextValue(new[] { "op1", "{Name}", "op3" }))
            .Info("Hello {Name}!", "Vostok");

            var @event = builder.BuildEvent();

            var vector = @event.Tags[LogEventTagNames.Properties]?.AsContainer[WellKnownProperties.OperationContext]?.AsVector;

            vector?.AsStringList.Should().Equal("op1", "Vostok", "op3");
        }
        public void Should_save_SourceContextValue_as_vector_of_strings()
        {
            var builder = new HerculesEventBuilder();

            sink.Put(stream, Arg.Do <Action <IHerculesEventBuilder> >(x => x(builder)));

            log
            .ForContext("src1")
            .ForContext("src2")
            .Info("Hello!");

            var @event = builder.BuildEvent();

            var vector = @event.Tags[LogEventTagNames.Properties]?.AsContainer[WellKnownProperties.SourceContext]?.AsVector;

            vector?.AsStringList.Should().Equal("src1", "src2");
        }
        public void TestSetup()
        {
            originalSpan = Substitute.For <ISpan>();
            originalSpan.TraceId.Returns(Guid.NewGuid());
            originalSpan.SpanId.Returns(Guid.NewGuid());

            builder = new HerculesEventBuilder();

            @event = null;

            sink = Substitute.For <IHerculesSink>();
            sink
            .When(s => s.Put(Arg.Any <string>(), Arg.Any <Action <IHerculesEventBuilder> >()))
            .Do(info => info.Arg <Action <IHerculesEventBuilder> >().Invoke(builder));

            sender = new HerculesSpanSender(new HerculesSpanSenderSettings(sink, Guid.NewGuid().ToString()));
        }
示例#10
0
        private HerculesEvent TestSerialization(Action <IHerculesEventBuilder> build)
        {
            var memoryBuilder = new HerculesEventBuilder();

            memoryBuilder.SetTimestamp(defaultTimestamp);

            build(memoryBuilder);

            var memoryEvent = memoryBuilder.BuildEvent();

            var binaryWriter = new BinaryBufferWriter(16)
            {
                Endianness = Endianness.Big
            };

            binaryWriter.Write(3);

            for (var i = 0; i < 3; i++)
            {
                using (var binaryBuilder = new BinaryEventBuilder(binaryWriter, () => defaultTimestamp, Constants.EventProtocolVersion))
                {
                    build(binaryBuilder);
                }
            }

            var events = EventsBinaryReader.Read(binaryWriter.Buffer, 0, _ => new HerculesEventBuilderGeneric(), new SynchronousConsoleLog());

            events.Count.Should().Be(3);
            events.Should().AllBeEquivalentTo(memoryEvent);

            var dummyEvents = EventsBinaryReader.Read(binaryWriter.Buffer, 0, b => DummyEventBuilder.Instance, new SynchronousConsoleLog());

            dummyEvents.Count.Should().Be(3);

            return(events.Last());
        }
        public void Should_correctly_build_events_from_buffer()
        {
            var management = Hercules.Instance.Management;

            management.CreateStream(
                new CreateStreamQuery(streamName)
            {
                ShardingKey = new[] { "hash" },
                Partitions  = 1
            },
                timeout);

            var events = new List <HerculesEvent>();
            var random = new Random();

            for (var i = 0; i < 1000; i++)
            {
                var tags = MetricTags.Empty
                           .Append("common", "value")
                           .Append("id", (i % 10).ToString());

                var @event = new MetricEvent(
                    i,
                    tags,
                    DateTimeOffset.UtcNow,
                    WellKnownUnits.Milliseconds,
                    WellKnownAggregationTypes.Counter,
                    new Dictionary <string, string>
                {
                    ["common-param"] = "param",
                    ["id-param"]     = (i % 10).ToString()
                });

                var builder = new HerculesEventBuilder();
                HerculesEventMetricBuilder.Build(@event, builder);

                CorruptEvent(random, builder);

                events.Add(builder.BuildEvent());
            }

            Hercules.Instance.Gate.Insert(new InsertEventsQuery(streamName, events), timeout).EnsureSuccess();

            var actual = Hercules.Instance.MetricsStream.Read(new ReadStreamQuery(streamName), timeout).Payload.Events;

            var expected = new List <MetricEvent>();

            foreach (var @event in events)
            {
                try
                {
                    expected.Add(HerculesMetricEventFactory.CreateFrom(@event));
                }
                // ReSharper disable once EmptyGeneralCatchClause
                catch (Exception)
                {
                }
            }

            actual.Should().BeEquivalentTo(expected);
        }