public async Task PayloadSentWithBearerToken() { var isRequestFinished = new TaskCompletionSource <object>(); AuthenticationHeaderValue authHeader = null; var handler = new MockHttpMessageHandler((r, c) => { authHeader = r.Headers.Authorization; isRequestFinished.SetResult(null); return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK))); }); const string secretToken = "SecretToken"; var logger = new NoopLogger(); var payloadSender = new PayloadSenderV2(logger, new TestAgentConfigurationReader(logger, secretToken: secretToken), Service.GetDefaultService(new TestAgentConfigurationReader(logger), logger), new Api.System(), handler); using (var agent = new ApmAgent(new TestAgentComponents(payloadSender: payloadSender, configurationReader: new TestAgentConfigurationReader(secretToken: secretToken)))) { agent.PayloadSender.QueueTransaction(new Transaction(agent, "TestName", "TestType")); } await isRequestFinished.Task; authHeader.Should().NotBeNull(); authHeader.Scheme.Should().Be("Bearer"); authHeader.Parameter.Should().Be(secretToken); }
public void SetUpForAllMetrics() { var noopLogger = new NoopLogger(); var mockPayloadSender = new MockPayloadSender(); _metricsCollector = new MetricsCollector(noopLogger, mockPayloadSender, new ConfigurationStore(new MockConfiguration(noopLogger), noopLogger)); }
public void DefaultAgentSetup() { var noopLogger = new NoopLogger(); _agent = new ApmAgent(new AgentComponents(payloadSender: new MockPayloadSender(), logger: noopLogger, configurationReader: new MockConfigSnapshot(noopLogger))); }
public Settings() { PushTimeout = TimeSpan.FromSeconds(10); ChannelRejoinTimeout = TimeSpan.FromSeconds(1); #if DEBUG Logger = new ConsoleLogger(); #else Logger = new NoopLogger(); #endif ReconnectionDelay = Consts.DefaultReconnectionDelay; QueueTimeout = Consts.DefaultQueueTimeout; OperationTimeout = Consts.DefaultOperationTimeout; OperationTimeoutCheckPeriod = Consts.DefaultOperationTimeoutCheckPeriod; HeartbeatInterval = TimeSpan.FromSeconds(10); HeartbeatTimeout = TimeSpan.FromSeconds(4); FailOnNoServerResponse = false; MaxConcurrentItems = 5000; MaxReconnections = Int32.MaxValue; MaxRetries = 2; MaxQueueSize = 5000; }
public void CollectAllMetrics_ShouldNotDisableProvider_WhenAnyValueIsSamplesIsValid() { const int iterations = MetricsCollector.MaxTryWithoutSuccess * 2; // Arrange var logger = new NoopLogger(); var mockPayloadSender = new MockPayloadSender(); using var metricsCollector = new MetricsCollector(logger, mockPayloadSender, new ConfigStore(new MockConfigSnapshot(logger, "Information"), _logger)); var metricsProviderMock = new Mock <IMetricsProvider>(); metricsProviderMock.Setup(x => x.IsMetricAlreadyCaptured).Returns(true); metricsProviderMock.Setup(x => x.GetSamples()) .Returns(() => new List <MetricSample> { new MetricSample("key1", double.NaN), new MetricSample("key2", 0.95) }); metricsProviderMock.SetupProperty(x => x.ConsecutiveNumberOfFailedReads); metricsCollector.MetricsProviders.Clear(); metricsCollector.MetricsProviders.Add(metricsProviderMock.Object); // Act foreach (var _ in Enumerable.Range(0, iterations)) { metricsCollector.CollectAllMetrics(); } // Assert mockPayloadSender.Metrics.Count.Should().Be(iterations); mockPayloadSender.Metrics.Should().OnlyContain(x => x.Samples.Count() == 1); metricsProviderMock.Verify(x => x.GetSamples(), Times.Exactly(iterations)); }
public void DistributionShouldBeUniform(double rate) { const int total = 1_000_000; var startCheckingAfter = Convert.ToInt32(total * 0.1); // i.e., after 10% const double allowedDiffInRate = 0.01; var sampledCount = 0; var noopLogger = new NoopLogger(); var noopPayloadSender = new NoopPayloadSender(); var sampler = new Sampler(rate); total.Repeat(i => { var transaction = new Transaction(noopLogger, "test transaction name", "test transaction type", sampler, null, noopPayloadSender, new TestAgentConfigurationReader(noopLogger)); if (transaction.IsSampled) { ++sampledCount; } if (i + 1 >= startCheckingAfter) { var actualRate = (double)sampledCount / (i + 1); var diffInRate = actualRate - rate; Assert.True(Math.Abs(diffInRate) <= allowedDiffInRate, "Abs(diffInRate) should be <= allowedDiffInRate. " + $"diffInRate: {diffInRate}, allowedDiffInRate: {allowedDiffInRate}, " + $"i: {i}, " + $"actual rate: {actualRate}, expected rate: {rate}, " + $"actual sampled count: {sampledCount}, expected sampled count: {Convert.ToInt32((i + 1) * rate)}" ); } }); }
public async Task ToggleRecordingAndCaptureMetrics() { var logger = new NoopLogger(); var payloadSender = new MockPayloadSender(); var configReader = new MockConfigSnapshot(logger, metricsInterval: "1s", logLevel: "Debug", recording: "false"); using var agentComponents = new AgentComponents(payloadSender: payloadSender, logger: logger, configurationReader: configReader); using var agent = new ApmAgent(agentComponents); await Task.Delay(10000); //make sure we wait enough to collect 1 set of metrics agent.ConfigurationReader.MetricsIntervalInMilliseconds.Should().Be(1000); payloadSender.Metrics.Should().BeEmpty(); //start recording agent.ConfigStore.CurrentSnapshot = new MockConfigSnapshot(logger, metricsInterval: "1s", logLevel: "Debug", recording: "true"); await Task.Delay(10000); //make sure we wait enough to collect 1 set of metrics //stop recording agent.ConfigStore.CurrentSnapshot = new MockConfigSnapshot(logger, metricsInterval: "1s", logLevel: "Debug", recording: "false"); payloadSender.Metrics.Should().NotBeEmpty(); await Task.Delay(500); //make sure collection on the MetricCollector is finished var numberOfEvents = payloadSender.Metrics.Count; await Task.Delay(10000); //make sure we wait enough to collect 1 set of metrics payloadSender.Metrics.Count.Should().Be(numberOfEvents); }
public void CollectAllMetrics_ShouldDisableProvider_WhenSamplesAreInvalid(List <MetricSample> samples) { const int iterations = MetricsCollector.MaxTryWithoutSuccess * 2; // Arrange var logger = new NoopLogger(); var mockPayloadSender = new MockPayloadSender(); using var metricsCollector = new MetricsCollector(logger, mockPayloadSender, new ConfigStore(new MockConfigSnapshot(logger, "Information"), _logger)); var metricsProviderMock = new Mock <IMetricsProvider>(); metricsProviderMock.Setup(x => x.IsMetricAlreadyCaptured).Returns(true); metricsProviderMock .Setup(x => x.GetSamples()) .Returns(() => samples); metricsProviderMock.SetupProperty(x => x.ConsecutiveNumberOfFailedReads); metricsCollector.MetricsProviders.Clear(); metricsCollector.MetricsProviders.Add(metricsProviderMock.Object); // Act foreach (var _ in Enumerable.Range(0, iterations)) { metricsCollector.CollectAllMetrics(); } // Assert mockPayloadSender.Metrics.Should().BeEmpty(); metricsProviderMock.Verify(x => x.GetSamples(), Times.Exactly(MetricsCollector.MaxTryWithoutSuccess)); }
public async Task SecretToken_test() { var isRequestFinished = new TaskCompletionSource <object>(); AuthenticationHeaderValue authHeader = null; var handler = new MockHttpMessageHandler((r, c) => { authHeader = r.Headers.Authorization; isRequestFinished.SetResult(null); return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK))); }); const string secretToken = "SecretToken"; var noopLogger = new NoopLogger(); var mockConfig = new MockConfigSnapshot(_logger, secretToken: secretToken, maxBatchEventCount: "1"); var payloadSender = new PayloadSenderV2(_logger, mockConfig, Service.GetDefaultService(mockConfig, noopLogger), new Api.System(), handler, /* dbgName: */ TestDisplayName); using (var agent = new ApmAgent(new TestAgentComponents(LoggerBase, mockConfig, payloadSender))) { agent.PayloadSender.QueueTransaction(new Transaction(agent, "TestName", "TestType")); await isRequestFinished.Task; } authHeader.Should().NotBeNull(); authHeader.Scheme.Should().Be("Bearer"); authHeader.Parameter.Should().Be(secretToken); }
public async Task MetricsWithRealAgent() { // Note: If XunitOutputLogger is used with MetricsCollector it might cause issues because // MetricsCollector's Dispose is currently broken - it doesn't guarantee that MetricsCollector's behaves correctly (i.e., ignores) // timer callbacks after Dispose completed. // This bug in turn causes MetricsCollector to possibly use XunitOutputLogger even after the current test has exited // and ITestOutputHelper on which XunitOutputLogger is based became invalid. // // After https://github.com/elastic/apm-agent-dotnet/issues/494 is fixed the line below can be uncommented. // // var logger = _logger; // var logger = new NoopLogger(); // var payloadSender = new MockPayloadSender(); var configReader = new MockConfigSnapshot(logger, metricsInterval: "1s", logLevel: "Debug"); using var agentComponents = new AgentComponents(payloadSender: payloadSender, logger: logger, configurationReader: configReader); using (var agent = new ApmAgent(agentComponents)) { await Task.Delay(10000); //make sure we wait enough to collect 1 set of metrics agent.ConfigurationReader.MetricsIntervalInMilliseconds.Should().Be(1000); } payloadSender.Metrics.Should().NotBeEmpty(); payloadSender.Metrics.First().Samples.Should().NotBeEmpty(); }
public void SetUpForAllMetrics() { var noopLogger = new NoopLogger(); var mockPayloadSender = new MockPayloadSender(); _metricsCollector = new MetricsCollector(noopLogger, mockPayloadSender, new MockConfigSnapshot(noopLogger)); }
public async Task CheckAuthorizationHeader(string authorizationHeader) { var isRequestFinished = new TaskCompletionSource <object>(); AuthenticationHeaderValue authHeader = null; var handler = new MockHttpMessageHandler((r, c) => { authHeader = r.Headers.Authorization; isRequestFinished.SetResult(null); return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK))); }); var logger = new NoopLogger(); var mockConfig = new MockConfigSnapshot(logger, secretToken: _secretToken, apiKey: _apiKey, flushInterval: "1s"); var payloadSender = new PayloadSenderV2(logger, mockConfig, Api.Service.GetDefaultService(mockConfig, logger), new Api.System(), handler, /* dbgName: */ nameof(ApiKeyFeatureContext)); using (var agent = new ApmAgent(new TestAgentComponents(logger, mockConfig, payloadSender))) { agent.PayloadSender.QueueTransaction(new Transaction(agent, "TestName", "TestType")); await isRequestFinished.Task; } authHeader.Should().NotBeNull(); authHeader.ToString().Should().Be(authorizationHeader); }
public void CollectAllMetrics2X() { var noopLogger = new NoopLogger(); var mockPayloadSender = new MockPayloadSender(); using (var collector = new MetricsCollector(noopLogger, mockPayloadSender, new MockConfigSnapshot(noopLogger))) { collector.CollectAllMetrics(); collector.CollectAllMetrics(); } }
public void CollectAllMetrics2X() { var noopLogger = new NoopLogger(); var mockPayloadSender = new MockPayloadSender(); using (var collector = new MetricsCollector(noopLogger, mockPayloadSender, new TestAgentConfigurationReader(noopLogger))) { collector.CollectAllMetrics(); collector.CollectAllMetrics(); } }
public void TestCGroupContentWithInvalidData() { if (!File.Exists("/proc/self/cgroup")) { return; //only run in Docker - this check can be improved } var noopLogger = new NoopLogger(); var systemInfoHelper = new TestSystemInfoHelper(noopLogger, "asdf:invalid-dockerid:243543"); var systemInfo = systemInfoHelper.ParseSystemInfo(); systemInfo.Container.Should().BeNull(); }
public void ServiceVersionLengthTest() { var logger = new NoopLogger(); var service = Service.GetDefaultService(new TestAgentConfigurationReader(logger), logger); service.Version = new string('a', 1200); var json = SerializePayloadItem(service); var deserializedService = JsonConvert.DeserializeObject <Service>(json); Assert.NotNull(deserializedService); Assert.Equal(Consts.PropertyMaxLength, deserializedService.Version.Length); Assert.Equal("...", deserializedService.Version.Substring(Consts.PropertyMaxLength - 3, 3)); }
public void ServiceNameLengthTest() { var logger = new NoopLogger(); var service = Service.GetDefaultService(new MockConfigSnapshot(logger), logger); service.Name = new string('a', 1200); var json = SerializePayloadItem(service); var deserializedService = JsonConvert.DeserializeObject <Service>(json); Assert.NotNull(deserializedService); Assert.Equal(Consts.PropertyMaxLength, deserializedService.Name.Length); Assert.Equal("...", deserializedService.Name.Substring(Consts.PropertyMaxLength - 3, 3)); }
public void TestCGroupContent(string cGroupContent, string expectedContainerId) { if (!File.Exists("/proc/self/cgroup")) { return; //only run in Docker - this check can be improved } var noopLogger = new NoopLogger(); var systemInfoHelper = new TestSystemInfoHelper(noopLogger, cGroupContent); var systemInfo = systemInfoHelper.ParseSystemInfo(); systemInfo.Should().NotBeNull(); systemInfo.Container.Should().NotBeNull(); systemInfo.Container.Id.Should().Be(expectedContainerId); }
public void TestCGroupContentWithInvalidData() { if (!File.Exists("/proc/self/cgroup")) { return; //only run in Docker - this check can be improved } var noopLogger = new NoopLogger(); var systemInfoHelper = new TestSystemInfoHelper(noopLogger, "asdf:invalid-dockerid:243543"); var systemInfo = systemInfoHelper.ReadContainerId(noopLogger); //The current implementation returns null instead of an empty System instance. //This may changes later, the point of the test is to make sure there is no container id systemInfo.Should().BeNull(); }
public void Simple100Transaction10Spans() { var noopLogger = new NoopLogger(); var agent = new ApmAgent(new AgentComponents(payloadSender: new MockPayloadSender(), logger: noopLogger, configurationReader: new TestAgentConfigurationReader(noopLogger, spanFramesMinDurationInMilliseconds: "-1ms", stackTraceLimit: "10"))); for (var i = 0; i < 100; i++) { agent.Tracer.CaptureTransaction("transaction", "perfTransaction", transaction => { for (var j = 0; j < 10; j++) { transaction.CaptureSpan("span", "perfSpan", () => { }); } }); } }
public void ServiceNameLengthTest() { var maxLength = typeof(Service).GetMember(nameof(Service.Name))[0].GetCustomAttribute <MaxLengthAttribute>().Length; var logger = new NoopLogger(); var service = Service.GetDefaultService(new MockConfigSnapshot(logger), logger); service.Name = new string('a', maxLength * 2); var json = _payloadItemSerializer.Serialize(service); var deserializedService = JsonConvert.DeserializeObject <Service>(json); maxLength.Should().Be(PropertyMaxLength); deserializedService.Should().NotBeNull(); deserializedService.Name.Length.Should().Be(maxLength); deserializedService.Name.Substring(maxLength - Ellipsis.Length, Ellipsis.Length).Should().Be(Ellipsis); }
public void DistributionShouldBeUniform(double rate) { const int total = 1_000_000; var startCheckingAfter = Convert.ToInt32(total * 0.1); // i.e., after 10% const double allowedDiffInRate = 0.01; var sampledCount = 0; var noopLogger = new NoopLogger(); var currentExecutionSegmentsContainer = new NoopCurrentExecutionSegmentsContainer(); var noopPayloadSender = new NoopPayloadSender(); var configurationReader = new MockConfigSnapshot(noopLogger); var sampler = new Sampler(rate); total.Repeat(i => { // reset current activity, otherwise all transactions share the same traceid which influences the sampling decision Activity.Current = null; var transaction = new Transaction(noopLogger, "test transaction name", "test transaction type", sampler, /* distributedTracingData: */ null, noopPayloadSender, configurationReader, currentExecutionSegmentsContainer); if (transaction.IsSampled) { ++sampledCount; } // ReSharper disable once InvertIf if (i + 1 >= startCheckingAfter) { var actualRate = (double)sampledCount / (i + 1); var diffInRate = actualRate - rate; Assert.True(Math.Abs(diffInRate) <= allowedDiffInRate, "Abs(diffInRate) should be <= allowedDiffInRate. " + $"diffInRate: {diffInRate}, allowedDiffInRate: {allowedDiffInRate}, " + $"i: {i}, " + $"actual rate: {actualRate}, expected rate: {rate}, " + $"actual sampled count: {sampledCount}, expected sampled count: {Convert.ToInt32((i + 1) * rate)}" ); } }); }
public async Task PayloadSentWithProperUserAgent() { var isRequestFinished = new TaskCompletionSource <object>(); HttpHeaderValueCollection <ProductInfoHeaderValue> userAgentHeader = null; var handler = new MockHttpMessageHandler((r, c) => { userAgentHeader = r.Headers.UserAgent; isRequestFinished.SetResult(null); return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK))); }); var logger = new NoopLogger(); var service = Service.GetDefaultService(new TestAgentConfigurationReader(logger), logger); var payloadSender = new PayloadSenderV2(logger, new TestAgentConfigurationReader(logger), service, new Api.System(), handler); using (var agent = new ApmAgent(new TestAgentComponents(payloadSender: payloadSender))) { agent.PayloadSender.QueueTransaction(new Transaction(agent, "TestName", "TestType")); } await isRequestFinished.Task; userAgentHeader .Should() .NotBeEmpty() .And.HaveCount(3); userAgentHeader.First().Product.Name.Should().Be($"elasticapm-{Consts.AgentName}"); userAgentHeader.First().Product.Version.Should().NotBeEmpty(); userAgentHeader.Skip(1).First().Product.Name.Should().Be("System.Net.Http"); userAgentHeader.Skip(1).First().Product.Version.Should().NotBeEmpty(); userAgentHeader.Skip(2).First().Product.Name.Should().NotBeEmpty(); userAgentHeader.Skip(2).First().Product.Version.Should().NotBeEmpty(); }
public void DisableMetrics_DisableCpuMetrics() { var mockPayloadSender = new MockPayloadSender(); var noopLogger = new NoopLogger(); using var metricsProvider = new MetricsCollector(noopLogger, mockPayloadSender, new ConfigStore(new MockConfigSnapshot(disableMetrics: "*cpu*"), noopLogger)); metricsProvider.CollectAllMetrics(); mockPayloadSender.Metrics.Should().NotBeEmpty(); var firstMetrics = mockPayloadSender.Metrics.First(); firstMetrics.Should().NotBeNull(); firstMetrics.Samples.Should().NotContain(n => n.KeyValue.Key.Contains("cpu")); //These are collected on all platforms, with the given config they always should be there firstMetrics.Samples.Should() .Contain(n => n.KeyValue.Key.Equals("system.process.memory.size", StringComparison.InvariantCultureIgnoreCase)); firstMetrics.Samples.Should() .Contain(n => n.KeyValue.Key.Equals("system.process.memory.rss.bytes", StringComparison.InvariantCultureIgnoreCase)); }