作者:竞霄
监控能力作为基础运维能力和核心稳定性措施,开发运维人员可以通过监控系统有效进行故障定位,预防潜在风险,分析长期趋势进行容量规划和性能调优,是软件开发生命周期中必不可少的一环。与此同时,Serverless 作为云计算的最佳实践和未来演进趋势,其全托管免运维的使用体验和按量付费的成本优势,使得其在云原生时代备受推崇,在下一个十年将成为云厂商提供的核心能力。随着 Serverless 的心智普及度越来越高,场景覆盖度越来越广,更多使用 PHP, Python,C/C++, Node.Js, Golang 等语言的用户开始进行 Serverless 架构升级。

对于这部分用户来说,传统的应用监控方案存在以下痛点:
●建设成本高:需部署一整套监控系统,包括数据采集,指标传输,持久化存储,可视化展示,告警等模块,增加了额外的资源成本和人力成本。
●埋点强入侵:需评估各语言,各框架,各接口的监控指标诉求,引入三方依赖进行繁琐地手动埋点。虽然对于 PHP, Python 等语言,已经有借助对象(模块)替换增强的技术实现无需修改的指标采集,但其能力成熟度,框架兼容性,运行稳定性等方面都还有进一步提升的空间。
●运维复杂:用户需要确保整个监控链路的低延时,高可用和指标准确性,需要对比分析引入监控埋点后对原有应用性能上的影响并持续优化。
Serverless 产品需要提供一种统一的,开箱即用的,无入侵零改造的方式来实现任意语言的应用监控能力,使得多语言用户可以充分享受 Serverless 带来的普惠技术红利。下面我们首先对其背后使用的 eBPF(Extended Berkeley Packet Filter) 技术进行介绍。
eBPF 全称为 Extended Berkeley Packet Filter,始于 Linux 3.18,是一项革命性的 Linux 内核技术。eBPF 提供了基于系统或程序事件的高效,安全,无入侵执行特定代码的通用能力。在 eBPF 诞生之前,由于用户态与系统态相互隔离,应用程序无法直接处理内核数据,而如果直接修改内核又具备相当的复杂性,每次开发或调试都需要重新编译,效率十分低下,安全性也无法保证。
eBPF 作为一个运行在内核中的虚拟机,允许开发人员直接提交 eBPF 程序,在不修改内核代码的情况下运行特定的功能。eBPF 程序基于事件驱动模型,当内核运行到特定 hook 点时会触发执行,预定义的 hook 点包括系统调用、函数进入/退出、内核 tracepoints、网络事件等。对于不存在的 hook 点也可以通过 KProbe,UProbe 进行动态埋点,提供内核态和用户态函数的追踪能力。借助丰富的 hook 点,eBPF 技术可被广泛应用于包括网络监控、安全过滤和性能分析等诸多场景。

eBPF 的工作流程如下图所示,首先通过在用户空间内使用 LLVM 或者 GCC 将编写好的 eBPF 程序编译成为字节码,然后借助系统调用 bpf 将其加载至内核中。eBPF 虚拟机将使用验证器对字节码进行安全性校验,如只能使用受限的 helper 辅助函数,有限的循环次数和执行时间,DAG 判断是否存在不可达代码等,避免其造成内核崩溃。
安全校验后 eBPF 字节码将通过即时编译器(JIT,Just-In-Time Compiler)编译成为原生机器码,提供近乎内核本地代码的执行效率,并挂载到具体的 hook 点上。用户态程序与 eBPF 程序间通过常驻内存的 eBPF Map 结构进行双向通信,每当特定的事件发生时,eBPF 程序可以将采集的统计信息通过 Map 结构传递给上层用户态的应用程序,进行进一步数据处理与分析。

SAE(Serverless 应用引擎)作为业界首款面向应用的 Serverless PaaS 平台,全托管免运维,实现了单体 Web 应用,微服务应用以及定时任务的 Serverless 化。其核心优势之一在于用户可以低心智负担,零改成成本的将其应用/任务直接部署至 SAE 中。目前在 JAVA 生态中,无论是代码包部署,监控调用链的集成,还是分布式调度框架的迁移,都可以让用户无需改动任何业务逻辑和版本依赖的情况下使用。

基于 eBPF 技术,SAE 应用监控支持了针对任意语言,任意框架的无入侵指标采集与监控告警能力,提供包括应用/实例维度的黄金三指标 RED(请求数,错误数,响应时间)和 HTTP 状态码统计,以及提供服务与依赖服务的接口级别调用信息。借助内置可视化大盘,开发运维人员可以及时评估当前应用对外服务状态,有效识别用户体验、服务中断、业务异常等问题。
SAE 应用监控能力具备以下核心优势:
●免运维:开箱即用,部署即生效,用户无需额外运行维护监控告警组件。
●代码无侵入:无需任何代码埋点,无需任何依赖修改即可获取到丰富的监控数据。
●语言无关:通过内核层进行网络协议解析,支持任意语言,任意框架。
●多协议覆盖:支持对 HTTP,MySQL,Redis,Kafka,DNS 等网络协议,进行指标和链路的监控。
●高性能:通过减少数据在内核态和用户态之间的拷贝,以极低的性能消耗获取指标数据。

技术实现上,SAE 通过将 eBPF 探针以 sidecar 的形式与用户业务程序部署在同一安全容器中,实现了多租隔离。eBPF 程序将会监听 accept/close/read/write/sendto/recvfrom 等系统调用,获取本地及远端地址,线程上下文,文件描述符 fd 等信息,同时关联当前容器实例信息产出原始事件。然后将原始事件的内容发送至用户态程序。用户态程序进行应用层协议识别,解析出协议的关键字段,匹配单条链路的请求和响应,同时经过事件过滤,维度收敛,元信息关联,预聚合等步骤进行数据加工,生成最终指标。最后周期性将采集指标上报至 Arms Promethues 中进行持久化存储。

面向未来,云计算将会全面 Serverless 化,多语言,全生态的支持将会是 Serverless 产品发力的重点,SAE 应用监控能力同样会持续不断的演进和增强,目前已经全面上线了无入侵,多维度,高性能的应用核心指标监控和告警能力,欢迎大家使用。同时在后续的 RoadMap 中,SAE 将会推出全局调用拓扑,服务上下游依赖,调用链路详情等进阶功能,打造更加完善的 Serverless 多语言可观测体系。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我构建了两个需要相互通信和发送文件的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
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
是否可以在应用程序中包含的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
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源