至顶网--博睿数据建立“服务可达的数据链DNA” 打通从代码到用户的“任督二脉

2022-08-05

最近,有家深耕APM(应用性能管理)领域十几年的企业抛出了一个全新概念——服务可达的数据链DNA。没错,这家企业就是博睿数据,相信很多业内人士并不陌生,博睿数据成立于2008年,是一家APM技术的领导厂商,专注于利用数据赋能IT运维,助力企业数字化转型。而就在去年8月份,博睿数据正式在上海证交所科创板完成上市。在Gartner《中国AIOps市场指南报告》中,博睿数据也是国内唯一一家同时具备强大APM背景和强大数据分析AI(人工智能)能力的厂商。


在阐述“服务可达的数据链DNA”概念时,博睿数据COO吴静涛表示,“相较以往AIOps智能运维概念,服务可达的数据链DNA有着更加先进的含义,其可以打通从代码到用户访问的全过程,形成一种创新的应用管理模型。”


从“应用可用”到“服务可达”

说到“服务可达”,就不得不从吴静涛自己多年想做但又没敢做的一件事说起,就是建立一个新的IT指标体系。最初IT是以计算为中心来构建的,主要体现为IBM大型主机为核心的数据中心。而在过去的20年里,整个IT体系逐渐开始以应用为中心进行构建,包括整个数据中心、运维体系、客服中心都是这样的建设体系,而在这样的体系下也出现了非常多的指标体系,如银行系统提出的RTO时间必须低于半小时,以及IT领域提出的5个9的网络高可用,数据中心、应用等等众多“5个9”指标体系。


这么多的指标体系,其实都在强调以应用为中心,突出的也仍然是应用本身的高可用和应用的高性能。直到今天众多的IT领域依然在围绕这样的指标体系逻辑去进行构建。而博睿数据最新提出的“服务可达”理念,实际上就是要把这种“以应用为中心”的IT指标体系转移到“以用户为中心”的一条新的IT指标体系的路径上。


事实上,从“应用”到“用户”虽然只有几字之差,但两者之间的逻辑关系却有着天壤之别。用吴静涛的话讲,“从应用可用到服务可达,实际上完全转化了角度,一个是最终客户端的角度,一个是企业的角度。其实就是从围绕应用的高可用到围绕用户的服务可达的一种转变。”


在以应用为中心的体系下,经常会出现一种十分尴尬的情况,就是当用户业务访问不通时,找到IT厂商解决问题,厂商的人检查自己的系统发现没有问题,并向用户展示系统都是满足5个9的应用高可用环境的指标,让用户可以放心使用。


但这种以应用为中心的指标逻辑对于解决用户实际问题显然毫无意义。而博睿数据提出的以用户为中心去构建一套全新的指标体系,并把用户作为核心去做系统性能的提升的思路可谓是独树一帜。而从应用可用到服务可达,也将成为博睿数据未来几年中要重点发力的市场方向。

建立从代码到用户的“服务可达的数据链DNA”

那么,如何才能真正建立起一套以用户为中心的新IT指标体系,并以这个指标体系作为提升方式,将用户的业务应用性能进行优化呢?


吴静涛表示,“博睿数据真正拥有这部分的能力,能够把从代码到用户的全过程打通,把应用的每一个环节所相关的状况全都抓取出来,所以我们叫数据链的DNA。”


众所周知,企业应用的代码到用户之间存在很多环节, 比如客户端多样化、最后一公里、边缘计算CDN、多云性能、PaaS、代码/SQL调用等, 任何一个环节出现问题带来的都是用户体验的下降, 随之而来的客户投诉、携号转网、携款转户等企业最不愿听到看到的负面现象就会相继发生。


全数据链监控服务可达DNA架构

为此,吴静涛指出,在这种情况下,成熟的应用性能管理工具将是企业客户的最佳选择。因此,博睿数据提出了服务可达的数据链DNA,所谓DNA,就是DEM(数字体验监控)+NPM(网络性能管理)+APM(应用性能管理),通过这三大技术来实现从代码到用户之间全过程的应用、体验管理与优化:


