伊始 -- 网聚宝业务监控系统

今年网聚宝开始推进服务化进程,我有幸分在架构组,在公司产品服务化的过程中负责业务监控模块。在以前,我们发展工程还未服务化的时候,我们可能只单单关注单个请求的耗时等基本指标,对其作出优化或者业务上的调整,其内容往往也只是一人从顶到底,一人即可了解其中的逻辑层次。但随着服务化的到来以及业务逻辑愈来愈复杂,一个前端 web 层的请求需要调用很多服务才可以完成一次请求,当请求变的比较慢或者发生故障,我们很难看出是哪个服务或者哪台机器发生的问题,所以需要一个监控服务,来快速复原出完整的请求链,以及请求中的耗时、异常等信息。从而判断是哪里出现了问题,哪里我们还有改进的空间,所以服务化监控模块应运而生。

而我们的监控过程中,部分模块基于了阿里云的基础设施,使得我们在上业务监控的过程中如虎添翼。阿里云的基础设施在使用过程中具有使用非常便捷快速的优势,真正做到了只关注业务逻辑,阿里云也将其旗下各个产品链路打通,我们可以根据自己的需要自由选择组合,完成我们的构想,这种一体化的体验,让我们在上云的时间过程中,真真切切的感受到了云生态。

下面,我将带大家一起来看看,我们在做监控部分中,如何玩转阿里云生态链,构建我们的项目异常监控信息收集。我们使用阿里云数加流计算(Ali Stream)为核心中枢,上下游使用到 阿里云日志服务(SLS) 、 消息队列(ONS) 、阿里云数据库(RDS) 这些产品。SLS + Ali Stream + ONS + RDS 的链路打通也为我们开发过程中带来了极大的便捷。

尤其我们在选择以数加流计算平台作为数据流中枢,数据流的传输过程中我们都不需要写过多的代码,即可完成 上下游数据传输,是不是相当的炫酷呢?下面,我将带领大家一同探究其中的奥秘,选择一些实现细节与大家一同分享,领略下 “无代码编程” 的魅力所在。

构建 -- “无代码编程” 上云

前文提到,我们在针对异常监控的模块中 使用到了 SLS + Ali Stream + ONS + RDS 这条产品链路,那么有看官会好奇,我们是如何使用到这条链路从而达到 “无代码编程” 的呢,在上云过程中我们有遭遇哪些困难呢?

下面是我们业务监控结合阿里云产品链路的架构图:

现在,我们从我们工程中的几个模块来探究这条链路的实现细节:

监控客户端

我们使用在我们的 Dubbo 服务中依赖了网聚宝的自有监控客户端,里面嵌入了诸如调用链监控埋点,异常截获等模块,其主要作用是代码切面拦截等功能,我们对未捕获异常拦截也在此,我们使用 Java 自带的 Thread.UncaughtExceptionHandler 接口 下的 void uncaughtException(Thread t, Throwable ex) 方法对异常进行拦截,并获取异常信息以及异常堆栈。

public class ExceptionLoggerHandler implements Thread.UncaughtExceptionHandler {private static Logger log = Logger.getLogger(ExceptionLoggerHandler.class);@Value(value = "${dubbo.application.name}")private String exceptionDubboName;public ExceptionLoggerHandler() {}public void uncaughtException(Thread t, Throwable ex) {log.error("Uncaught exception in Application: " + exceptionDubboName, ex);}
}

将异常信息使用阿里云日志服务 com.aliyun.openservices.log.log4j.LoghubAppender 进行收集,并根据 log4j.xml 发送到 相对应的 logstore中去。
log4j.xml 关于SLS部分的配置:

 <!-- 阿里云监控日志 --><appender name="loghub" class="com.aliyun.openservices.log.log4j.LoghubAppender"><!--阿里云日志服务信息配置--><param name="projectName" value="${projectName}" /><param name="logstore" value="${logstore}" /><param name="endpoint" value="${endpoint}" /><param name="accessKeyId" value="${accessKeyId}"/><param name="accessKey" value="${accessKey}"/><!-- 填写监控的dubbo application名称 --><param name="topic" value="${your dubbo application name}"/><param name="packageTimeoutInMS" value="3000"/><param name="logsCountPerPackage" value="4096"/><param name="logsBytesPerPackage" value="5242880"/><param name="memPoolSizeInByte" value="1048576000"/><param name="ioThreadsCount" value="1"/><param name="timeFormat" value="yyyy-MM-dd HH:mm:ss"/><param name="timeZone" value="GMT+8"/>   </appender><logger name="loghub" additivity="false"><level value="ERROR" /><appender-ref ref="loghub" /></logger><root><level value="WARN" /><appender-ref ref="loghub" /></root>

