Not entirely forgotten, though I've been working on other things...
I've implemented a basic availability service for nodes and wanted to throw it
out for comment before I add further bells and whistles.
You can open opennms/rest/availability/nodes/ and get something like
<nodeAvailabilities>
<nodeavailability nodeId="13" availability="83.1633597883598" />
<nodeavailability nodeId="50" availability="100.0" />
<nodeavailability nodeId="51" availability="100.0" />
<nodeavailability nodeId="52" availability="99.99751984126985" />
<nodeavailability nodeId="53" availability="100.0" />
<nodeavailability nodeId="54" availability="100.0" />
<nodeavailability nodeId="55" availability="100.0" />
</nodeAvailabilities>
or append a nodeid and get a single nodeavailability record.
Time range defaults to 'last 7 days', amending with ?days=N will change that.
Specifying start/end dates isn't implemented yet but probably will be.
Because the PostgreSQL availability functions take dates as input, I've not
been able to hook straight into the Hibernate entity model - instead it's a
native SQL query mapped onto a simple object. That means none of the
NodeRestService filtering rules are easily transferable; I'm not sure if
they're needed and if so how to go about doing that without pain and/or
suffering. Any thoughts there would be most welcome.
Otherwise I'll finish it off with start/end date mapping and a similar lookup
for service availability and leave it at that for now.
Thanks,
Duncan
________________________________________
From: Duncan Mackintosh [dmackint...@cbnl.com]
Sent: 05 September 2011 09:52
To: OpenNMS Code Development and Bugs
Subject: Re: [opennms-devel] Getting node lists with status out of REST
That sounds pretty good, it would suit my needs just fine and it's generic
enough that I can see plenty of other uses for it. I'll start hacking something
up and see if I run into any issues, otherwise I'll post a rough plan soon.
Duncan
________________________________________
From: Craig Miskell [cr...@stroppykitten.com]
Sent: 05 September 2011 00:16
To: OpenNMS Code Development and Bugs
Subject: Re: [opennms-devel] Getting node lists with status out of REST
Hi,
Well, how about something like:
/rest/availability?filter=<whatever>
That way it's not cluttering up the information returned by the Node
rest service, and minimises the number of queries. It's a concrete set
of data that should be exposed for reading. Actually, given that
availability can be for a number of different entities, perhaps it
should be:
/rest/availability/<entity>?filter=<something>&period=<period>
where <entity> is "node", "service", or anything else for which OpenNMS
can calculate an availability ("applications" maybe one day?)
It can return an array of "availability" records, each specifying which
entity it refers to, and the availability over the given period.
Efficiency will be down to the server-side doing sensible queries.
Filter is optional (implying "all").
How does that sound?
Craig
Cambridge Broadband Networks Limited Registered in England and Wales under
company number: 03879840 Registered office: Selwyn House, Cambridge Business
Park, Cowley Road, Cambridge CB4 0WZ, UK. VAT number: GB 741 0186 64
From bb8b6d7272b6c9d5da64781aef422ab5c3f5b6ff Mon Sep 17 00:00:00 2001
From: Duncan Mackintosh <dunc...@cbnl.com>
Date: Fri, 14 Oct 2011 09:50:44 +0100
Subject: [PATCH] CBNL CORE: Beginnings of an availability REST service. Currently exposes node availability for all nodes
(/openmns/rest/availability/nodes/) and specific nodes (rest/availability/nodes/<id>/).
---
.../org/opennms/netmgt/dao/AvailabilityDao.java | 3 +
.../dao/hibernate/AvailabilityDaoHibernate.java | 99 ++++++++++++-----
.../hibernate/AvailabilityDaoHibernateTest.java | 58 ----------
.../model/availability/NodeAvailability.java | 36 +++++--
.../opennms/web/rest/AvailabilityRestService.java | 112 ++++++++++++++++++++
5 files changed, 214 insertions(+), 94 deletions(-)
delete mode 100644 opennms-dao/src/test/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernateTest.java
create mode 100644 opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java
diff --git a/opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java b/opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java
index 6e9a62a..f159637 100644
--- a/opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java
+++ b/opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java
@@ -7,4 +7,7 @@ import org.opennms.netmgt.model.availability.NodeAvailability;
public interface AvailabilityDao {
public List<NodeAvailability> getAllNodesAvailability(Date since);
+ public NodeAvailability getNodeAvailability(String nodeCriteria, Date since);
+ public NodeAvailability getNodeAvailability(int nodeid, Date since);
+ public NodeAvailability getNodeAvailabilityByForeignId(String foreignSource, String foreignId, Date since);
}
diff --git a/opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java b/opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java
index 404e956..19128f7 100644
--- a/opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java
+++ b/opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java
@@ -1,44 +1,85 @@
package org.opennms.netmgt.dao.hibernate;
+import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
+import java.util.LinkedList;
import java.util.List;
+import org.hibernate.HibernateException;
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+import org.hibernate.transform.Transformers;
import org.opennms.netmgt.dao.AvailabilityDao;
import org.opennms.netmgt.model.availability.NodeAvailability;
+import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class AvailabilityDaoHibernate extends HibernateDaoSupport implements AvailabilityDao {
@SuppressWarnings("unchecked")
- public List<NodeAvailability> getAllNodesAvailability(Date since) {
- Date now = new Date();
- return getHibernateTemplate().find(
- "SELECT DISTINCT new org.opennms.netmgt.model.availability.NodeAvailability(" +
- " node.id, " +
- " getmanagepercentavailnodewindow(node.id, ?, ?)," +
- " ?," +
- " ?)" +
- "FROM OnmsNode as node " +
- "ORDER BY node.id", new Timestamp(since.getTime()), new Timestamp(now.getTime()), new Timestamp(since.getTime()), new Timestamp(now.getTime()));
+ public List<NodeAvailability> getAllNodesAvailability(final Date since) {
+ final Date now = new Date();
+ HibernateCallback<List<NodeAvailability>> c = new HibernateCallback<List<NodeAvailability>>() {
+ public List<NodeAvailability> doInHibernate(Session session)
+ throws HibernateException, SQLException {
+ SQLQuery sqlQuery = session.createSQLQuery("SELECT nodeid, " +
+ "getmanagepercentavailnodewindow(nodeid, CAST(:from AS timestamp), CAST(:to AS timestamp)) AS availability " +
+ "FROM node ORDER BY nodeid");
+ sqlQuery.setResultTransformer(Transformers.aliasToBean(NodeAvailability.class));
+ sqlQuery.setDate("from", since);
+ sqlQuery.setDate("to", now);
+ return sqlQuery.list();
+ }
+ };
+ return getHibernateTemplate().execute(c);
}
-
-// Do I need these? I don't know :<
-// public void initialize(Object obj) {
-// getHibernateTemplate().initialize(obj);
-// }
-//
-// /**
-// * <p>flush</p>
-// */
-// public void flush() {
-// getHibernateTemplate().flush();
-// }
-//
-// /**
-// * <p>clear</p>
-// */
-// public void clear() {
-// getHibernateTemplate().clear();
-// }
+
+ public NodeAvailability getNodeAvailability(String nodeCriteria, Date since) {
+ if (nodeCriteria.contains(":")) {
+ String[] criteria = nodeCriteria.split(":");
+ return getNodeAvailabilityByForeignId(criteria[0], criteria[1], since);
+ }
+ return getNodeAvailability(Integer.parseInt(nodeCriteria), since);
+ }
+
+ public NodeAvailability getNodeAvailability(final int nodeid, final Date since) {
+ final Date now = new Date();
+ HibernateCallback<NodeAvailability> c = new HibernateCallback<NodeAvailability>() {
+ public NodeAvailability doInHibernate(Session session)
+ throws HibernateException, SQLException {
+ SQLQuery sqlQuery = session.createSQLQuery("SELECT nodeid, " +
+ "getmanagepercentavailnodewindow(nodeid, CAST(:from AS timestamp), CAST(:to AS timestamp)) AS availability " +
+ "FROM node WHERE nodeid=:nodeid ORDER BY nodeid");
+ sqlQuery.setResultTransformer(Transformers.aliasToBean(NodeAvailability.class));
+ sqlQuery.setDate("from", since);
+ sqlQuery.setDate("to", now);
+ sqlQuery.setInteger("nodeid", nodeid);
+ return (NodeAvailability) sqlQuery.uniqueResult();
+ }
+ };
+ return getHibernateTemplate().execute(c);
+ }
+
+ public NodeAvailability getNodeAvailabilityByForeignId(
+ final String foreignSource, final String foreignId, final Date since) {
+ final Date now = new Date();
+ HibernateCallback<NodeAvailability> c = new HibernateCallback<NodeAvailability>() {
+ public NodeAvailability doInHibernate(Session session)
+ throws HibernateException, SQLException {
+ SQLQuery sqlQuery = session.createSQLQuery("SELECT nodeid, " +
+ "getmanagepercentavailnodewindow(nodeid, CAST(:from AS timestamp), CAST(:to AS timestamp)) AS availability " +
+ "FROM node WHERE foreignid=:foreignid AND foreignsource=:foreignsource ORDER BY nodeid");
+ sqlQuery.setResultTransformer(Transformers.aliasToBean(NodeAvailability.class));
+ sqlQuery.setDate("from", since);
+ sqlQuery.setDate("to", now);
+ sqlQuery.setString("foreignid", foreignId);
+ sqlQuery.setString("foreignsource", foreignSource);
+ return (NodeAvailability) sqlQuery.uniqueResult();
+ }
+ };
+ return getHibernateTemplate().execute(c);
+ }
+
+
}
diff --git a/opennms-dao/src/test/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernateTest.java b/opennms-dao/src/test/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernateTest.java
deleted file mode 100644
index 955e052..0000000
--- a/opennms-dao/src/test/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernateTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * This file is part of the OpenNMS(R) Application.
- *
- * OpenNMS(R) is Copyright (C) 2009 The OpenNMS Group, Inc. All rights reserved.
- * OpenNMS(R) is a derivative work, containing both original code, included code and modified
- * code that was published under the GNU General Public License. Copyrights for modified
- * and included code are below.
- *
- * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
- *
- * Modifications:
- *
- * Created: January 10th 2010 jonat...@opennms.org
- *
- * Copyright (C) 2010 The OpenNMS Group, Inc. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * For more information contact:
- * OpenNMS Licensing <lice...@opennms.org>
- * http://www.opennms.org/
- * http://www.opennms.com/
- */
-package org.opennms.netmgt.dao.hibernate;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-import org.opennms.netmgt.dao.AbstractTransactionalDaoTestCase;
-import org.opennms.netmgt.model.ReportCatalogEntry;
-import org.opennms.netmgt.model.availability.NodeAvailability;
-
-public class AvailabilityDaoHibernateTest extends AbstractTransactionalDaoTestCase {
-
- public void testList() {
- Calendar since = Calendar.getInstance();
- since.add(Calendar.DAY_OF_MONTH, -14);
- List<NodeAvailability> list = getAvailabilityDao().getAllNodesAvailability(since.getTime());
- System.out.println("Successfully queried a thing");
- for(NodeAvailability n : list) {
- System.out.println(n);
- }
-// AvailabilityDasince.getTime()
- }
-}
diff --git a/opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java b/opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java
index 94604c6..89b9272 100644
--- a/opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java
+++ b/opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java
@@ -3,13 +3,26 @@ package org.opennms.netmgt.model.availability;
import java.sql.Timestamp;
import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
import org.apache.commons.lang.builder.CompareToBuilder;
+import org.opennms.netmgt.model.OnmsNode;
/**
* A data structure summarising node availability over a given time range
* @author Duncan Mackintosh
*
*/
+@XmlRootElement(name="nodeavailability")
public class NodeAvailability implements Comparable<NodeAvailability> {
/** ID of the node */
@@ -23,10 +36,8 @@ public class NodeAvailability implements Comparable<NodeAvailability> {
/** End of the time period over which availability was calculated */
private Date dateTo;
-
- public int getNodeId() {
- return nodeId;
- }
+
+ public NodeAvailability(){}
public NodeAvailability(int nodeId, double availability) {
System.out.println("Created with nodeID" + nodeId + " avail " + availability);
}
@@ -50,10 +61,17 @@ public class NodeAvailability implements Comparable<NodeAvailability> {
this.dateTo = dateTo;
}
- public void setNodeId(int nodeId) {
+
+ @Column
+ @XmlAttribute
+ public int getNodeId() {
+ return nodeId;
+ }
+ public void setNodeid(int nodeId) {
this.nodeId = nodeId;
}
-
+ @Column
+ @XmlAttribute
public double getAvailability() {
return availability;
}
@@ -62,6 +80,8 @@ public class NodeAvailability implements Comparable<NodeAvailability> {
this.availability = availability;
}
+ @Column
+ @Temporal(TemporalType.TIMESTAMP)
public Date getDateFrom() {
return dateFrom;
}
@@ -69,7 +89,9 @@ public class NodeAvailability implements Comparable<NodeAvailability> {
public void setDateFrom(Date dateFrom) {
this.dateFrom = dateFrom;
}
-
+
+ @Column
+ @Temporal(TemporalType.TIMESTAMP)
public Date getDateTo() {
return dateTo;
}
diff --git a/opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java b/opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java
new file mode 100644
index 0000000..65b8709
--- /dev/null
+++ b/opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java
@@ -0,0 +1,112 @@
+/*
+ * This file is part of the OpenNMS(R) Application.
+ *
+ * OpenNMS(R) is Copyright (C) 2009 The OpenNMS Group, Inc. All rights reserved.
+ * OpenNMS(R) is a derivative work, containing both original code, included code and modified
+ * code that was published under the GNU General Public License. Copyrights for modified
+ * and included code are below.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * Modifications:
+ *
+ * Created: July 16, 2009
+ *
+ * Copyright (C) 2009 The OpenNMS Group, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * For more information contact:
+ * OpenNMS Licensing <lice...@opennms.org>
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ */
+package org.opennms.web.rest;
+
+import java.util.Calendar;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.UriInfo;
+
+import org.opennms.netmgt.dao.AvailabilityDao;
+import org.opennms.netmgt.model.availability.NodeAvailability;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sun.jersey.spi.resource.PerRequest;
+
+@Component
+@PerRequest
+@Scope("prototype")
+@Path("availability")
+
+/**
+ * ReST service for availability stats
+ *
+ * @author Duncan Mackintosh
+ * @version $Id: $
+ */
+public class AvailabilityRestService extends OnmsRestService {
+ @Autowired
+ private AvailabilityDao m_availabilityDao;
+
+ @Context
+ UriInfo m_uriInfo;
+
+ @Context
+ SecurityContext m_securityContext;
+
+ /**
+ * <p>getAcknowledgment</p>
+ *
+ * @param alarmId a {@link java.lang.String} object.
+ * @return a {@link org.opennms.netmgt.model.OnmsAcknowledgment} object.
+ */
+ @GET
+ @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+ @Path("nodes")
+ @Transactional
+ public List<NodeAvailability> getNodesAvailability() {
+ // Using @FormParam annotations seems to cause exceptions, so do it the hard way
+ String dayRange = m_uriInfo.getQueryParameters().getFirst("days");
+ if(dayRange == null) dayRange = "7";
+ Calendar since = Calendar.getInstance();
+ since.add(Calendar.DAY_OF_MONTH, -Integer.valueOf(dayRange));
+ return m_availabilityDao.getAllNodesAvailability(since.getTime());
+ }
+
+ @GET
+ @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+ @Path("nodes/{nodeCriteria}")
+ @Transactional
+ public NodeAvailability getNodeAvailability(@PathParam("nodeCriteria") String nodeCriteria) {
+ // Using @FormParam annotations seems to cause exceptions, so do it the hard way
+ String dayRange = m_uriInfo.getQueryParameters().getFirst("days");
+ if(dayRange == null) dayRange = "7";
+ Calendar since = Calendar.getInstance();
+ since.add(Calendar.DAY_OF_MONTH, -Integer.valueOf(dayRange));
+ return m_availabilityDao.getNodeAvailability(nodeCriteria, since.getTime());
+ }
+
+}
--
1.7.1
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2d-oct
_______________________________________________
Please read the OpenNMS Mailing List FAQ:
http://www.opennms.org/index.php/Mailing_List_FAQ
opennms-devel mailing list
To *unsubscribe* or change your subscription options, see the bottom of this
page:
https://lists.sourceforge.net/lists/listinfo/opennms-devel