use of org.opennms.netmgt.collection.support.builder.NodeLevelResource in project opennms by OpenNMS.
the class WSManCollectorTest method canGenerateManyResources.
/**
* NMS-8924: Verifies that the generated collection set includes a resource
* for every node (XML) in the response.
*/
@Test
public void canGenerateManyResources() {
// Define our resource type, and create a supplier that returns a new instance on every call
NodeLevelResource node = mock(NodeLevelResource.class);
ResourceType rt = new ResourceType();
rt.setName("wsProcIndex");
rt.setLabel("Processor (wsman)");
rt.setResourceLabel("Processor (${wmiOSCpuName})");
StorageStrategy strategy = new StorageStrategy();
strategy.setClazz(SiblingColumnStorageStrategy.class.getCanonicalName());
strategy.addParameter(new Parameter("sibling-column-name", "wmiOSCpuName"));
rt.setStorageStrategy(strategy);
PersistenceSelectorStrategy pstrategy = new PersistenceSelectorStrategy();
pstrategy.setClazz(PersistAllSelectorStrategy.class.getCanonicalName());
rt.setPersistenceSelectorStrategy(pstrategy);
final AtomicInteger instanceId = new AtomicInteger();
Supplier<Resource> resourceSupplier = () -> {
return new GenericTypeResource(node, rt, Integer.toString(instanceId.getAndIncrement()));
};
// Define our group
Group group = new Group();
group.setName("windows-os-wmi-processor");
addAttribute(group, "Name", "wmiOSCpuName", AttributeType.STRING);
addAttribute(group, "InterruptsPersec", "wmiOSCpuIntsPerSec", AttributeType.GAUGE);
addAttribute(group, "PercentProcessorTime", "wmiOSCpuPctProcTime", AttributeType.GAUGE);
addAttribute(group, "PercentDPCTime", "wmiOSCpuPctDPCTime", AttributeType.GAUGE);
addAttribute(group, "PercentInterruptTime", "wmiOSCpuPctIntrTime", AttributeType.GAUGE);
addAttribute(group, "PercentUserTime", "wmiOSCpuPctUserTime", AttributeType.GAUGE);
// Mock the agent
CollectionAgent agent = mock(CollectionAgent.class);
when(agent.getStorageResourcePath()).thenReturn(ResourcePath.get());
CollectionSetBuilder builder = new CollectionSetBuilder(agent);
// Sample data
XMLTag xmlTag = XMLDoc.newDocument(true).addRoot("body").addTag("Win32_PerfFormattedData_PerfOS_Processor").addTag("Name").setText("c0").addTag("InterruptsPersec").setText("95").gotoRoot().addTag("Win32_PerfFormattedData_PerfOS_Processor").addTag("Name").setText("c1").addTag("InterruptsPersec").setText("100");
List<Node> nodes = xmlTag.gotoRoot().getChildElement().stream().map(el -> (Node) el).collect(Collectors.toList());
// Process the data and generate the collection set
WsManCollector.processEnumerationResults(group, builder, resourceSupplier, nodes);
// Verify the result
CollectionSet collectionSet = builder.build();
assertEquals(Arrays.asList("wsProcIndex/c0/windows-os-wmi-processor/wmiOSCpuName[c0,null]", "wsProcIndex/c0/windows-os-wmi-processor/wmiOSCpuIntsPerSec[null,95.0]", "wsProcIndex/c1/windows-os-wmi-processor/wmiOSCpuName[c1,null]", "wsProcIndex/c1/windows-os-wmi-processor/wmiOSCpuIntsPerSec[null,100.0]"), CollectionSetUtils.flatten(collectionSet));
assertEquals(Sets.newHashSet("c0", "c1"), CollectionSetUtils.getResourcesByLabel(collectionSet).keySet());
}
use of org.opennms.netmgt.collection.support.builder.NodeLevelResource in project opennms by OpenNMS.
the class ThresholdingVisitorIT method testThresholdFiltersOnGenericResourceWithSiblingColumnStorageStrategy.
/**
* Verifies that we are able to generate thresholds for CollectionSets
* using GenericTypeResource resources that use the SiblingColumnStorageStrategy.
*
* Resources of this type are commonly used by the WS-Man collector,
* where data is returned in a tabular format and the resource name is set using
* the SiblingColumnStorageStrategy.
*
* In the case of the WS-Man collector, the instance ids are generated systematically
* and will differ from one collection run to another. For this reason, it's important
* that the thresholder keys it's state based off of the resource label, and not
* the instance id - this test will validate this.
*/
@Test
public void testThresholdFiltersOnGenericResourceWithSiblingColumnStorageStrategy() throws Exception {
initFactories("/threshd-configuration.xml", "/test-thresholds-wsman.xml");
ThresholdingVisitor visitor = createVisitor();
SnmpCollectionAgent agent = createCollectionAgent();
NodeLevelResource nodeResource = new NodeLevelResource(agent.getNodeId());
org.opennms.netmgt.config.datacollection.ResourceType wmiLogicalDisk = createWmiLogicalDiskResourceType();
// Expect a low threshold event (as configured in test-thresholds-wsman.xml)
addEvent(// uei
"uei.opennms.org/threshold/lowThresholdExceededWSManLogStorage", // ipaddr
"127.0.0.1", // service
"SNMP", // trigger
2, // threshold
10240.0, // rearm
12288.0, // value
1.0, // label
"HarddiskVolume16", // instance
"volume16-1", // ds
"wmiLDPctFreeMBytes", // iflabel
null, // ifindex
null, m_anticipator, m_anticipatedEvents);
// Visit the collection set twice (the trigger is set to 2)
for (int i = 0; i < 2; i++) {
// A resource for each drive, with a unique instance on each iteration
GenericTypeResource volume16 = new GenericTypeResource(nodeResource, wmiLogicalDisk, "volume16-" + i);
GenericTypeResource iDrive = new GenericTypeResource(nodeResource, wmiLogicalDisk, "iDrive" + i);
// Create the entries in strings.properties
ResourcePath path = ResourcePath.get("snmp", "1", "wmiLogicalDisk", "HarddiskVolume16");
m_resourceStorageDao.setStringAttribute(path, "wmiLDName", "HarddiskVolume16");
path = ResourcePath.get("snmp", "1", "wmiLogicalDisk", "I");
m_resourceStorageDao.setStringAttribute(path, "wmiLDName", "I");
// Build a collection set containing attributes for both resources
CollectionSet collectionSet = new CollectionSetBuilder(agent).withStringAttribute(volume16, "windows-os-wmi-LogicalDisk", "wmiLDName", "HarddiskVolume16").withNumericAttribute(volume16, "windows-os-wmi-LogicalDisk", "wmiLDPctFreeMBytes", 1.0, AttributeType.GAUGE).withNumericAttribute(volume16, "windows-os-wmi-LogicalDisk", "wmiLDPctFreeSpace", 10, AttributeType.GAUGE).withStringAttribute(iDrive, "windows-os-wmi-LogicalDisk", "wmiLDName", "I").withNumericAttribute(iDrive, "windows-os-wmi-LogicalDisk", "wmiLDPctFreeMBytes", 2668498.0, AttributeType.GAUGE).withNumericAttribute(iDrive, "windows-os-wmi-LogicalDisk", "wmiLDPctFreeSpace", 10, AttributeType.GAUGE).build();
collectionSet.visit(visitor);
}
// Verify!
verifyEvents(0);
}
use of org.opennms.netmgt.collection.support.builder.NodeLevelResource in project opennms by OpenNMS.
the class AbstractXmlCollectionHandler method getCollectionResource.
/**
* Gets the collection resource.
*
* @param agent the collection agent
* @param instance the resource instance
* @param resourceType the resource type
* @param timestamp the timestamp
* @return the collection resource
*/
protected Resource getCollectionResource(CollectionAgent agent, String instance, String resourceType, Date timestamp) {
final NodeLevelResource nodeResource = new NodeLevelResource(agent.getNodeId());
if (CollectionResource.RESOURCE_TYPE_NODE.equalsIgnoreCase(resourceType)) {
return nodeResource;
} else {
DeferredGenericTypeResource resource = new DeferredGenericTypeResource(nodeResource, resourceType, FALLBACK_RESOURCE_TYPE_NAME, instance);
if (timestamp != null) {
LOG.debug("getCollectionResource: the date that will be used when updating the RRDs is {}", timestamp);
resource.setTimestamp(timestamp);
}
return resource;
}
}
use of org.opennms.netmgt.collection.support.builder.NodeLevelResource in project opennms by OpenNMS.
the class NSClientCollector method collect.
/**
* {@inheritDoc}
*/
@Override
public CollectionSet collect(CollectionAgent agent, Map<String, Object> parameters) {
CollectionSetBuilder builder = new CollectionSetBuilder(agent);
builder.withStatus(CollectionStatus.FAILED);
// Find attributes to collect - check groups in configuration. For each,
// check scheduled nodes to see if that group should be collected
NsclientCollection collection = (NsclientCollection) parameters.get(NSCLIENT_COLLECTION_KEY);
NSClientAgentConfig agentConfig = (NSClientAgentConfig) parameters.get(NSCLIENT_AGENT_CONFIG_KEY);
NSClientAgentState agentState = new NSClientAgentState(agent.getAddress(), parameters, agentConfig);
if (collection.getWpms().getWpm().size() < 1) {
LOG.info("No groups to collect.");
builder.withStatus(CollectionStatus.SUCCEEDED);
return builder.build();
}
// All node resources for NSClient; nothing of interface or "indexed resource" type
NodeLevelResource nodeResource = new NodeLevelResource(agent.getNodeId());
for (Wpm wpm : collection.getWpms().getWpm()) {
// A wpm consists of a list of attributes, identified by name
if (agentState.shouldCheckAvailability(wpm.getName(), wpm.getRecheckInterval())) {
LOG.debug("Checking availability of group {}", wpm.getName());
NsclientManager manager = null;
try {
manager = agentState.getManager();
manager.init();
NsclientCheckParams params = new NsclientCheckParams(wpm.getKeyvalue());
NsclientPacket result = manager.processCheckCommand(NsclientManager.CHECK_COUNTER, params);
manager.close();
boolean isAvailable = (result.getResultCode() == NsclientPacket.RES_STATE_OK);
agentState.setGroupIsAvailable(wpm.getName(), isAvailable);
LOG.debug("Group {} is {}available ", wpm.getName(), (isAvailable ? "" : "not"));
} catch (NsclientException e) {
LOG.error("Error checking group ({}) availability", wpm.getName(), e);
agentState.setGroupIsAvailable(wpm.getName(), false);
} finally {
if (manager != null) {
manager.close();
}
}
}
if (agentState.groupIsAvailable(wpm.getName())) {
// Collect the data
try {
NsclientManager manager = agentState.getManager();
// Open the connection, then do each
manager.init();
for (Attrib attrib : wpm.getAttrib()) {
NsclientPacket result = null;
try {
NsclientCheckParams params = new NsclientCheckParams(attrib.getName());
result = manager.processCheckCommand(NsclientManager.CHECK_COUNTER, params);
} catch (NsclientException e) {
LOG.info("unable to collect params for attribute '{}'", attrib.getName(), e);
}
if (result != null) {
if (result.getResultCode() != NsclientPacket.RES_STATE_OK) {
LOG.info("not writing parameters for attribute '{}', state is not 'OK'", attrib.getName());
} else {
// Only numeric data comes back from NSClient in data collection
builder.withNumericAttribute(nodeResource, wpm.getName(), attrib.getAlias(), NumericAttributeUtils.parseNumericValue(result.getResponse()), attrib.getType());
}
}
}
builder.withStatus(CollectionStatus.SUCCEEDED);
// Only close once all the attribs have
manager.close();
// been done (optimizing as much as
// possible with NSClient)
} catch (NsclientException e) {
LOG.error("Error collecting data", e);
}
}
}
return builder.build();
}
use of org.opennms.netmgt.collection.support.builder.NodeLevelResource in project opennms by OpenNMS.
the class StressCommand method generateAndPersistCollectionSets.
private Callable<Void> generateAndPersistCollectionSets(ServiceParameters params, RrdRepository repository, int generatorThreadId, int sleepTimeInMillisBetweenNodes) {
return new Callable<Void>() {
@Override
public Void call() throws Exception {
for (int nodeId = 0; nodeId < numberOfNodes; nodeId++) {
if (nodeId % numberOfGeneratorThreads != generatorThreadId) {
// A different generator will handle this node
continue;
}
// Build the node resource
CollectionAgent agent = new MockCollectionAgent(nodeId);
NodeLevelResource nodeResource = new NodeLevelResource(nodeId);
// Don't reuse the persister instance across nodes to help simulate collectd's actual behavior
Persister persister = persisterFactory.createPersister(params, repository);
for (int interfaceId = 0; interfaceId < numberOfInterfacesPerNode; interfaceId++) {
// Return immediately if the abort flag is set
if (abort.get()) {
return null;
}
// Build the interface resource
InterfaceLevelResource interfaceResource = new InterfaceLevelResource(nodeResource, "tap" + interfaceId);
// Generate the collection set
CollectionSet collectionSet = generateCollectionSet(agent, nodeId, interfaceId, interfaceResource);
// Persist
collectionSet.visit(persister);
}
Thread.sleep(sleepTimeInMillisBetweenNodes);
}
return null;
}
};
}
Aggregations