在日常系统运行过程中,故障总是不期而遇。一旦出现故障通常是查监控,翻各种日志,从大量的日志中寻找蛛丝马迹。如果问题现场的日志记录缺失,会尝试在本地重现问题并调试解决,本地难以重现的,只能再加日志,再部署,再重现,然后再查日志,效率较低。对于复杂一些的比如程序性能问题,如何定位性能瓶颈,一不小心又要回到加日志、部署、查日志、再加日志的老路,不仅效率不高,也破坏了问题现场。
所以针对以上问题,我们的目标是建立一个Java应用在线诊断平台,让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面对应用进行诊断,提升开发人员诊断问题的效率和能力。
我们期望有一套架构,让开发人员以Web UI的方式使用各类在线诊断能力。

架构概览
浏览器是开发人员进行在线诊断的入口,tunnel server通过Web UI的方式提供在线诊断能力,支持复杂的交互场景。
提供两个方面的功能,分别是:
浏览器通过http与tunnel server的12201端口进行交互;
连接指定IP的arthas agent机器、断开指定IP的arthas agent机器、查看指定IP的arthas agent生成的文件。
浏览器通过websocket与tunnel server的12202端口进行交互;
支持各种arthas诊断指令:dashboard、heapdump、thread、vmtool等。
arthas agent作为websocket客户端与tunnel server的12202端口进行交互;
arthas agent通过attach应用进程实现对应用进程的诊断。

核心流程
流程说明:
1.1 tunnel server 监听12201端口,该端口用于展示Web UI
1.2 tunnel server监听12202端口,该端口用于与浏览器进行websocket交互,也用于与arthas agent进行websocket交互
1.3 应用程序通过引入arthas pom依赖,在应用部署的时候将arthas安装包安装到服务器上
2.1 通过在浏览器上访问:
http://tunner_server_ip:12201,打开Web UI
2.2 在Web UI上输入要诊断的服务器IP,点击Connect,建立与tunner server 12202端口的websocket连接,发送请求为:
ws://tunner_server_ip:12202/ws?method=connectArthas&id=服务器IP
2.3 tunner server根据服务器IP获取与arthas agent的control connection
2.4 如果control connection没有建立,则通过访问
http://arthas_agent_IP:12230?tunnerserver=ws://tunner_server_ip:12202/ws,触发arthas agent初始化、attach应用进程。
2.5 arthas agent创建与tunner server的websocket连接:
此时创建的websocket连接称为:control connection。
2.6 control connection已创建成功,则向arthas agent tunnel client发送:response:/?method=startTunnel&id=服务器IP&clientCnotallow=connectionIDxxx,请求建立连接;
arthas agent tunnel client收到startTunnel请求后,新建与tunnel server的连接,并发送:ws://tunner_server_ip:12202/ws/?method=openTunnel&clientCnotallow=connectionIDxxx&id=服务器IP
此时创建的websocket连接称为:tunnel connection;
同时创建与arthas agent的本地连接:ws://127.0.0.1:3658/ws,此时创建的连接称为:local connection
3.13.2 执行诊断命令链路如下:

交互逻辑
arthas本身提供了tunner server功能,我们主要需要解决的有两个问题:
将arthas打包进操作系统镜像中,保证新初始化的ECS实例中含有最新版本的arthas;对于已经存在的ECS实例则需要想办法进行arthas版本更新。
第2.2步骤当对指定服务器进行诊断的时候,在tunnel server或其他旁路系统通过ssh方式将arthas安装包拷贝的指定服务器。
在应用进程初始化的时候,加载自定义的javaagent,该javaagent实现下载、解压arthas的功能。
第2.2步骤当对指定服务器进行诊断的时候,tunnel server或其他旁路系统通过与指定服务器javaagent通讯,通过javaagent完成arthas下载、解压。
应用通过引入arthas pom,将arthas打包进应用部署包中。
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-agent-attach</artifactId>
<version>3.6.7</version>
</dependency>
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-packaging</artifactId>
<version>3.6.7</version>
</dependency>在应用工程中新建一个Controller,该Controller实现arthas agent初始化功能。
tunnel server通过现有的Web Server访问Controller接口触发arthas agent初始化。
注意:
创建独立的HTTP Server,主要是为了使得tunnel server能够访问新监听的端口,解决【复用Web Server】端口面临的两个问题。
注意:
根据应用使用的RPC框架,新建对应的RPC Provider,tunnel server直接调用指定IP的RPC Provider完成arthas agent的初始化。该方式的好处是不用新开放监听端口。
注意:
tunnel server作为MQ Producer发送报文(报文中包含指定服务器的IP)到MQ Broker,应用中新建MQ Consumer消费tunnel server的报文,如果报文中IP与本机一致则处理,不一致则丢弃。
思路与【通过MQ】一致,按照apollo等配置中心相关API进行实现。
思路与【通过MQ】一致,按照Redis相关通讯机制进行实现。
tunner server或旁路系统有权限直接ssh指定服务器,通过脚本方式触发arthas agent初始化。
在AgentId的文本框里输入要诊断的服务器IP,稍等一会就可以进行诊断了。

web console

dashboard
thread示例

thread
monitor示例

monitor
JVM options示例

jvm options

console
terminal与tunner server UI基本一致,不同的是该terminal是直接访问的目标服务器。
以上方案只是简单的应用,期望以后可以不断的迭代优化。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt