vnsc威尼斯城官方网站百亿级访问量的实时监控系统如何实现?

百亿级访问量的实时监控系统如何实现?,百亿级实时监控系统

笔者自2016年加入WiFi万能钥匙,现任WiFi万能钥匙高级架构师,拥有10年互联网研发经验,喜欢折腾技术。主要专注于:分布式监控平台、调用链跟踪平台、统一日志平台、应用性能管理、稳定性保障体系建设等领域。

在本文中,笔者将与大家分享一下在实时监控领域的一些实战经验,介绍WiFi万能钥匙是如何构建APM端到端的全链路监控平台,从而实现提升故障发现率、缩短故障处理周期、减少用户投诉率、树立公司良好品牌形象等目标。

WiFi万能钥匙开发运维团队的困扰

始于盛大创新院的WiFi万能钥匙,截至到2016年底,我们总用户量已突破9亿、月活跃达5.2亿,用户分布在全球223个国家和地区,在全球可连接热点4亿,日均连接次数超过40亿次。

随着日活跃用户大规模的增长,WiFi万能钥匙各产品线服务端团队正进行着一场无硝烟的战争。越来越多的应用服务面临着流量激增、架构扩展、性能瓶颈等问题。为了应对并支撑业务的高速发展,我们迈入了SOA、Microservice、API
Gateway等组件化及服务化的时代。

伴随着各系统微服务化的演进,服务数量、机器规模不断增长,线上环境也变得日益复杂,工程师们每天都会面临着诸多苦恼。例如:线上应用出现故障问题时无法第一时间感知;面对线上应用产生的海量日志,排查故障问题时一筹莫展;应用系统内部及系统间的调用链路产生故障问题时难以定位等等。

综上所述,线上应用的性能问题和异常错误已经成为困扰开发人员和运维人员最大的挑战,而排查这类问题往往需要几个小时甚至几天的时间,严重影响了效率和业务发展。WiFi万能钥匙亟需完善监控体系,帮助开发运维人员摆脱烦恼,提升应用性能。依据公司的产品形态及业务发展,我们发现监控体系需要解决一系列问题:

◆面对全球多地域海量用户的WiFi连接请求,如何保障用户连接体验?

◆如何通过全链路监控提升用户连接WiFi的成功率?

◆随着微服务大规模推广实施,钥WiFi万能钥匙产品服务端系统越来越复杂,线上故障的发现、定位、处理难度也随之增长,如何通过全链路监控提升故障处理速度?

◆移动出海已经进入深入化发展的下半场,全链路监控如何应对公司全球化的业务发展?

◆……

全链路监控

早期为了快速支撑业务发展,我们主要使用了开源的监控方案保障线上系统的稳定性:Cat、Zabbix,随着业务发展的需要,开源的解决方案已经不能满足我们的业务需求,我们迫切需要构建一套满足我们现状的全链路监控体系:

◆多维度监控(系统监控、业务监控、应用监控、日志搜索、调用链跟踪等)

◆多实例支撑(满足线上应用在单台物理机上部署多个应用实例场景需求等)

◆多语言支撑(满足各团队多开发语言场景的监控支撑,Go、C++、PHP等)

◆多机房支撑(满足国内外多个机房内应用的监控支撑,机房间数据同步等)

◆多渠道报警(满足多渠道报警支撑、内部系统对接,邮件、掌信、短信等)

◆调用链跟踪(满足应用内、应用间调用链跟踪需求,内部中间件升级改造等)

◆统一日志搜索(实现线上应用日志、Nginx日志等集中化日志搜索与管控等)

◆……

监控目标

从“应用”角度我们把监控体系划分为:应用外、应用内、应用间。如下图所示:

vnsc威尼斯城官方网站 1

应用外:主要是从应用所处的运行时环境进行监控(硬件、网络、操作系统等)

应用内:主要从用户请求至应用内部的不同方面(JVM、URL、Method、SQL等)

应用间:主要是从分布式调用链跟踪的视角进行监控(依赖分析、容量规划等)

罗马监控体系的诞生

根据自身的实际需求,WiFi万能钥匙研发团队构建了罗马(Roma)监控体系。之所以将监控体系命名为罗马,原因在于:

1、罗马不是一天成炼的(线上监控目标相关指标需要逐步完善);

2、条条大路通罗马(罗马通过多种数据采集方式收集各监控目标的数据);

3、据神话记载特洛伊之战后部分特洛伊人的后代铸造了古代罗马帝国(一个故事的延续、一个新项目的诞生)。

一个完美的监控体系会涵盖IT领域内方方面面的监控目标,从目前国内外各互联网公司的监控发展来看,很多公司把不同的监控目标划分了不同的研发团队进行处理,但这样做会带来一些问题:人力资源浪费、系统重复建设、数据资产不统一、全链路监控实施困难。目前,各公司在监控领域采用的各解决方案,如下图所示:

vnsc威尼斯城官方网站 2

正如图中所示,罗马监控体系希望能够汲取各方优秀的架构设计理念,融合不同的监控维度实现监控体系的“一体化”、“全链路”等。

高可用架构之道

面对每天40多亿次的WiFi连接请求,每次请求都会经历内部数十个微服务系统,每个微服务的监控维度又都会涉及应用外、应用内、应用间等多个监控指标,目前罗马监控体系每天需要处理近千亿次指标数据、近百TB日志数据。面对海量的监控数据罗马(Roma)如何应对处理?接下来,笔者带大家从系统架构设计的角度逐一进行剖析。

架构原则

一个监控系统对于接入使用方应用而言,需要满足如下图中所示的五点:

• 性能影响:对业务系统的性能影响最小化(CPU、Load、Memory、IO等)

• 低侵入性:方便业务系统接入使用(无需编码或极少编码即可实现系统接入)

• 无内部依赖:不依赖公司内部核心系统(避免被依赖系统故障导致相互依赖)

• 单元化部署:监控系统需要支撑单元化部署(支持多机房单元化部署)

• 数据集中化:监控数据集中化处理、分析、存储等(便于数据统计等)

整体架构

Roma系统架构如下图所示:

vnsc威尼斯城官方网站 3

Roma架构中各个组件的功能职责、用途说明如下:

vnsc威尼斯城官方网站 4

Roma整体架构中划分了不同的处理环节:数据采集、数据传输、数据同步、数据分析、数据存储、数据质量、数据展示等,数据流处理的不同阶段主要使用到的技术栈如下图所示:

