文章来源:https://zhuanlan.zhihu.com/p/26981364?group_id=850365065449328641上一篇主要讲了StatsD+InfluxDB+Grafana构建使用Grafana创建两种图(Graph):api各个接口的请求量和API各个接口的响应时间。监控告警Grafana+ELK在观察Grafana监控时,发现一个API接口的响应时间突然出现了尖峰。这时候的表情是:不过不用担心,我之前写过一篇文章《Koa 请求日志打点工具》是关于如何管理Koa应用的。将慢日志收集到ELK,可以看到具体请求的yield表达式每一步的执行时间。那么如何结合Grafana和ELK日志记录呢?如果我们深入研究Grafana,我们会发现一个可用的功能:Grafana的图表可以添加一个链接,如下:shimo会弹出。点击跳转到https://shimo.im。记得勾选Includetimerange,这是关键。在Kibana-RequestId-Link中勾选Includetimerange会将from=xxx&to=xxx添加到querystring中,选择范围时,Grafana的时间范围格式与Kibana的不一样。所以我写了一个Chrome插件kibana-requestId-link来解决两个问题:1.转换时间范围格式。即从Grafana带入Kibana的时间范围(from和to)转换成Kibana识别的时间范围并重定向。2.添加requestId链接。点击后跳转到限制在同一时间范围内的requestId的查询结果,省去了粘贴复制到Kibana再次查询的过程。该插件已发布至ChromeAppStore,下载链接。安装插件后,我们还需要修改初始化Grafana响应时间图表的脚本,将:links:[]改为:"links":[{"title":"Gotokibana","type":"absolute","keepTime":true,"targetBlank":true,"url":"http://你的kibana地址/app/kibana#/discover?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-1h,mode:quick,to:now))&_a=(columns:!(routerName,sumOfTake,requestId),index:'logstash-*',interval:auto,query:(query_string:(analyze_wildcard:!t,query:'app:%22api%22%20AND%20routerName:%22<%=action%>%22%20AND%20_exists_:%22sumOfTake%22')),sort:!('@timestamp',asc))"}]这里有两点需要说明:1.url中的默认时间:(from:now-1h,mode:quick,to:now),kibana-requestId-链接插件将使用此值替换。2、query_string中的查询语句为:app:"api"ANDrouterName:"xxx"AND_exists_:"sumOfTake"下面是我们业务api的lucene查询语句。app仅限于api的log,routerName表示是哪个接口,_exists_:"sumOfTake"表示请求最后一步的log(因为慢日志和error日志只有最后一步添加了sumOfTake场地)。一句话解释:查询某个API接口在一定时间内的所有慢请求和错误请求。举个真实的例子,过去一小时file.star接口的响应时间图:可以看到在09:17和09:19左右出现尖峰(响应时间大于500ms),点击Gotokibana跳转到Kibana,如下:有两条慢日志,时间点和响应时间一致(这里没有错误请求日志)。我们点击第二条慢日志的requestId,跳转如下:可以看到从request到结束一共执行了18个step,而且大部分step的执行时间都很短,但是step的执行时间=17为1190ms,点击左侧展开查看具体信息:url表示是哪个接口,fn表示yield表达式为this.me.addStarredFile(file,{individualHooks:true}),filename表示代码为在/data/app/api/controllers/file.js:439:4中,status为afterYield表示本次yield表达式的执行时间(beforeYield表示在最后一个yield表达式执行之后,本次yield表达式执行之前),take表示执行时间为1190ms。Grafana监控告警Grafanav4版本新增了告警(Alert)功能。首先点击左上角的图标,弹出选项菜单->Alerting->AlertList->Configurenotifications。如果没有频道,单击新建频道创建一个。创建或修改频道如下:Emailaddresses中的emailaddresses以分号分隔。单击“发送测试”,测试是否可以收到邮件。注意:需要配置Grafana的邮箱地址。回到具体的监控图表,进入编辑页面,有一个Alert标签页,如下:过去5m的平均响应时间大于500ms然后发送警报邮件。通知可以设置发送到哪些渠道。在这里,设置仅发送到管理频道。您可以在Message中填写详细的描述,Statehistory保存所有报警历史。相应的,我们需要修改创建响应时间图表的脚本,增加alert字段:{"alert":{"conditions":[{"evaluator":{"params":[500],"type":"gt"},"operator":{"type":"and"},"query":{"params":["A","5m","now"]},"reducer":{"params":[],"type":"avg"},"type":"query"}],"executionErrorState":"alerting","frequency":"60s","handler":1,"name":"<%=action%>Responsetime","noDataState":"no_data","notifications":[]},..."id":<%=panelId%>}注意:这里的A是之前的refId意思是。收到的报警邮件会有当前监控图的截图,如下图:终于招人啦![[北京/武汉]石墨文档做最美的产品——寻找中国最有才华的工程师加盟](https://www.v2ex.com/t/313389)
