@Override public TelemetriesTransmitter create(String endpoint, String maxTransmissionStorageCapacity, boolean throttlingIsEnabled, int maxInstanceRetries) { // An active object with the network sender TransmissionOutput actualNetworkSender = TestThreadLocalData.getTransmissionOutput(); final TransmissionPolicyManager transmissionPolicyManager = new TransmissionPolicyManager(throttlingIsEnabled); transmissionPolicyManager.addTransmissionHandler(new ErrorHandler(transmissionPolicyManager)); transmissionPolicyManager.addTransmissionHandler(new PartialSuccessHandler(transmissionPolicyManager)); transmissionPolicyManager.addTransmissionHandler(new ThrottlingHandler(transmissionPolicyManager)); transmissionPolicyManager.setMaxInstantRetries(maxInstanceRetries); TransmissionPolicyStateFetcher stateFetcher = transmissionPolicyManager.getTransmissionPolicyState(); TransmissionOutput networkSender = new ActiveTransmissionNetworkOutput(actualNetworkSender, stateFetcher); // An active object with the file system sender TransmissionFileSystemOutput fileSystemSender = new TransmissionFileSystemOutput(); TransmissionOutput activeFileSystemOutput = new ActiveTransmissionFileSystemOutput(fileSystemSender, stateFetcher); // The dispatcher works with the two active senders TransmissionDispatcher dispatcher = new NonBlockingDispatcher(new TransmissionOutput[] {networkSender, activeFileSystemOutput}); // The loader works with the file system loader as the active one does TransmissionsLoader transmissionsLoader = new ActiveTransmissionLoader(fileSystemSender, stateFetcher, dispatcher); // The Transmitter manage all TelemetriesTransmitter telemetriesTransmitter = new TransmitterImpl(dispatcher, new GzipTelemetrySerializer(), transmissionsLoader); return telemetriesTransmitter; } }
@Test public void testSuspendInSecondsWithTwoWhereTheFirstOneCounts() throws InterruptedException { TransmissionPolicyManager tested = new TransmissionPolicyManager(true); tested.suspendInSeconds(TransmissionPolicy.BLOCKED_AND_CANNOT_BE_PERSISTED, 2); tested.suspendInSeconds(TransmissionPolicy.BLOCKED_BUT_CAN_BE_PERSISTED, 1); Thread.sleep(1500); assertEquals(TransmissionPolicy.BLOCKED_AND_CANNOT_BE_PERSISTED, tested.getTransmissionPolicyState().getCurrentState()); Thread.sleep(1000); assertEquals(TransmissionPolicy.UNBLOCKED, tested.getTransmissionPolicyState().getCurrentState()); }
this.transmissionPolicyManager.suspendInSeconds(suspensionPolicy, retryAfterAsSeconds); } catch (Throwable e) { InternalLogger.INSTANCE.error("Throttled but failed to block transmission.%nStack Trace:%n%s", ExceptionUtils.getStackTrace(e)); this.transmissionPolicyManager.backoff();
/** * Suspend this transmission thread using the specified policy * @param policy The {@link TransmissionPolicy} to use for suspension * @param suspendInSeconds The number of seconds to suspend. */ public void suspendInSeconds(TransmissionPolicy policy, long suspendInSeconds) { if (!throttlingIsEnabled) { return; } Preconditions.checkArgument(suspendInSeconds > 0, "Suspension must be greater than zero"); createScheduler(); doSuspend(policy, suspendInSeconds); }
@Test(expected = IllegalArgumentException.class) public void testSuspendInSecondsWithZeroSeconds() { TransmissionPolicyManager tested = new TransmissionPolicyManager(true); tested.suspendInSeconds(TransmissionPolicy.BLOCKED_AND_CANNOT_BE_PERSISTED, 0); }
@Test public void passGenerateOriginalItemsNonGZIP() { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionDispatcher mockedDispatcher = Mockito.mock(TransmissionDispatcher.class); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); args.setResponseCode(206); args.setTransmission(new Transmission(fourItemsNonGZIP.getBytes(), "application/json", "utf8")); args.setTransmissionDispatcher(mockedDispatcher); PartialSuccessHandler eh = new PartialSuccessHandler(tpm); List<String> originalItems = eh.generateOriginalItems(args); Assert.assertEquals(4, originalItems.size()); }
@Test public void testAfterCtor() { TransmissionPolicyManager tested = new TransmissionPolicyManager(true); assertNotNull(tested.getTransmissionPolicyState()); assertEquals(TransmissionPolicy.UNBLOCKED, tested.getTransmissionPolicyState().getCurrentState()); }
if (transmissionPolicyManager.getTransmissionPolicyState() .getCurrentState() != TransmissionPolicy.UNBLOCKED) { return false; if (code > HttpStatus.SC_PARTIAL_CONTENT && transmission.getNumberOfSends() > this.transmissionPolicyManager.getMaxInstantRetries()) { return false; } else if (code == HttpStatus.SC_OK) { transmissionPolicyManager.clearBackoff(); args.setException(ex); args.setRetryHeader(retryAfterHeader); this.transmissionPolicyManager.onTransmissionSent(args);
private void backoffAndSendTransmission(TransmissionHandlerArgs args) { // It is possible for us to have a temporary blip in transmission // this setting will allow us to control how many instant retries we perform // before backing off the send if (args.getTransmission() != null && (args.getTransmission().getNumberOfSends() > transmissionPolicyManager.getMaxInstantRetries())) { this.transmissionPolicyManager.backoff(); } args.getTransmissionDispatcher().dispatch(args.getTransmission()); } }
/** * Suspend the transmission thread according to the current back off policy. */ public void backoff() { policyState.setCurrentState(TransmissionPolicy.BACKOFF); long backOffMillis = backoffManager.backOffCurrentSenderThreadValue(); if (backOffMillis > 0) { long backOffSeconds = backOffMillis / 1000; InternalLogger.INSTANCE.info("App is throttled, telemetry will be blocked for %s seconds.", backOffSeconds); this.suspendInSeconds(TransmissionPolicy.BACKOFF, backOffSeconds); } }
private boolean generateTransmissionWithStatusCodeAndHeader(int code, String retryHeader) { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionDispatcher mockedDispatcher = Mockito.mock(TransmissionDispatcher.class); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); args.setResponseCode(code); args.setTransmission(new Transmission(new byte[] { 0 }, "testcontent", "testencoding")); args.setTransmissionDispatcher(mockedDispatcher); args.setRetryHeader(new BasicHeader(RESPONSE_THROTTLING_HEADER, retryHeader)); ThrottlingHandler eh = new ThrottlingHandler(tpm); boolean result = eh.validateTransmissionAndSend(args); return result; }
@Override public TelemetriesTransmitter create(String endpoint, String maxTransmissionStorageCapacity, boolean throttlingIsEnabled, int maxInstantRetries) { final TransmissionPolicyManager transmissionPolicyManager = new TransmissionPolicyManager(throttlingIsEnabled); transmissionPolicyManager.addTransmissionHandler(new ErrorHandler(transmissionPolicyManager)); transmissionPolicyManager.addTransmissionHandler(new PartialSuccessHandler(transmissionPolicyManager)); transmissionPolicyManager.addTransmissionHandler(new ThrottlingHandler(transmissionPolicyManager)); transmissionPolicyManager.setMaxInstantRetries(maxInstantRetries); TransmissionPolicyStateFetcher stateFetcher = transmissionPolicyManager.getTransmissionPolicyState();
@Test public void testSuspendInSecondsWithTwoWhereTheSecondOneCounts() throws InterruptedException { TransmissionPolicyManager tested = new TransmissionPolicyManager(true); tested.suspendInSeconds(TransmissionPolicy.BLOCKED_AND_CANNOT_BE_PERSISTED, 1); tested.suspendInSeconds(TransmissionPolicy.BLOCKED_BUT_CAN_BE_PERSISTED, 2); Thread.sleep(1500); assertEquals(TransmissionPolicy.BLOCKED_BUT_CAN_BE_PERSISTED, tested.getTransmissionPolicyState().getCurrentState()); Thread.sleep(1000); assertEquals(TransmissionPolicy.UNBLOCKED, tested.getTransmissionPolicyState().getCurrentState()); } }
@Test public void passSingleItemArrayList() { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionDispatcher mockedDispatcher = Mockito.mock(TransmissionDispatcher.class); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); args.setResponseCode(206); args.setTransmission(new Transmission(fourItems, "application/x-json-stream", "gzip")); args.setTransmissionDispatcher(mockedDispatcher); PartialSuccessHandler eh = new PartialSuccessHandler(tpm); List<String> singleItem = new ArrayList<String>(); singleItem.add("{\"ver\":1,\"name\":\"Microsoft.ApplicationInsights.b69a3a06e25a425ba1a44e9ff6f13582.Event\",\"time\":\"2018-02-11T16:02:36.120-0500\",\"sampleRate\":100.0,\"iKey\":\"b69a3a06-e25a-425b-a1a4-4e9ff6f13582\",\"tags\":{\"ai.internal.sdkVersion\":\"java:2.0.0-beta-snapshot\",\"ai.device.id\":\"test.machine.name\",\"ai.device.locale\":\"en-US\",\"ai.internal.nodename\":\"test.machine.name\",\"ai.device.os\":\"Windows 10\",\"ai.device.roleInstance\":\"test.machine.name\",\"ai.device.osVersion\":\"Windows 10\",\"ai.session.id\":\"20180211160233\"},\"data\":{\"baseType\":\"EventData\",\"baseData\":{\"ver\":2,\"name\":\"TestEvent0\",\"properties\":null}}}\r\n"); boolean result = eh.sendNewTransmission(args, singleItem); Assert.assertTrue(result); }
@Test public void testSuspendInSecondsWithUnBlock() { TransmissionPolicyManager tested = new TransmissionPolicyManager(true); tested.suspendInSeconds(TransmissionPolicy.UNBLOCKED, 10); assertEquals(TransmissionPolicy.UNBLOCKED, tested.getTransmissionPolicyState().getCurrentState()); }
private boolean generateTransmissionWithStatusCode(int code) { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionDispatcher mockedDispatcher = Mockito.mock(TransmissionDispatcher.class); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); args.setResponseCode(code); args.setTransmission(new Transmission(new byte[] { 0 }, "testcontent", "testencoding")); args.setTransmissionDispatcher(mockedDispatcher); PartialSuccessHandler eh = new PartialSuccessHandler(tpm); boolean result = eh.validateTransmissionAndSend(args); return result; }
@Test public void failEmptyArrayList() { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionDispatcher mockedDispatcher = Mockito.mock(TransmissionDispatcher.class); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); args.setResponseCode(206); args.setTransmission(new Transmission(fourItems, "application/x-json-stream", "gzip")); args.setTransmissionDispatcher(mockedDispatcher); PartialSuccessHandler eh = new PartialSuccessHandler(tpm); boolean result = eh.sendNewTransmission(args, new ArrayList<String>()); Assert.assertFalse(result); }
@Test public void failOnNull() { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); ErrorHandler eh = new ErrorHandler(tpm); boolean result = eh.validateTransmissionAndSend(args); Assert.assertFalse(result); }
@Test public void failOnNull() { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); ErrorHandler eh = new ErrorHandler(tpm); boolean result = eh.validateTransmissionAndSend(args); Assert.assertFalse(result); }
@Test public void failOnNull() { TransmissionPolicyManager tpm = new TransmissionPolicyManager(true); TransmissionHandlerArgs args = new TransmissionHandlerArgs(); ErrorHandler eh = new ErrorHandler(tpm); boolean result = eh.validateTransmissionAndSend(args); Assert.assertFalse(result); }