用Nginx实现接口慢查询并可示化展示TOP20
相信很多小伙伴都见过一些商业产品中的url接口响应时间,实时汇总显示功能。可以理解为web接口的慢查询,与sql的慢查询有异曲同工之妙,但是想做却无从入手不知道怎么实现此功能,所以今天就教大家如何实现用grafananginxmysql来实现此功能。0x0
其实nginx本身就带有接口响应时间的功能,只不过还需要改造下,比如说单独记录超过1000ms(1秒)的响应,并写入数据库中。要注意的是并不建议大家将记录直接写入数据库中,因为数据库有时会成为nginx的负担,间接写入即可。需要简单修改下log模块,涉及文件ngxhttplogmodule。c通常位于nginx1。17。9srchttpmodulesngxhttplogmodule。c
大约838行,找到ngxhttplogrequesttime函数并修改如下:staticucharngxhttplogrequesttime(ngxhttprequesttr,ucharbuf,ngxhttplogoptop){ngxtimettp;ngxmsecinttms;timetttime(NULL);structtmloctimelocaltime(t);tpngxtimeofday();ucharslowlog〔2048〕;memset(slowlog,0,sizeof(slowlog));ms(ngxmsecintt)((tpsecrstartsec)1000(tpmsecrstartmsec));msngxmax(ms,0);ngxsprintf(slowlog,04d02d02d02d:02d:02dVV?VwastetimeT。03M,loctimetmyear1900,loctimetmmon1,loctimetmmday,loctimetmhour,loctimetmmin,loctimetmsec,rheadersin。server,ruri,rargs,(timet)ms1000,ms1000);intlogfd;if((logfdopen(varlognginxnginxslow。log,ORDWROCREATOAPPEND,SIRUSRSIWUSR))1){ngxlogerror(NGXLOGERR,rconnectionlog,0,cannotopenfile:logfile);}charServername〔256〕;constcharservername。s;memset(Servername,0,sizeof(Servername));snprintf((char)Servername,sizeof(Servername),servername,rheadersin。server。len,rheadersin。server。data);只记录大于1秒的并且域名不是grafana。sshfortress。comif(ms1000strcmp(grafana。sshfortress。com,Servername)!0)write(logfd,slowlog,strlen((char)slowlog));close(logfd);returnngxsprintf(buf,T。03M,(timet)ms1000,ms1000);}
之后再编译即可。configureprefixusrlocalnginx1。17。9makej4;makeinstallmkdirpvarlognginx;chmodR777varlognginx
简单配置下
server{listen:80;servernameslow。sshfortress。com;location{proxysetheaderHosthost;proxysetheaderXRealIPremoteaddr;proxysetheaderREMOTEHOSTremoteaddr;proxysetheaderXForwardedForproxyaddxforwardedfor;proxypasshttp:127。0。0。1:3000;}}
启动nginx即可,如果接口响应时间超过1秒,那么varlognginxnginxslow。log中就会有记录了。但这只是将慢查询记录而已,我们还需要排序以及可示化的展示。记录也可以直接写入mysql但我并没有这么做,为什么不直接写入呢,原因是如果mysql如果响应慢则会影响nginx的响应,但写入磁盘就不会出现这种情形了。接下来就简单实现下把数据同步写入到数据库中。
0x01
首先建个表用于同步写入记录CREATETABLEnginxslow(idint(11)NOTNULLAUTOINCREMENT,datedatetimeNOTNULL,servernamevarchar(255)NOTNULL,urlvarchar(255)NOTNULL,wastetimedecimal(11,3)NOTNULL,PRIMARYKEY(id))ENGINEInnoDBAUTOINCREMENT1DEFAULTCHARSETutf8mb4;
之后实现一个同步数据的工具,这里用shell即可实现,代码如下:!binbashinsertmysql。shsetxif〔!1〕thenechoUsageinsertmysql。shvarlognginxnginxslow。logexit1fitailn1f{1}whilereadvardovalueechovarawk{print3}value2echovarawk{print4}value3echovarawk{print7}echovaluevalue2value3mysqlh127。0。0。1usuperpxxxxxxxxxeusenginx;INSERTINTOnginxslow(date,servername,url,wastetime)VALUES(now(),{value},{value2},value3);done
运行脚本就可以同步写入数据了,是不是很简单呢。insertmysql。shvarlognginxnginxslow。log建议后台运行,因为要实时同步嘛nohub。insertmysql。shvarlognginxnginxslow。logdevnull21
0x02
最后在grafana里面配置下当天接口慢查询TOP20即可,相关语句是selectn。url,avg(n。wastetime)平均响应时长fromnginxslownWHEREn。datecurdate()groupby1orderby2desclimit20或者selectn。servername,n。url,avg(n。wastetime)平均响应时长,count(1)调用次数fromnginxslownWHEREn。datecurdate()groupby1,2orderby3desclimit50
最后效果图如下
电影泄密者主创亮相上影节开幕红毯最敢拍泄密联盟齐聚造型吸睛《泄密者》主创亮相上影节开幕红毯最敢拍泄密联盟齐聚造型吸睛6月16日,第二十一届上海国际电影节开幕式红毯举行,海内外优秀电影人汇聚一堂。万众瞩目的红毯仪式更是星光熠熠,此……
亚马逊首次把macOS引入云服务亚马逊(Amazon)有史以来第一次将macOS引入其AWS云服务。新的Macmini实例将在亚马逊弹性计算服务(EC2)上提供,允许开发者为iPhone、iPad、Mac和更……
电影在乎你曝不负初见路演特辑我只在乎你引全场大合唱星关系4月16日许由香港鬼才导演毕国智执导,内地著名演员俞飞鸿、日本实力派男演员大泽隆夫领衔主演,日本元气少女木下彩音、人气小生前田公辉以及内地新晋小花卢洋洋联袂主演的电影《在……
把游戏本装进口袋是种什么体验?GPDWINMax2021给你游戏本可以说是很多游戏爱好者的刚需,然而每每出门都要提着一个笔记本的手提包,还是会觉得有些累赘,虽然目前很多笔记本都已经做的非常轻薄,但是体积仍旧是便携的痛点,平板电脑虽然很好……
寂静之地郑州首映观影观众紧张到屏住呼吸由约翰卡拉辛斯基执导并与好莱坞女星艾米莉布朗特共同主演的惊悚片《寂静之地》将于5月18日在中国内地上映。5月16日,奥斯卡院线在电影大世界举办提前观影活动,获得了观众的一致好评……
兄弟班宣传曲暖心上线温拿约定千载不变由导演陈友执导,陈家乐、于湉、王梓轩、林耀声、邓加乐、吴鹤谦演出,任达华、惠英红、金燕玲、廖启智等一众实力派戏骨特别主演的热血青春喜剧电影《兄弟班》今日首发宣传曲MV,华语乐坛……
手握10万块,欧拉好猫和本田飞度,你怎么选?在她经济时代,越来越多的女性想买一台属于自己的车。而从女性的审美上,很多女性往往更倾向于选择外观精致的小型车。今天小编给大家挑两款典型的小型车欧拉好猫和本田飞度。一款是纯……
好莱坞动作大片摩天营救全阵容北京行超前观影千米高空体验看到腿暑期档唯一好莱坞动作大片《摩天营救》于7月2日举办了全球首映礼北京站活动及观影见面会,道恩强森、内芙坎贝尔、诺亚科特雷尔、麦肯纳罗伯茨、黄经汉、文峰、昆凌等一众主创全阵容空降现……
来自华为开发者社区!深度解析HashMap底层实现架构Map接口大家应该都听说过吧?它是在Java中对键值对进行存储的一种常用方式,同样其中的HashMap我相信大家应该也不会陌生,一说到HashMap,我想稍微知道点的小伙伴应该……
如何看BTC在币圈的投资中,支撑位置和阻力位置是一件重要的事情,如果能准确的判断出支撑阻力,那么在投资过程中将会轻松很多,从而能够更好的获利。今天给大家讲解一下怎么说支撑阻力位,及支撑位和……
大轰炸曝海报刘烨宋承宪陈伟霆谢霆锋版空军F4亮相日前宣布定档8月17日,以重庆大轰炸这一史实为背景创作的战争电影《大轰炸》,今日曝光了一张空军F4版海报,由刘烨、宋承宪、陈伟霆、谢霆锋四大男神组成的空军F4率性亮相整装待发。……
特别任务热播上热度榜樊昊仑领衔警匪巅峰对决星关系5月21日讯近日,悬疑刑侦电视连续剧《特别任务》在爱奇艺独家上映。该片主要讲述了刑侦大队长李文海因一起醉驾案被派到南江市进行调查,在此过程中发现警队内部竟也有黑暗势力作祟……