Monday, October 19, 2009

Project Updates

It seems like every moment is only more busy than the last. We are working on Network Systems Key Performance Indicators reports (KPI; what we do and how well we do it), Circuit/Network Diagrams in a web-friendly manner (LinkViz), Equipment (Asset) Database (EDB) focusing on tracking costs and budgeting, and BGP monitoring (Meerkat BGP). Facing inward, we're improving the efficiency of developing web services built on our postgresql database (rex and automatic html/javascript object binding).

The primary goal of the KPI project is to report on the depth and breadth of Network Systems services and, further, report the quality of those services. Service availability was the first chart we deployed. The user can include or exclude planned outage windows from the report. The variable represents the average of all customers' availability. An individual customer's availability is defined as the percentage of time the customer's service point (gateway) was determined to be available (pingable from our poller).

In our LinkViz project, we are making another attempt at automatically visualizing circuits and networks in a way that a Network Engineer might diagram. In my opinion, automatic Network Topology "christmas trees" have always gotten the problem wrong. It looks like a Software Engineer is solving the problem using Software Engineering visualizations from graph theory instead of trying to mimic what a Network Architect or Engineer would draw for themselves and their peers. This problem is ripe for innovation and we're trying to take a baby step towards xanadu here. We considered using flash, directly generate a Visio file, and several javascript canvas libraries before deciding to go with the html/css box modeling directly. We need to refine the layout but here's a simple example showing where we are now:

The UW Technology Equipment Database project is an effort to converge the different databases from each unit into a single database so that costs can be centrally tracked and we can improve our equipment budget projections. The new functionality is to track next-step lifecycle decisions such as retire, replace, etc., with a date when action needs to occur.

We were surprised to find that we were monitoring nearly 1000 BGP sessions. While we've been managing the bgp monitoring config manually, I had no idea there were this many already. This project is to automate BGP session discovery and monitoring configuration.

Facing inward, we've taken several steps to improve how efficiently we develop open, ReST-like, database backed web services. We try to spend a sensible amount of time improving our common tasks so we can deliver them rapidly. Two successes here "rex" and html/javascript binding.

Rex allows you to map ReST HTTP requests directly to database queries that generate XML. Since we write a lot of services that simply do a simple transformation on the database data and expose it in a ReST-like manner, it was important for us to normalize how we do this and make it more efficient. After setting up and configuring rex with your jdbc datasources, you can start configuring HTTP endpoints directly to queries. Once a RexMap is created, your web service is immediately available. Rex also provides a json endpoint that exposes the badgerfish transformed xml data. Rex exposes a test interface for entering parameters and displaying the syntax highlighted xml or json results. It is hosted on sourceforge.

The last efficiency improvement we've gained is using a library that allows you to bind a javascript object (jso) to html directly. It's kind of like XPath and XSLT but using a jso instead of XML and html directly instead of XSLT. It is very similar to the chain.js jquery plugin. The downside of chain.js is that it requires you to format your data in the way it expects (e.g. arrays within the jso must have the key "items"). The html/jso binding approach we took was to simply match the html id to the jso "key".

For example, to bind an html class "equipment_bind" to a javascript object asset, you do this:
var asset={ Name: "ucswww" };
var equipment=HtmlJsoBind("equipment_bind", asset);

The html would look like this:
<p id="Asset.Name" class="equipment_bind"></p>

After equipment.bind() is called, the CDATA portion of the paragraph will be filled with the Asset.Name "ucswww".

The primary win here is that you don't have a ton of javascript code that is simply creating html to wrap your data. Our library also handles arrays.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.