根据上面的配置,当项目中发生异常时,就可以在日志服务中就可以收到日志信息了。

到这里数据收集的工作就算完成了,下一站,Ali Stream!

阿里云流计算配置

现在我们数据到达了流计算这个中枢神经中,在 流计算中 我们在开发平台构建源表,数据源当然是 日志服务啦。

SLS 源表:
CREATE STREAM TABLE monitor_client_log_input (message STRING,time STRING ,level STRING,`location` STRING,thread STRING
) WITH (type='loghub',endpoint='${endpoint}',roleArn='${roleArn}',projectName='${projectName}',logstore='${logstore}',allowKeyNotExists=TRUE
);

流计算 “数据中枢” 的工作目前非常简单,收集到数据,重组数据,一边通知 ONS ,一边存储到 RDS 中,所以为了达成这个目的,我们需要构建两张结果表,分别指向不同的地址。

根据需要通知监控服务端的内容建立 ONS 结果表:
CREATE RESULT TABLE monitor_server_log_collect_exception_ons_result (message STRING,time STRING ,level STRING,`location` STRING,thread STRING,`topic` STRING
) WITH (type='mq',endpoint='${endpoint}',topic='${topic}',producerId='${producerId}',accessId='${accessId}',accessKey='${accessKey}',fieldDelimiter=",",domainSubGroup="nsaddr4client-internet"
);

根据RDS的对应列建立 RDS 结果表:

CREATE RESULT TABLE wjb_application_exceptions_rds_result
(`error_application_name` string,`error_stack` STRING,`gmt_create` timestamp,`status` int
) with (type = 'rds',url = '${url}',username = '${username}',password = '${password}',tableName = '${tableName}',cacheTTL = '120000',cacheType = 'LRU'
);

OK ,表的构建就结束了,下面我们当数据到来的时候,我们需要将数据插入进表格就可以了。

--通知 ONS
INSERT INTO TABLE monitor_server_log_collect_exception_ons_resultSELECT `message` as message,`time` as time,`level` as level,`location` as `location`,`thread` as `thread`,prop_get('__topic__') as `topic`FROM monitor_client_log_inputWHERElevel = 'ERROR';--插入 rds 异常表
INSERT INTO TABLE wjb_application_exceptions_rds_resultSELECT prop_get('__topic__') as error_application_name,`message` as error_stack,`time` as gmt_create,1 as `status`FROM monitor_client_log_inputWHERElevel = 'ERROR';

TIPS:
我们在 日志服务 中,使用 topic 作为标识符 标示不同的异常服务,所以这个是loghub的系统字段 __topic__, 在 获取数据时 使用 prop_get('__topic__') 获得字段值。使用系统参数,还需要配置下任务参数(右边栏)。

在任务参数中添加:

`galaxy.input.props.keylist=string,__topic__`

好了,到此为止,这个 “数据中枢” 就构建完了,只需要点击 上线,启动,就OK了,是不是 so easy ?

启动之后可以在运维模块下 看到当前 流计算的状态:

监控服务端

服务端的工作只有一件事:

通过 建立 ONS 消费者监听,实时获得 异常信息,通知前端,以及响应及时处理机制。这样,我们就可以比客户反馈,快一步去处理去处理这些异常。

     Properties properties = new Properties();properties.put(PropertyKeyConst.ConsumerId, MonitorConstants.ONS_CID_EXCEPTION_HANDLER);properties.put(PropertyKeyConst.AccessKey, MonitorConstants.ACCESS_KEY_ID);properties.put(PropertyKeyConst.SecretKey,MonitorConstants.ACCESS_KEY_SECRET);Consumer consumer = ONSFactory.createConsumer(properties);consumer.subscribe(MonitorConstants.ONS_TOPIC_MONITOR, "*", (message, context) -> {//启动异常处理机制return Action.CommitMessage;});consumer.start();

成果 -- 先客户一步

到这里,异常监控的一条 基于阿里云的 “无代码编程” 链路就打通了,在我们的开发过程中,我们基本不需要写过多的代码,就可以将我们需要做的事情融入到 网聚宝的系统中,我们只需要真正关注我们的业务逻辑,我们的 异常监控数据 “腾云驾雾”,先客户一步到达我们的眼前,当客户来因为异常问题找到我们的时候,我们已经找到问题,处理完毕了,减少了交流的成本,让客户使用我们产品体验也得到巨大的提升。

网聚宝服务化的进程还在推进,我们云上的架构也在逐步完善扩充,根据阿里云生态的体系,我们相信可以找到更多适用于我们自己的“最佳实践“。

上海云贝网络科技有限公司
架构师 童煜

基于阿里云生态构建网聚宝业务监控系统相关推荐

  1. 基于阿里云 MaxCompute 构建企业云数据仓库CDW

    在本文中阿里云资深产品专家云郎分享了基于阿里云 MaxCompute 构建企业云数据仓库CDW的最佳实践建议. 本文内容根据演讲视频以及PPT整理而成. 大家下午好,我是云郎,之前在甲骨文做企业架构师 ...

  2. 基于阿里云 MaxCompute 构建企业云数据仓库CDW的最佳实践建议

    简介: 通过我们背后的指导思想和我们给出的技术解决方案,希望与大家能够一起探索一些新的基于云上的数据仓库构建的最佳实践,从而尽量避免走弯路.这就是我今天想跟大家分享的内容与目的. 在本文中阿里云资深产 ...

  3. 挑战一个人搭建一套完整直播系统5:基于阿里云搭建外网直播系统

    本节将来介绍如何基于阿里云搭建一个真正的外网直播系统,其实平台的搭建在前面已经做了介绍,这里的区别是在云平台上重新搭建系统,这里采用了阿里云服务器ECS来实现(可以免费使用薅羊毛),选择的系统为ubu ...

  4. 车纷享:基于阿里云HBase构建车联网平台实践

    摘要: 1. 业务介绍 车纷享是国内首家进行汽车共享开发和运营的公司.旗下共享汽车平台采用新能源汽车作为运营工具以B2C+C2C汽车共享作为商业运营模式采用车联网技术作为运营管理技术目前已与国内多个城 ...

  5. 基于阿里云物联网平台实现的简易出入监控

    本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入口人员出 ...

  6. 基于阿里云物联网平台实现的简易出入监控 1

    场景 在公司大门入口处布点树莓派和红外感应,实现出入口人员出入时,自动拍照并上送钉钉群机器人 准备 物料准备 树莓派 HC-SR501 人体红外感应器 树莓派摄像头 母对母杜邦线三根 阿里云环境准备 ...

  7. 云场景实践研究第40期:网聚宝

    更多云场景实践研究案例,点击这里: [云场景实践研究合集]联合不是简单的加法,而是无限的生态,谁会是下一个独角兽 作为阿里云的深度用户,网聚宝的成长和阿里云的成长已经深深交织在了一起,在公开的5个产品 ...

  8. 阿里云 mysql 高可用_如何在阿里云上构建高可用应用

    原标题:如何在阿里云上构建高可用应用 业务高可用是我们每个项目的需求,一个经常故障的项目,会让我们觉得不靠谱而选择放弃,从而导致项目的失败.今天,我们来聊一聊,如何让你自己的业务能够更加稳固的运行! ...

  9. 小打卡基于阿里云构建企业级数仓的实践及总结

    简介:本次分享主要有4块内容,小打卡介绍,小打卡数仓场景简介,小打卡数仓选型思路以及代表性案例分享. 小打卡架构师 申羡 本次分享主要有4块内容,小打卡介绍,小打卡数仓场景简介,小打卡数仓选型思路以及 ...

最新文章

  1. Git学习记录 力做全网最强入门教程
  2. Linux-Rsync命令参数详解
  3. (42) Aeroo 模板实战
  4. 股市孙子兵法(收藏)
  5. expect返回值给shell_使用expect实现shell自动交互
  6. STS安装 activiti-designer-5.18.0插件
  7. 神似华为Mate20!金立手机也开始复刻了...
  8. 一周试用yii开发一个带各种该有功能的web程序(二)
  9. Java中的equals() 和 ==
  10. 引领全球增长的60大技术:机会、增长、投资、洞察
  11. zabbix详解(六)——zabbix 添加监控主机
  12. 文本关键词提取算法总结
  13. HTML5移动应用开发为什么需要引入前端工程化
  14. 前照灯检测仪_前照灯检测仪
  15. 用plsql导出oracle,使用PLSQL进行Oracle数据导入导出[转]
  16. Android 实现一键加QQ群,一键加QQ好友
  17. 聊一聊固态硬盘的那些事
  18. Oracle创建数据库连接——DATABASE LINKS
  19. 空间两直线最近的两个点、距离
  20. nba app android,NBA app官方版

热门文章

  1. 高考水平科测试软件,新高考选课测评app-新高考最好用的软件推荐!
  2. 原生JavaScript获取某一段时间内的所有日期列表
  3. 工作站Ubuntu16.04环境下安装nvidia显卡驱动
  4. 第三--JVM与线程
  5. 怎么确认eclipse是32位还是64位
  6. Exception [WinError 995] 由于线程退出或应用程序请求 的解决办法
  7. 儿童全脑九大能力,3-6岁的家长都应该知道
  8. 安卓通过SQLite实现登录注册功能(小白式教程)
  9. 收藏!AI从业者必备表情包!
  10. 类模板与函数模板区别