vnsc威尼斯城官方网站 5

数据采集

对于应用内监控主要是通过client客户端同所在机器上的agent建立TCP长连接的方式处理,agent同时也需要具备通过脚本调度的方式获取系统性能指标数据。

vnsc威尼斯城官方网站 6

面对海量的监控指标数据,罗马监控通过在各层中预聚合的方式进行汇总计算,比如在客户端中相同URL请求的指标数据在一分钟内汇总计算后统计结果为一条记录(分钟内相同请求进行累加计算,通过占用极少内存、减少数据传输量),对于一个接入并使用罗马的系统,完全可以根据其实例数、指标维度、采集频率等进行监控数据规模的统计计算。通过各层分级预聚合,减少了海量数据在网络中的数据传输,减少了数据存储成本,节省了网络带宽资源和磁盘存储空间等。

应用内监控的实现原理(如下图所示):主要是通过客户端采集,在应用内部的各个层面进行拦截统计:
URL、Method、Exception、SQL等不同维度的指标数据。

vnsc威尼斯城官方网站 7

应用内监控各维度指标数据采集过程如下图所示:针对不同的监控维度定义了不同的计数器,最终通过JMX规范进行数据采集。

vnsc威尼斯城官方网站 8

数据传输

数据传输TLV协议,支持二进制、JSON、XML等多种类型。

vnsc威尼斯城官方网站 9

每台机器上都会部署agent(同客户端建立TCP长连接),agent的主要职责是数据转发、数据采集(日志文件读取、系统监控指标获取等),agent在获取到性能指标数据后会发送至kafka集群,在每个机房都会独立部署kafka集群用于监控指标数据的发送缓冲,便于后端的节点进行数据消费、数据存储等。

为了实现数据的高效传输,我们对比分析了消息处理的压缩方式,最终选择了高压缩比的GZIP方式,主要是为了节省网络带宽、避免由于监控的海量数据占用机房内的网络带宽。针对各个节点间数据通信的时序图如下图所示:建立连接->读取配置->采集调度->上报数据等。

vnsc威尼斯城官方网站 10

数据同步

海外运营商众多,公网覆盖质量参差不齐,再加上运营商互联策略的不同,付出的代价将是高时延、高丢包的网络质量,钥匙产品走向海外过程中,首先会对整体网络质量情况有正确的预期,比如如果需要对于海外机房内的应用进行监控则依赖于在海外建立站点(主机房)、海外主站同国内主站进行互联互通,另外需要对监控指标数据分级处理,比如对于实时、准实时、离线等不同需求的指标数据采集时进行归类划分(控制不同需求、不同数据规模等指标数据进行采样策略的调整)

由于各产品线应用部署在多个机房,为了满足各个应用在多个机房内都可以被监控的需求,罗马监控平台需要支持多机房内应用监控的场景,为了避免罗马各组件在各个机房内重复部署,同时便于监控指标数据的统一存储、统一分析等,各个机房内的监控指标数据最终会同步至主机房内,最终在主机房内进行数据分析、数据存储等。

为了实现多机房间数据同步,我们主要是利用kafka跨数据中心部署的高可用方案,整体部署示意图如下图所示:

vnsc威尼斯城官方网站 11

在对比分析了MirrorMaker、uReplicator后,我们决定基于uReplicator进行二次开发,主要是因为当MirrorMaker节点发生故障时,数据复制延迟较大,对于动态添加topic则需要重启进程,黑白名单管理完全静态等。虽然uReplicator针对MirrorMaker进行了大量优化,但在我们的大量测试之后仍遇到众多问题,我们需要具备动态管理MirrorMaker进程的能力,同时我们也不希望每次都重启MirrorMaker进程。

数据存储

为了应对不同监控指标数据的存储需求,我们主要使用了HBase、OpenTSDB、Elasticsearch等数据存储框架。

vnsc威尼斯城官方网站 12

数据存储我们踩过了很多的坑,总结下来主要有以下几点:


集群划分:依据各产品线应用的数据规模,合理划分线上存储资源,比如我们的ES集群是按照产品线、核心系统、数据大小等进行规划切分;

• 性能优化:Linux系统层优化、TCP优化、存储参数优化等;


数据操作:数据批量入库(避免单条记录保存),例如针对HBase数据存储可以通过在客户端进行数据缓存、批量提交、避免客户端同RegionServer频繁建立连接(减少RPC请求次数)

数据质量

我们的系统在持续不断地产生非常多的事件、服务间的链路消息和应用日志,这些数据在得到处理之前需要经过Kafka。那么,我们的平台是如何实时地对这些数据进行审计呢?

为了监控Kafka数据管道的健康状况并对流经Kafka的每个消息进行审计,我们调研并分析了Uber开源的审计系统Chaperone,在经过各种测试之后,我们决定自研来实现需求,主要是因为我们希望具备任意节点任意代码块内的数据审计需求,同时需要结合我们自己的数据管道特点,设计和实现达成一系列目标:数据完整性与时延;数据质量监控需要近实时;数据产生问题时便于快速定位(提供诊断信息帮助解决问题);监控与审计本身高度可信;监控平台服务高可用、超稳定等;

为了满足以上目标,数据质量审计系统的实现原理:把审计数据按照时间窗口聚合,统计一定时间段内的数据量,并尽早准确地检测出数据的丢失、延迟和重复情况。同时有相应的逻辑处理去重,晚到以及非顺序到来的数据,同时做各种容错处理保证高可用。

数据展示

为了实现监控指标的数据可视化,我们自研了前端数据可视化项目,同时我们也整合了外部第三方开源的数据可视化组件(grafana、kibana),在整合的过程中我们遇到的问题:权限控制问题(内部系统SSO整合)主要是通过自研的权限代理系统解决、去除kibana官方提供的相关插件、完善并自研了ES集群监控插件等。

核心功能及落地实践

系统监控

我们的系统监控主要使用了OpenTSDB作为数据存储、Grafana作为数据展示,TSDB数据存储层我们通过读写分离的方式减轻存储层的压力,TSDB同Grafana整合的过程中我们也遇到了数据分组展示的问题(海量指标数据下查询出分组字段值,通过建立独立的指标项进行数据查询),如下图某机器系统监控效果:

vnsc威尼斯城官方网站 13

应用监控

针对各个Java应用,我们提供了不同的监控类型用于应用内指标数据的度量。

vnsc威尼斯城官方网站 14

