use of org.opennms.netmgt.config.jdbc.JdbcQuery in project opennms by OpenNMS.
the class JdbcCollectorTest method canCollectNodeLevelResource.
@Test
public void canCollectNodeLevelResource() throws Exception {
// Build the query
JdbcQuery query = new JdbcQuery();
query.setIfType("ignore");
// This is the group name
query.setQueryName("someJdbcQuery");
JdbcColumn column = new JdbcColumn();
column.setColumnName("someColumnName");
column.setAlias("someAlias");
column.setDataType(AttributeType.GAUGE);
query.addJdbcColumn(column);
JdbcDataCollection collection = new JdbcDataCollection();
collection.addQuery(query);
// Mock the result set
ResultSet resultSet = mock(ResultSet.class);
when(resultSet.getRow()).thenReturn(1);
when(resultSet.getString("someColumnName")).thenReturn("99");
when(resultSet.next()).thenReturn(true).thenReturn(false);
// Collect and verify
CollectionSet collectionSet = collect(collection, resultSet);
assertEquals(CollectionStatus.SUCCEEDED, collectionSet.getStatus());
List<String> collectionSetKeys = CollectionSetUtils.flatten(collectionSet);
assertEquals(Arrays.asList("snmp/1/someJdbcQuery/someAlias[null,99.0]"), collectionSetKeys);
}
use of org.opennms.netmgt.config.jdbc.JdbcQuery in project opennms by OpenNMS.
the class JdbcCollectorTest method canCollectGenericResource.
@Test
public void canCollectGenericResource() throws Exception {
// Build the query
JdbcQuery query = new JdbcQuery();
query.setQueryName("pg_tablespace_size");
query.setIfType("all");
query.setResourceType("pgTableSpace");
query.setInstanceColumn("spcname");
JdbcColumn spcnameColumn = new JdbcColumn();
spcnameColumn.setColumnName("spcname");
spcnameColumn.setAlias("spcname");
spcnameColumn.setDataType(AttributeType.STRING);
query.addJdbcColumn(spcnameColumn);
JdbcColumn tssizeColumn = new JdbcColumn();
tssizeColumn.setColumnName("ts_size");
tssizeColumn.setAlias("ts_size");
tssizeColumn.setDataType(AttributeType.GAUGE);
query.addJdbcColumn(tssizeColumn);
JdbcDataCollection collection = new JdbcDataCollection();
collection.addQuery(query);
// Mock the result set
ResultSet resultSet = mock(ResultSet.class);
when(resultSet.getRow()).thenReturn(2);
when(resultSet.getString("spcname")).thenReturn("some: name");
when(resultSet.getString("ts_size")).thenReturn("41").thenReturn("52");
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
// Define the resource type
ResourceType resourceType = new ResourceType();
resourceType.setName("pgTableSpace");
resourceType.setLabel("PostgreSQL Tablespace");
resourceType.setResourceLabel("${spcname}");
StorageStrategy storageStrategy = new StorageStrategy();
storageStrategy.setClazz(IndexStorageStrategy.class.getCanonicalName());
resourceType.setStorageStrategy(storageStrategy);
PersistenceSelectorStrategy persistenceSelectorStrategy = new PersistenceSelectorStrategy();
persistenceSelectorStrategy.setClazz(PersistAllSelectorStrategy.class.getCanonicalName());
resourceType.setPersistenceSelectorStrategy(persistenceSelectorStrategy);
// Collect and verify
CollectionSet collectionSet = collect(collection, resultSet, resourceType);
assertEquals(CollectionStatus.SUCCEEDED, collectionSet.getStatus());
List<String> collectionSetKeys = CollectionSetUtils.flatten(collectionSet);
assertEquals(Arrays.asList("snmp/1/pgTableSpace/some__name/pg_tablespace_size/spcname[some: name,null]", "snmp/1/pgTableSpace/some__name/pg_tablespace_size/ts_size[null,41.0]", "snmp/1/pgTableSpace/some__name/pg_tablespace_size/spcname[some: name,null]", "snmp/1/pgTableSpace/some__name/pg_tablespace_size/ts_size[null,52.0]"), collectionSetKeys);
}
use of org.opennms.netmgt.config.jdbc.JdbcQuery in project opennms by OpenNMS.
the class JdbcCollector method collect.
@Override
public CollectionSet collect(CollectionAgent agent, Map<String, Object> parameters) throws CollectionException {
final JdbcDataCollection collection = (JdbcDataCollection) parameters.get(JDBC_COLLECTION_KEY);
JdbcAgentState agentState = null;
Connection con = null;
ResultSet results = null;
Statement stmt = null;
try {
agentState = createAgentState(agent.getAddress(), parameters);
agentState.setupDatabaseConnections(parameters);
// Create a new collection set.
CollectionSetBuilder builder = new CollectionSetBuilder(agent);
// Creating a single resource object, because all node-level metric must belong to the exact same resource.
final NodeLevelResource nodeResource = new NodeLevelResource(agent.getNodeId());
// Cycle through all of the queries for this collection
for (JdbcQuery query : collection.getQueries()) {
// Verify if we should check for availability of a query.
if (agentState.shouldCheckAvailability(query.getQueryName(), query.getRecheckInterval())) {
// Check to see if the query is available.
if (!isGroupAvailable(agentState, query)) {
LOG.warn("Group is not available.");
continue;
}
}
try {
// If the query is available, lets collect it.
if (agentState.groupIsAvailable(query.getQueryName())) {
if (agentState.getUseDataSourceName()) {
initDatabaseConnectionFactory(agentState.getDataSourceName());
con = DataSourceFactory.getInstance(agentState.getDataSourceName()).getConnection();
} else {
con = agentState.getJdbcConnection();
}
stmt = agentState.createStatement(con);
results = agentState.executeJdbcQuery(stmt, query);
// Determine if there were any results for this query to
if (results.isBeforeFirst() && results.isAfterLast()) {
LOG.warn("Query '{}' returned no results.", query.getQueryName());
// Close the statement, but retain the connection.
agentState.closeResultSet(results);
agentState.closeStmt(stmt);
continue;
}
// Determine if there are results and how many.
results.last();
boolean singleInstance = (results.getRow() == 1) ? true : false;
results.beforeFirst();
// Iterate through each row.
while (results.next()) {
Resource resource = null;
// Create the appropriate resource container.
if (singleInstance) {
resource = nodeResource;
} else {
// Retrieve the name of the column to use as the instance key for multi-row queries.
String instance = results.getString(query.getInstanceColumn());
resource = new DeferredGenericTypeResource(nodeResource, query.getResourceType(), instance);
}
for (JdbcColumn curColumn : query.getJdbcColumns()) {
final AttributeType type = curColumn.getDataType();
String columnName = null;
if (curColumn.getDataSourceName() != null && curColumn.getDataSourceName().length() != 0) {
columnName = curColumn.getDataSourceName();
} else {
columnName = curColumn.getColumnName();
}
String columnValue = results.getString(columnName);
if (columnValue == null) {
LOG.debug("Skipping column named '{}' with null value.", curColumn.getColumnName());
continue;
}
if (type.isNumeric()) {
Double numericValue = Double.NaN;
try {
numericValue = Double.parseDouble(columnValue);
} catch (NumberFormatException e) {
LOG.warn("Value '{}' for column named '{}' cannot be converted to a number. Skipping.", columnValue, curColumn.getColumnName());
continue;
}
builder.withNumericAttribute(resource, query.getQueryName(), curColumn.getAlias(), numericValue, type);
} else {
builder.withStringAttribute(resource, query.getQueryName(), curColumn.getAlias(), columnValue);
}
}
}
}
} catch (SQLException e) {
// Close the statement but retain the connection, log the exception and continue to the next query.
LOG.warn("There was a problem executing query '{}' Please review the query or configuration. Reason: {}", query.getQueryName(), e.getMessage());
continue;
} finally {
agentState.closeResultSet(results);
agentState.closeStmt(stmt);
agentState.closeConnection(con);
}
}
builder.withStatus(CollectionStatus.SUCCEEDED);
return builder.build();
} finally {
if (agentState != null) {
// Make sure that when we're done we close all results, statements and connections.
agentState.closeResultSet(results);
agentState.closeStmt(stmt);
agentState.closeConnection(con);
// agentState.closeAgentConnection();
}
}
}
Aggregations