public void SeqDestructureCustomObject() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var testObject = new TestObject() { X = 1.2, Y = 3.4 }; var structuredData = new StructuredData("{@a}", testObject); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"{@a}\""); StringAssert.Contains(requestBody, "\"a\":{\"X\":1.2,\"Y\":3.4}"); }
public void SeqHandlesEventFromTraceSource() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); TraceSource source = new TraceSource("seq1Source"); var listener = source.Listeners.OfType <SeqTraceListener>().First(); listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; source.TraceEvent(TraceEventType.Warning, 2, "{0}-{1}", 3, "B"); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; Assert.AreEqual("POST", request.Method); Assert.AreEqual("application/json; charset=utf-8", request.ContentType); Assert.AreEqual("http://127.0.0.1:5341/api/events/raw", request.Uri); Assert.AreEqual(1, request.Headers.Count); var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "seq1Source"); StringAssert.Contains(requestBody, "{0}-{1}"); }
public void SeqStructuredArray() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var structuredData = new StructuredData("{a}", new [] { 1, 2, 3 }); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"{a}\""); StringAssert.Contains(requestBody, "\"a\":[1,2,3]"); }
public void SeqIgnoresStructuredDictionaryWhenTurnedOff() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; listener.ProcessDictionaryData = false; var dictionaryData = new Dictionary <string, object>() { { "MessageTemplate", "{a}" }, { "a", 1 } }; listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, dictionaryData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); var regexTemplateData = new Regex("\"MessageTemplate\":\"{Data}\""); StringAssert.Matches(requestBody, regexTemplateData); var regexData = new Regex("\"Data\":"); StringAssert.Matches(requestBody, regexData); }
public void SeqHandlesStructuredDataProperties() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var structuredData = new StructuredData(new Dictionary <string, object>() { { "a", 1 } }, "{a}"); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"{a}\""); StringAssert.Contains(requestBody, "\"a\":1"); var regexEvent1 = new Regex("\"EventId\":1"); StringAssert.Matches(requestBody, regexEvent1); }
public void SeqTraceOptionsAndAdditionalProperties() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); TraceSource source = new TraceSource("seq3Source"); var listener = source.Listeners.OfType <SeqTraceListener>().First(); listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; source.TraceEvent(TraceEventType.Information, 1, "TestMessage"); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "ThreadId"); StringAssert.Contains(requestBody, "ProcessId"); StringAssert.Contains(requestBody, "MachineName"); }
public void SeqStructuredChildArray() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var list1 = new ArrayList() { 1, "A" }; var dictionary2 = new Dictionary <string, object>() { { "x", 2 }, { "y", list1 } }; var structuredData = new StructuredData("{a}", dictionary2); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"{a}\""); StringAssert.Contains(requestBody, "\"a\":{\"x\":2,\"y\":[1,\"A\"]}"); }
public void SeqHandlesBasicEvent() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; listener.TraceEvent(null, "TestSource", TraceEventType.Warning, 1, "Test Message"); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; Assert.AreEqual("POST", request.Method); Assert.AreEqual("application/json; charset=utf-8", request.ContentType); Assert.AreEqual("http://testuri/api/events/raw", request.Uri); Assert.AreEqual(0, request.Headers.Count); var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "TestSource"); StringAssert.Contains(requestBody, "Test Message"); }
public void SeqStructuredCustomObject() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var structuredData = new StructuredData("{a}", new TestObject()); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"{a}\""); // Note that the '\' is encoded as '\\' StringAssert.Contains(requestBody, @"""a"":""w=x\\y'z"""); }
public void SeqBatchErrorResponseShouldRetry() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.RequestTimeout, null) ); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 5; listener.BatchTimeout = TimeSpan.FromMilliseconds(500); listener.MaxRetries = 5; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; listener.TraceEvent(null, "TestSource", TraceEventType.Warning, 1, "Test Message 1"); Thread.Sleep(100); listener.TraceEvent(null, "TestSource", TraceEventType.Information, 2, "Test Message 2"); Thread.Sleep(100); // Before batch timeout, should have only received one Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request0Body = mockRequestFactory.RequestsCreated[0].RequestBody; Console.WriteLine(request0Body); // After batch timeout, should have two requests (second got error response) Thread.Sleep(500); Assert.AreEqual(2, mockRequestFactory.RequestsCreated.Count); var request1Body = mockRequestFactory.RequestsCreated[1].RequestBody; Console.WriteLine(request1Body); // After retry timeout, should have three requests Thread.Sleep(1200); Assert.AreEqual(3, mockRequestFactory.RequestsCreated.Count); var request2Body = mockRequestFactory.RequestsCreated[2].RequestBody; Console.WriteLine(request2Body); Assert.AreEqual(request1Body, request2Body); // Let background thread finish Thread.Sleep(1000); }
public void SeqStructuredDataOverrides() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.TraceOutputOptions = TraceOptions.LogicalOperationStack; listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var structuredData = new StructuredData(new Dictionary <string, object>() { { "LogicalOperationStack", "A" } }); try { Trace.CorrelationManager.StartLogicalOperation("X"); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); } finally { Trace.CorrelationManager.StopLogicalOperation(); } // NOTE: Not sure if structured data should override trace options or the other way around. // Structured Data override -- allows per-trace specific values // Trace Option override -- allows dummy value to be passed in with templateMessage and then overriden by listener // (there are work arounds; e.g. pass property collection instead of template values) Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "TestSource"); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"\""); var regexStackA = new Regex("\"LogicalOperationStack\":\"A\""); StringAssert.Matches(requestBody, regexStackA); var regexStackX = new Regex("\"LogicalOperationStack\":\\[\"X\"\\]"); StringAssert.DoesNotMatch(requestBody, regexStackX); }
public void SeqStructuredRecursiveDictionaryShouldStop() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var dictionary1 = new Dictionary <string, object>() { { "A", 1 } }; var dictionary2 = new Dictionary <string, object>() { { "X", 2 }, { "Y", dictionary1 } }; dictionary1.Add("B", dictionary2); var structuredData = new StructuredData("{a}|{b}", dictionary1, dictionary2); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"{a}|{b}\""); StringAssert.Contains(requestBody, "\"a\":{\"A\":1,\"B\":{\"X\":2,\"Y\":\"System.Collections.Generic.Dictionary`2[System.String,System.Object]\"}}"); StringAssert.Contains(requestBody, "\"b\":{\"X\":2,\"Y\":{\"A\":1,\"B\":\"System.Collections.Generic.Dictionary`2[System.String,System.Object]\"}}"); }
public void SeqHandlesDictionaryOperationAsProperties() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var dictionaryData = new Dictionary <string, object>() { { "a", 1 } }; Trace.CorrelationManager.StartLogicalOperation(dictionaryData); listener.TraceEvent(null, "TestSource", TraceEventType.Warning, 1, "x{0}", "y"); Trace.CorrelationManager.StopLogicalOperation(); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"x{0}\""); StringAssert.Contains(requestBody, "\"0\":\"y\""); StringAssert.Contains(requestBody, "\"a\":1"); var regexData = new Regex("\"Data\":"); StringAssert.DoesNotMatch(requestBody, regexData); var regexStack = new Regex("\"LogicalOperationStack\":"); StringAssert.DoesNotMatch(requestBody, regexStack); }
public void SeqStructuredTraceOptionsInMessage() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.TraceOutputOptions = TraceOptions.LogicalOperationStack; listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var structuredData = new StructuredData("x{LogicalOperationStack}"); try { Trace.CorrelationManager.StartLogicalOperation("X"); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); } finally { Trace.CorrelationManager.StopLogicalOperation(); } Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"x{LogicalOperationStack}\""); var regexStackX = new Regex("\"LogicalOperationStack\":\\[\"X\"\\]"); StringAssert.Matches(requestBody, regexStackX); }
public void SeqStructuredRecursiveArrayShouldStop() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 0; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; var list1 = new ArrayList() { 1 }; var list2 = new ArrayList() { 2, list1 }; list1.Add(list2); var structuredData = new StructuredData("{a}|{b}", list1, list2); listener.TraceData(null, "TestSource", TraceEventType.Warning, 1, structuredData); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); var request = mockRequestFactory.RequestsCreated[0]; var requestBody = request.RequestBody; Console.WriteLine(requestBody); StringAssert.Contains(requestBody, "\"MessageTemplate\":\"{a}|{b}\""); StringAssert.Contains(requestBody, "\"a\":[1,[2,\"System.Collections.ArrayList\"]]"); StringAssert.Contains(requestBody, "\"b\":[2,[1,\"System.Collections.ArrayList\"]]"); }
public void SeqBatchFirstMessageSentImmediately() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 5; listener.BatchTimeout = TimeSpan.FromMilliseconds(500); listener.MaxRetries = 5; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; listener.TraceEvent(null, "TestSource", TraceEventType.Warning, 1, "Test Message"); // Although immediate, it is still async, so need to sleep thread Thread.Sleep(200); Assert.AreEqual(1, mockRequestFactory.RequestsCreated.Count); // Let background thread finish Thread.Sleep(1000); }
public void SeqBatchErrorAbandonAfterMaxRetries() { var mockRequestFactory = new MockHttpWebRequestFactory(); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.RequestTimeout, null) ); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.RequestTimeout, null) ); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.RequestTimeout, null) ); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.RequestTimeout, null) ); mockRequestFactory.ResponseQueue.Enqueue( new MockHttpWebResponse(HttpStatusCode.OK, null) ); var listener = new SeqTraceListener("http://testuri"); listener.BatchSize = 5; listener.BatchTimeout = TimeSpan.FromMilliseconds(500); listener.MaxRetries = 3; listener.BatchSender.HttpWebRequestFactory = mockRequestFactory; // First batch (okay) listener.TraceEvent(null, "TestSource", TraceEventType.Warning, 1, "Test Message 1"); Thread.Sleep(100); // Second batch (fail, plus 3 retry fails) listener.TraceEvent(null, "TestSource", TraceEventType.Information, 2, "Poison Message 2"); Thread.Sleep(600); // Wait (above) for the batch to have started listener.TraceEvent(null, "TestSource", TraceEventType.Warning, 3, "Test Message 3"); Thread.Sleep(100); // By now should have two requests (second got error response) Assert.AreEqual(2, mockRequestFactory.RequestsCreated.Count); var request0Body = mockRequestFactory.RequestsCreated[0].RequestBody; Console.WriteLine(request0Body); var request1Body = mockRequestFactory.RequestsCreated[1].RequestBody; Console.WriteLine(request1Body); // Three retries after 500, 1000, and 2000 ms, plus the 6th should have succeeded Thread.Sleep(3500); Assert.AreEqual(6, mockRequestFactory.RequestsCreated.Count); var request4Body = mockRequestFactory.RequestsCreated[4].RequestBody; Console.WriteLine(request4Body); var request5Body = mockRequestFactory.RequestsCreated[5].RequestBody; Console.WriteLine(request5Body); Assert.AreEqual(request1Body, request4Body); StringAssert.Contains(request0Body, "Test Message 1"); StringAssert.Contains(request1Body, "Poison Message 2"); StringAssert.Contains(request5Body, "Test Message 3"); // Let background thread finish Thread.Sleep(1000); }