业务监控

针对业务监控,我们可以通过编码埋点、日志输出、HTTP接口等不同的方式进行业务监控指标采集,同时支持多维度数据报表展示,如下图所示:

vnsc威尼斯城官方网站 15

我们的业务监控通过自助化的方式让各应用方便捷的接入,如下图监控项定义:

vnsc威尼斯城官方网站 16

日志搜索

为了支撑好研发人员线上排查故障,我们开发了统一日志搜索平台,便于研发人员在海量日志中定位问题。

vnsc威尼斯城官方网站 17

未来展望

随着IT新兴技术的迅猛发展,罗马监控体系未来的演进之路:

• 多语言支撑:满足多语言的监控需求(性能监控、业务监控、日志搜索等)

• 智能化监控:提高报警及时性、准确性等避免报警风暴(ITOA、AIOps)

• 容器化监控:随着容器化技术的验证落地实施,容器化监控开启布局;

总结

罗马(Roma)是一个能够对应用进行深度监控的全链路监控平台,主要涵盖了应用外、应用内、应用间等不同维度的监控目标,例如应用监控、业务监控、系统监控、中间件监控、统一日志搜索、调用链跟踪等。能够帮助开发者进行快速故障诊断、性能瓶颈定位、架构梳理、依赖分析、容量评估等工作。

笔者自2016年加入WiFi万能钥匙,现任WiFi万能钥匙高级架构师,拥有10年互联网…

【摘要】:以UNIX为背景开发的Linux,是目前相当流行的一种操作系统.Linux内核具有较高的实时性,随着实时监控具体要求的日益增加,Linux实时监控系统得到迅速发展,也正是为了满足这些监控需求,大量的实用性监控系统先后出现,并为人们的生产生活提供便利.本文首先介绍了Linux以及它的优点,然后阐述了Linux实时监控系统和实现该系统的基本原理,最后分析了基于Linux的适时监控系统的具体应用和实现.

计算机网络技术的日益发展和普及,为信息共享提供了一条全球性的高速通道,但目前采用的TCP/IP协议族潜在着安全漏洞,其安全机制并不健全,如何保护企业内部网络中的资源及信息不受外部攻击者肆意破坏或盗窃,是企业网络安全需要解决的重要问题。当我们担心被黑客攻击或怀疑电脑被植入木马时,我们往往求助于防火墙,本系统即通过实时监控全部TCP连接的方法来实现防黑客攻击。同时网络管理人员在整个网络运行期间,能否实时监控联网计算机的运行状态和操作对网络安全具有极其重要的作用.下面就以Visual
Basic 6.0作为开发工具讲述两个主要模块的设计和实现。

人生苦短,我用Python~
界内的Python宣传标语,对Python而言,这是种标榜,实际上,Python确实是当下最好用的开发语言之一。

【51CTO.com原创稿件】笔者自2016年加入WiFi万能钥匙,现任WiFi万能钥匙高级架构师,拥有10年互联网研发经验,喜欢折腾技术。主要专注于:分布式监控平台、调用链跟踪平台、统一日志平台、应用性能管理、稳定性保障体系建设等领域。

【作者单位】: 福州大学阳光学院;福建省科学技术信息研究所;

  系统概述

在相继学习了C++/C#/Java之后,接触Python,最一开始突然一片茫然,似乎是进入了新世界,所有C家族的语法,在这里都或多或少地发生了改变,方法没有大括号,喜闻乐见的格式。定义变量不需要声明,时间长了,竟爱上了这个简介明了,高效快捷的语言,当然,也是当下开发语言界内的宠儿,不可否认,Python是当下最流行的开发语言了。

在本文中,笔者将与大家分享一下在实时监控领域的一些实战经验,介绍WiFi万能钥匙是如何构建APM端到端的全链路监控平台,从而实现提升故障发现率、缩短故障处理周期、减少用户投诉率、树立公司良好品牌形象等目标。

【关键词】: Linux 实时监控系统 实现

  该系统由两个子系统组成:服务器端系统和客户端(工作站)系统。服务器端系统安装在网络管理人员的计算机上,用于实施各种对联网计算机的监控操作;客户端系统安装在每台联网的计算机上,它运行后以图标的方式出现在系统任务栏的提示区中,不影响工作站的其他操作,只用于响应服务器端的监控命令,并根据服务的需要,及时采样工作站的相应数据返回给服务器端。该系统的运行环境可以运行于Win98、Win95或WinNT、Win2000下。在系统的开发中,引入了WINSOCK通讯控件,除此之外,为较好地实现各项监控操作,还用到了几个API函数。

【前言】

本文拟使用Python开发语言实现在任何能链接上互联网的地方,远程启动在其他地方部署的监控系统,并且实时地进行图像连拍,将实时图像以邮件形式反馈到手机邮箱,达到远程实时监控的目的。

WiFi万能钥匙开发运维团队的困扰

【分类号】:TP316.81

  系统功能

【实现功能】

这篇文章将要介绍的主要内容如下:

1、远程发送监控命令

2、监控系统做出相应,进行图像连拍(或者是录制一段视频)

3、监控系统将处理结果以邮件形式发送到移动端

始于盛大创新院的WiFi万能钥匙,截至到2016年底,我们总用户量已突破9亿、月活跃达5.2亿,用户分布在全球223个国家和地区,在全球可连接热点4亿,日均连接次数超过40亿次。

【正文快照】:

  1、监控全部TCP连接:实时监控所有服务器端口的连接情况、及时对异常连接发出警告并提示用户删除异常连接;

【实现思路】

远程向某邮箱服务器发送一封邮件,监控系统循环检测此邮箱最新接受的邮件,通过获取并分析邮件的信息确定是否需要执行监控功能操作。如果需要,做出响应,拍照并且将拍照结果反馈回邮件发送方。

随着日活跃用户大规模的增长,WiFi万能钥匙各产品线服务端团队正进行着一场无硝烟的战争。越来越多的应用服务面临着流量激增、架构扩展、性能瓶颈等问题。为了应对并支撑业务的高速发展,我们迈入了SOA、Microservice、API
Gateway等组件化及服务化的时代。

