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

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

今年网聚宝开始推进服务化进程,我有幸分在架构组,在公司产品服务化的过程中负责业务监控模块。在以前,我们发展工程还未服务化的时候,我们可能只单单关注单个请求的耗时等基本指标,对其作出优化或者业务上的调整,其内容往往也只是一人从顶到底,一人即可了解其中的逻辑层次。但随着服务化的到来以及业务逻辑愈来愈复杂,一个前端 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) 方法对异常进行拦截,并获取异常信息以及异常堆栈。

```java
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_result
 SELECT
    `message` as message,
    `time` as time,
    `level` as level,
    `location` as `location`,
    `thread` as `thread`,
    prop_get('__topic__') as `topic`
 FROM monitor_client_log_input
 WHERE
 level = 'ERROR';

--插入 rds 异常表
INSERT INTO TABLE wjb_application_exceptions_rds_result
 SELECT
    prop_get('__topic__') as error_application_name,
    `message` as error_stack,
     `time` as gmt_create,
     1 as `status`
 FROM monitor_client_log_input
 WHERE
 level = 'ERROR';
```

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

在任务参数中添加:

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

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

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

监控服务端

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

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

```java
     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();
```

成果 -- 先客户一步

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

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

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

时间: 2024-10-02 02:22:28

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

数据让生意更简单,网聚宝创业团队利用数加快速打造核心业务竞争力,在激烈的市场竞争中弯道超车。

免费开通大数据服务:https://www.aliyun.com/product/odps "我们选择数加平台的主要目的是数加平台本身大数据应用的能力和平台的成熟度,当然背后还有很多能陪我们一起996战斗的数加兄弟们,无论是技术能力的判断,还是从商业合作的角度,这是选择数加的考虑.""可以毫不保留的来讲,我们现在内部团队具备的大数据处理的能力相当于阿里巴巴的处理能力,所以我们能够很快速.便捷的给我们的品牌提供多样化的丰富的完整闭环的大数据的营销和解决方案的能力"熊大

【Best Practice】基于阿里云数加·StreamCompute快速构建网站日志实时分析大屏

本文偏向与实操层面的为大家介绍,如何基于阿里云数加StreamCompute.DataV快速构建网站日志实时分析. [什么场景适合用流计算] 流计算提供了针对流式数据实时分析的一站式工具链,对于大量流式数据存在实时分析.计算.处理的逻辑可以考虑通过流计算该任务.举例如下: 1. 针对实时营销活动,需要实时获取活动流量数据分析以了解活动的营销情况,此时可以上流计算. 2. 针对物联网设备监控,需要实时获取设备数据进行实时灾难监控,此时可以上流计算. 3. 对于手机APP数据实时分析,需要实时了解手

【Best Practice】基于阿里云数加·MaxCompute及Quick BI构建网站用户画像分析

前文背景:[Best Practice]基于阿里云数加·StreamCompute快速构建网站日志实时分析大屏   开通阿里云数加产品 前提条件 为了保证整个实验的顺利开展,需要用户使用开通相关产品及服务,包括DataHub.MaxCompute.AnalyticDB.Data IDE.Quick BI.      业务场景 数据来源于网站上的HTTP访问日志数据,基于这份网站日志来实现如下分析需求: n   统计并展现网站的PV和UV,并能够按照用户的终端类型(如Android.iPad.iP

天猫携手阿里云、万网宣布联合推出聚石塔平台,打造开放、安全稳定的电商云工作平台

近日,天猫携手阿里云.万网宣布联合推出聚石塔平台,以云计算为"塔基",为天猫.淘宝平台上的电商及服务商等提供数据云服务,打造开放.安全稳定的电商云工作平台. 每每遇到电商搞促销活动时,网购的消费者或多或少都会遇到以下情况:网页拥堵.产品靠抢,好不容易下单成功,商家却延迟发货:明明拍的是一双男鞋,快递收到的货品却是一双女鞋--这些服务质量问题让消费者很恼火. 在去年"光棍节"的促销活动中,阿里巴巴创下了一天交易额52亿元的惊人纪录,但众人一拥而上造成的网页拥堵.&qu

[容器Hub服务]基于阿里云Code的仓库构建

阿里云Code 容器Hub服务支持Github.Bitbucket作为代码源的仓库构建,但是为了向用户提供更加稳定可靠的服务,我们也引入了阿里云Code.阿里云Code代码托管平台实现了私有并且安全的代码管理服务,能提供目前最流行的分布式版本控制系统Git来有效管理项目. 创建仓库 默认情况下,如果你的容器Hub服务登录账户已经开通了阿里云Code,将会默认展示你在阿里云Code上的项目.如果你还没有开通过阿里云Code,那就不要犹豫,先点击绑定账号,去开通一下吧. 之后,你可以基于阿里云Cod

云加数商业地产转型——基于阿里云构建云+中台

在2017云栖大会-上海峰会上,正佳金控集团CIO宋亦皇做了题为<云加数商业地产转型--基于阿里云构建云+中台>的分享.未来在大数据技术和云计算的推动下,商业地产中将出现原生金融.融合体验.对于企业来说,商业决策也会变得更加智慧,体制也会被不断创新.云在未来的商业活动中将凸显其核心地位.

用友等上百家阿里云生态伙伴参与 超千款产品同庆双11

在天猫双11全球狂欢节的"电器城会场",计算资源正成为最受关注的热门商品之一.日前,阿里云宣布加入天猫双11全球狂欢节,启动针对企业级市场的大促计划,为创新创业者"一键"备齐商业运行所需的计算引擎.值得一提的是,除阿里云全线计算资源产品在官网狂欢售卖外,此次双11还聚合生态合作伙伴力量,专门设立云市场分会场,汇集用友.神州数码.正邦.SAP.华耀中国.深信服.北京云梦.长雅文化等上百家知名软件企业的超千款产品. 依托强大的合作伙伴产品接入能力,参与本次"双

阿里云生态成“风口” 资本市场重金培育企业级市场“独角兽”

提供企业云服务的创业者,正成为投资机构眼中的"香饽饽".近日,基于阿里云平台输出技术服务解决方案的驻云科技,和同为阿里云使命级合作伙伴的数梦工场,分别获得亿元级融资.   而被资本青睐的数梦与驻云并非个例.据不完全统计,2016年,在阿里云市场上有16家独立软件供应商(ISV)获得融资,总额接近15亿人民币.围绕阿里云,一个生机勃勃的生态系统正在建成. 阿里云总裁胡晓明表示:"生态是云计算的明天,也是普惠科技的必由之路.阿里云将一如既往地与生态伙伴紧密合作,构建全球生态服务体

平均融资破亿 阿里云生态伙伴晒最强成绩单

新年伊始,企业服务领域便被泛微网络顺利完成A股上市的消息引爆,阿里云生态最大的"潜力股"商家正式成为协同管理软件行业登陆主板的第一支股票. 资本正流向企业服务领域.除泛微外,阿里云生态上已成长更多的企业服务"潜力股",他们或是被创投机构关注,或是业绩大幅增长,据不完全统计,2016年云市场上聚合数据获得融资3.6亿人民币,Face++获得1亿美元融资,Udesk融资1亿人民币,悠络客新三板定增市值2.76亿:此外,法大大.图普科技.安华金和.斗象科技.驻云等也都获得