Beispiel #1
0
        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);
        }
Beispiel #2
0
        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)));
        }
Beispiel #4
0
        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));
        }
Beispiel #9
0
        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();
        }
Beispiel #11
0
        public void SetUpForAllMetrics()
        {
            var noopLogger        = new NoopLogger();
            var mockPayloadSender = new MockPayloadSender();

            _metricsCollector = new MetricsCollector(noopLogger, mockPayloadSender, new MockConfigSnapshot(noopLogger));
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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();
            }
        }
Beispiel #14
0
        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();
            }
        }
Beispiel #15
0
        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));
        }
Beispiel #18
0
        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);
        }
Beispiel #19
0
        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();
        }
Beispiel #20
0
        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", () => { });
                    }
                });
            }
        }
Beispiel #21
0
        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);
        }
Beispiel #22
0
        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)}"
                                );
                }
            });
        }
Beispiel #23
0
        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();
        }
Beispiel #24
0
        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));
        }