Linux操作系统具有灵活稳定、成本低、实时性、伸缩性能好等特性,非常适于开发嵌入式系统,因此嵌入式Linux系统发展迅速,Linux实时监控系统也得到不断突破和实现.嵌入式系统的优势特性使其渗透到很多领域,为我们的生产发展提供了重要操作手段,同时也推动了计算机网络的安全发发展提供了重要操作手段。同时也推动了计算机网络的安全发展.如今国民经济的各个领域都能找到Linux实时监控系统的影子,大到工业企业生产的实时监测,小到我们常见的环境监测等.Linux实时监控系统的实现方式多种多样,不同的监控系统有不同的监控要求,Linux都能以其强大的功能不断实现.
, 

  2、屏幕监控:该功能允许服务器随时把被监控工作站的屏幕画面抓取到服务器中,网络管理人员对相应工作站所进行的操作一目了然,若发现有非法操作即可采取发送警告或强制措施,强迫其停止相应操作;

【所需技术】

1、Python语言的熟练掌握,Python版本2.7

2、利用Python语言,实现SMTP协议以及POP3协议。已达到发送邮件和接收邮件的功能。

3、正则表达式的简单使用

4、OpenCV 图像处理,图像识别,跨平台开发库的使用

5、邮箱服务器SMTP,POP3协议的开通

伴随着各系统微服务化的演进,服务数量、机器规模不断增长,线上环境也变得日益复杂,工程师们每天都会面临着诸多苦恼。例如:线上应用出现故障问题时无法第一时间感知;面对线上应用产生的海量日志,排查故障问题时一筹莫展;应用系统内部及系统间的调用链路产生故障问题时难以定位等等。

Linux 实时监控系统的实现 PDF版免费下载地址:

  3、对工作站进行锁机、关机、限制鼠标活动等;

【实现过程】

1、实现Python发送接收邮件代码,最后封装成Email_Helper_DG类,便于后续调用,当然本文的Python_Helper_DG还没有达到更高层次的封装,毕竟要发送图片的,适当做了一些对本系统的适应。

