Search in sources :

Example 6 with OnmsMonitoredService

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

the class OutageDaoHibernate method matchingCurrentOutages.

/** {@inheritDoc} */
@Override
public Collection<OnmsOutage> matchingCurrentOutages(final ServiceSelector selector) {
    final Set<InetAddress> matchingAddrs = new HashSet<InetAddress>(m_filterDao.getIPAddressList(selector.getFilterRule()));
    final Set<String> matchingSvcs = new HashSet<String>(selector.getServiceNames());
    final List<OnmsOutage> matchingOutages = new LinkedList<OnmsOutage>();
    final Collection<OnmsOutage> outages = currentOutages();
    for (final OnmsOutage outage : outages) {
        final OnmsMonitoredService svc = outage.getMonitoredService();
        if ((matchingSvcs.contains(svc.getServiceName()) || matchingSvcs.isEmpty()) && matchingAddrs.contains(svc.getIpAddress())) {
            matchingOutages.add(outage);
        }
    }
    return matchingOutages;
}
Also used : OnmsOutage(org.opennms.netmgt.model.OnmsOutage) InetAddress(java.net.InetAddress) LinkedList(java.util.LinkedList) HashSet(java.util.HashSet) OnmsMonitoredService(org.opennms.netmgt.model.OnmsMonitoredService)

Example 7 with OnmsMonitoredService

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

the class DefaultDistributedStatusService method createHistoryModel.

/** {@inheritDoc} */
@Override
public DistributedStatusHistoryModel createHistoryModel(String locationName, String monitorId, String applicationName, String timeSpan, String previousLocationName) {
    List<String> errors = new LinkedList<String>();
    List<OnmsMonitoringLocation> locationDefinitions = m_monitoringLocationDao.findAll();
    List<RelativeTimePeriod> periods = Arrays.asList(RelativeTimePeriod.getDefaultPeriods());
    Collection<OnmsApplication> applications = m_applicationDao.findAll();
    List<OnmsApplication> sortedApplications = new ArrayList<OnmsApplication>(applications);
    Collections.sort(sortedApplications);
    OnmsMonitoringLocation location = new OnmsMonitoringLocation();
    if (locationName == null) {
        if (!locationDefinitions.isEmpty()) {
            location = locationDefinitions.get(0);
        }
    } else {
        location = m_monitoringLocationDao.get(locationName);
        if (location == null) {
            errors.add("Could not find location definition '" + locationName + "'");
            if (!locationDefinitions.isEmpty()) {
                location = locationDefinitions.get(0);
            }
        }
    }
    OnmsApplication application = new OnmsApplication();
    if (applicationName == null) {
        if (!sortedApplications.isEmpty()) {
            application = sortedApplications.get(0);
        }
    } else {
        application = m_applicationDao.findByName(applicationName);
        if (application == null) {
            errors.add("Could not find application '" + applicationName + "'");
            if (!sortedApplications.isEmpty()) {
                application = sortedApplications.get(0);
            }
        }
    }
    Collection<OnmsLocationMonitor> monitors = m_locationMonitorDao.findByLocationDefinition(location);
    List<OnmsLocationMonitor> sortedMonitors = new LinkedList<OnmsLocationMonitor>(monitors);
    Collections.sort(sortedMonitors);
    OnmsLocationMonitor monitor = null;
    if (monitorId != null && !"".equals(monitorId.trim()) && location.getLocationName().equals(previousLocationName)) {
        for (OnmsLocationMonitor m : sortedMonitors) {
            if (m.getId().equals(monitorId)) {
                monitor = m;
                break;
            }
        }
    }
    if (monitor == null && !sortedMonitors.isEmpty()) {
        monitor = sortedMonitors.get(0);
    }
    RelativeTimePeriod period = RelativeTimePeriod.getPeriodByIdOrDefault(timeSpan);
    /*
         * Initialize the hierarchy under the service so that we don't get
         * a LazyInitializationException later when the JSP page is pulling
         * data out of the model object.
         */
    Collection<OnmsMonitoredService> memberServices = m_monitoredServiceDao.findByApplication(application);
    for (OnmsMonitoredService service : memberServices) {
        m_locationMonitorDao.initialize(service.getIpInterface());
        m_locationMonitorDao.initialize(service.getIpInterface().getNode());
    }
    Collection<OnmsMonitoredService> applicationMemberServices = m_monitoredServiceDao.findByApplication(application);
    if (applicationMemberServices.isEmpty()) {
        errors.add("There are no services in the application '" + applicationName + "'");
    }
    DistributedStatusHistoryModel model = new DistributedStatusHistoryModel(locationDefinitions, sortedApplications, sortedMonitors, periods, location, application, applicationMemberServices, monitor, period, errors);
    initializeGraphUrls(model);
    return model;
}
Also used : ArrayList(java.util.ArrayList) OnmsApplication(org.opennms.netmgt.model.OnmsApplication) LinkedList(java.util.LinkedList) OnmsMonitoredService(org.opennms.netmgt.model.OnmsMonitoredService) DistributedStatusHistoryModel(org.opennms.web.svclayer.model.DistributedStatusHistoryModel) RelativeTimePeriod(org.opennms.web.svclayer.model.RelativeTimePeriod) OnmsLocationMonitor(org.opennms.netmgt.model.OnmsLocationMonitor) OnmsMonitoringLocation(org.opennms.netmgt.model.monitoringLocations.OnmsMonitoringLocation)

