Search in sources :

Example 1 with ScanReportPollResult

use of org.opennms.netmgt.model.ScanReportPollResult in project opennms by OpenNMS.

the class ScanReportPollerFrontEnd method performServiceScans.

/**
 * Perform all scans for a given location and return the results as a {@link ScanReport}
 * object. To filter by application, specify the selected applications by using the
 * {@link #setSelectedApplications(Set)} method.
 */
private void performServiceScans() {
    firePropertyChange(ScanReportProperties.percentageComplete.toString(), null, 0.0);
    ScanReport scanReport = new ScanReport();
    scanReport.setLocation(m_location);
    // scanReport.addProperty("monitoring-system-id", getMonitoringSystemId());
    scanReport.setTimestamp(new Date());
    // Add all of the OS and connection metadata to the scan report
    for (final Map.Entry<String, String> entry : getDetails().entrySet()) {
        scanReport.addProperty(entry);
    }
    // Add all of the metadata to the scan report
    for (final Map.Entry<String, String> entry : m_metadata.entrySet()) {
        scanReport.addProperty(entry);
    }
    // Add the selected applications as scan report metadata
    if (m_selectedApplications != null && m_selectedApplications.size() > 0) {
        scanReport.addProperty("applications", m_selectedApplications.stream().collect(Collectors.joining(", ")));
    }
    // Create a log appender that will capture log output to the root logger
    Log4j2StringAppender appender = Log4j2StringAppender.createAppender();
    appender.start();
    try {
        m_pollService.setServiceMonitorLocators(m_backEnd.getServiceMonitorLocators(DistributionContext.REMOTE_MONITOR));
        m_pollerConfiguration = retrieveLatestConfiguration();
        appender.addToLogger(LogManager.ROOT_LOGGER_NAME, Level.DEBUG);
        Set<PolledService> polledServices = getPolledServices().stream().filter(s -> matchesApplications(s, m_selectedApplications)).collect(Collectors.toSet());
        PolledService[] services = polledServices.toArray(POLLED_SERVICE_ARRAY);
        LOG.debug("Polling {} services.", services.length);
        for (int i = 0; i < services.length; i++) {
            PolledService service = services[i];
            try {
                final PollStatus result = doPoll(service);
                if (result == null) {
                    LOG.warn("Null poll result for service {}", service.getServiceId());
                } else {
                    LOG.info(new ToStringBuilder(this).append("statusName", result.getStatusName()).append("reason", result.getReason()).toString());
                    scanReport.addPollResult(new ScanReportPollResult(service.getSvcName(), service.getServiceId(), service.getNodeLabel(), service.getNodeId(), service.getIpAddr(), result));
                }
            } catch (Throwable e) {
                LOG.error("Unexpected exception occurred while polling service ID {}", service.getServiceId(), e);
                setState(new FatalExceptionOccurred(e));
            }
            firePropertyChange(ScanReportProperties.percentageComplete.toString(), null, ((double) i / (double) services.length));
        }
    } catch (final Throwable e) {
        LOG.error("Error while performing scan", e);
    } finally {
        // Remove the log appender from the root logger
        appender.removeFromLogger(LogManager.ROOT_LOGGER_NAME);
    }
    // Set the percentage complete to 100%
    firePropertyChange(ScanReportProperties.percentageComplete.toString(), null, 1.0);
    scanReport.setLog(new ScanReportLog(scanReport.getId(), appender.getOutput()));
    LOG.debug("Returning scan report: {}", scanReport);
    /*
        LOG.debug("=============== Scan report log START ===============");
        LOG.debug("Scan report log: '{}'", appender.getOutput());
        LOG.debug("=============== Scan report log END ===============");
         */
    // Fire an exitNecessary event with the scanReport as the parameter
    firePropertyChange(PollerFrontEndStates.exitNecessary.toString(), null, scanReport);
}
Also used : Arrays(java.util.Arrays) PolledService(org.opennms.netmgt.poller.remote.PolledService) ServicePollStateChangedListener(org.opennms.netmgt.poller.remote.ServicePollStateChangedListener) ServicePollState(org.opennms.netmgt.poller.remote.ServicePollState) ScanReportLog(org.opennms.netmgt.model.ScanReportLog) Date(java.util.Date) PollerFrontEnd(org.opennms.netmgt.poller.remote.PollerFrontEnd) ToStringBuilder(org.apache.commons.lang.builder.ToStringBuilder) LoggerFactory(org.slf4j.LoggerFactory) Level(org.apache.logging.log4j.Level) HashMap(java.util.HashMap) DistributionContext(org.opennms.netmgt.poller.DistributionContext) PollStatus(org.opennms.netmgt.poller.PollStatus) InitializingBean(org.springframework.beans.factory.InitializingBean) InetAddress(java.net.InetAddress) ScanReport(org.opennms.netmgt.model.ScanReport) Map(java.util.Map) PollerBackEnd(org.opennms.netmgt.poller.remote.PollerBackEnd) ScanReportPollResult(org.opennms.netmgt.model.ScanReportPollResult) LinkedList(java.util.LinkedList) PropertyChangeEvent(java.beans.PropertyChangeEvent) ConfigurationChangedListener(org.opennms.netmgt.poller.remote.ConfigurationChangedListener) Properties(java.util.Properties) Logger(org.slf4j.Logger) HOST_ADDRESS_KEY(org.opennms.netmgt.poller.remote.PollerBackEnd.HOST_ADDRESS_KEY) TimeAdjustment(org.opennms.netmgt.poller.remote.TimeAdjustment) InetAddressUtils(org.opennms.core.utils.InetAddressUtils) Collection(java.util.Collection) ObjectUtils(org.springframework.util.ObjectUtils) HOST_NAME_KEY(org.opennms.netmgt.poller.remote.PollerBackEnd.HOST_NAME_KEY) Set(java.util.Set) Collectors(java.util.stream.Collectors) PollService(org.opennms.netmgt.poller.remote.PollService) List(java.util.List) PropertyChangeListener(java.beans.PropertyChangeListener) DisposableBean(org.springframework.beans.factory.DisposableBean) PollerConfiguration(org.opennms.netmgt.poller.remote.PollerConfiguration) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) Assert(org.springframework.util.Assert) PollStatus(org.opennms.netmgt.poller.PollStatus) ScanReport(org.opennms.netmgt.model.ScanReport) Date(java.util.Date) ScanReportLog(org.opennms.netmgt.model.ScanReportLog) PolledService(org.opennms.netmgt.poller.remote.PolledService) ToStringBuilder(org.apache.commons.lang.builder.ToStringBuilder) ScanReportPollResult(org.opennms.netmgt.model.ScanReportPollResult) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with ScanReportPollResult