邮件发送接受的Email_Helper_DG代码如下:

  1 # -*- coding: UTF-8 -*-
  2 import os
  3 import poplib
  4 import smtplib
  5 from email.mime.application import MIMEApplication
  6 from email.mime.audio import MIMEAudio
  7 from email.mime.image import MIMEImage
  8 from email.mime.multipart import MIMEMultipart
  9 from email.mime.text import MIMEText
 10 from email.utils import formataddr
 11 
 12 
 13 class Mail_Helper_DG:
 14     my_smtp_server = 'smtp.sina.com'  # smtp 邮件服务地址
 15     my_pop3_server = 'pop.sina.com'  # pop3 邮件服务地址
 16     mail_type = 'html'  # 发送的邮件的格式,HTML或者Plain
 17     my_account = '******@example.com'  # 发件人邮箱账号
 18     my_pwd = '******'  # 发件人邮箱密码
 19     toAddressArray = ['xxxxx@example.com', ]  # 收件人的邮箱,可发送给多人
 20 
 21     def __init__(self):
 22         pass
 23 
 24     # 发送邮件
 25     def SendMail(self, toAddressArray, senderName, subject, content):
 26         try:
 27             server = smtplib.SMTP(self.my_smtp_server, 25)  # 发件人邮箱中的SMTP服务器,端口是25
 28 
 29             try:
 30                 msg = MIMEText(content, self.mail_type, 'utf-8')
 31                 msg['From'] = formataddr([senderName, self.my_account])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
 32                 # msg['To'] = formataddr(["FK", my_account])  # 括号里的对应收件人邮箱昵称、收件人邮箱账号
 33                 msg['Subject'] = subject  # 邮件的主题,也可以说是标题
 34 
 35                 server.login(self.my_account, self.my_pwd)  # 括号中对应的是发件人邮箱账号、邮箱密码
 36                 server.sendmail(self.my_account, toAddressArray, msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
 37             except Exception:
 38                 print(Exception)
 39                 return False
 40             finally:
 41                 server.quit()  # 关闭连接
 42             return True
 43         except Exception:
 44             print(Exception)
 45             return False
 46 
 47     # 发送邮件带附件
 48     def SendMailAttachment(self, toAddressArray, senderName, subject, content, attachment_path):
 49         try:
 50             server = smtplib.SMTP(self.my_smtp_server, 25)  # 发件人邮箱中的SMTP服务器,端口是25
 51 
 52             try:
 53                 server.login(self.my_account, self.my_pwd)  # 括号中对应的是发件人邮箱账号、邮箱密码
 54 
 55                 msg = MIMEMultipart()  # create MIMEMultipart
 56                 msg['From'] = formataddr([senderName, self.my_account])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
 57                 # msg['To'] = formataddr(["FK", my_account])  # 括号里的对应收件人邮箱昵称、收件人邮箱账号
 58                 msg['Subject'] = subject  # 邮件的主题,也可以说是标题
 59                 content2 = MIMEText(content,
 60                                     _charset='utf-8')  # add email content  ,coding is gbk, becasue chinese exist
 61                 msg.attach(content2)
 62                 for attachment_name in os.listdir(attachment_path):
 63                     attachment_file = os.path.join(attachment_path, attachment_name)
 64 
 65                     with open(attachment_file, 'rb') as attachment:
 66                         if 'application' == 'text':
 67                             attachment = MIMEText(attachment.read(), _subtype='octet-stream', _charset='GB2312')
 68                         elif 'application' == 'image':
 69                             attachment = MIMEImage(attachment.read(), _subtype='octet-stream')
 70                         elif 'application' == 'audio':
 71                             attachment = MIMEAudio(attachment.read(), _subtype='octet-stream')
 72                         else:
 73                             attachment = MIMEApplication(attachment.read(), _subtype='octet-stream')
 74 
 75                     attachment.add_header('Content-Disposition', 'attachment', filename=('gbk', '', attachment_name))
 76                     # make sure "attachment_name is chinese" right
 77                     msg.attach(attachment)
 78 
 79                 server.sendmail(self.my_account, toAddressArray, msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
 80             except Exception:
 81                 print(Exception)
 82                 return False
 83             finally:
 84                 server.quit()  # 关闭连接
 85             return True
 86         except Exception:
 87             print(Exception)
 88             return
 89 
 90     # 接收邮件
 91     def ReceiveMail(self):
 92         # 创建一个pop3对象,这个时候实际上已经连接上服务器了
 93         pp = poplib.POP3(self.my_pop3_server)
 94         # 设置调试模式,可以看到与服务器的交互信息
 95         pp.set_debuglevel(1)
 96         # 向服务器发送用户名
 97         pp.user(self.my_account)
 98         # 向服务器发送密码
 99         pp.pass_(self.my_pwd)
100         # 返回邮箱的状态,返回2元祖(消息的数量,消息的总字节)
101         # msgCount, msgSize = pp.stat()
102 
103         ret = pp.list()
104 
105         mailBody = pp.retr(len(ret[1]))
106         # 释放pp
107         pp.quit()
108 
109         return mailBody

2、主要业务逻辑代码,其中包含对POP3邮箱的实时监测,且对捕获到的命令进行分析判断,最后做出响应:

 1 # -*- coding: UTF-8 -*-
 2 import re
 3 import time
 4 import cv2
 5 
 6 from Email import Mail_Helper_DG
 7 
 8 toAddressArray = ['wd8622088@foxmail.com']  # 收件人的邮箱,可发送给多人
 9 
10 content = """
11 当前摄像头捕获的结果:
12 """
13 
14 
15 # 获取当前时间
16 def getCurrentTime():
17     return str(time.strftime('’%Y-%m-%d %X’', time.localtime(time.time())))
18 
19 
20 # 程序启动标识
21 print('QiXiao`s SHS Starting ...')
22 # 初始化邮件发送类
23 mail = Mail_Helper_DG()
24 
25 # 声明一个变量,来作为一个标记判断是否已经检测过当前这封邮件了
26 last_receiveMailDate = ''
27 # 输出显示当前扫描邮箱服务器的次数
28 scan_index = 0
29 # 设置一个循环检测邮箱的方法
30 while True:
31     time.sleep(10)  # 设置检测邮箱服务器的时间间隔
32     print(getCurrentTime() + ' : scan item >>> ' + str(scan_index))
33     scan_index += 1  # 扫描次数累加
34     try:
35         # 通过Pop3 获取到邮件的第一条
36         mailBody = mail.ReceiveMail()
37 
38         # 解析第一条邮件,并得到发件人,主题,日期
39         sender = re.search("X-Sender: (.*?)'.", str(mailBody[1]).decode(('utf-8')), re.S).group(1)
40         subject = re.search("Subject: (.*?)'.", str(mailBody[1]).decode(('utf-8')), re.S).group(1)
41         date = re.search("Date: (.*?)'.", str(mailBody[1]).decode(('utf-8')), re.S).group(1)
42 
43         # 判断解析到的参数值
44         if date != last_receiveMailDate:
45             # 对发送方进行邮箱判断,否则任何人都可以发送命令,你懂得
46             if sender == 'wd8622088@foxmail.com':
47                 # 对命令进行分析
48                 if subject.__contains__('qx_cmd:'):
49                     cmd = subject.split(':')[1]
50                     # 按cmd的命令来匹配要执行的操作:
51                     # catch-camera 捕获摄像头的操作
52                     if cmd == 'catch-camera':
53                         # 载入图像,连续捕获数张图片,间隔三秒
54                         video = cv2.VideoCapture(0)
55                         time.sleep(3)
56                         ret, img = video.read()
57                         cv2.imwrite('files\\shoot_001.jpg', img)
58 
59                         time.sleep(3)
60                         ret, img = video.read()
61                         cv2.imwrite('files\\shoot_002.jpg', img)
62 
63                         time.sleep(3)
64                         ret, img = video.read()
65                         cv2.imwrite('files\\shoot_003.jpg', img)
66 
67                         video.release()  # 关闭摄像头
68                         result = mail.SendMailAttachment(toAddressArray, "QiXiao",
69                                                          "QiXiao`s SHS (QiXiao`s Smart Home System v1.0)", content,
70                                                          "files")
71                         if result is True:
72                             print(getCurrentTime() + ' : send mail success !')
73                         else:
74                             print(getCurrentTime() + ' : send fail #')
75 
76                     # 让当前这条信息的日期赋值给标记变量,以便下次略过当前这条信息
77                     last_receiveMailDate = date
78     except Exception:
79         print(getCurrentTime() + 'Error:' + Exception)

至于代码逻辑的分析,代码内部已有适当的注释进行讲解,这里不再赘述,如有任何疑问,请留言,本人进行一一回复。

综上所述,线上应用的性能问题和异常错误已经成为困扰开发人员和运维人员最大的挑战,而排查这类问题往往需要几个小时甚至几天的时间,严重影响了效率和业务发展。WiFi万能钥匙亟需完善监控体系,帮助开发运维人员摆脱烦恼,提升应用性能。依据公司的产品形态及业务发展,我们发现监控体系需要解决一系列问题:

免费下载地址在

  4、服务器和工作站之间的信息互送。

【系统测试】

首先我们启动我们的服务器,让代码跑起来。

 

每隔一段时间,服务器就会自动请求一次POP3服务器,判断是否有新的命令输入。

然后我们在任何地点进行邮件命令的发送:这里以Ios自带的Mail来进行邮件的发送(邮件客户端无所谓,微信里的也可以)

我们首先要填写好要发送的邮箱地址,以及主题(这里是约定好的执行命令)

vnsc威尼斯城官方网站 18

填写好后,点击发送。

vnsc威尼斯城官方网站 19

可以看到在0:00发送了一条邮件,这就是我们刚才发送的邮件。然后打开收件箱,准备进行邮件的查收。

vnsc威尼斯城官方网站 20

我们可以看到,两分钟后,服务端以邮件形式返回监控的结果。打开邮箱进行查看。

vnsc威尼斯城官方网站 21vnsc威尼斯城官方网站 22

我们可以看到,摄像头正对的部位被成功捕获,并且反馈到我们发送邮件的邮箱中。

通过这样的方式,我们可以在全球任意位置,向邮箱发送邮件,只要存在网络的地方,都可以实时对任意位置部署的摄像头进行监控,实时返回监控结果。

我们打开我们的接收命令的邮箱查看一下我们接受到的邮件:

vnsc威尼斯城官方网站 23

没错,是我们刚才发送的邮件。

我们程序文件目录下保存的截取图片:

vnsc威尼斯城官方网站 24

至此,我们的远程监控系统已经测试完毕,可见,完美达到了预期的效果!

◆面对全球多地域海量用户的WiFi连接请求,如何保障用户连接体验?

用户名与密码都是www.linuxidc.com

  功能的实现

【系统展望】

系统虽然功能已经实现,然还有很多不尽人意之处,未来将在第二版进行改进的有:

1、系统每隔一定时间间隔自动进行拍照,然后图像分析是否有区别(有物体入侵),如果有立即发送邮件推送报警信息。

2、对图片进行人脸识别,用方框圈出人连范围,以便增加提醒。

3、系统将搭建于Raspberry Pi
Linux微机系统上,并且配备摄像头全天候进行跟踪拍摄。

4、未来可能搭建web服务,在网站或者App上进行此功能的使用

◆如何通过全链路监控提升用户连接WiFi的成功率?

具体下载目录在 /2013年资料/4月/28日/Linux 实时监控系统的实现 PDF

  1、监控全部TCP连接

◆随着微服务大规模推广实施,钥WiFi万能钥匙产品服务端系统越来越复杂,线上故障的发现、定位、处理难度也随之增长,如何通过全链路监控提升故障处理速度?

vnsc威尼斯城官方网站 25

  TCP/IP(Transmission Control Protocol/Internet
Protocol:传输控制协议/互联网协议)是一个包括TCP、IP、
UDP、ARP、RARP和ICMP等在内的网络协议集。TCP/IP经常被称为“将Internet绑定在一起的粘合剂”,它允许在空间上分离的多个信息网络连接在一起形成一个巨大的虚拟网络。TCP和UDP(用户数据报协议)是两个最常用的数据传输协议,它们都使用设置监听端口的方法来完成数据传输。

◆移动出海已经进入深入化发展的下半场,全链路监控如何应对公司全球化的业务发展?

  在本文中讨论TCP连接。通过使用TCP,
Internet客户机可以打开到另一个Internet客户机的虚拟连接并传送数据流。与UDP不同,TCP协议通过重传丢失的数据报保证传输的可靠性。它也保证在接收端的应用程序按发送的顺序将接收到的位和字节重新组装起来以获取完整的数据。
  要获得与服务器系统中全部有效的TCP连接,用到GetTcpTable这个API函数,它定义如下:

◆……

Private Declare Function GetTcpTable Lib "iphlpapi.
dll" (ByRef pTcpTable As MIB_TCPTABLE, ByRef
pdwSize As Long, ByVal bOrder As Long) As Long

全链路监控

  其中参数pPcpTable是已生成的
TCP连接表缓冲区的指针,参数pdwsize是缓冲区大小(当缓冲区不够大时,该参数返回实际需要的大小),参数bOrder指示连接表是否需要按“Local
IP”、“Localport”、“Remote IP”、“Remote
port”依次进行排序,1为按此顺序。

早期为了快速支撑业务发展,我们主要使用了开源的监控方案保障线上系统的稳定性:Cat、Zabbix,随着业务发展的需要,开源的解决方案已经不能满足我们的业务需求,我们迫切需要构建一套满足我们现状的全链路监控体系:

  通过一个TIMEER控件的TIMER的事件来比较前后两个TCP连接表,我们可以立即发现异常并发出警告。本系统用声音和报警标志提醒用户注意可能的外界入侵。收到警告信号后,我们应首先将可疑连接删除掉,SetTcpEntry函数可以帮助我们删除可疑连接。其定义为:

◆多维度监控(系统监控、业务监控、应用监控、日志搜索、调用链跟踪等)

Private Declare Function SetTcpEntry Lib "iphlpapi.
dll" (ByRef pTcpTable As MIB_TCPROW) As Long

◆多实例支撑(满足线上应用在单台物理机上部署多个应用实例场景需求等)

  其中参数pTcptable为指向tcp表行的指针。然后将欲删连接的状态置为MIB_TCP_STATE_DELETE_TCB(值为12)即可删除该连接。

◆多语言支撑(满足各团队多开发语言场景的监控支撑,Go、C++、PHP等)

  TIMER事件源代码:

◆多机房支撑(满足国内外多个机房内应用的监控支撑,机房间数据同步等)

Private Sub Timer1_Timer()
 Dim Return1 As Long, i As Long
 Dim Tmp1 As Long, Tmp2 As Long
 Dim Ip_Buf(1 To 4) As Byte
 Dim Win_Path As String, TMP3 As String
 Return1 = GetTcpTable(TCP1, Len(TCP1), 1)
 If Last_Num_Of_Entries <> 0 And _
   Last_Num_Of_Entries <> TCP1.dwNum_Of_Entries Then
  异常时发出警告
  Picture1.Visible = True   警告标志
  On Error Resume Next
  Win_Path = String(145, 0)
  利用API函数GetWindowsDirectory获得当前系统目录
  i = GetWindowsDirectory(Win_Path, 145)
  Win_Path = Left(Win_Path, i)
  利用API函数sndPlaySound发出报警声音
  i = sndPlaySound(Win_Path + "MediaDing.wav", &H1)
  On Error GoTo 0
 Else
  If Picture1.Visible = True Then
   Picture1.Visible = False
  End If
 End If
 Last_Num_Of_Entries = TCP1.dwNum_Of_Entries
 Select Case Return1
  Case 0&:
   Text1 = "": Combo1.Clear
   For i = 0 To TCP1.dwNum_Of_Entries – 1
    Tmp3 = Str(i + 1) + " "
    Select Case TCP1.TCP_Table(i).dwState
      显示连接状态
    Case 1: Tmp3 = Tmp3 + "CLOSED"
    Case 2: Tmp3 = Tmp3 + "LISTENING"
    Case 3: Tmp3 = Tmp3 + "SYN_SENT"
    Case 4: Tmp3 = Tmp3 + "SYN_RCVD"
    Case 5: Tmp3 = Tmp3 + "ESTABLISHED"
    Case 6: Tmp3 = Tmp3 + "FIN_WAIT1"
    Case 7: Tmp3 = Tmp3 + "FIN_WAIT2"
    Case 8: Tmp3 = Tmp3 + "CLOSE_WAIT"
    Case 9: Tmp3 = Tmp3 + "CLOSING"
    Case 10: Tmp3 = Tmp3 + "LAST_ACK"
    Case 11: Tmp3 = Tmp3 + "TIME_WAIT"
    Case 12: Tmp3 = Tmp3 + "DELETE_TCB"
    End Select
    Combo1.AddItem Tmp3 填充列表以供用户删除
     本地IP
    Tmp3 = Tmp3 + ":" + VBCrLf + vbTab + "Local: "
    CopyMemory为API函数
    CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwLocalAddr, 4
    Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + _
CStr(Ip_Buf(2)) + "."+ CStr(Ip_Buf(3)) _
+"." + CStr(Ip_Buf(4))
    Tmp1 = TCP1.TCP_Table(i).dwLocalPort
     本地端口
    Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256
     远程IP
    Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbTab + "Remote: "
    CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwRemoteAddr, 4
    Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) _
