private InetAddress determineProxyAddress(Map<String, Object> parameters, MonitoredService svc) { LOG.debug("Determining the proxy address on which to set up the ciscoPingEntry for target interface {}", svc.getAddress()); OnmsNode proxyNode = null; InetAddress proxyAddress = null; if (rawProxyIpAddr != null) { proxyIpAddr = PropertiesUtils.substitute(rawProxyIpAddr, getServiceProperties(svc)); LOG.debug("Expanded value '{}' of parameter {} to '{}' for service {} on interface {}", rawProxyIpAddr, PARM_PROXY_IP_ADDR, proxyIpAddr, svc.getSvcName(), svc.getAddress()); LOG.debug("Trying to look up proxy node with foreign-source {}, foreign-id {} for target interface {}", proxyNodeFS, proxyNodeFI, svc.getAddress()); proxyNode = nodeDao.get().findByForeignId(proxyNodeFS, proxyNodeFI); LOG.debug("Found a node via foreign-source / foreign-id '{}'/'{}' to use as proxy", proxyNodeFS, proxyNodeFI); LOG.info("Using address {} from node '{}':'{}' as proxy for service '{}' on interface {}", proxyAddress, proxyNodeFS, proxyNodeFI, svc.getSvcName(), svc.getIpAddr()); return proxyAddress; LOG.debug("Trying to look up proxy node with database ID {} for target interface {}", proxyNodeId, svc.getAddress()); proxyNode = nodeDao.get().get(Integer.valueOf(proxyNodeId)); if (proxyNode != null && proxyNode.getPrimaryInterface() != null) proxyAddress = proxyNode.getPrimaryInterface().getIpAddress(); LOG.info("Using address {} from node with DBID {} as proxy for service '{}' on interface {}", proxyAddress, proxyNodeId, svc.getSvcName(), svc.getIpAddr()); return proxyAddress; LOG.info("Trying to use address {} as proxy-ping agent address for target interface {}", proxyIpAddr, svc.getAddress()); try { if (!"".equals(proxyIpAddr)) { LOG.info("Using address {} (user-specified) as proxy for service '{}' on interface {}", proxyAddress, svc.getSvcName(), svc.getIpAddr()); return proxyAddress;
public static Properties getServiceProperties(final MonitoredService svc) { final InetAddress addr = InetAddressUtils.addr(svc.getIpAddr()); final boolean requireBrackets = addr != null && addr instanceof Inet6Address && !svc.getIpAddr().startsWith("["); final Properties properties = new Properties(); properties.put("ipaddr", requireBrackets ? "[" + svc.getIpAddr() + "]" : svc.getIpAddr()); properties.put("nodeid", svc.getNodeId()); properties.put("nodelabel", svc.getNodeLabel()); properties.put("svcname", svc.getSvcName()); return properties; } }
private void applyThresholds(String rrdPath, MonitoredService service, String dsName, Map<String, Number> entries) { try { if (m_thresholdingSet == null) { RrdRepository repository = new RrdRepository(); repository.setRrdBaseDir(new File(rrdPath)); m_thresholdingSet = new LatencyThresholdingSet(service.getNodeId(), service.getIpAddr(), service.getSvcName(), service.getNodeLocation(), repository, m_resourceStorageDao); } LinkedHashMap<String, Double> attributes = new LinkedHashMap<String, Double>(); for (String ds : entries.keySet()) { Number sampleValue = entries.get(ds); if (sampleValue == null) { attributes.put(ds, Double.NaN); } else { attributes.put(ds, sampleValue.doubleValue()); } } if (m_thresholdingSet.isNodeInOutage()) { LOG.info("applyThresholds: the threshold processing will be skipped because the service {} is on a scheduled outage.", service); } else if (m_thresholdingSet.hasThresholds(attributes)) { List<Event> events = m_thresholdingSet.applyThresholds(dsName, attributes); if (events.size() > 0) { ThresholdingEventProxy proxy = new ThresholdingEventProxy(); proxy.add(events); proxy.sendAllEvents(); } } } catch(Throwable e) { LOG.error("Failed to threshold on {} for {} because of an exception", service, dsName, e); } }
@Override public PollStatus poll(MonitoredService svc, Map<String, Object> parameters) { return PassiveStatusKeeper.getInstance().getStatus(svc.getNodeLabel(), svc.getIpAddr(), svc.getSvcName()); }
private InetAddress determineTargetAddress(MonitoredService svc, Map<String, Object> parameters) { String rawOverrideTarget = ParameterMap.getKeyedString(parameters, PARM_TARGET_IP_ADDR, null); String overrideTarget = rawOverrideTarget; if (rawOverrideTarget != null) { overrideTarget = PropertiesUtils.substitute(rawOverrideTarget, getServiceProperties(svc)); LOG.debug("Expanded value '{}' of parameter {} to '{}' for service {} on interface {}", rawOverrideTarget, PARM_TARGET_IP_ADDR, overrideTarget, svc.getSvcName(), svc.getAddress()); } if (overrideTarget == null) return svc.getAddress(); LOG.debug("Using user-specified override target IP address {} instead of service address {} for service {}", overrideTarget, svc.getAddress(), svc.getSvcName()); try { final InetAddress overrideAddr = InetAddressUtils.addr(overrideTarget); LOG.debug("Overriding service address ({}) with user-specified target address ({}) for service {}", svc.getAddress(), overrideAddr, svc.getSvcName()); return overrideAddr; } catch (final IllegalArgumentException e) { LOG.warn("Failed to look up {} override value {} for service {}. Using service interface {} instead", PARM_TARGET_IP_ADDR, overrideTarget, svc.getSvcName(), svc.getAddress()); } return svc.getAddress(); }
/** * {@inheritDoc} * * Poll the specified address for service availability. * <p> * @param svc * @param parameters * @return * <p> * @see #poll(InetAddress, Map) */ @Override public PollStatus poll(MonitoredService svc, Map<String, Object> parameters) { return poll(svc.getAddress(), parameters); }
.withNodeId(service.getNodeId()) .withLocation(service.getNodeLocation()) .withSystemId(systemId) .withServiceAttributes(attributes) request.setSystemId(target.getSystemId()); request.setClassName(className != null ? className : serviceMonitor.getClass().getCanonicalName()); request.setServiceName(service.getSvcName()); request.setAddress(service.getAddress()); request.setNodeId(service.getNodeId()); request.setNodeLabel(service.getNodeLabel()); request.setNodeLocation(service.getNodeLocation()); request.setTimeToLiveMs(ttlInMs); request.addAttributes(attributes);
private String getBaseUrl(Map<String, Object> parameters, MonitoredService svc) { if(parameters.containsKey("base-url")) { String baseUrl = (String) parameters.get("base-url"); if(!baseUrl.contains("http")) { baseUrl = "http://" + baseUrl; } if(baseUrl.contains("${ipAddr}")) { baseUrl = BaseUrlUtils.replaceIpAddr(baseUrl, svc.getIpAddr()); } if(parameters.containsKey("port")) { String port = (String) parameters.get("port"); baseUrl = baseUrl + ":" + port; } return baseUrl; }else { return null; } }
case "ipAddr": case "ipAddress": sb.append(svc.getIpAddr()); break; case "nodeId": sb.append(svc.getNodeId()); break; case "nodeLabel": sb.append(svc.getNodeLabel()); break; case "foreignId": sb.append(nodeDao.get().get(svc.getNodeId()).getForeignId()); break; case "foreignSource": sb.append(nodeDao.get().get(svc.getNodeId()).getForeignSource()); break; default: LOG.debug("attempting to add node asset property {}", m.group(1)); OnmsNode node = nodeDao.get().get(svc.getNodeId()); if (node != null) { BeanWrapper wrapper = new BeanWrapperImpl(node.getAssetRecord());
@Override public Map<String, Object> getRuntimeAttributes(MonitoredService svc, Map<String, Object> parameters) { final Map<String, Object> attributes = new HashMap<>(); final PollStatus pollStatus = doPoll(svc.getNodeId(), svc.getIpAddr(), m_svcName); attributes.put("status", Integer.toString(pollStatus.getStatusCode())); attributes.put("reason", pollStatus.getReason()); return attributes; }
private void persistLatencySamples(MonitoredService service, Map<String, Number> entries, File rrdRepositoryRoot, String rrdBaseName) { RrdRepository repository = new RrdRepository(); repository.setStep(m_pollerConfig.getStep(m_pkg)); repository.setRraList(m_pollerConfig.getRRAList(m_pkg)); repository.setHeartBeat(repository.getStep() * HEARTBEAT_STEP_MULTIPLIER); repository.setRrdBaseDir(rrdRepositoryRoot); // When making calls directly to RrdUtils#createRrd() and RrdUtils#updateRrd(), // the behavior was as follows: // 1) All samples get written to response/${ipAddr}/${rrdBaseName}.rrd // This happens whether or not storeByGroup is enabled. // 2) If multiple entries are present, the DSs are created in the same order that they // appear in the map LatencyCollectionResource latencyResource = new LatencyCollectionResource(service.getSvcName(), service.getIpAddr(), service.getNodeLocation()); for (final Entry<String, Number> entry : entries.entrySet()) { final String ds = entry.getKey(); final Number value = entry.getValue() != null ? entry.getValue() : Double.NaN; LatencyCollectionAttributeType latencyType = new LatencyCollectionAttributeType(rrdBaseName, ds); latencyResource.addAttribute(new LatencyCollectionAttribute(latencyResource, latencyType, ds, value.doubleValue())); } ServiceParameters params = new ServiceParameters(Collections.emptyMap()); CollectionSetVisitor persister = m_persisterFactory.createPersister(params, repository, false, true, true); SingleResourceCollectionSet collectionSet = new SingleResourceCollectionSet(latencyResource, new Date()); collectionSet.setStatus(CollectionStatus.SUCCEEDED); collectionSet.visit(persister); }
/** {@inheritDoc} */ @Override public PollStatus poll(MonitoredService svc, Map<String, Object> parameters) { TimeoutTracker timeoutTracker = new TimeoutTracker(parameters, DEFAULT_RETRY, DEFAULT_TIMEOUT); for(timeoutTracker.reset(); timeoutTracker.shouldRetry(); timeoutTracker.nextAttempt()) { try { timeoutTracker.startAttempt(); if (svc.getAddress().isReachable(timeoutTracker.getSoTimeout())) { return PollStatus.available(timeoutTracker.elapsedTimeInMillis()); } } catch (IOException e) { LOG.debug("Unable to contact {}", svc.getIpAddr(), e); } } String reason = svc+" failed to respond"; LOG.debug(reason); return PollStatus.unavailable(reason); }
final InetAddress addr = svc.getAddress(); final String nodeLabel = svc.getNodeLabel(); .append(":").append(svc.getSvcName()).append(":").append(currentPort) .toString();
@Override public Map<String, Object> getRuntimeAttributes(MonitoredService svc, Map<String, Object> parameters) { try { SnmpPeerFactory.init(); } catch (IOException e) { LOG.error("SnmpPeerFactory initialization failed.", e); } return ImmutableMap.of("agent", SnmpPeerFactory.getInstance().getAgentConfig(svc.getAddress(), svc.getNodeLocation())); }
@Override public PollStatus poll(final MonitoredService svc, final Map<String, Object> parameters) { // Minions send heartbeat every 30 seconds - we check that we can skip not more than one beat final int period = 2 * ParameterMap.getKeyedInteger(parameters, "period", 30 * 1000); // Get the minion to test whereas the minion ID is the nodes foreign ID by convention final OnmsNode node = nodeDao.get().get(svc.getNodeId()); final OnmsMinion minion = minionDao.get().findById(node.getForeignId()); // Calculate the time since the last heartbeat was received final long lastSeen = System.currentTimeMillis() - minion.getLastUpdated().getTime(); final PollStatus status; if (lastSeen <= period) { status = PollStatus.available(); } else if (ManagementFactory.getRuntimeMXBean().getUptime() < period) { status = PollStatus.unknown("JVM has not been started long enough to process a heartbeat."); } else { status = PollStatus.unavailable(String.format("Last heartbeat was %.2f seconds ago", lastSeen / 1000.0)); } return status; }
clientWrapper.setUserAgent(getUserAgent()); } else { clientWrapper.setUserAgent("OpenNMS PageSequenceMonitor (Service name: " + svc.getSvcName() + ")"); clientWrapper.useRelaxedSSL("https"); } catch (final GeneralSecurityException e) { LOG.warn("Failed configure relaxed SSL for PageSequence {}", svc.getSvcName(), e);
final String lookup = resolveKeyedString(parameters, PARM_LOOKUP, svc.getNodeLabel()); try { name = new Name(lookup);
@Override public Map<String, Object> getRuntimeAttributes(MonitoredService svc, Map<String, Object> parameters) { Map<String, String> convert = new HashMap<>(); for (Map.Entry<String, Object> entry : parameters.entrySet()) { convert.put(entry.getKey(), (String) entry.getValue()); } Map<String, String> attributes = JmxUtils.getRuntimeAttributes(jmxConfigDao.get(), InetAddressUtils.str(svc.getAddress()), convert); return new HashMap<>(attributes); }
/** {@inheritDoc} */ @Override public PollStatus poll(MonitoredService svc, Map<String, Object> parameters) { int retries = ParameterMap.getKeyedInteger(parameters, "retry", PingConstants.DEFAULT_RETRIES); long timeout = ParameterMap.getKeyedLong(parameters, "timeout", PingConstants.DEFAULT_TIMEOUT); Long rtt = null; String phoneNumber = null; try { phoneNumber = phonebook.getTargetForAddress(svc.getIpAddr()); } catch (final PhonebookException e) { LOG.warn("Unable to get phonebook target for {}", svc.getIpAddr(), e); } if (phoneNumber != null) { try { rtt = SmsPinger.ping(phoneNumber, timeout, retries); } catch (final Exception e) { LOG.warn("Unable to ping phone number: {}", phoneNumber, e); } } if (rtt != null) { return PollStatus.available(rtt.doubleValue()); } else { return PollStatus.unavailable(); } } }
@Override public PollStatus poll(MonitoredService monSvc, Map<String, Object> parameters) { if (parameters.containsKey("status")) { final int statusCode = getKeyedInteger(parameters, "status", PollStatus.SERVICE_UNKNOWN); final String reason = getKeyedString(parameters, "reason", null); return PollStatus.get(statusCode, reason); } synchronized (m_network) { return doPoll(monSvc.getNodeId(), monSvc.getIpAddr(), m_svcName); } }