魔改 Grafana 我学到的事

来源:来自网络    作者:海联网    人气:    发布时间:2017-03-13    

我,一个 Java 的忠粉,前些日子也不得不开始用 Golang 写一些对象,原因实在很简朴,语言也好信奉也好,都敌不过一个根基实现需求的能够为我节减大量代码的开源软件。

一年之前第一次值班,被各类题目弄得焦头烂额,其时就想着要是有个系统,能把生产系统中正在产生的各类题目以告警的方法给出来,同时附带办理方案该多好。其时也是初生牛犊不怕虎,值班日报里随即把基于日志收罗实现业务监控、可视化的方案说了一通,复用阿里云的各类基本办法法子,也许只要数天就能搭建一套完备的日志收罗、存储、阐明、可视化、告警体系。

于是实现这个方案就成了我的事情,可是有一个约束:为了实现依靠最小化,我必须使用团队内部提供的基本办法法子来实现,不能使用中间件那套虽然看起来完善可是底下不知道水多深的技能栈。

吭哧吭哧搞了一的多月,整合业界常见的大数据三板斧 Storm 和 Kafka,加上团队提供的 HybridDB 数仓,另有在生产代码里加上埋点,我也算是造了一套日志收罗、存储、阐明的轮子。可是这套系统我向来欠美意思拿出去给同事们用,由于它太难用了。难用不难用和我用什么后端技能完全没干系,只和我用什么用户界面有干系。之前我在菜鸟的时候,基于 ODPS(此刻叫 MaxCompute )做的日志查询和阐明,虽然能实现良多成果,好比准及时生产日志查询、性能分解、强弱依靠阐明等等,可是由于猎取这些信息的时候需要写 SQL,功效就是除了我之外没几个同事在用。

没有一个靠谱的用户界面向来是我这套日志系统的致命硬伤,可是业界之前仿佛没有什么好的能够直接基于干系数据库做可视化的开源系统。直到厥后我才知道 Airbnb 开源了一个 superset。实在我看向来都想要用上 Grafana,一个是由于它酷炫的界面,另一个则是它在 4.x 版本里新出的 Alert 成果。一旦能够用上 Grafana,那么我的日志系统就有了一个超等靠谱的可视化用户界面,和一个委曲可用的监控告警,整个成果就齐全了。

也许还真是我命运运限不错,让我在 Github 里找到一个数据源插件,这个插件能够让 Grafana 使用 MySQL 协议可能 PostgreSQL 协议从干系数据库中猎取数据并展示出来,实现类似于 Influxdb 的结果。美中不敷的是,这个插件不支持 Alert 成果,由于这个插件是在 3.x 下开辟的,而 Alert 在 4.x 才有,也惟独 Grafana 官方维护的数据源才同步支持了 Alert。

魔改开源软件,我也算是一把妙手了。Grafana 经过本名流的魔改之后,不只支持 SQL 数据源,还给 SQL 数据源加上了 Alert 成果;不只可以在 Alert 时发邮件,还能往钉钉群敦促静;不只能敦促静,还能提醒指定的人,还能按照变量渲染告警消息;存放告警指标截图的图床,除了原生支持的 S3 和 WebDAV,我还给加上了阿里云 OSS;之前只能明文放在配置文件里的数据库和密码,被我加密存起来了……

经过我魔改的Grafana,不只在我地址的小团队里迅速被几个业务采用,还以软件包的形式给输出其他团队,个中的杀手级特性,当属钉钉推送,这也算是我意料之中的~

托 Grafana 的福,我写了一星期的 Golang,也算是又多了一门上过生产情况的语言。除了 Golang,我还发明一些有趣的软件工程本领和常见的设计缺陷,一并纪录下来。

Golang 的错误处理惩罚真是麻烦得不可

if out, err := json.Marshal(); err != nil { // handle error } else { // real code }

Golang 迫使用户在险些所有函数返回之后,立即处理惩罚函数返回值中的错误信息。可是在我写过的实用的代码中,险些所有深层代码,是没有能力去处理惩罚各类异常/错误的,只能把异常/错误原封不动交给上一层调用。在函数返回值中返回错误信息,不只使得错误处理惩罚和业务逻辑耦合在一起,还让我们喜闻乐见的延续调用变的不行能。

// other languages return f(g(x)) // Golang if gg, err := g(x): err != nil { return nil, err } else { if ff, err := f(gg); err != nil { return nil, err } else { return ff, nil } }

真是简捷优雅呢~

在系统启动进程中自动执行数据库变换

Grafana 有一套 Migration 代码,用来在系统启动并连接到数据库之后,自动执行诸如建设表结构、表结构升级之类的节制。也许是出于便于会合权限打点的原因,我从没在事情中见到有一个系统是这么做的,我们都需要在系统进入 stage 情况之前就把 DDL 提交到数据库打点平台上,由 DBA 审核之后伎俩在业务低峰期执行。也许这也和我向来以来的事情都是维护 SaaS 提供处事而不是输出软件有干系,可是这种做法在需要输出软件的时候真的很利便用户,无论是部署仍是使用都很利便。

Docker build 阶段使用代劳署理来加速网络

在为开源软件做 Docker 镜像的时候,常常在 build 阶段泯灭大量时间,就算把明面上需要下载的资源弄到了本地,仍是会在一些看不到的处所会见一些不存在的网站,好比 npm install 的时候,纵然把客栈指向了墙内镜像,也仍是招架不住某些软件包在 install.js 里去 Github 下对象,然后 Github 的资源又是托管在 S3 上的,除非在打包的时候开个 VPN 全局代劳署理,否则 build 进程卡个半个多一个小时没功效是常有的工作。

幸好 Docker build 有一个 --build-args 参数,可以在 build 阶段设置一些情况变量,好比 docker build --build-arg HTTPS_PROXY=127.0.0.1:8888 nobody/awesome-image . ,就可以在构建镜像的时候指定一个 https 协议代劳署理。需要寄望的是 mac OS 上的 Docker 是运行在一个虚拟机里的,127.0.0.1 指向的是虚拟机而不是宿主机,所以在 mac OS 上使用这个黑科技的时候,要把 IP 改成宿主机的 IP。

超时哄骗

超时(Timeout)是每个在线系统需要在意的工作,只要是可以遇见到会有较长耗时的梗阻调用,就得思量如果在可接管的时间内无法拿到功效该如那边理惩罚;如果一次恳求内有多个大概梗阻的调用,海联网, 还需要按照这些调用的重要水和善预期的恳求耗时,布置公正的超时配置。Grafana 的 Alert 特性在这一点上做得较量糟糕。

Alert 的概略流程分为查询指标、鉴定前提、渲染图片、推送通知四个步调,整体的超时为 30s。查询指标是最根基的步调,如果这步超时根基 Alert 就废了;鉴定前提是纯内存计较,不会超时;推送通知也很重要,该推送的告警信息推不出来,这个成果也就废了;唯逐一个锦上添花的成果就是渲染图片。Grafana 发明监控指标异常后,使用 PhantomJS 来打开监控指标地址页面并将页面渲染成 PNG 花样的图片,然后实验调用可用的 image uploader 将图片上传至图床,供推送通知使用。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

责任编辑:海联网

频道精选

最火资讯