Example 8 with OnmsMonitoredService

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

the class DefaultDistributedStatusService method calculateCurrentStatus.

/**
     * <p>calculateCurrentStatus</p>
     *
     * @param monitor a {@link org.opennms.netmgt.model.OnmsLocationMonitor} object.
     * @param applicationServices a {@link java.util.Collection} object.
     * @param statuses a {@link java.util.Collection} object.
     * @return a {@link org.opennms.web.svclayer.support.DefaultDistributedStatusService.Severity} object.
     */
public Severity calculateCurrentStatus(OnmsLocationMonitor monitor, Collection<OnmsMonitoredService> applicationServices, Collection<OnmsLocationSpecificStatus> statuses) {
    Set<PollStatus> pollStatuses = new HashSet<PollStatus>();
    for (OnmsMonitoredService service : applicationServices) {
        boolean foundIt = false;
        for (OnmsLocationSpecificStatus status : statuses) {
            if (status.getMonitoredService().equals(service) && status.getLocationMonitor().equals(monitor)) {
                pollStatuses.add(status.getPollResult());
                foundIt = true;
                break;
            }
        }
        if (!foundIt) {
            pollStatuses.add(PollStatus.unknown("No status found for this service"));
            LOG.debug("Did not find status for service {} in application.  Setting status for it to unknown.", service);
        }
    }
    return calculateStatus(pollStatuses);
}
Also used : PollStatus(org.opennms.netmgt.poller.PollStatus) OnmsLocationSpecificStatus(org.opennms.netmgt.model.OnmsLocationSpecificStatus) HashSet(java.util.HashSet) OnmsMonitoredService(org.opennms.netmgt.model.OnmsMonitoredService)

Example 9 with OnmsMonitoredService

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

the class DefaultDistributedStatusService method calculatePercentageUptime.

/**
     * Calculate the percentage of time that all services are up for this
     * application on this remote monitor.
     *
     * @param applicationServices services to report on
     * @param statuses status entries to use for report
     * @param startDate start date.  The report starts on this date.
     * @param endDate end date.  The report ends the last millisecond prior
     * this date.
     * @return representation of the percentage uptime out to three decimal
     * places.  Null is returned if there is no data.
     */
