后台系统监控
背景:监控系统对另外服务器的系统进行监控
方案一:
监控系统定时通过地址访问,需要监控的系统,执行相关的Linux命令,返回需要的信息
方案二:
需监控服务器,提供查询内存使用的接口。监控系统定时,调用查询接口,获取内存数据
方案三:
在需要监控的服务器,写shell脚本,将信息存到数据库,然后,监控系统,读取数据库里的数据
经过考虑,方案一,方案二都是不可行的。
方案一:通过地址访问需要被监控系统所在的服务器。因为服务器和服务器之间,不能
通过IP访问,只能通过域名访问,通过F5前置再随机到其中一台服务器。因此,返回的内容,也不知道
是哪台服务器传过来的。即使知道,暂时没有想到,访问完一台后,一定访问另一台的办法。
方案二:需监控服务器,提供查询内存使用的接口,也是不可行的。一旦系统挂掉,就没办法监控
并且耦合性太强
方案三:
最后是通过方案三实现的。
记录一下,在这个过程中遇到的坑。
1.如何通过Linux命令,获取jvm内存信息
2.写shell脚本,获取jvm内存信息
3.通过shell脚本,将信息存到数据库
4.定时执行shell脚本
5.后台代码,读取数据库。
6.将信息传到前台
7.前台用echart展示
1.如何通过Linux命令,获取jvm内存信息
通过jps查看java进程的ID
然后通过jmap -histo pid,就可以查看到java内存中的已用内存,对象个数。
也可以通过losf -i:端口号,查看java进程的pid。
遇到的问题:
web管理台所在服务器,通过jps看不到在运行的java进程。而通过losf -i,可以
看到进程号,通过jmap,可以看到jvm相关使用情况
2.写shell脚本,获取jvm内存信息
了解到相关命令后,开始写shell脚本,之前没有接触过shell脚本,从头开始系统学,太慢了。我是直接看别人写好的脚本。有什么不懂的,再
去查相关资料
遇到的问题:
如何在``中,传入参数
heap=$(jmap -heap ${pid})
#如何把值取出来,再用awk取一次值
a="hello world"
b=$(echo $a | awk '{print $2}')
因为,不知道语法,这两个问题绕了我很久。
https://blog.youkuaiyun.com/stpeace/article/details/78342465
https://www.linuxidc.com/Linux/2018-09/154438.htm
3.通过shell脚本,定时将信息存到数据库
获取到jvm的值之后,将值插入到数据库。
因为用的是oracle数据库,Linux服务器上必须先装sqlplus软件,配置环境变量。
我装了这三个软件,貌似中间devel这个软件不用装。
oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
oracle-instantclient18.3-devel-18.3.0.0.0-1.x86_64.rpm
oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.x86_64.rpm
遇到的问题:
1.我用非root用户,装软件。因为需要更新系统软件包数据库 (berkerly db)
这个库,只有root可以写,所有在装软件,这一步,必须要用root权限。
2.在shell脚本中,必须通过export。加上相关的环境变量,虽然直接执行shell
脚本不会报错,但是使用linux的corntab定时执行时,不能识别其中的命令。
https://jingyan.baidu.com/article/9f63fb9168b8e0c8400f0ed7.html
https://blog.youkuaiyun.com/chengyuqiang/article/details/80406159
4.定时执行shell脚本
写好脚本之后,sh myshll.sh.成功将数据插入到了数据库。开始使用Linux
的corntab 定时执行shell脚本
corntab -l :查看正在执行的shell脚本
corntab -e :编辑shell脚本
servie crond restart :重新启动
service crond start: 启动
service crond stop: 停止
遇到的问题:
1.刚开始不知道,shell脚本上要加环境变量。也没见他报错。
不知道哪里出了问题。就一直提示我
you have newmail in /var/spool/mail/(用户名)
然后,我就就去这个文件夹下面看。也没看到什么东西。服务器一直提示我
这个文档里,有新东西。但是,我进去也看不到任何相关信息。都是以前的。
我看到他的大小,一直没变。应该是文档满了。就用echo "" > 文档名。
果然看到了新内容
设定mail里文档固定大小的原因:可能是,如果不设定的话,定时器,总有一天
会把服务器撑满
5.后台代码,读取数据库。
后台代码读取,数据库,就简单了。在存数据库时,查询最新一条数据
select * from(select * from table order by createdate) where rownum =1
遇到的问题:
rownum和rowid的区别
rowid和rownum都是虚列,但含义完全不同。rowid是物理地址,用于定位oracle中具体数据的物理存储位置,而rownum则是sql的输出结果排序。通俗的讲:rowid是相对不变的,rownum会变化,尤其是使用order by的时候。
rowid 用于定位数据表中某条数据的位置,是唯一的、也不会改变
rownum 表示查询某条记录在整个结果集中的位置, 同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的
https://blog.youkuaiyun.com/yzxz/article/details/4547495
https://www.cnblogs.com/szlbm/p/5806070.html
6.将信息传到前台
没啥好说的。最重要的是,注意传到前台的json格式。
7.前台echart展示
var mychart = echarts.init(document.getElementsById(""));
var myOptions = {
//echart 组件元素
}
mychart.setOption(myOptions);
var options = mychart.getOptions();
$.ajax({
type: ,
async: ,
url: ${pageContext.request.contextPath},
data:,
success:function(result){
//动态赋值
options.series[0].data = result.key
mycahrt.setOption(options);
}
});