public void Setup()
        {
            // Create a Storage Mock
            this.StorageBaseMock = new Moq.Mock<StorageBase>();
            this.OnEnqueue = null;

            // Setup  Storage.EnqueueAsync to call OnEnqueue and increase this.numberOfCallsToStorageEnqueue by 1
            this.StorageBaseMock.Setup((storage) => storage.EnqueueAsync(It.IsAny<Transmission>()))
                .Callback(
                () =>
                {
                    this.numberOfCallsToStorageEnqueue++;
                    if (OnEnqueue != null)
                    {
                        OnEnqueue();
                    }
                })
                .Returns(
                () =>
                {
                    var completionSource = new TaskCompletionSource<bool>();
                    completionSource.SetResult(true);
                    return completionSource.Task as Task;
                });

            // Create telemetry buffer mock
            this.TelemetryBufferMock = new TelemetryBuffer();
            this.TelemetryBufferMock.Capacity = 1;
        }
        public void WhenNewValueIsLessThanOneSetToDefault()
        {
            var buffer = new TelemetryBuffer();
            buffer.Capacity = 0;

            Assert.Equal(buffer.Capacity, 500);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="PersistenceChannel"/> class.
 /// </summary>
 /// <param name="storageFolderName">
 /// A folder name. Under this folder all the transmissions will be saved. 
 /// Setting this value groups channels, even from different processes. 
 /// If 2 (or more) channels has the same <c>storageFolderName</c> only one channel will perform the sending even if the channel is in a different process/AppDomain/Thread.  
 /// </param>
 /// <param name="sendersCount">
 /// Defines the number of senders. A sender is a long-running thread that sends telemetry batches in intervals defined by <see cref="SendingInterval"/>. 
 /// So the amount of senders also defined the maximum amount of http channels opened at the same time.
 /// </param>        
 public PersistenceChannel(string storageFolderName, int sendersCount = 3)
 {   
     this.TelemetryBuffer = new TelemetryBuffer();
     this.storage = new Storage(storageFolderName);
     this.Transmitter = new PersistenceTransmitter(this.storage, sendersCount);
     this.flushManager = new FlushManager(this.storage, this.TelemetryBuffer);
     this.EndpointAddress = Constants.TelemetryServiceEndpoint;
     this.developerMode = false;
 }
        public void TelemetryBufferCallingOnFullActionWhenBufferCapacityReached()
        {
            IEnumerable<ITelemetry> items = null;
            TelemetryBuffer buffer = new TelemetryBuffer { Capacity = 2 };
            buffer.OnFull = () => { items = buffer.Dequeue(); };

            buffer.Enqueue(new EventTelemetry("Event1"));
            buffer.Enqueue(new EventTelemetry("Event2"));

            Assert.NotNull(items);
            Assert.Equal(2, items.Count());
        }
        public void WhenSendIsCalledTheEventIsBeingQueuedInTheBuffer()
        {
            var telemetryBuffer = new TelemetryBuffer();
            var channel = new InMemoryChannel(telemetryBuffer, new InMemoryTransmitter(telemetryBuffer));
            var sentTelemetry = new StubTelemetry();

            channel.Send(sentTelemetry);
            IEnumerable<ITelemetry> telemetries = telemetryBuffer.Dequeue();

            Assert.Equal(1, telemetries.Count());
            Assert.Same(sentTelemetry, telemetries.First());
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="FlushManager"/> class.
        /// </summary>        
        /// <param name="storage">The storage that persists the telemetries.</param>
        /// <param name="telemetryBuffer">In memory buffer that holds telemetries.</param>
        /// <param name="supportAutoFlush">A boolean value that determines if flush will happen automatically. Used by unit tests.</param>
        internal FlushManager(StorageBase storage, TelemetryBuffer telemetryBuffer, bool supportAutoFlush = true)
        {
            this.storage = storage;
            this.telemetryBuffer = telemetryBuffer;
            this.telemetryBuffer.OnFull = this.OnTelemetryBufferFull;
            this.FlushDelay = TimeSpan.FromSeconds(30);

            if (supportAutoFlush)
            {
                Task.Factory.StartNew(this.FlushLoop, TaskCreationOptions.LongRunning)
                    .ContinueWith(t => CoreEventSource.Log.LogVerbose("FlushManager: Failure in FlushLoop: Exception: " + t.Exception.ToString()), TaskContinuationOptions.OnlyOnFaulted);
            }
        }
        internal InMemoryTransmitter(TelemetryBuffer buffer)
        {
            this.buffer = buffer;
            this.buffer.OnFull = this.OnBufferFull;

            // Starting the Runner
            Task.Factory.StartNew(this.Runner, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default)
                .ContinueWith(
                    task => 
                    {
                        string msg = string.Format(CultureInfo.InvariantCulture, "InMemoryTransmitter: Unhandled exception in Runner: {0}", task.Exception);
                        CoreEventSource.Log.LogVerbose(msg);
                    }, 
                    TaskContinuationOptions.OnlyOnFaulted);
        }
        internal ServerTelemetryChannel(INetwork network, IApplicationLifecycle applicationLifecycle)
        {
            var policies = new TransmissionPolicy[] 
            { 
                new ApplicationLifecycleTransmissionPolicy(applicationLifecycle),
                new ErrorHandlingTransmissionPolicy(),
                new NetworkAvailabilityTransmissionPolicy(network),
                new ThrottlingTransmissionPolicy()
            };

            this.Transmitter = new Transmitter(policies: policies);

            this.TelemetrySerializer = new TelemetrySerializer(this.Transmitter);
            this.TelemetryBuffer = new TelemetryBuffer(this.TelemetrySerializer, applicationLifecycle);
            this.telemetryBufferCapacity = this.TelemetryBuffer.Capacity;

            this.TelemetryProcessor = this.TelemetryBuffer;
            this.isInitialized = false;
        }
Esempio n. 9
0
        public void TelemetryWithNoInstrumentationKeyIsDropped()
        {
            var telemetryBuffer = new TelemetryBuffer();
            var channel         = new InMemoryChannel(telemetryBuffer, new InMemoryTransmitter(telemetryBuffer));
            var sentTelemetry   = new StubTelemetry();

            // No instrumentation key

            using (TestEventListener listener = new TestEventListener())
            {
                listener.EnableEvents(CoreEventSource.Log, EventLevel.Verbose);

                channel.Send(sentTelemetry);
                IEnumerable <ITelemetry> telemetries = telemetryBuffer.Dequeue();

                Assert.IsNull(telemetries);

                var expectedMessage = listener.Messages.First();
                Assert.AreEqual(35, expectedMessage.EventId);
            }
        }
        public void TelemetryBufferDoesNotGrowBeyondMaxBacklogSize()
        {
            TelemetryBuffer buffer = new TelemetryBuffer {
                Capacity = 2, BacklogSize = 1002
            };

            buffer.OnFull = () => { //intentionally blank to simulate situation where buffer
                                    //is not emptied.
            };

            // Add more items to buffer than the max backlog size
            for (int i = 0; i < 1005; i++)
            {
                buffer.Enqueue(new EventTelemetry("Event" + i));
            }



            // validate that items are not added after maxunsentbacklogsize is reached.
            // this also validate that items can still be added after Capacity is reached as it is only a soft limit.
            int bufferItemCount = buffer.Dequeue().Count();

            Assert.AreEqual(1002, bufferItemCount);
        }
            public void ThrowsArgumentOutOfRangeExceptionWhenNewValueIsLessThanOne()
            {
                var buffer = new TelemetryBuffer();

                Assert.Throws <ArgumentOutOfRangeException>(() => buffer.Capacity = 0);
            }
 /// <summary>
 /// Initializes a new instance of the <see cref="InMemoryChannel" /> class. Used in unit tests for constructor injection.  
 /// </summary>
 /// <param name="telemetryBuffer">The telemetry buffer that will be used to enqueue new events.</param>
 /// <param name="transmitter">The in memory transmitter that will send the events queued in the buffer.</param>
 internal InMemoryChannel(TelemetryBuffer telemetryBuffer, InMemoryTransmitter transmitter)
 {
     this.buffer = telemetryBuffer;
     this.transmitter = transmitter;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="InMemoryChannel" /> class.
 /// </summary>
 public InMemoryChannel()
 {
     this.buffer      = new TelemetryBuffer();
     this.transmitter = new InMemoryTransmitter(this.buffer);
 }
 public void ThrowsArgumentOutOfRangeExceptionWhenNewValueIsLessThanOne()
 {
     var buffer = new TelemetryBuffer();
     Assert.Throws<ArgumentOutOfRangeException>(() => buffer.Capacity = 0);
 }
 public void DefaultValueIsAppropriateForProductionEnvironmentAndUnitTests()
 {
     var buffer = new TelemetryBuffer();
     Assert.Equal(500, buffer.Capacity);
 }
Esempio n. 16
0
        public void DefaultValueIsAppropriateForProductionEnvironmentAndUnitTests()
        {
            var buffer = new TelemetryBuffer();

            Assert.Equal(500, buffer.Capacity);
        }
 public void CanBeSetByChannelToTunePerformance()
 {
     var buffer = new TelemetryBuffer();
     buffer.Capacity = 42;
     Assert.Equal(42, buffer.Capacity);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="InMemoryChannel" /> class. Used in unit tests for constructor injection.
 /// </summary>
 /// <param name="telemetryBuffer">The telemetry buffer that will be used to enqueue new events.</param>
 /// <param name="transmitter">The in memory transmitter that will send the events queued in the buffer.</param>
 internal InMemoryChannel(TelemetryBuffer telemetryBuffer, InMemoryTransmitter transmitter)
 {
     this.buffer      = telemetryBuffer;
     this.transmitter = transmitter;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="InMemoryChannel" /> class.
 /// </summary>
 public InMemoryChannel()
 {
     this.buffer = new TelemetryBuffer();
     this.transmitter = new InMemoryTransmitter(this.buffer);
 }