数据预处理-系统监控web界面-系统运行情况数据来源|学习笔记

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 快速学习数据预处理-系统监控web界面-系统运行情况数据来源

开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建)第四阶段数据预处理-系统监控web界面-系统运行情况数据来源】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/672/detail/11679


数据预处理-系统监控web界面-系统运行情况数据来源


系统功能运行情况

实时流量转发情况,系统功能运行情况出现,个链路流量转发情况这几个模块数据如何得来。首先是系统功能运行情况:

如图所示:

image.png

运行正常为蓝色,异常为红色。

数据如何传输,如何判别是否正常,过程如下:

找到 function 。代码如下:

image.png

其中调用 ajax 调后台:systemMonitoring,找到该 controller

如下图所示位置

image.png

双击打开,找到其中发现如下图所示:

image.png

发现 systemMonitoring ,找到 systemFunctionInfo 。如下:

image.png

这里获取系统功能运行情况。

实例 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,

image.png

然后 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"。

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
37 1
|
2天前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
8 0
|
1月前
|
前端开发 开发者 容器
【布局革命!】Flexbox与Grid双剑合璧:解锁Web设计新纪元,让响应式界面瞬间焕发光彩!
【9月更文挑战第1天】本文通过问答形式深入探讨了Flexbox和Grid布局的特点与应用场景。Flexbox专为单轴布局设计,适用于响应式导航栏和列表;Grid布局则适用于二维布局,可精确控制元素的位置和大小,适合构建复杂的内容区域和仪表板。文章还提供了示例代码,帮助读者更好地理解和应用这两种布局方式,以创建高效、美观的Web界面。
67 9
|
1月前
|
监控 前端开发 数据库连接
Zabbix 5.0 LTS的web界面安装及修改zabbix web管理员的默认密码
这篇文章是关于如何安装Zabbix 5.0 LTS的web界面以及如何修改Zabbix web管理员默认密码的教程。
83 1
|
1月前
|
前端开发 JavaScript 开发者
现代前端框架激烈交锋,高效响应式 Web 界面的归属扑朔迷离!
【9月更文挑战第6天】本文通过实际案例,比较了主流前端框架 Vue.js、React 和 Angular 的特点与优势。Vue.js 以简洁的语法和灵活的组件化架构著称,适合小型到中型项目;React 强调性能和可扩展性,适用于大型应用;Angular 凭借全面的功能和严格架构,适合企业级开发。开发者应根据项目需求和技术栈选择合适的框架。
38 0
|
2月前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
55 0
|
2月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
40 0
|
2月前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
52 0
|
2月前
|
前端开发 微服务 API
微服务浪潮下的JSF革新:如何在分散式架构中构建统一而强大的Web界面
【8月更文挑战第31天】随着微服务架构的兴起,企业将应用拆分成小型、独立的服务以提高系统可维护性和可扩展性。本文探讨如何在微服务架构下构建和部署JavaServer Faces (JSF) 应用,通过RESTful服务实现前后端分离,提升灵活性和适应性。
49 0
|
2月前
|
开发者 Java Spring
【绝技揭秘】掌握Vaadin数据绑定:一键同步Java对象,告别手动数据烦恼,轻松玩转Web应用开发!
【8月更文挑战第31天】Vaadin不仅是一个功能丰富的Java Web应用框架,还提供了强大的数据绑定机制,使开发者能轻松连接UI组件与后端Java对象,简化Web应用开发流程。本文通过创建一个简单的用户信息表单示例,详细介绍了如何使用Vaadin的`Binder`类实现数据绑定,包括字段与模型属性的双向绑定及数据验证。通过这个示例,开发者可以更专注于业务逻辑而非繁琐的数据同步工作,提高开发效率和应用可维护性。
57 0