物流KA商家业务监控能力建设与实践
通用数据监控流程如下图,从埋点输出数据,再到采集数据通过计算聚合得到各项指标,最后根据指标配置阈值进行告警规则设置和通过各类面板进行指标展示。
1.1 UMP业务监控
UMP的业务监控建设的时间最早,现在也已下线。
但原有已接入的业务监控还在继续运营,比如KA商家服务的一个应用
1.2 PFinder业务监控
监控展示如下:
1.3 泰山业务监控
2.1 日志格式
针对KA商家的业务特点和应用场景对日志的输出格式进行了统一规范
业务域和业务子域:这两个字段按照集团业务域对每个应用进行定义; 业务场景:指单据的类型,比如下单、取消、修改和回传等; 渠道来源:指请求的渠道来源,比如JOS、EDI、物流网关、WMS等; 商家编码和青龙业主号或事业部编码:这是重点,因为KA商家需要按照事业部或商家维度进行监控; 密度:指一次请求的单量; 结果(Y/N):Y表示成功、N表示失败(业务层面); 结果码和结果码描述:指一级结果码,大的分类; 结果子码和结果子码描述:指二级结果码,细的分类; 商家单号:指商家下传的唯一值; 订单号和运单号:指业务成功后京东内部生成的各类单号,非固定字段,由各应用各接口自定义;
|业务域|业务子域|业务场景|渠道来源|商家编码|青龙业主号或事业部编码|密度|结果(Y/N)|结果码|结果码描述|结果子码|结果子码描述|商家单号|订单号|运单号2.2 举个例子
下面分别举一个业务成功和失败的例子,重点在于ECP、EBU、Y/N。
成功:|订单域|销售出|下单|50|ECP|EBU|1|Y|200|success|200|success|T20240704000086|ESL1230989|JDV002323失败:|订单域|退供出|下单|70|ECP|EBU|1|N|4007|fail|3-01-11020|可销售库存不足|T20240704000086||
3.1 log4j文件配置
在log4j的xml配置文件里,<Properties>通常都有patternLayout格式化输出的前缀,复用就可以
<property name="patternLayout">%d{yyyy-MM-dd HH:mm:ss.SSS}-%X{PFTID}-%-5p - [%t] %c -%m%n</property><RollingRandomAccessFile name="businessFile" fileName="${log_path}/eclp-biz-eclp-isv-business.log"filePattern="${log_path}/eclp-biz-eclp-isv-business-%i.log"><PatternLayout charset="UTF-8" pattern="${patternLayout}"/><Policies><SizeBasedTriggeringPolicy size="1GB"/></Policies><DefaultRolloverStrategy max="5"/></RollingRandomAccessFile>
<AsyncLogger name="BusinessLogger" level="INFO" additivity="false" includeLocation="false"><AppenderRef ref="businessFile"/></AsyncLogger>
3.2 业务日志打印
在代码需要业务监控日志埋点的类文件里定义业务日志Logger
/*** 业务日志*/private static final Logger blogger = LoggerFactory.getLogger("BusinessLogger");
blogger.info("|订单域|销售出|下单|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}",order.getSourceChannel(), order.getShopNo(), order.getDepartmentNo(), 1,result, code, message, subCode, subMessage,order.getIsvUUID(), context.getPin(), soNo);
protected void doProcess(ProcessorContext processorContext) throws Exception {OrderContext context=buildOrderContext(processorContext);try {String soNo = isvSoReceiveService.transportOrder(context);processorContext.setAttachment(IsvProcessorConstant.PRCS_RTN_ORD_TRANSPORT_SO_NO, soNo);processorContext.setAttachment(IsvProcessorConstant.PRCS_RTN_SO_IS_REPEAT_ORDER, context.isRepeatOrder());processorContext.setAttachment(IsvProcessorConstant.PRCS_RTN_ORD_CREATE_SUCC_MSG, context.getCache(CachedKeyConstants.ORDER_CREATE_SUCCESS_ATTACH_MSG, String.class));processorContext.setBizNo1(soNo);} catch (Exception e) {printBusinessLog(context, e);throw e;} finally {fillLogContext(context, processorContext);}printBusinessLog(context, null);}
protected void printBusinessLog(OrderContext context, Exception e) {String result = "Y";String code = "200";String message = "success";String subCode = "200";String subMessage = "success";String soNo = "";Order order = context.getOrder();if (e == null) {soNo = order.getSoNo();} else {result = "N";if (e instanceof JdlOpenException) {JdlOpenException jdlOpenException = (JdlOpenException) e;code = jdlOpenException.getCode();message = jdlOpenException.getMessage();subCode = jdlOpenException.getSubCode();subMessage = jdlOpenException.getSubMsg();} else if (e instanceof SafJosException) {SafJosException safJosException = (SafJosException) e;code = "4001";message = safJosException.getMessage();subCode = safJosException.getCode();subMessage = safJosException.getZhMsg();} else {code = "4002";message = e.getMessage();subCode = "";subMessage = "";}}blogger.info("|订单域|销售出|下单|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}",order.getSourceChannel(), order.getShopNo(), order.getDepartmentNo(), 1,result, code, message, subCode, subMessage,order.getIsvUUID(), context.getPin(), soNo);}
3.3 日志文件
输出的日志文件
4.1 监控项
按照泰山业务监控配置日志文件各字段取值,对下单的业务监控配置后效果如下:
4.2 监控大盘
在泰山监控大盘里配置KA商家重点事业部的分钟级监控,每个事业部一个表格,可以直观实时了解各事业部下单情况。
下图是针对某个事业部的单独监控大盘配置,成功率和失败数以图形的方式放在左边,可以直观感受到业务变动情况;每一分钟的下单量以表格的形式放在中间,便于准确了解分钟级的单量;最后观测周期内的下单结果放在右边,有助于知悉周期内的异常情况。
5.1 成功率告警
根据每个事业部的下单规律合理配置告警阈值,比如某个事业部剔除库存不足的业务失败场景后还有其他业务失败,无法一一剔除,故配置成功率连续2次低于50%触发告警。
5.2 单量突增/突降
由于单个事业部流量不均,在初期单量突增或突降的规则阈值调整过程中频繁触发告警
单量突降告警规则配置:
6.1 商家搬仓
在业务监控初期,GOC大盘的巡检过程中发现A商家的推单成功率极低,平均只有1%是成功的,通过联系前端业务跟商家反馈,商家表示商品正在切仓,待切换完成后会停用旧SKU的下单。
6.2 重复下单
B商家不定时会有大量的下单失败,报错原因都是:重复提交,通过反馈业务咨询商家的下单场景,了解到的该商家是业务从商家侧拿到文件上传至FTP某个目录下,EDI定时拉单,如果其中有个别单子因为某些原因下单失败的话,业务暂无法从单子列表中筛选出来,只能将原文件重复上传让异常单重试下单,这时候已下单成功的单子就会出现“重复提交”的报错信息。
6.3 库存不足
C商家的下单成功率一直不高,基本都在70%左右,大量的失败原因都是:库存不足,经过抽查部分单子,发现商家会不停的重试,在最后有库存的情况下都会下单成功,同样通过业务了解到商家的下单逻辑是:商家有2B和2C两个仓,商品通过采购入库单进入到2B仓,再通过调拨入到2C仓,所以存在一定的时间差会出现库存不足,待商品调拨到2C仓,经过不断地重试就能下单成功和正常出库。
6.4 事业部切换
在大促开门前的某一天,D商家突发严重告警,下单成功率跌至0%且有很大的单量,紧急排查日志发现失败原因是基础数据归属事业部错误,通过业务联系商家,反馈是商家在做事业部切换,当前推单失败的单子待切换后会进行再次推送。
6.5 商品等级调整
上面的C商家的2B仓,成功率一直在100%,2B业务单量少,因此经过优化后配置的告警阈值是连续2次小于50%,在某一天突发严重告警,同一个单子连续请求了2次,因为库存不足触发了告警规则,业务反馈商家在操作某个商品的等级调整导致原需要出库的商品等级库存不足。
6.6、外部接口超时
E商家的O2O下运单业务,因为商家用的是腾讯地图GIS信息,需要我们去转换成内部的GIS信息,在调用腾讯地图的API时会偶发超时,如果多次失败需要研发介入排查是否有系统异常还是日常的超时原因导致的。
6.7 OAID校验失败
6.8 揽收时间校验失败
G商家将老单子重推送给物流,所以揽收时间都是在当前时间之前,推单失败。
6.9 入参错误
常见的商家入参错误,反馈商家确认商家系统是否有异常情况。
6.10 上游流量异常
1.6号突发单量下降严重告警,通过总量查看确实在18点~18点45分期间上游单量下降很多,待触发告警后去排查的时候单量已恢复正常值,联系上游反馈系统正常,总单量无变化,其实这里是留有疑问的,如果系统正常的话是不会出现单量突增和突降的情况。
推荐阅读