public String calculatePercentageUptime(Collection<OnmsMonitoredService> applicationServices, Collection<OnmsLocationSpecificStatus> statuses, Date startDate, Date endDate) {
    /*
         * The methodology is as such:
         * 1) Sort the status entries by their timestamp;
         * 2) Create a Map of each monitored service with a default
         *    PollStatus of unknown.
         * 3) Iterate through the sorted list of status entries until
         *    we hit a timestamp that is not within our time range or
         *    run out of entries.
         *    a) Along the way, update the status Map with the current
         *       entry's status, and calculate the current status.
         *    b) If the current timestamp is before the start time, store
         *       the current status so we can use it once we cross over
         *       into our time range and then continue.
         *    c) If the previous status is normal, then count up the number
         *       of milliseconds since the previous state change entry in
         *       the time range (or the beginning of the range if this is
         *       the first entry in within the time range), and add that
         *       a counter of "normal" millseconds.
         *    d) Finally, save the current date and status for later use.
         * 4) Perform the same computation in 3c, except count the number
         *    of milliseconds since the last state change entry (or the
         *    start time if there were no entries) and the end time, and add
         *    that to the counter of "normal" milliseconds.
         * 5) Divide the "normal" milliseconds counter by the total number
         *    of milliseconds in our time range and compute and return a
         *    percentage.
         */
    List<OnmsLocationSpecificStatus> sortedStatuses = new LinkedList<OnmsLocationSpecificStatus>(statuses);
    Collections.sort(sortedStatuses, new Comparator<OnmsLocationSpecificStatus>() {

        @Override
        public int compare(OnmsLocationSpecificStatus o1, OnmsLocationSpecificStatus o2) {
            return o1.getPollResult().getTimestamp().compareTo(o2.getPollResult().getTimestamp());
        }
    });
    HashMap<OnmsMonitoredService, PollStatus> serviceStatus = new HashMap<OnmsMonitoredService, PollStatus>();
    for (OnmsMonitoredService service : applicationServices) {
        serviceStatus.put(service, PollStatus.unknown("No history for this service from this location"));
    }
    float normalMilliseconds = 0f;
    Date lastDate = startDate;
    Severity lastStatus = Severity.CRITICAL;
    for (OnmsLocationSpecificStatus status : sortedStatuses) {
        Date currentDate = status.getPollResult().getTimestamp();
        if (!currentDate.before(endDate)) {
            // We're at or past the end date, so we're done processing
            break;
        }
        serviceStatus.put(status.getMonitoredService(), status.getPollResult());
        Severity currentStatus = calculateStatus(serviceStatus.values());
        if (currentDate.before(startDate)) {
            /*
                 * We're not yet to a date that is inside our time period, so
                 * we don't need to check the status and adjust the
                 * normalMilliseconds variable, but we do need to save the
                 * status so we have an up-to-date status when we cross the
                 * start date.
                 */
            lastStatus = currentStatus;
            continue;
        }
        /*
             * Because we *just* had a state change, we want to look at the
             * value of the *last* status.
             */
        if (lastStatus == Severity.NORMAL) {
            long milliseconds = currentDate.getTime() - lastDate.getTime();
            normalMilliseconds += milliseconds;
        }
        lastDate = currentDate;
        lastStatus = currentStatus;
    }
    if (lastStatus == Severity.NORMAL) {
        long milliseconds = endDate.getTime() - lastDate.getTime();
        normalMilliseconds += milliseconds;
    }
    float percentage = normalMilliseconds / (endDate.getTime() - startDate.getTime()) * 100;
    return new DecimalFormat("0.000").format((double) percentage) + "%";
}
Also used : PollStatus(org.opennms.netmgt.poller.PollStatus) HashMap(java.util.HashMap) OnmsLocationSpecificStatus(org.opennms.netmgt.model.OnmsLocationSpecificStatus) DecimalFormat(java.text.DecimalFormat) LinkedList(java.util.LinkedList) Date(java.util.Date) OnmsMonitoredService(org.opennms.netmgt.model.OnmsMonitoredService)

Example 10 with OnmsMonitoredService

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

the class DefaultDistributedStatusService method createFacilityStatusTable.

