找回密码
 会员注册
查看: 10|回复: 0

数据中心数据质量线上监控的实践

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71994
发表于 2024-10-7 21:59:30 | 显示全部楼层 |阅读模式
点击关注“有赞coder”获取更多技术干货哦~作者:侨歌部门:技术中台/测试开发有赞数据报表中心为商家提供了多维度、多渠道、多周期的数据,帮助商家更合理、科学的运营店铺,同时也直接提供分析决策方法供商家使用。多维度是指支持正逆向交易、商品、客户、流量、营销活动...多渠道是指支持全渠道、H5、APP、小程序(微信、支付宝、百度...)...多周期是指支持实时、自然日、自然周、自然月、近7天、近30天、季度、自定义监控背景&解决的问题因为数据涉及商家运营策略的制定,所以在商用数据及时性和准确性上都会有很高的要求,而数据除了发布可能引入问题之外,每日调度时依赖表缺失、组件异常或者数据异常等均可能造成数据问题,所以线上监控就显得非常重要,是发现和拦截问题的重要手段。本文主要分享有赞针对离线和实时数据做的一些监控实践,当前商家数据基本在7点前完成产出,所以线上监控规则大多是7点开始调度,为了更早的发现问题,我们也开始做业务层表(kylin)构建完成后触发监控。章节分为5块:1.有赞的数据流图 2.离线数据(批处理)的线上监控详解 3.实时数据(流处理)的线上监控详解 4.线上监控效果 5.后期规划。一、有赞的数据流图有赞的数据主要来源于交易、商品、客户等各业务方和C端的埋点日志,在数据处理阶段提供离线和实时数据两个维度,在应用层不仅支持了通用的数据报表,也支持定制化的业务数据。数据流图如下:?二、离线数据(批处理)的线上监控详解1、离线数据描述离线数据定义为昨天及以前时间的数据统计,周期维度有自然日、自然周、自然月、近7天、近30天、季度、自定义,主要是通过hivesql来处理和聚合。在梳理规则前,先简单了解下离线数据链路每层的特性。1.1 准确性规则-线上监控梳理离线数据的线上准确性监控分为指标、表和应用层三个维度,其中指标准确性又分为“跨表对比”、“同表逻辑性判断”和“自身判断”;表维度分为“行数判断”和“大小判断”;应用层分为“接口返回历史数据不变判断”。指标维度跨表对比:是指不同表相同指标之间的等值判断,有赞数据中心当前仍然存在着页面不同定义相同的指标,来源于不同的底层表,后期随着底层表统一模型的建设,此类对比监控比重会逐步下降。同表逻辑性判断:是指同表不同指标之间的逻辑判断,比如支付人数0判断。),其中接口返回指标数值>0判断和deadline告警为线上监控,也是接下来着重介绍的。2、线上监控规则的实现针对不同层级数据,所有线上监控覆盖面参考下图:(实圈为覆盖项,空圈为无交集项)?平台监控职责以及保障维度拆解如下:(图中“BI报表”主要是做元数据管理平台监控数据的报表统计,本次不做详细介绍)?2.1 线上监控示例2.1.1 准确性示例基于元数据管理平台,实现“同表逻辑性”判断,数据变更时自动触发规则校验,具体实现如下图 :基于接口自动化平台,实现数据回归用例-“数据接口返回历史数据不变”判断,7-24点每10分钟定时触发,对于离线数据做10分钟间隔触发,也是为了监控数仓刷数和应用发布的动作。准确性监控,示例数据中心全量指标,如下图 :2.1.2 及时性示例基于接口自动化平台,实现“数据接口返回指标数值>0”判断,7点定时触发。及时性监控,示例流量概况页面指标,如下图:三、实时数据(流处理)的线上监控详解1、实时数据描述今日实时数据的统计时间均为今日零时截至当前更新时间,有赞数据中心实时数据主要分为店铺和商品两个维度,会对交易(正逆向)、流量、营销、商品多个业务方的数据做处理,最后结果数据落入底层存储,涉及的处理组件为Flink,底层存储为druid和TIDB。1.1 准确性规则-线上监控梳理实时数据的准确性校验分为上下游数据对比、昨日实时与昨日离线数据对比。上下游数据对比:是指业务方binglog日志传到数据侧时,在TIDB存入明细数据,按指标统计规则处理后与底层存储对比。昨日实时与昨日离线数据对比:是指昨日实时数据完全落库后,通过接口再提取出来与昨日离线的数据进行比较。1.2 及时性规则-线上监控梳理实时数据及时性,上层表象为实时指标不变或者变化缓慢,下层表象是kafka有积压,导致延迟的主要影响因子是Flink的配置和集群资源,对于集群和kafka的监控由运维同学cover,暂不做详细介绍。2、线上监控规则的实现上下游数据对比,执行时间为:全天每20分钟执行一轮,一轮校验500次,均不相等时,触发告警。?@Override @Scheduled(cron="0 0/20 * * * ?") public void teamOrderCheck() { tidbCheck(); druidCheck(); } public void druidCheck() { boolean druidAlert = true; try { //druid for (int i = 0; i
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 22:09 , Processed in 0.428384 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表