+ "."+ CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))
     远程端口
    Tmp1 = TCP1.TCP_Table(i).dwRemotePort
    Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256
    Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbCrLf
    Text1 = Text1 + Tmp3
   Next i
  Case 50&:
   MsgBox "系统不支持该API函数": End
  Case 87:
   MsgBox "无效的参数": End
  Case 111&:
   MsgBox "缓冲区溢出": End
  Case 232&:
   MsgBox "无数据": End
  End Select
End Sub

◆多渠道报警(满足多渠道报警支撑、内部系统对接,邮件、掌信、短信等)

  用于删除连接的CLICK事件源代码:

◆调用链跟踪(满足应用内、应用间调用链跟踪需求,内部中间件升级改造等)

Private Sub delete_Click()
 Dim Return1 As Long
 If Combo1.ListIndex < 0 Then Exit Sub
  将欲删连接的状态置为值为12
 TCP1.TCP_Table(Combo1.ListIndex).dwState = 12  
  执行删除
 Return1 = SetTcpEntry(TCP1.TCP_Table(Combo1.ListIndex))
 If Return1 = 0 Then
  MsgBox "删除成功"
 Else
  MsgBox "删除失败"
 End If
 Timer1_Timer
End Sub

◆统一日志搜索(实现线上应用日志、Nginx日志等集中化日志搜索与管控等)

 

