今天心情不错,公司终于签下了一个综合业务监控系统的大单。到底有多大我也不知道,反正连软件带硬件不算小。按照销售的说法,拿下这个项目一个重要的因素就是要提供一个吸引眼球的demo,而我们做的不错!今天和大家分享一下喜悦和经验!
这个项目是一个省级电信运营商的综合业务监控系统。公司跟了好长时间了。由于是一个综合的业务监控系统,涉及的管理资源非常多,又要提供大屏幕显示,所以对系统的呈现效果要求非常高(“政绩工程”么)。前前后后提了很多“无礼”要求,陆续提过的有3D电子地图、3D机房监控、场景仿真、全动画、Google Earth、全Flash等等....弄的我们晕头转向、焦头烂额。其实很多时候,用户自己也不知道想要什么,反正对厂商的要求就是一个字:“炫”,两个字“好看”,三个字:“一定好好看!”(不对,好像是四个字哦)。
言归正传,项目跟踪过程中,商务始终告诉我们研发一定要做好一件事:如何做好呈现,尤其是综合的业务监控和呈现,这是获得项目的关键,一定要“出彩”。这个“综合呈现”说起来容易,做起来难。作为省级的电信运营商,内部的各种软硬件系统无数,要监控从上到下、从软到硬,真是烦不胜烦:
- 基础设施层:主要是网络上的硬件设备,包括交换机、路由器、防火墙、各种主机设备服务器等等;
- 软件层:这一层主要是主机上面运行的操作系统和各类业务软件系统,例如操作系统(Windows、AIX/HP-UX/LINUX/SOLARIS)、各种中间件(WebLogic、JBoss、IIS、WebSphere等)、数据库(Oracle、Sybase、MySQL)等;
- 应用层:这一层是指运行在软件层内部的一些细粒度资源,包括一些关键的软件进程、数据库表空间、业务连接、消息队列等等。这一层数量繁杂、数量众多。不过这些资源的状态直接会影响其上层支撑的业务。
- 业务层:业务层是最顶层,由以上底层资源所共同支撑起来的面向用户的各种业务。对业务最容易理解的描述就是电信提供给客户的具体“服务”。例如视频业务、短信业务、WAP业务、专网业务等等。这些业务才是用户最终关心的东西,因为这些业务才是客户的核心资产,是拿来卖钱的最终产品。一旦出问题,将直接影响money!
此外,还有一大堆机房环境监控的要求,什么配电柜供电、开关状态、UPS、蓄电池、空调、适度温度漏水效仿通风门禁视频.........一大堆。所以,要对业务进行监控,就必须对业务所支撑的各个底层资源进行监控。另外,还要能够对这些资源的关系进行连接和定义,一旦发生故障和问题,能够从上到下迅速定位故障起源,在最短时间内发现问题、解决问题。如何呈现这些依赖关系,并对故障和告警进行纵向定位,是软件呈现的一个核心问题,也是用户最关心的一个问题。
用户要求我们先制作一个demo程序,看我们将如何呈现“综合监控”的效果。在充分了解了用户需求之后,经过讨论,我们想做一个完全图形化的分层、跨层的综合监控界面。界面要美观,有动画效果,能够清晰的显示资源依赖关系和告警传播定位。
需要监控和管理的资源
接下来要写代码了。肯定先用我熟悉的TWaver试试。研究了一下,TWaver中有一个平行四边形的Group对象,适合做上图中的“层”的概念。先如下封装并设置属性:
- package demo;
- import java.awt.Color;
- import twaver.Group;
- import twaver.TWaverConst;
- public class LayerGroup extends Group {
- public LayerGroup() {
- init();
- }
- public LayerGroup(Object id) {
- super(id);
- init();
- }
- private void init() {
- this.setGroupType(TWaverConst.GROUP_TYPE_PARALLELOGRAM);
- this.putGroupAngle(45);
- this.putGroup3D(true);
- this.putGroupDeep(10);
- this.putGroupOutline(false);
- this.putGroupFillColor(Color.green.darker());
- this.putGroupGradient(true);
- this.putGroupGradientFactory(TWaverConst.GRADIENT_LINE_E);
- this.putGroupHandlerVisible(false);
- this.putGroupDoubleClickEnabled(false);
- this.putBorderColor(Color.white);
- this.putBorderInsets(3);
- this.putBorderAntialias(true);
- this.putBorderStroke(TWaverConst.STROKE_SOLID_4);
- this.putBorderVisible(false);
- this.putLabelHighlightable(false);
- this.setEnableAlarmPropagationFromChildren(false);
- }
- }
package demo;
import java.awt.Color;
import twaver.Group;
import twaver.TWaverConst;
public class LayerGroup extends Group {
public LayerGroup() {
init();
}
public