监控节点的性能实例代码
下面介绍监控Nodejs的性能,
最近想监控Nodejs的性能。记录分析日志太麻烦了。最简单的方法是记录每个HTTP请求的处理时间,并直接在HTTP响应头中返回。
记录HTTP请求的时间非常简单,即接收请求时记录一个时间戳,响应请求时记录另一个时间戳。两个时间戳的区别在于处理时间。
但是,res.send()代码遍布在js文件中,因此您不能更改每个URL处理程序。
正确的思路是使用中间件。但是Nodejs没有任何办法拦截res.send()。怎么破?
其实只要稍微改变一下思路,放弃传统的OOP方法,把res.send()当作一个函数对象,就可以先保存原来的处理函数res.send,然后用自己的处理函数替换res.send:
使用(函数(req,RES,next){//record start time : varexec _ start _ at=date。now();//保存原处理函数: var _ send=res.send//绑定我们自己的处理函数: RES . send=function(){//send header : RES . set(' x-execution-time ',string (date。now()-exec _ start _ at));//调用原处理函数:return _ send.apply (RES,arguments);};next();});只需几行代码就可以修复时间戳。
不需要处理res.render()方法,因为res.send()是在res.render()内部调用的。
调用apply()函数时,传入res对象非常重要,否则这个原始处理函数指向undefined,直接导致错误。
主页的实测响应时间为9ms
x-执行时间
Ps:下面介绍nodejs实现远程桌面监控的方法。具体内容如下:
最近,使用节点实现了一个远程桌面监控应用程序,该应用程序分为服务器和客户端。客户端可以实时监控服务器的桌面,通过鼠标和键盘控制服务器的桌面。
这里,因为我用的是同一台电脑,监控屏幕是这样的。当然,使用两台计算机是有意义的,一台用于运行客户端,一台用于运行服务器。
原则
其实这个应用的功能主要分为两个部分。一是实现监控,即在客户端可以看到服务器的桌面。这部分功能是通过定时截图实现的。例如,服务器端每秒钟拍摄几次图片,然后通过socketio将其发送到客户端。客户端通过改变img的src,可以逐帧显示最新的图片,让其看到动态桌面。监控就是这样实现的。
另一个功能是控制,也就是客户端在监控屏幕上的操作,包括鼠标和键盘的操作,才能真正在服务器的桌面上生效。该功能的实现是为了监控电子应用中的所有鼠标和键盘事件,如按键、向上键、按键、向下键、向上键、移动键、点击键等。然后,事件通过socketio传输到服务器,服务器通过robot-js执行不同的事件,这样就可以在服务器上触发客户端事件。
实现
原理完成后,让我们具体实现(源代码链接在这里)。
实现套接字通信
首先,服务器和客户端分别引入socket.io和socket.io-client,并分别进行初始化
服务器端:
const app=new Koa();const server=http . CreateServer(app . callback());createSocketIO(服务器);app . use((CTX): void={ CTX . body='请连接使用插座';});server.listen(端口,(): void={ console.log '(服务器在http://localhost: '端口启动);});//createsocketiocconst io=socket io(服务器,{ pingInterval: 10000,pingTimeout: 5000,cookie : false });io.on('connect ',(socket): void={ socket . emit(' msg ',' connected ');}客户端:
varsocket=this . socket=io(' http://' this . IP ' :3000 ')socket . on(' msg ',(msg)={ console . log(msg)})socket . on(' error ',(err)={alert ('error ')
实施桌面监控
之后,我们必须首先在服务器端截图,并使用截图-桌面包
const截图=require('截图-桌面')const截图_ INTERVAL=500export const createsscreenshot=(): Promise[string,Buffer]={返回截图({format: 'png'})。然后((img): [string,Buffer]={ return[img . tostring(' base64 '),img];}).catch((err): { }={ console . log '(截图失败,err);返回错误;})} export const startScreenshotTimer=(回调): { }={ return setInterval((): void={ createsscreenshot()。然后(([imgStr,IMG]): void={ callback([' data : image/png;base64,' imgStr,IMg]);}) },SCOTT _ INTERVAL)}然后通过socketio的emit传输到客户端:
startScreenshotTimer(([imgStr,img]): void={ io . sockets . emit('截图',imgStr);});客户端收到图片后,设置为img的src(这里是base64的图片URL):
Img class='截图' : src=' http:截图'/data(){ return {截图:''}} socket.on('截图',(数据)={this。截图=数据})其实桌面监控已经实现了。感兴趣,
当然这个方案是有问题的,因为我们需要知道服务器桌面的大小,然后根据这个来调整客户端显示的图片大小。
为了实现这个细节,我们使用get-pixels库,它可以读取本地图片文件的宽度和高度等信息,所以我先把图片写在本地,然后读出,从而得到屏幕大小。
界面屏幕大小{ width: numberheight:号;}函数getScreenSize(img): promises screensize { const IMgpath=path . resolve(process . CWD(),'。/tmp . png ');fs.writeFileSync(imgPath,IMG);返回新的Promise((resolve): void={ getPixels(imgPath,function(err,pixels): void { if(err){ console . log(' Bad image path ')return } resolve({ width : pixels . shape[0],height : pixels . shape[1]});});})}然后通过socektio传递给客户端
getScreenSize(img)。然后(({ width,height })={ io . sockets . emit(' screensize ',{ width,height })});客户端收到后,调整图片大小
img class=' screen shot ' : src=' http : screen shot ' : style=' screenshot style '/data(){ return { screenshot : ' ',screenshotStyle: ' ',}} socket.on ('screen size ',(screen size)={this。截图样式={'width' :屏幕大小。宽度' px ','高度' :屏幕尺寸。height' px'})到目前为止已经实现了桌面监控,图片大小与服务器屏幕大小一致。
这里还有一个细节,就是得到的图片大小是物理像素,客户端设置的px是设备无关像素,也就是px的值除以dpr。这里我们需要得到dpr,因为目前只在mac下使用,所以直接除以2。
实现远程控制
有了这里写的代码,客户端的电子应用程序已经可以实时显示服务器的桌面了。(当然,与主逻辑无关的细节,比如输入ip popup、e-vue和typescript,就不展开了。)
接下来需要实现远程控制,即监控事件、传输事件、执行事件。
首先,让我们定义交付事件的格式:
接口MouseEvent { type:字符串;buttonType:字符串;x:号;y:号;}接口KeyboardEvent { type: string键码:号;keyName:字符串;} MouseEvent mouseevent,type是鼠标事件的类型,具体值包括mousedown、mouseup、mousemove、click和dblclick,buttonType指鼠标左键或右键,值为左或右,而x和y是具体坐标。
keyboard event,type是键盘事件的类型,具体值包括KeyboardEvent、keyup和keypress,keyCode是键盘代码,而keyName是按键的名称。
接下来,我们将在客户端监听事件:
图片类='屏幕截图: src=' http :截图' : style=' screenshotStyle ' @鼠标按下=' handleMouseEvent ' @ mousemove=' handleMouseEvent ' @ mouseup=' handleMouseEvent ' @ dblclick=' handleMouseEvent '/window。onkey press=window。onkey up=window。onkey down=这个。handlekeyboardevent通过socekt把事件传递到服务端
handleKeyboardEvent(e){ this。插上这个。插座。emit(' user event ',{ type: 'keyboard ',event: { type: e.type,keyName: e.key,keyCode: e.keyCode } }) },handleMouseEvent(e){ this。插上这个。插座。发出('用户事件',{ type: '鼠标',事件3: { type 3: e,type,buttonType:right' : 'left ',x: e.clientX,y: e.clientY } }) },然后在服务端把事件取出来执行,执行事件使用的是机器人-js:
const {鼠标、点、键盘}=require(' robot-js ');接口MouseEvent { type:字符串;按钮类型:字符串;x:号;y:号;}接口KeyboardEvent { type:字符串键码:号;keyName:字符串;}导出默认类事件执行器{公共鼠标公共键盘;公共构造函数(){这个。Mouse=new Mouse();这个。键盘=新键盘();} public execute KeyboardEvent(事件: KeyBoard event): void { switch(事件。type){ case ' keydown ' : this。键盘事件。按(事件。键码);打破;case ' key up ' :这个。键盘。发布(事件。键码);打破;case ' keypress ' :这个。键盘。点击(事件。键码);打破;default : break } } public executemousevent(事件): void { mouse。设定点(新点(事件。x,事件。y));const按钮=事件。按钮类型==='左侧'?0 : 2开关(事件。type){ case ' mouse down ' : this。老鼠。印刷机(按钮);打破;case ' mouse move ' : break case ' mouse up ' :这个。老鼠。释放(按钮);打破;案例'点击' :这个。老鼠。点击(按钮);打破;case ' dbl click ' :这个。老鼠。点击(按钮);this.mouse.click(按钮);打破;default : break } } public exec tue(EventInfo): void { console。日志(EventInfo);开关(EventInfo。type){ case ' keyboard ' : this。executeKeyboardevent(EventInfo。事件);打破;案例'鼠标' :这个。executemousevent(事件信息。事件);打破;default: break} }}至此,桌面监控和远程控制的客户端还有服务端的部分,以及两端的通信都已经实现了。思路其实并不麻烦,但细节还是很多的。有兴趣的同学可以把代码下下来跑跑试试,或者按着这个思路自己实现一遍,还是挺好玩的。
总结
以上所述是小编给大家介绍的开发实现远程桌面监控的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
版权声明:监控节点的性能实例代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。