◆……

2、屏幕监控

监控目标

  当服务器系统发现TCP异常连接时,可通过屏幕监控功能将局域网中被监控工作站的屏幕画面抓取到服务器中并实施相应措施,如对工作站锁机或关机等。此处用到WINSOCK控件,其通讯原理请参阅相关资料,屏幕监控功能用到TCP协议,为了达到更好的效果,可在窗体中加入TIMER控件,设定TIMER事件。

从“应用”角度我们把监控体系划分为:应用外、应用内、应用间。如下图所示:

  (1) 工作站端 

vnsc威尼斯城官方网站 26

  侦听并响应服务器端发出的连接请求和屏幕抓取。其中屏幕抓取功能可通过API函数实现:

应用外:主要是从应用所处的运行时环境进行监控(硬件、网络、操作系统等)

Dim a As String
Winsock1.GetData a

应用内:主要从用户请求至应用内部的不同方面(JVM、URL、Method、SQL等)

应用间:主要是从分布式调用链跟踪的视角进行监控(依赖分析、容量规划等)

罗马监控体系的诞生

根据自身的实际需求,WiFi万能钥匙研发团队构建了罗马(Roma)监控体系。之所以将监控体系命名为罗马,原因在于:

1、罗马不是一天成炼的(线上监控目标相关指标需要逐步完善);

2、条条大路通罗马(罗马通过多种数据采集方式收集各监控目标的数据);

3、据神话记载特洛伊之战后部分特洛伊人的后代铸造了古代罗马帝国(一个故事的延续、一个新项目的诞生)。

一个完美的监控体系会涵盖IT领域内方方面面的监控目标,从目前国内外各互联网公司的监控发展来看,很多公司把不同的监控目标划分了不同的研发团队进行处理,但这样做会带来一些问题:人力资源浪费、系统重复建设、数据资产不统一、全链路监控实施困难。目前,各公司在监控领域采用的各解决方案,如下图所示:

vnsc威尼斯城官方网站 27

正如图中所示,罗马监控体系希望能够汲取各方优秀的架构设计理念,融合不同的监控维度实现监控体系的“一体化”、“全链路”等。

高可用架构之道

面对每天40多亿次的WiFi连接请求,每次请求都会经历内部数十个微服务系统,每个微服务的监控维度又都会涉及应用外、应用内、应用间等多个监控指标,目前罗马监控体系每天需要处理近千亿次指标数据、近百TB日志数据。面对海量的监控数据罗马(Roma)如何应对处理?接下来,笔者带大家从系统架构设计的角度逐一进行剖析。

架构原则

一个监控系统对于接入使用方应用而言,需要满足如下图中所示的五点:

• 性能影响:对业务系统的性能影响最小化(CPU、Load、Memory、IO等)

• 低侵入性:方便业务系统接入使用(无需编码或极少编码即可实现系统接入)

• 无内部依赖:不依赖公司内部核心系统(避免被依赖系统故障导致相互依赖)

• 单元化部署:监控系统需要支撑单元化部署(支持多机房单元化部署)

• 数据集中化:监控数据集中化处理、分析、存储等(便于数据统计等)

整体架构

Roma系统架构如下图所示:

vnsc威尼斯城官方网站 28

Roma架构中各个组件的功能职责、用途说明如下:

vnsc威尼斯城官方网站 29

Roma整体架构中划分了不同的处理环节:数据采集、数据传输、数据同步、数据分析、数据存储、数据质量、数据展示等,数据流处理的不同阶段主要使用到的技术栈如下图所示:

vnsc威尼斯城官方网站 30

数据采集

对于应用内监控主要是通过client客户端同所在机器上的agent建立TCP长连接的方式处理,agent同时也需要具备通过脚本调度的方式获取系统性能指标数据。

vnsc威尼斯城官方网站 31

面对海量的监控指标数据,罗马监控通过在各层中预聚合的方式进行汇总计算,比如在客户端中相同URL请求的指标数据在一分钟内汇总计算后统计结果为一条记录(分钟内相同请求进行累加计算,通过占用极少内存、减少数据传输量),对于一个接入并使用罗马的系统,完全可以根据其实例数、指标维度、采集频率等进行监控数据规模的统计计算。通过各层分级预聚合,减少了海量数据在网络中的数据传输,减少了数据存储成本,节省了网络带宽资源和磁盘存储空间等。

应用内监控的实现原理(如下图所示):主要是通过客户端采集,在应用内部的各个层面进行拦截统计:
URL、Method、Exception、SQL等不同维度的指标数据。

vnsc威尼斯城官方网站 32

应用内监控各维度指标数据采集过程如下图所示:针对不同的监控维度定义了不同的计数器,最终通过JMX规范进行数据采集。

vnsc威尼斯城官方网站 33

数据传输

数据传输TLV协议,支持二进制、JSON、XML等多种类型。

