@Override
  public void requestInitialized(ServletRequestEvent sre) {
    if (corePlugin.isStagemonitorActive()) {
      final MeasurementSession measurementSession = corePlugin.getMeasurementSession();
      if (measurementSession.getApplicationName() != null) {
        MDC.put("application", measurementSession.getApplicationName());
      }
      if (measurementSession.getHostName() != null) {
        MDC.put("host", measurementSession.getHostName());
      }
      String instanceName = measurementSession.getInstanceName();
      if (instanceName == null) {
        instanceName = sre.getServletRequest().getServerName();
      }
      MDC.put("instance", instanceName);

      final String requestId = UUID.randomUUID().toString();
      sre.getServletRequest().setAttribute(STAGEMONITOR_REQUEST_ID_ATTR, requestId);

      if (Stagemonitor.isStarted()) {
        // don't store the requestId in MDC if stagemonitor is not active
        // so that thread pools that get created on startup don't inherit the requestId
        MDC.put("requestId", requestId);
      }
    }
  }
  @Test
  public void testNotInitialized() {
    when(corePlugin.isStagemonitorActive()).thenReturn(true);

    final MeasurementSession measurementSession =
        new MeasurementSession(null, "testHost", "testInstance");
    StageMonitor.startMonitoring(measurementSession);

    verify(logger).warn("Measurement Session is not initialized: {}", measurementSession);
  }
  @Test
  public void testDisabledPlugin() {
    when(corePlugin.isStagemonitorActive()).thenReturn(true);
    when(corePlugin.getDisabledPlugins()).thenReturn(Arrays.asList("TestExceptionPlugin"));

    StageMonitor.startMonitoring(new MeasurementSession("testApp", "testHost", "testInstance"));

    verify(logger).info("Initializing plugin {}", "TestPlugin");
    verify(logger).info("Not initializing disabled plugin {}", "TestExceptionPlugin");
    verify(logger, times(0)).info("Initializing plugin {}", "TestExceptionPlugin");
  }
  @Test
  public void testStartMonitoringNotActive() throws Exception {
    when(corePlugin.isStagemonitorActive()).thenReturn(false);
    StageMonitor.setConfiguration(configuration);

    final MeasurementSession measurementSession =
        new MeasurementSession("testApp", "testHost", "testInstance");
    StageMonitor.startMonitoring(measurementSession);

    assertTrue(StageMonitor.isStarted());
    assertFalse(StageMonitor.getMeasurementSession().isInitialized());
    verify(logger, times(0)).info("Initializing plugin {}", "TestPlugin");
    verify(logger, times(0)).info("Initializing plugin {}", "TestExceptionPlugin");
  }
  @Test
  public void testStartMonitoring() throws Exception {
    when(corePlugin.isStagemonitorActive()).thenReturn(true);

    final MeasurementSession measurementSession =
        new MeasurementSession("testApp", "testHost", "testInstance");
    StageMonitor.startMonitoring(measurementSession);
    StageMonitor.startMonitoring(new MeasurementSession("testApp2", "testHost2", "testInstance2"));

    assertTrue(StageMonitor.isStarted());
    assertTrue(StageMonitor.getMeasurementSession().isInitialized());
    assertSame(measurementSession, StageMonitor.getMeasurementSession());
    verify(logger).info("Initializing plugin {}", "TestPlugin");
    verify(logger).info("Initializing plugin {}", "TestExceptionPlugin");
  }