use of org.opennms.netmgt.model.ScanReportPollResult in project opennms by OpenNMS.

the class PollerBackEndTest method testUnsuccessfulScanReportMessage.

public void testUnsuccessfulScanReportMessage() {
    expect(m_scanReportDao.save(EasyMock.anyObject(ScanReport.class))).andReturn("");
    m_mocks.replayAll();
    List<ScanReportPollResult> scanReportPollResults = new ArrayList<>();
    scanReportPollResults.add(new ScanReportPollResult("ICMP", 1, "Test Node", 1, "127.0.0.1", PollStatus.available(20.0)));
    scanReportPollResults.add(new ScanReportPollResult("HTTP", 2, "Test Node", 1, "127.0.0.1", PollStatus.unavailable("Weasels ate my HTTP server")));
    scanReportPollResults.add(new ScanReportPollResult("SNMP", 3, "Test Node", 1, "127.0.0.1", PollStatus.available(400.0)));
    scanReportPollResults.add(new ScanReportPollResult("POP3", 3, "Test Node", 1, "127.0.0.1", PollStatus.available(300.0)));
    scanReportPollResults.add(new ScanReportPollResult("IMAP", 4, "Test Node", 1, "127.0.0.1", PollStatus.unavailable("Kiwis infested my mail server")));
    ScanReport report = new ScanReport();
    report.setId(UUID.randomUUID().toString());
    report.setPollResults(scanReportPollResults);
    m_backEnd.reportSingleScan(report);
    // Fetch the event that was sent
    Event unsuccessfulScanEvent = m_eventIpcManager.getEventAnticipator().getUnanticipatedEvents().iterator().next();
    assertTrue(unsuccessfulScanEvent.getParm(DefaultPollerBackEnd.PARM_SCAN_REPORT_FAILURE_MESSAGE).getValue().getContent(), unsuccessfulScanEvent.getParm(DefaultPollerBackEnd.PARM_SCAN_REPORT_FAILURE_MESSAGE).getValue().getContent().contains("2 out of 5 service polls failed"));
}
Also used : ScanReport(org.opennms.netmgt.model.ScanReport) ArrayList(java.util.ArrayList) Event(org.opennms.netmgt.xml.event.Event) ScanReportPollResult(org.opennms.netmgt.model.ScanReportPollResult)

Example 3 with ScanReportPollResult