vnsc威尼斯城官方网站 34

每台机器上都会部署agent(同客户端建立TCP长连接),agent的主要职责是数据转发、数据采集(日志文件读取、系统监控指标获取等),agent在获取到性能指标数据后会发送至kafka集群,在每个机房都会独立部署kafka集群用于监控指标数据的发送缓冲,便于后端的节点进行数据消费、数据存储等。

为了实现数据的高效传输,我们对比分析了消息处理的压缩方式,最终选择了高压缩比的GZIP方式,主要是为了节省网络带宽、避免由于监控的海量数据占用机房内的网络带宽。针对各个节点间数据通信的时序图如下图所示:建立连接->读取配置->采集调度->上报数据等。

vnsc威尼斯城官方网站 35

数据同步

海外运营商众多,公网覆盖质量参差不齐,再加上运营商互联策略的不同,付出的代价将是高时延、高丢包的网络质量,钥匙产品走向海外过程中,首先会对整体网络质量情况有正确的预期,比如如果需要对于海外机房内的应用进行监控则依赖于在海外建立站点(主机房)、海外主站同国内主站进行互联互通,另外需要对监控指标数据分级处理,比如对于实时、准实时、离线等不同需求的指标数据采集时进行归类划分(控制不同需求、不同数据规模等指标数据进行采样策略的调整)

由于各产品线应用部署在多个机房,为了满足各个应用在多个机房内都可以被监控的需求,罗马监控平台需要支持多机房内应用监控的场景,为了避免罗马各组件在各个机房内重复部署,同时便于监控指标数据的统一存储、统一分析等,各个机房内的监控指标数据最终会同步至主机房内,最终在主机房内进行数据分析、数据存储等。

为了实现多机房间数据同步,我们主要是利用kafka跨数据中心部署的高可用方案,整体部署示意图如下图所示:

vnsc威尼斯城官方网站 36

在对比分析了MirrorMaker、uReplicator后,我们决定基于uReplicator进行二次开发,主要是因为当MirrorMaker节点发生故障时,数据复制延迟较大,对于动态添加topic则需要重启进程,黑白名单管理完全静态等。虽然uReplicator针对MirrorMaker进行了大量优化,但在我们的大量测试之后仍遇到众多问题,我们需要具备动态管理MirrorMaker进程的能力,同时我们也不希望每次都重启MirrorMaker进程。

数据存储

为了应对不同监控指标数据的存储需求,我们主要使用了HBase、OpenTSDB、Elasticsearch等数据存储框架。

vnsc威尼斯城官方网站 37

数据存储我们踩过了很多的坑,总结下来主要有以下几点:


集群划分:依据各产品线应用的数据规模,合理划分线上存储资源,比如我们的ES集群是按照产品线、核心系统、数据大小等进行规划切分;

• 性能优化:Linux系统层优化、TCP优化、存储参数优化等;


数据操作:数据批量入库(避免单条记录保存),例如针对HBase数据存储可以通过在客户端进行数据缓存、批量提交、避免客户端同RegionServer频繁建立连接(减少RPC请求次数)

数据质量

我们的系统在持续不断地产生非常多的事件、服务间的链路消息和应用日志,这些数据在得到处理之前需要经过Kafka。那么,我们的平台是如何实时地对这些数据进行审计呢?

为了监控Kafka数据管道的健康状况并对流经Kafka的每个消息进行审计,我们调研并分析了Uber开源的审计系统Chaperone,在经过各种测试之后,我们决定自研来实现需求,主要是因为我们希望具备任意节点任意代码块内的数据审计需求,同时需要结合我们自己的数据管道特点,设计和实现达成一系列目标:数据完整性与时延;数据质量监控需要近实时;数据产生问题时便于快速定位(提供诊断信息帮助解决问题);监控与审计本身高度可信;监控平台服务高可用、超稳定等;

为了满足以上目标,数据质量审计系统的实现原理:把审计数据按照时间窗口聚合,统计一定时间段内的数据量,并尽早准确地检测出数据的丢失、延迟和重复情况。同时有相应的逻辑处理去重,晚到以及非顺序到来的数据,同时做各种容错处理保证高可用。

数据展示

为了实现监控指标的数据可视化,我们自研了前端数据可视化项目,同时我们也整合了外部第三方开源的数据可视化组件(grafana、kibana),在整合的过程中我们遇到的问题:权限控制问题(内部系统SSO整合)主要是通过自研的权限代理系统解决、去除kibana官方提供的相关插件、完善并自研了ES集群监控插件等。

核心功能及落地实践

系统监控

我们的系统监控主要使用了OpenTSDB作为数据存储、Grafana作为数据展示,TSDB数据存储层我们通过读写分离的方式减轻存储层的压力,TSDB同Grafana整合的过程中我们也遇到了数据分组展示的问题(海量指标数据下查询出分组字段值,通过建立独立的指标项进行数据查询),如下图某机器系统监控效果:

vnsc威尼斯城官方网站 38

应用监控

针对各个Java应用,我们提供了不同的监控类型用于应用内指标数据的度量。

vnsc威尼斯城官方网站 39

业务监控

针对业务监控,我们可以通过编码埋点、日志输出、HTTP接口等不同的方式进行业务监控指标采集,同时支持多维度数据报表展示,如下图所示:

vnsc威尼斯城官方网站 40

我们的业务监控通过自助化的方式让各应用方便捷的接入,如下图监控项定义:

vnsc威尼斯城官方网站 41

日志搜索

为了支撑好研发人员线上排查故障,我们开发了统一日志搜索平台,便于研发人员在海量日志中定位问题。

vnsc威尼斯城官方网站 42

未来展望

随着IT新兴技术的迅猛发展,罗马监控体系未来的演进之路:

• 多语言支撑:满足多语言的监控需求(性能监控、业务监控、日志搜索等)

• 智能化监控:提高报警及时性、准确性等避免报警风暴(ITOA、AIOps)

• 容器化监控:随着容器化技术的验证落地实施,容器化监控开启布局;

总结

罗马(Roma)是一个能够对应用进行深度监控的全链路监控平台,主要涵盖了应用外、应用内、应用间等不同维度的监控目标,例如应用监控、业务监控、系统监控、中间件监控、统一日志搜索、调用链跟踪等。能够帮助开发者进行快速故障诊断、性能瓶颈定位、架构梳理、依赖分析、容量评估等工作。

【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】

【编辑推荐】

相关文章