1. DEM:用户端的数字体验管理, 包含客户端APP监控, 浏览器监控, 小程序监控和浏览器拨测/手机真机拨测等一系列技术。


2. NPM:网络性能管理, 通过网络探针、 BigIP大数据引擎、Nginx Telemetry等技术, 实现网络传输的全路径监控。


3. APM:应用性能管理, 通过字节码注入和微服务探针, 在没有应用代码变更的情况下实现对代码运行效率, SQL调用效率, PaaS API调用逻辑追踪, 以及微服务的性能监控。


换句话说,当把应用的每行代码及数据库的调动效率等因素组合在一起,通过DNA技术就能够从用户端发起访问开始,到后台的每一行代码的执行效率,从头到尾一目了然。一旦出现用户体验下降等问题,系统就会在第一时间发现问题来源,并给出相应策略或告警。把以往需要以小时,甚至以天计算的排障时间提升到分钟级甚至秒级的程度。


如何真正打通数据链的DNA

由于DEM、NPM、APM三种技术所应用的业务层面和技术逻辑都不相同,因此将三者结合到一起说起来容易,但做起来并不简单。这也是为什么国内目前只有博睿数据一家提出了结合DNA三种技术的整体解决方案,其实现难度可见一斑。


对此,博睿数据创始人兼CTO孟曦东也给出了自己的理解,“要真正实现这三种技术的结合,首先就要知道数据的相互关联与依赖关系,要把整个数据链打通,相当于人的一次行为,不管是通过什么方式,比如从网络到数据中心,从数据中心到任何一台服务器,再从服务器到任何一行代码去运行,需要完全串在一起。第一这条链路很长,第二链路数量众多,每个人或每台设备都要建立一套关系,所以需要强大的计算引擎和代码的支撑。”


同时,孟曦东还强调,这些数据被全部梳理出来之后,博睿数据还具备一个强大的工具叫DataView,这就相当于一个真实的大脑,能够把所有数据换算成知识或者信息,而不是只把数据摆在那里。然后再利用这些信息去做DEM、NPM、APM三者之间的进一步联动。而这个动作实际上是十分复杂的,因为不能保证客户所采用的DEM、NPM、APM三种技术都是同一厂商的产品。另外,客户可能还有一些原有数据也要考虑进来,加上博睿数据所提供的相关数据,以及第三方数据,所有的数据和信息要实现关联,并保证相互调用的准确性。


此外,吴静涛指出,当服务可达的数据链DNA实现后,再把代码到用户访问全过程的采集Telemetry数据整合到大数据平台DataView, 可以实现对VIP用户访问的全站溯源。还可以实现机器学习后的智能基线,智能警报。如果再继续通过AI实现根因分析,还能够提出解决建议,甚至通过API调用验证过的预配置,实现一键变更,一键割接。而最终将帮助企业用户在保证稳定可靠业务的同时,实现平台和云原生平台、信创平台、微服务平台的可靠性和性能的整体提升。


试想一下,这样一套以用户为中心的全新“服务可达的数据链DNA”方案一旦成熟应用,用户再出现业务问题时,客服人员以及后方的技术维护人员将多么气定神闲,客服再也不用因为不能及时迅速的解决用户问题而不断听用户投诉,而后方技术人员也可以更加自如的发现并解决问题。


其实,这也正是博睿数据提出“服务可达的数据链DNA”的初衷与核心价值所在,即帮助企业客户发现具体用户体验提升、API调用效率提升,以及代码运行效率提升之间的相互关联关系,在客户投诉前发现和处理可用性风险,避免一级事故,并降低事故级别。