use of org.opennms.netmgt.model.ScanReportPollResult in project opennms by OpenNMS.

the class ScanReportTest method testSerialization.

/**
 * Test the JAXB marshaling of the {@link ScanReport} class.
 */
@Test
public void testSerialization() throws Exception {
    ScanReport report = new ScanReport();
    report.addProperty("customer-account-number", "12345");
    report.addProperty("customer-name", "Zombo.com");
    report.addProperty("reference-id", "ABZ135");
    report.addProperty("time-zone", "-5:00");
    report.setLocale("en-US");
    report.setLocation("RDU");
    report.setTimestamp(new Date());
    report.setLog(new ScanReportLog(report.getId(), "Hey, a log!"));
    for (int i = 0; i < 5; i++) {
        PollStatus status = PollStatus.get(PollStatus.SERVICE_AVAILABLE, "Anything is possible", 4.5d);
        status.setProperty("whatever", 2.0);
        report.addPollResult(new ScanReportPollResult("Foo", 1, "zombonode", 1, "1.2.3.4", status));
    }
    String reportString = JaxbUtils.marshal(report);
    LOG.debug("Report string: \n " + reportString);
    assertTrue(reportString.contains("<key>customer-account-number</key>"));
    assertTrue(reportString.contains("<value>12345</value>"));
    assertTrue(reportString.contains("<key>customer-name</key>"));
    assertTrue(reportString.contains("<value>Zombo.com</value>"));
    assertTrue(reportString.contains("response-time=\"4.5\""));
    // object is not serialized as JAXB/JSON, only to the database
    assertFalse(reportString.contains("a log!"));
}
Also used : PollStatus(org.opennms.netmgt.poller.PollStatus) ScanReportLog(org.opennms.netmgt.model.ScanReportLog) ScanReport(org.opennms.netmgt.model.ScanReport) ScanReportPollResult(org.opennms.netmgt.model.ScanReportPollResult) Date(java.util.Date) Test(org.junit.Test)

Example 4 with ScanReportPollResult

use of org.opennms.netmgt.model.ScanReportPollResult in project opennms by OpenNMS.

the class DefaultPollerBackEnd method reportSingleScan.

@Override
public void reportSingleScan(final ScanReport report) {
    if (report == null) {
        throw new IllegalArgumentException("ScanReport cannot be null");
    }
    LOG.info("Scan report complete: {}", report);
    m_scanReportDao.save(report);
    if (report.getPollResults().stream().allMatch(a -> {
        return a.getPollStatus().isAvailable();
    })) {
        // If all polls returned 'available' then send the success event
        sendSuccessfulScanReportEvent(report.getId(), report.getLocation());
    } else {
        // Otherwise send the unsuccessful event
        int total = 0;
        int failed = 0;
        final StringBuilder failedPollResults = new StringBuilder();
        for (ScanReportPollResult result : report.getPollResults()) {
            total++;
            if (!result.getPollStatus().isAvailable()) {
                failed++;
                failedPollResults.append(String.format(FAILED_POLL_RESULT_MESSAGE_FORMAT, result.getNodeLabel(), result.getIpAddress(), result.getServiceName(), result.getPollStatus().getReason()));
            }
        }
        StringBuffer finalMessage = new StringBuffer();
        finalMessage.append(String.format(FAILURE_SUMMARY_MESSAGE_FORMAT, failed, total));
        finalMessage.append("<ul>");
        finalMessage.append(failedPollResults);
        finalMessage.append("</ul>");
        sendUnsuccessfulScanReportEvent(report.getId(), report.getLocation(), finalMessage.toString());
    }
}
Also used : ScanReportPollResult(org.opennms.netmgt.model.ScanReportPollResult)

Aggregations

ScanReportPollResult (org.opennms.netmgt.model.ScanReportPollResult)4 ScanReport (org.opennms.netmgt.model.ScanReport)3 Date (java.util.Date)2 ScanReportLog (org.opennms.netmgt.model.ScanReportLog)2 PollStatus (org.opennms.netmgt.poller.PollStatus)2 PropertyChangeEvent (java.beans.PropertyChangeEvent)1 PropertyChangeListener (java.beans.PropertyChangeListener)1 InetAddress (java.net.InetAddress)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 HashMap (java.util.HashMap)1 LinkedList (java.util.LinkedList)1 List (java.util.List)1 Map (java.util.Map)1 Properties (java.util.Properties)1 Set (java.util.Set)1 Collectors (java.util.stream.Collectors)1 ToStringBuilder (org.apache.commons.lang.builder.ToStringBuilder)1