Skip to content

Commit e730aa0

Browse files
committed
NMS-19560: Pre populate metadata for each service
Retreive metadata before once for each service instead of retrieving it for each RPC invoke. Whenever metadata updates, we should clear parameters for the service
1 parent 057ded5 commit e730aa0

File tree

7 files changed

+115
-6
lines changed

7 files changed

+115
-6
lines changed

features/poller/client-rpc/src/main/java/org/opennms/netmgt/poller/client/rpc/PollerRequestBuilderImpl.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,10 @@ public CompletableFuture<PollerResponse> execute() {
145145
throw new IllegalArgumentException("Monitor not found: " + className);
146146
}
147147

148-
final Map<String, Object> interpolatedAttributes = this.getInterpolatedAttributes();
148+
// The normal Poller path (PollableServiceConfig) will double-interpolate, but that's a no-op
149+
// DCB related raw expressions will be interpolated here.
150+
final Scope scope = getScope();
151+
final Map<String, Object> interpolatedAttributes = Interpolator.interpolateObjects(this.attributes, scope);
149152

150153
final RpcTarget target = client.getRpcTargetHelper().target()
151154
.withNodeId(service.getNodeId())
@@ -177,7 +180,10 @@ public CompletableFuture<PollerResponse> execute() {
177180
// such as the agent details and other state related attributes
178181
// which should be included in the request
179182
final Map<String, Object> parameters = request.getMonitorParameters();
180-
request.addAttributes(Interpolator.interpolateAttributes(serviceMonitor.getRuntimeAttributes(request, parameters), getScope()));
183+
final Map<String, Object> runtimeAttributes = serviceMonitor.getRuntimeAttributes(request, parameters);
184+
if (!runtimeAttributes.isEmpty()) {
185+
request.addAttributes(Interpolator.interpolateAttributes(runtimeAttributes, scope));
186+
}
181187

182188
// Execute the request
183189
return client.getDelegate().execute(request).thenApply(results -> {

opennms-services/src/main/java/org/opennms/netmgt/poller/Poller.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.opennms.core.criteria.Criteria;
3636
import org.opennms.core.criteria.restrictions.InRestriction;
3737
import org.opennms.core.logging.Logging;
38+
import org.opennms.core.mate.api.EntityScopeProvider;
3839
import org.opennms.core.utils.InetAddressUtils;
3940
import org.opennms.netmgt.collection.api.PersisterFactory;
4041
import org.opennms.netmgt.config.PollerConfig;
@@ -123,6 +124,9 @@ public class Poller extends AbstractServiceDaemon {
123124
@Qualifier("deviceConfigMonitorAdaptor")
124125
private ServiceMonitorAdaptor serviceMonitorAdaptor;
125126

127+
@Autowired
128+
private EntityScopeProvider m_entityScopeProvider;
129+
126130
public void setPersisterFactory(PersisterFactory persisterFactory) {
127131
m_persisterFactory = persisterFactory;
128132
}
@@ -526,7 +530,8 @@ private boolean scheduleService(OnmsMonitoredService service, Set<OnmsOutage> ou
526530
PollableService svc = getNetwork().createService(service.getNodeId(), iface.getNode().getLabel(), iface.getNode().getLocation().getLocationName(), addr, serviceName);
527531
PollableServiceConfig pollConfig = new PollableServiceConfig(svc, m_pollerConfig, pkg,
528532
getScheduler(), m_persisterFactory, m_thresholdingService,
529-
m_locationAwarePollerClient, m_pollOutagesDao, serviceMonitorAdaptor);
533+
m_locationAwarePollerClient, m_pollOutagesDao, serviceMonitorAdaptor,
534+
m_entityScopeProvider);
530535
svc.setPollConfig(pollConfig);
531536
synchronized(svc) {
532537
if (svc.getSchedule() == null) {

opennms-services/src/main/java/org/opennms/netmgt/poller/PollerEventProcessor.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,12 @@ private void createMessageSelectorAndSubscribe() {
161161
// node location change
162162
ueiList.add(EventConstants.NODE_LOCATION_CHANGED_EVENT_UEI);
163163

164+
// node updated
165+
ueiList.add(EventConstants.NODE_UPDATED_EVENT_UEI);
166+
167+
// node scan completed
168+
ueiList.add(EventConstants.PROVISION_SCAN_COMPLETE_UEI);
169+
164170
// for reloading poller configuration and re-scheduling pollers
165171
ueiList.add(EventConstants.RELOAD_DAEMON_CONFIG_UEI);
166172

@@ -387,6 +393,21 @@ private void nodeLabelChangedHandler(IEvent event) {
387393
}
388394
}
389395

396+
private void nodeUpdatedHandler(IEvent event) {
397+
final Long nodeId = event.getNodeid();
398+
final PollableNode pnode = getNetwork().getNode(nodeId.intValue());
399+
if (pnode == null) {
400+
LOG.debug("nodeUpdatedHandler: node {} not found in pollable network, ignoring.", nodeId);
401+
return;
402+
}
403+
LOG.debug("nodeUpdatedHandler: clearing cached parameters for node {}", nodeId);
404+
for (final PollableInterface iface : pnode.getInterfaces()) {
405+
for (final PollableService svc : iface.getServices()) {
406+
svc.refreshConfig();
407+
}
408+
}
409+
}
410+
390411
private void interfaceDeletedHandler(IEvent event) {
391412
Long nodeId = event.getNodeid();
392413
String sourceUei = event.getUei();
@@ -603,8 +624,9 @@ public void onEvent(IEvent event) {
603624
serviceDeletedHandler(event);
604625
}
605626
} else if (event.getUei().equals(EventConstants.NODE_CATEGORY_MEMBERSHIP_CHANGED_EVENT_UEI)) {
606-
if (event.getNodeid() > 0) {
627+
if (event.getNodeid() > 0) {
607628
serviceReschedule(event, false);
629+
nodeUpdatedHandler(event);
608630
}
609631
} else if (event.getUei().equals(EventConstants.NODE_LOCATION_CHANGED_EVENT_UEI)) {
610632
if (event.getNodeid() > 0) {
@@ -614,6 +636,12 @@ public void onEvent(IEvent event) {
614636
} else if (event.getUei().equals(EventConstants.ASSET_INFO_CHANGED_EVENT_UEI)) {
615637
if (event.getNodeid() > 0) {
616638
serviceReschedule(event, false);
639+
nodeUpdatedHandler(event);
640+
}
641+
} else if (event.getUei().equals(EventConstants.NODE_UPDATED_EVENT_UEI) ||
642+
event.getUei().equals(EventConstants.PROVISION_SCAN_COMPLETE_UEI)) {
643+
if (event.getNodeid() > 0) {
644+
nodeUpdatedHandler(event);
617645
}
618646
} // end single event process
619647

opennms-services/src/main/java/org/opennms/netmgt/poller/pollables/PollableServiceConfig.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@
2222
package org.opennms.netmgt.poller.pollables;
2323

2424
import java.util.Collections;
25+
import java.util.HashMap;
2526
import java.util.Map;
2627
import java.util.Objects;
2728
import java.util.concurrent.CompletableFuture;
2829
import java.util.concurrent.CompletionStage;
2930
import java.util.concurrent.ExecutionException;
3031
import java.util.concurrent.TimeUnit;
3132

33+
import org.opennms.core.mate.api.EntityScopeProvider;
34+
import org.opennms.core.mate.api.FallbackScope;
35+
import org.opennms.core.mate.api.Interpolator;
36+
import org.opennms.core.mate.api.MapScope;
37+
import org.opennms.core.mate.api.Scope;
3238
import org.opennms.core.rpc.api.RpcExceptionHandler;
3339
import org.opennms.core.rpc.api.RpcExceptionUtils;
3440
import org.opennms.netmgt.collection.api.PersisterFactory;
@@ -72,7 +78,9 @@ public class PollableServiceConfig implements PollConfig, ScheduleInterval {
7278
private final ServiceMonitorAdaptor m_DeviceConfigMonitorAdaptor;
7379

7480
private final ReadablePollOutagesDao m_pollOutagesDao;
75-
81+
82+
private final EntityScopeProvider m_entityScopeProvider;
83+
7684
/**
7785
* <p>Constructor for PollableServiceConfig.</p>
7886
*
@@ -84,6 +92,13 @@ public class PollableServiceConfig implements PollConfig, ScheduleInterval {
8492
public PollableServiceConfig(PollableService svc, PollerConfig pollerConfig, Package pkg, Timer timer, PersisterFactory persisterFactory,
8593
ThresholdingService thresholdingService, LocationAwarePollerClient locationAwarePollerClient,
8694
ReadablePollOutagesDao pollOutagesDao, ServiceMonitorAdaptor serviceMonitorAdaptor) {
95+
this(svc, pollerConfig, pkg, timer, persisterFactory, thresholdingService, locationAwarePollerClient, pollOutagesDao, serviceMonitorAdaptor, null);
96+
}
97+
98+
public PollableServiceConfig(PollableService svc, PollerConfig pollerConfig, Package pkg, Timer timer, PersisterFactory persisterFactory,
99+
ThresholdingService thresholdingService, LocationAwarePollerClient locationAwarePollerClient,
100+
ReadablePollOutagesDao pollOutagesDao, ServiceMonitorAdaptor serviceMonitorAdaptor,
101+
EntityScopeProvider entityScopeProvider) {
87102
m_service = svc;
88103
m_pollerConfig = pollerConfig;
89104
m_pkg = pkg;
@@ -93,6 +108,7 @@ public PollableServiceConfig(PollableService svc, PollerConfig pollerConfig, Pac
93108
m_statusStoringServiceMonitorAdaptor = new StatusStoringServiceMonitorAdaptor(pollerConfig, pkg, persisterFactory);
94109
m_DeviceConfigMonitorAdaptor = serviceMonitorAdaptor;
95110
m_pollOutagesDao = Objects.requireNonNull(pollOutagesDao);
111+
m_entityScopeProvider = entityScopeProvider;
96112

97113
this.findService();
98114
}
@@ -190,11 +206,23 @@ public synchronized void refresh() {
190206
m_pkg = newPkg;
191207

192208
this.findService();
209+
m_parameters = null;
193210
}
194211

195212
private synchronized Map<String,Object> getParameters() {
196213
if (m_parameters == null) {
197-
m_parameters = m_configService.getParameterMap();
214+
final Map<String, Object> raw = m_configService.getParameterMap();
215+
if (m_entityScopeProvider != null) {
216+
final Scope scope = new FallbackScope(
217+
m_entityScopeProvider.getScopeForNode(m_service.getNodeId()),
218+
m_entityScopeProvider.getScopeForInterface(m_service.getNodeId(), m_service.getIpAddr()),
219+
m_entityScopeProvider.getScopeForService(m_service.getNodeId(), m_service.getAddress(), m_service.getSvcName()),
220+
MapScope.singleContext(Scope.ScopeName.SERVICE, "pattern", m_patternVariables)
221+
);
222+
m_parameters = new HashMap<>(Interpolator.interpolateObjects(raw, scope));
223+
} else {
224+
m_parameters = raw;
225+
}
198226
}
199227
return m_parameters;
200228
}

opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/NodeIpInterfacesRestService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import org.opennms.core.criteria.Alias.JoinType;
4545
import org.opennms.core.criteria.CriteriaBuilder;
4646
import org.opennms.netmgt.dao.api.IpInterfaceDao;
47+
import org.opennms.netmgt.events.api.EventConstants;
4748
import org.opennms.netmgt.model.OnmsIpInterface;
4849
import org.opennms.netmgt.model.OnmsIpInterfaceList;
4950
import org.opennms.netmgt.model.OnmsMetaData;
5051
import org.opennms.netmgt.model.OnmsMetaDataList;
5152
import org.opennms.netmgt.model.OnmsNode;
53+
import org.opennms.netmgt.model.events.EventBuilder;
5254
import org.opennms.netmgt.model.events.EventUtils;
5355
import org.opennms.netmgt.xml.event.Event;
5456
import org.opennms.web.api.RestUtils;
@@ -236,6 +238,7 @@ public Response deleteMetaData(@Context final UriInfo uriInfo, @PathParam("ipAdd
236238
}
237239
intf.removeMetaData(context);
238240
getDao().update(intf);
241+
sendNodeMetadataUpdatedEvent(intf);
239242
return Response.noContent().build();
240243
} finally {
241244
writeUnlock();
@@ -257,6 +260,7 @@ public Response deleteMetaData(@Context final UriInfo uriInfo, @PathParam("ipAdd
257260
}
258261
intf.removeMetaData(context, key);
259262
getDao().update(intf);
263+
sendNodeMetadataUpdatedEvent(intf);
260264
return Response.noContent().build();
261265
} finally {
262266
writeUnlock();
@@ -278,6 +282,7 @@ public Response postMetaData(@Context final UriInfo uriInfo, @PathParam("ipAddre
278282
}
279283
intf.addMetaData(entity.getContext(), entity.getKey(), entity.getValue());
280284
getDao().update(intf);
285+
sendNodeMetadataUpdatedEvent(intf);
281286
return Response.noContent().build();
282287
} finally {
283288
writeUnlock();
@@ -299,9 +304,18 @@ public Response postMetaData(@Context final UriInfo uriInfo, @PathParam("ipAddre
299304
}
300305
intf.addMetaData(context, key, value);
301306
getDao().update(intf);
307+
sendNodeMetadataUpdatedEvent(intf);
302308
return Response.noContent().build();
303309
} finally {
304310
writeUnlock();
305311
}
306312
}
313+
314+
private void sendNodeMetadataUpdatedEvent(final OnmsIpInterface intf) {
315+
final Event e = new EventBuilder(EventConstants.NODE_UPDATED_EVENT_UEI, "ReST")
316+
.setNodeid(intf.getNodeId())
317+
.addParam(EventConstants.PARM_RESCAN_EXISTING, Boolean.FALSE.toString())
318+
.getEvent();
319+
sendEvent(e);
320+
}
307321
}

opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/NodeMonitoredServiceRestService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.opennms.netmgt.dao.api.MonitoredServiceDao;
5050
import org.opennms.netmgt.dao.api.ServiceTypeDao;
5151
import org.opennms.netmgt.dao.support.CreateIfNecessaryTemplate;
52+
import org.opennms.netmgt.events.api.EventConstants;
5253
import org.opennms.netmgt.model.OnmsApplication;
5354
import org.opennms.netmgt.model.OnmsIpInterface;
5455
import org.opennms.netmgt.model.OnmsMetaData;
@@ -57,6 +58,7 @@
5758
import org.opennms.netmgt.model.OnmsMonitoredServiceList;
5859
import org.opennms.netmgt.model.OnmsNode;
5960
import org.opennms.netmgt.model.OnmsServiceType;
61+
import org.opennms.netmgt.model.events.EventBuilder;
6062
import org.opennms.netmgt.model.events.EventUtils;
6163
import org.opennms.netmgt.xml.event.Event;
6264
import org.opennms.web.api.RestUtils;
@@ -292,6 +294,7 @@ public Response deleteMetaData(@Context final UriInfo uriInfo, @PathParam("servi
292294
}
293295
service.removeMetaData(context);
294296
getDao().update(service);
297+
sendNodeMetadataUpdatedEvent(service);
295298
return Response.noContent().build();
296299
} finally {
297300
writeUnlock();
@@ -313,6 +316,7 @@ public Response deleteMetaData(@Context final UriInfo uriInfo, @PathParam("servi
313316
}
314317
service.removeMetaData(context, key);
315318
getDao().update(service);
319+
sendNodeMetadataUpdatedEvent(service);
316320
return Response.noContent().build();
317321
} finally {
318322
writeUnlock();
@@ -334,6 +338,7 @@ public Response postMetaData(@Context final UriInfo uriInfo, @PathParam("service
334338
}
335339
service.addMetaData(entity.getContext(), entity.getKey(), entity.getValue());
336340
getDao().update(service);
341+
sendNodeMetadataUpdatedEvent(service);
337342
return Response.noContent().build();
338343
} finally {
339344
writeUnlock();
@@ -355,9 +360,18 @@ public Response putMetaData(@Context final UriInfo uriInfo, @PathParam("serviceN
355360
}
356361
service.addMetaData(context, key, value);
357362
getDao().update(service);
363+
sendNodeMetadataUpdatedEvent(service);
358364
return Response.noContent().build();
359365
} finally {
360366
writeUnlock();
361367
}
362368
}
369+
370+
private void sendNodeMetadataUpdatedEvent(final OnmsMonitoredService service) {
371+
final Event e = new EventBuilder(EventConstants.NODE_UPDATED_EVENT_UEI, "ReST")
372+
.setNodeid(service.getNodeId())
373+
.addParam(EventConstants.PARM_RESCAN_EXISTING, Boolean.FALSE.toString())
374+
.getEvent();
375+
sendEvent(e);
376+
}
363377
}

opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/NodeRestService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
import org.opennms.netmgt.model.OnmsMetaDataList;
5858
import org.opennms.netmgt.model.OnmsNode;
5959
import org.opennms.netmgt.model.OnmsNodeList;
60+
import org.opennms.netmgt.events.api.EventConstants;
61+
import org.opennms.netmgt.model.events.EventBuilder;
6062
import org.opennms.netmgt.model.events.EventUtils;
6163
import org.opennms.netmgt.model.monitoringLocations.OnmsMonitoringLocation;
6264
import org.opennms.netmgt.xml.event.Event;
@@ -348,6 +350,7 @@ public Response deleteMetaData(@PathParam("nodeCriteria") final String nodeCrite
348350
}
349351
node.removeMetaData(context);
350352
getDao().update(node);
353+
sendNodeMetadataUpdatedEvent(node);
351354
return Response.noContent().build();
352355
} finally {
353356
writeUnlock();
@@ -368,6 +371,7 @@ public Response deleteMetaData(@PathParam("nodeCriteria") final String nodeCrite
368371
}
369372
node.removeMetaData(context, key);
370373
getDao().update(node);
374+
sendNodeMetadataUpdatedEvent(node);
371375
return Response.noContent().build();
372376
} finally {
373377
writeUnlock();
@@ -388,6 +392,7 @@ public Response postMetaData(@PathParam("nodeCriteria") final String nodeCriteri
388392
}
389393
node.addMetaData(entity.getContext(), entity.getKey(), entity.getValue());
390394
getDao().update(node);
395+
sendNodeMetadataUpdatedEvent(node);
391396
return Response.noContent().build();
392397
} finally {
393398
writeUnlock();
@@ -408,9 +413,18 @@ public Response putMetaData(@PathParam("nodeCriteria") final String nodeCriteria
408413
}
409414
node.addMetaData(context, key, value);
410415
getDao().update(node);
416+
sendNodeMetadataUpdatedEvent(node);
411417
return Response.noContent().build();
412418
} finally {
413419
writeUnlock();
414420
}
415421
}
422+
423+
private void sendNodeMetadataUpdatedEvent(final OnmsNode node) {
424+
final Event e = new EventBuilder(EventConstants.NODE_UPDATED_EVENT_UEI, "ReST")
425+
.setNodeid(node.getId())
426+
.addParam(EventConstants.PARM_RESCAN_EXISTING, Boolean.FALSE.toString())
427+
.getEvent();
428+
sendEvent(e);
429+
}
416430
}

0 commit comments

Comments
 (0)