一、为什么需要一个自动预警系统
关注数据的你,是否曾经遇到过如下情况?
一个包含了多个页面的活动上线一段时间后,数据虽有波动却十分正常,你本以为安枕无忧,却在过了几天做报表的时候,才发现其中一个活动页面的数据断崖式下跌,这个页面的浏览量不大,很难对总量数据产生影响,以至于难以第一时间发现问题,让你白白丢失了几天的数据,受到了批评;
另一个活动上线了,这次你吸取了之前的教训,你对数据异常关注,活动中的每个页面你都每天查看相关数据,起初这还是一个没有多大压力的事情,无非是多点几次鼠标,但随着你所负责活动的增多,你所关注数据的增加,每次多一点的细心,竟成了占据你每日大量时间的工作,这搞得你疲惫不堪,甚至还影响了你其他工作的开展;
……
上面两种情况,我相信大家或多或少的遇见过,对一个数据从业人员来说,数据是一切的基础,但是数据不是天生就在那里的,而是需要采集、挖掘、维护的,即使是仅仅部署了一套最简单的基础跟踪代码,或简单的分析网站的访问日志,也至少需要确保跟踪代码是加载正确的,访问日志是真实有效的。
初始的时候,总是“没有问题”的,这个时候大家专注于此,精神集中,出现了问题也能很快发现,但随着活动、工作的开展,一个活动所关联的内容越来越多,活动的复杂度越来越高,问题总是难以避免,有时可能仅仅是一个小小功能点的变更,甚至产品和开发都觉得不值一提,却使得一个关键埋点数据的丢失。
理所当然,我们希望能够在问题发生之前就解决它,但是即使我们进行了大量的沟通,和其他各部门都阐述了数据收集的重要性,要求确保每一次可能和数据收集相关联的变更都和数据部门做及时的沟通,问题依然难以避免。
“这个地方的修改,我理解应该不会影响数据的采集啊。”
“这个地方是其他部门负责的,我们现在没有办法…”
沟通的成本总是低于人们的预想,又显著地高于人们的行动力。
百分百的将问题扼杀在摇篮中是不太现实的,何况除了内部的问题,外部的问题也总是层出不穷,渠道、广告、引擎、搜索引擎……
那么如果我不能消灭问题,我能不能在出现问题后及时发现并解决呢?
可以,你要做的就是再细心一点,再认真一点,但是正如我们所熟知的八二法则一般,百分之八十的时间,与你而言却只创造了百分之二十的价值。
关键的问题在于,我们大多数时候所作的检查,仅仅是为了避免极小部分错误的产生,如果恰好——确实是你所负责的内容出现了问题,而你因为及时、细心的检查,将其有效的解决——那自然是好事情,但大多时候出现的结果却是——你早上上班后,花了大把时间,草草地看了几个负责的活动,麻木的扫视了长期不变的那几个数字,然后熟练的关闭了页面,并感慨你“短暂”人生几个小时无聊的浪费,然后被办公室的其他同事认为是花了一早上对着屏幕发呆——并且当一次突发的问题出现却没有被你检查到后,你的所有检查都失去了“意义”。
检查是一种避免损失的方法,但它却没有创造价值,即使有的观点告诉我们,从长期来看,避免犯错,就是最好的技巧(例如在中国股市,只要我不投资股票,我就跑赢了绝大部分的股民),但是假如我们能够在保证上述前提的同时——节约这部分时间呢?
去关注、深入挖掘、探索、创造一些其他的事情,想必会更有趣一些吧~
GA(Google Analytics)想必大家都十分熟悉了,GA拥有丰富的功能,以及庞大的生态,上述遇到的情况,使用GA比较熟练的同学,可能就会想到,可以结合Data Studio生成自动化报告以及GA的自定义提醒,从而实现自动化的检查、预警工作。
GA已然如此强大,但还是有些需求还是我们是实现不了的:
比如有些可视化的呈现效果,我们公司用echarts或three能够做的更加漂亮,可不可以用这些做呢?
比如除了我们日常查看,还想同时发送邮件给关注这个事情的领导,但是领导的电脑翻不了墙,虽然手动可以解决,但是怎么自动化的处理这个事情呢?
甚至是我发现了GA数据有极大的异常波动,但是能不能在继续让它自己智能地做一些自动化的监测呢?比如维度下钻、方差检验、异常值检测等等。
当然,如果能够很方便的进行管理,比如不用变更代码,而可以通过可视化的管理界面就进行修改、添加可不可以呢?
……
一般来说,文章水到这个地步,下一步就是告诉大家,嘿!恰好我们这里有款产品可以满足你们的全部需求,而且价格还不贵!但是——正如标题所言,这篇文章的主要目的的在于分享方法、思路,辅助你搭建一个属于你自己的自动预警系统,下面,我们就来看看如何搭建这个东西。
二、自动预警系统的构成
一个相对完善基于GA的自动预警系统,一般由以下几部分构成:
- 数据获取模块(用于从GA中获取数据,当然后面你也可以改成任意提供数据源。)
- 数据处理模块(用于将所获取到的数据进行处理,以成为符合格式需求的数据。)
- 数据分析模块(核心,用于设定规则,并处理好的数据进行分析。)
- 报表生成模块(用于生成可视化报表,可能是邮件中的表格,也可能是邮件附件。)
- 数据存储&备份模块(用于处理后关键数据的存储,以方便后期的比较或长期的分析。)
- 邮件发送模块(用于批量邮件&带附件邮件的发送,采用邮件通知是最经济、简单的预警提示方式了,当然如果需要的话,你也可以尝试弄成如自动微信发送、短信发送的方式。)
- 自动调度模块(用于定时执行上述工作。)
- 系统配置模块(用于进行部分配置的调整。)
除了上述模块以外,为了方便的查看数据、管理部分系统配置等,有时我们还会搭建管理后台;为了保护数据的安全性,一般还会有身份认证模块(事实上如果通过GA API取数,则一定会有相应的身份认证过程,如通过Oauth2.0或服务账号密钥等);此外,日志记录模块,允许我们进行程序执行记录,以便在出现问题时进行查询;测试模块,可以加入相应的单元测试,以保证系统执行的稳定、可行。
下图展示了系统中各模块的关系&包含的组件:
数据获取模块中,罗列了两行,一个是通过Reporting API获取的GA报告数据;另一个是通过 google-cloud-bigquery&gsutil获取的GABigequery数据,区别在于前者的数据形式维度&指标组成的数据表格,免费但存在抽样;而后者则是特定数据格式存储的GA底层数据,收费,但是是全样的原始数据
通过API获取的数据处理起来相对简单,仅需要解析响应结果即可,BQ的数据导出就相对复杂一些,需要先执行BigQuery查询job,然后存储在google cloud storage(GCS)上,再导出到本地,BigQuery适用于更加复杂、精准、深度的业务需要。
处理后的数据就可以进行分析了,如果是最简单的阈值比较,我们直接进行比对即可了,如果涉及到一些相对复杂的计算、分析,则可以使用诸如Sklearn、Scipy。
而无论是数据处理后的结果,还是数据分析的结果,都只是苦涩的数字,虽然可以通过上传csv附件的方式,但是如果想要转换为直观,易懂的,就需要借助诸如Matplotlib、pyecharts、jinja2,此类的工具,这里面,Matplotlib&pyecharts都用于图表的生成,而jinja2用于将邮件模板根据不同输入数据,渲染成不同内容的html格式文件,这样可以非常直观的直接在邮件中进行数据&报表的呈现。
邮件发送和数据存储都采用的是非常通俗的解决方案,本次不做叙述。
自动调度方面,由于我们选用在linux服务器上进行项目的部署(如果没有现成的 linux 服务器,可以选择在阿里云上购买一台低配置的云服务器,或者购置一台树莓派,都能完成你的需要。)所以我们选择使用crontab来进行定期调度,如果想要使用window来完成自动调度,可以选择使用window的任务计划程序。
系统配置模块选择yaml,它能支持我们方便、快捷的修改、更新系统配置。
管理后台此处采用了Django,Django是Python下开源Web框架,采用了MTV(模型、视图、模板)的框架模式,此处采用Django的原因在于Django提供了一套堪称完美的管理后台搭建方案,可以非常简单的搭建出一个UI美观、功能强大的管理后台来,通过这个管理后台,我们可以便捷地进行数据&配置的管理。