最后,吴静涛表示,“博睿数据要做的就是通过打通数据链的DNA,帮助客户实现从应用可用到服务可达的过渡,并建立起以用户为中心的服务可达能力的监控和评估体系,通过数据链的DNA等方式及手段,从代码到用户的全过程去发现应用问题所在,从而提升客户的自动化运维能力,并提升最终用户的应用体验。”


文章标签

应用性能监控 网络性能监控

相关文章

FreeMarker template error (DEBUG mode; use RETHROW in production!): The string doesn't match the expected date/time/date-time format. The string to parse was: "2024年3月5日". The expected format was: "MMM d, y". The nested reason given follows: Unparseable date: "2024年3月5日" ---- FTL stack trace ("~" means nesting-related): - Failed at: #if "2024年3月5日"?date lt item.createTi... [in template "themes/halo_quickstarter/post_newsDetail.ftl" at line 106, column 25] ---- Java stack trace (for programmers): ---- freemarker.core._TemplateModelException: [... Exception message was already printed; see it above ...] at freemarker.core.BuiltInsForMultipleTypes$dateBI$DateParser.parse(BuiltInsForMultipleTypes.java:220) at freemarker.core.BuiltInsForMultipleTypes$dateBI$DateParser.getAsDateModel(BuiltInsForMultipleTypes.java:190) at freemarker.core.BuiltInsForMultipleTypes$dateBI$DateParser.getAsDate(BuiltInsForMultipleTypes.java:197) at freemarker.core.EvalUtil.modelToDate(EvalUtil.java:86) at freemarker.core.EvalUtil.compare(EvalUtil.java:270) at freemarker.core.EvalUtil.compare(EvalUtil.java:115) at freemarker.core.ComparisonExpression.evalToBoolean(ComparisonExpression.java:78) at freemarker.core.IfBlock.accept(IfBlock.java:49) at freemarker.core.Environment.visit(Environment.java:370) at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:321) at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244) at freemarker.core.Environment.visitIteratorBlock(Environment.java:644) at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) at freemarker.core.Environment.visit(Environment.java:334) at freemarker.core.Environment.visit(Environment.java:340) at freemarker.core.Environment.visit(Environment.java:340) at freemarker.core.Environment.process(Environment.java:313) at freemarker.template.Template.process(Template.java:383) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:391) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:304) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:255) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:179) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1401) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:497) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:584) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1631) at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:230) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.cas.UserInfoFilter.doFilter(UserInfoFilter.java:37) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.jasig.cas.client.util.AssertionThreadLocalFilter.doFilter(AssertionThreadLocalFilter.java:54) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.jasig.cas.client.util.HttpServletRequestWrapperFilter.doFilter(HttpServletRequestWrapperFilter.java:75) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.cas.MyAbstractTicketValidationFilter.doFilter(MyAbstractTicketValidationFilter.java:215) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.cas.MyAuthenticationNoLoginFilter.doFilter(MyAuthenticationNoLoginFilter.java:57) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:102) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:102) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.security.filter.ContentFilter.doAuthenticate(ContentFilter.java:69) at run.halo.app.security.filter.AbstractAuthenticationFilter.doFilterInternal(AbstractAuthenticationFilter.java:229) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.filter.CorsFilter.doFilter(CorsFilter.java:53) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.filter.LogFilter.doFilterInternal(LogFilter.java:40) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:516) at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: freemarker.core.UnparsableValueException: Unparseable date: "2024年3月5日" at freemarker.core.JavaTemplateDateFormat.parse(JavaTemplateDateFormat.java:51) at freemarker.core.JavaTemplateDateFormat.parse(JavaTemplateDateFormat.java:33) at freemarker.core.BuiltInsForMultipleTypes$dateBI$DateParser.parse(BuiltInsForMultipleTypes.java:213) ... 118 more Caused by: java.text.ParseException: Unparseable date: "2024年3月5日" at java.base/java.text.DateFormat.parse(DateFormat.java:395) at freemarker.core.JavaTemplateDateFormat.parse(JavaTemplateDateFormat.java:49) ... 120 more