/** {@inheritDoc} */
@Override
public SimpleWebTable createFacilityStatusTable(Date start, Date end) {
    Assert.notNull(start, "argument start cannot be null");
    Assert.notNull(end, "argument end cannot be null");
    if (!start.before(end)) {
        throw new IllegalArgumentException("start date (" + start + ") must be older than end date (" + end + ")");
    }
    SimpleWebTable table = new SimpleWebTable();
    List<OnmsMonitoringLocation> locationDefinitions = m_monitoringLocationDao.findAll();
    Collection<OnmsApplication> applications = m_applicationDao.findAll();
    if (applications.size() == 0) {
        throw new IllegalArgumentException("there are no applications");
    }
    List<OnmsApplication> sortedApplications = new ArrayList<OnmsApplication>(applications);
    Collections.sort(sortedApplications);
    Collection<OnmsLocationSpecificStatus> mostRecentStatuses = m_locationMonitorDao.getAllMostRecentStatusChanges();
    Collection<OnmsLocationSpecificStatus> statusesPeriod = new HashSet<OnmsLocationSpecificStatus>();
    statusesPeriod.addAll(m_locationMonitorDao.getAllStatusChangesAt(start));
    statusesPeriod.addAll(m_locationMonitorDao.getStatusChangesBetween(start, end));
    table.setTitle("Distributed Status Summary");
    table.addColumn("Area", "");
    table.addColumn("Location", "");
    for (OnmsApplication application : sortedApplications) {
        table.addColumn(application.getName(), "");
    }
    for (OnmsMonitoringLocation locationDefinition : locationDefinitions) {
        Collection<OnmsLocationMonitor> monitors = m_locationMonitorDao.findByLocationDefinition(locationDefinition);
        table.newRow();
        table.addCell(locationDefinition.getMonitoringArea(), "");
        table.addCell(locationDefinition.getLocationName(), "");
        for (OnmsApplication application : sortedApplications) {
            Collection<OnmsMonitoredService> memberServices = m_monitoredServiceDao.findByApplication(application);
            Severity status = calculateCurrentStatus(monitors, memberServices, mostRecentStatuses);
            Set<OnmsLocationSpecificStatus> selectedStatuses = filterStatus(statusesPeriod, monitors, memberServices);
            if (selectedStatuses.size() > 0) {
                String percentage = calculatePercentageUptime(memberServices, selectedStatuses, start, end);
                table.addCell(percentage, status.getStyle(), createHistoryPageUrl(locationDefinition, application));
            } else {
                table.addCell("No data", status.getStyle());
            }
        }
    }
    if (isLayoutApplicationsVertically()) {
        SimpleWebTable newTable = new SimpleWebTable();
        newTable.setErrors(table.getErrors());
        newTable.setTitle(table.getTitle());
        newTable.addColumn("Application");
        for (List<Cell> row : table.getRows()) {
            // The location is in the second row
            newTable.addColumn(row.get(1).getContent(), row.get(1).getStyleClass());
        }
        for (Cell columnHeader : table.getColumnHeaders().subList(2, table.getColumnHeaders().size())) {
            // This is the index into collumn list of the old table to get the data for the current application
            int rowColumnIndex = newTable.getRows().size() + 2;
            newTable.newRow();
            newTable.addCell(columnHeader.getContent(), columnHeader.getStyleClass());
            for (List<Cell> row : table.getRows()) {
                newTable.addCell(row.get(rowColumnIndex).getContent(), row.get(rowColumnIndex).getStyleClass(), row.get(rowColumnIndex).getLink());
            }
        }
        return newTable;
    }
    return table;
}
Also used : OnmsLocationSpecificStatus(org.opennms.netmgt.model.OnmsLocationSpecificStatus) ArrayList(java.util.ArrayList) OnmsApplication(org.opennms.netmgt.model.OnmsApplication) OnmsMonitoredService(org.opennms.netmgt.model.OnmsMonitoredService) SimpleWebTable(org.opennms.web.svclayer.model.SimpleWebTable) OnmsLocationMonitor(org.opennms.netmgt.model.OnmsLocationMonitor) Cell(org.opennms.web.svclayer.model.SimpleWebTable.Cell) OnmsMonitoringLocation(org.opennms.netmgt.model.monitoringLocations.OnmsMonitoringLocation) HashSet(java.util.HashSet)

Aggregations

OnmsMonitoredService (org.opennms.netmgt.model.OnmsMonitoredService)116 Date (java.util.Date)35 OnmsNode (org.opennms.netmgt.model.OnmsNode)35 OnmsIpInterface (org.opennms.netmgt.model.OnmsIpInterface)33 Test (org.junit.Test)26 OnmsOutage (org.opennms.netmgt.model.OnmsOutage)23 Transactional (org.springframework.transaction.annotation.Transactional)21 OnmsApplication (org.opennms.netmgt.model.OnmsApplication)20 OnmsLocationSpecificStatus (org.opennms.netmgt.model.OnmsLocationSpecificStatus)18 ArrayList (java.util.ArrayList)17 OnmsServiceType (org.opennms.netmgt.model.OnmsServiceType)16 OnmsLocationMonitor (org.opennms.netmgt.model.OnmsLocationMonitor)15 OnmsMonitoringLocation (org.opennms.netmgt.model.monitoringLocations.OnmsMonitoringLocation)15 LinkedList (java.util.LinkedList)13 OnmsEvent (org.opennms.netmgt.model.OnmsEvent)12 HashSet (java.util.HashSet)8 Before (org.junit.Before)6 Criteria (org.opennms.core.criteria.Criteria)5 BusinessServiceEntity (org.opennms.netmgt.bsm.persistence.api.BusinessServiceEntity)5 SimpleWebTable (org.opennms.web.svclayer.model.SimpleWebTable)5