开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建)第四阶段:数据预处理-系统监控web界面-系统运行情况数据来源】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/672/detail/11679
数据预处理-系统监控web界面-系统运行情况数据来源
系统功能运行情况
实时流量转发情况,系统功能运行情况出现,个链路流量转发情况这几个模块数据如何得来。首先是系统功能运行情况:
如图所示:
运行正常为蓝色,异常为红色。
数据如何传输,如何判别是否正常,过程如下:
找到 function 。代码如下:
其中调用 ajax 调后台:systemMonitoring,找到该 controller
如下图所示位置:
双击打开,找到其中发现如下图所示:
发现 systemMonitoring ,找到 systemFunctionInfo 。如下:
这里获取系统功能运行情况。
实例 list systemFunctionInfo , 点击 list :
List<systemFunctionInfo> systemFunctionInfos=new ArrayList<~>();
其中为展示前端用到的数据:ID state(状态) modelName recordTime
第二行代码:
Map<string,object> map =new HashMap<string,object>();这行代码后续了解。
List<Jsonvo> jVos = Trafficutil.getTrafficInfobyMinute( minutes: -2,
Constants.CSANTI_MONITOR_DP);
//Trafficutil里有 getTrafficInfobyMinute
方法。传递两个参数,一个是-2,一个是 CSANTI_MONITOR_DP(读取数据时 key 的前缀)。进入数据写入程序:key 是 DP ,值为 value。
点击 getTrafficInfobyMinute:
Public static List<JsonVO>getTrafficInfobyMinute(int minutes,String key){
//redis内所有的匹配上的数据
List<JsonVO> jsonVOs = trafficInfo(key);
List<JsonVO> sList=new ArrayList<~>();
minutes 中是一个-2,key 是前缀,第一个 key 的前缀到第二个 key 中,key又传到 trafficInfo 方法中。
点击进入 trafficInfo 方法中:
Public static List<JsonVO>trafficInfo(String strFlage){
Jediscluster jediscluster =JedisConnectionUtil.getJediscluster();
//strFlage就是刚才传递的前缀,实例化jediscluster 的JedisConnectionUtil.getJediscluster,获得一个集群
Set<string> keyset = JedisConnectionUtil.keys(jediscluster, pattern: strFlage + "*");
//加一个"*"组成前缀,把 jediscluster 集群传递到 JedisConnectionUtil.keys 中,传递两个参数:jediscluster, pattern: strFlage + "*"。
点击 keys,显示代码:
DUOIIC SLdLL c ireesetestring> keys jedisciuster jc, string pattern) //jedisciuster jc
为集群,pattern 为前缀。
Treeset<string> keys=new Treeset<>(();
Map<string,JedisPool> clusterNodes=jcgetclusterNodes(); for(string k :clusterNodes.keyset()){
JedisPool jp=clusterNodes.get(k);
Jedis jedis =jp.getResource();
try {
keys.addAll(jedis.keys(pattern));
} catch(Exception e){
e.printstackTrace();
} finally{
//用完一定要close链接!!! jedis.close();
}
return keys;
代码表示:代集群实例了一个集群的所有节点,遍历了每一个节点拿到 clusterNodes,实例 jedis,去 jediskeys 找到 pattern(刚刚传入的前缀),所有就拿到了以 pattern 为节点的所有 key。
如下图所示:就拿到了 DP 开头的所有 key,
然后 keys.addAll(jedis.keys(pattern))。将拿到的所有 DP 开头的 key 添加到 keys 里。最后 return 返回。
trafficutil.java 中:
public static List<Jsonvo> trafficInfo(string strFlage){
JedisCluster jedisCluster=JedisConnectionUtil.getJediscluster();
Set<string> keyset =JedisConnectionUtil.keys(iedisCluster, pattern: strFlage +“*") List<Jsonvo> isonVOs=new ArrayList<~>();
//Keyset 返回的所有DP 开头的 key 。
for(string str : keyset){
//keyset为刚才读取的所有DP 开头的前缀
Jsonvo jsonvo=new JsonVO();
string value=jediscluster.get(str);
//jedis的集群节点,str 其中的某个key。集群 get key 就拿到这个 key 的值:value
jsonvo=JsonResolveUtil.resolveJson(value);
//JsonResolveUtil.resolveJson方法将 value 字符串转化为 jsonvo 类型
if(null != jsonVO){
jsonvo.setkey(str);
jsonVOs.add(jsonVo);
}
点击 jsonvo:
public class JsonVO implements Comparable<Jsonvo>java.io.Serializable{
private string key; //redis 系统内的key
private string costtime; //时间差任务运行时间(endrstart)
private Map<string,object> serversCountMap;//链路统计中的结果
private string applicationId; //appID
private string countperMillis; //speed
private string applicationUniqueName; //appname
private string endtime; //任务运行结尾时间
private string sourceCount; //一批次数据数据总量
上述代码即写入数据,就是前端需要的数据,后端准备前端需要的数据。后端和前端约定,要用哪些数据,组装需要的数据,上述代码封装数据。
以下代码为写入数据:
val Maps = Map(
"costTime" -> runTime.tostring,
"serverscountMap" -> serverCount,
"applicationId" -> appid.tostring,
"countperMillis"-> runspeed.tostring,
"applicationUniqueName"-> appName.tostring,
"endTime" -> endTimes,
"sourceCount" -> dataCount.tostring
)
其中 costTime 是 kry,runTime 是 value,将这些数据左侧的作为 key,而它把这些读的时候以 key 作为读的数据,
回到 jsonvo=JsonResolveUtil.resolveJson(value);
if(null != jsonVO){
jsonvo.setkey(str);
jsonVOs.add(jsonVo);
}
value 是字符串,jsonVO 是接收 jsonVO 的 class,
JsonResolveUtil.resolveJson
方法的作用是,输入一个字符串输出是 jsonVO,所以这个方法一定是将字符串转化成了 jsonVO 类型。
jsonVOs 不空,走代码jsonvo.setkey(str) , jsonVO
需要用 key 。进行设置后,jsonVOs 用来接收,存储jsonVo 的例子。
到目前为止,在 key 中获取了所有以 DP 开头的前缀数据。
public static List<JsonVO> getTrafficInfoByMinute(int
minutes,string key){
//redis 内所有的匹配上的数据,
List<Jonvo> jsonVOs=trafficInfo(key); //返回的所有的数据库的value 值。 转化为 Jsonvo 的结果。
List<]sonVo> sList = new ArrayList<~>();//获取当前时间
string timeE =Timeutil.getCurrTime();
//获取 minutes 分钟前的时间,获取-2。//timeE 当前系统时间。
string timeS =TimeUtil.getTimeByMinute(TimeUtil.yyyy MM DDHH24miss(timeE), minutes)
//选取 minutes 分钟内的数据
//获取一个时间范围,开始时间和结束时间,2分钟之前和当前时间。
for(Jsonvo jsonvo :jsonVOs){
//比较时间大小,并对返回的int值做判断
Int i =jsonvo.getEndTime().compareTo(times);
//getEndTime 当前结束时间,转化为 jsonvo , 即获取到的数据结束时间,times 为2分钟之前,compareTo 方法将数据时间与2分钟之前的时间点进行对比。返回的结果前面的值大就大于0,小就小于0。
int j=timeE.compareTo(jsonvo.getEndTime());
//将当前时间与数据结束时间对比,结束时间大就大于0,小就小于0。
if(i>0 && j>0){
//数据时间大于开始时间,结束时间大于数据时间。
sList.add(jsonVO);}
//时间大于数据时间,数据的时间是大约两分钟之前,小于当前时间,如果数据在最近的两分钟之内,以当地时间为准,在最近的两分钟时间之内,把 jsonVO 的 class 这个对象,添加到 sList。
//sList是添加或者存储两分钟时间之内的 jsonVO 值。
}
return slist;
}
回到最初打开的 controller 中,代码如下:
List<Jsonvo> jVos = Trafficutil.getTrafficInfobyMinute( minutes: -2,
Constants.CSANTI_MONITOR_DP);
//List存储的所有DP 开头的所有数据。然后判断在2分钟内有没有数据。
if(nu]l==jvos || o==jvos.size()){ //如果等于空或者大小等于0
map.put("sign",1); //则map.put 一个 key ,值为1 ,map存储两分钟内的数据。
}
else{
map.put("sign", 0); //2分钟之内有数据就为0
}
catch(Exception e) {
logger.info(e.getMessage());
map.put("result","失败");
map.put("sign",1);
return map;
}
然后返回到ajax调用的 systemMonitoring 的方法,代码如下:
loadsystemFunctionInfo:function(){
var content ='';
$.ajax({
url :ctx+'/systemMonitoring/getsystemFunctionInfo'
type : 'get',
dataType : 'json'
success:function(data){
if(data.sign == 1){
//2分钟内没有数据就是异常css styIe="background:#f94325;"。
document.getElementById( elementld:dataHandl').style.background="#f94325";
//数据处理模块的唯一标识,颜色设为"#f94325";
}
else if(data.sign==0)
{
//2分钟内有数据就是正常css style="background:#58aea5;"
document.getElementById( elementld:'dataHandl').style.background="#58aea5";
//数据处理模块的唯一标识,颜色设为"#58aea5"。
}
}
});
即先拿到所有的 DP 数据,然后传入2分钟时间范围,
即2分钟内有这个数据,值为1,颜色为"#f94325",没有,值为0 ,颜色为"#58aea5"。