基于 eBPF 的 Serverless 多语言应用监控能力建设
作者:竞霄
监控能力作为基础运维能力和核心稳定性措施,开发运维人员可以通过监控系统有效进行故障定位,预防潜在风险,分析长期趋势进行容量规划和性能调优,是软件开发生命周期中必不可少的一环。与此同时,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 活动、直播,用户最佳实践。
基于 eBPF 的 Serverless 多语言应用监控能力建设的更多相关文章
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
- 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。
快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...
- 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型
前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...
- 深入详解美团点评CAT跨语言服务监控(一) CAT简介与部署
前言: CAT是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,除了与点评RPC组件融合的很好之外,他将会能与Spring.MyBatis.Dubbo 等框架以及Log4j 等结合,支持P ...
- 基于v4l2 ffmpeg x264的视频远程监控(附上编译好的库文件)
说明:主要是基于ghostyu网友整理的< arm mini2440 基于v4l2 ffmpeg x264的视频远程监控>.自己做了一遍,遇到不少问题,就整理记录下来. 1.平台 硬件:a ...
- 基于 HTML5 WebGL 的加油站 3D 可视化监控
前言 随着数字化,工业互联网,物联网的发展,我国加油站正向有人值守,无人操作,远程控制的方向发展,传统的人工巡查方式逐渐转变为以自动化控制为主的在线监控方式,即采用数据采集与监控系统 SCADA.SC ...
- 基于.NET环境,C#语言 实现 TCP NAT
基于.NET平台和C#语言实现TCP NAT穿越 1.<C# WinForm 跨线程访问控件(实用简洁写法)> 2.<基于.NET环境,C#语言 实现 TC ...
- 基于python爬虫的github-exploitdb漏洞库监控与下载
基于python爬虫的github-exploitdb漏洞库监控与下载 offensive.py(爬取项目历史更新内容) #!/usr/bin/env python # -*- coding:utf- ...
- window平台基于influxdb + grafana + jmeter 搭建性能测试实时监控平台
一.influxdb 安装与配置 1.1 influxdb下载并安装 官网无需翻墙,但是下载跳出的界面需要翻墙,我这里提供下载链接:https://dl.influxdata.com/influxdb ...
- vivo 服务端监控体系建设实践
作者:vivo 互联网服务器团队- Chen Ningning 本文根据"2022 vivo开发者大会"现场演讲内容整理而成. 经过几年的平台建设,vivo监控平台产品矩阵日趋完善 ...
随机推荐
- 从物理机到K8S:应用系统部署方式的演进及其影响
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 概述 随着科技的进步,软件系统的部署架构也在不断演进,从以前传统的物理机到虚拟机.Docker和Kubernetes,我们 ...
- 【驱动】串口驱动分析(二)-tty core
前言 tty这个名称源于电传打字节的简称,在linux表示各种终端,终端通常都跟硬件相对应.比如对应于输入设备键盘鼠标,输出设备显示器的控制终端和串口终端.也有对应于不存在设备的pty驱动.在如此众多 ...
- java-图片添加水印
前言: 需求:需要在图片中添加水印,防止盗用 优缺点: 优点:保护版权,防止盗用 缺点 可能会影响图片的视觉效果:如果水印过大或过醒目,可能会影响图片的视觉效果. 可能会增加 ...
- serdes调试常见功能汇总
初始化流程 CORE复位流程 FW手动加载 FW版本自生成(可选) lane复位流程 TX复位流程 RX复位流程 TX,RX使能,disable(可选)关闭数据通道 速率频点配置,CPU模式配置,PL ...
- liunx系统sed命令使用
增 sed '$行数i 新增内容' 文件名在文件里某行上面新增内容 sed '$行数a 新增内容' 文件名在文件里某行下面新增内容 -i.bak对源文件进行修改并备份修改之前源文件 #在文件里第5行上 ...
- Spring整合Quartz简单入门
创建一个Web项目 导入相关jar包 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- 推荐给前端开发的 5 款 Chrome 扩展 🚀
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 工欲善其事,必先利其器.Chrome 可能是前端开发中使用最多的浏览器.在日常开发中,下列几款 Ch ...
- 2018年长沙理工大学第十三届程序设计竞赛 G 题:逃离迷宫
题目链接:https://www.nowcoder.com/acm/contest/96/G 思路:两遍bfs,找到p到k的情况,记录时间:找到E到k的情况,记录时间.题目超时点在于输入需要用scan ...
- .NET开发中合理使用对象映射库,简化和提高工作效率
前言 在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂,庞大的时候还容易出现错误.为了解决这个 ...
- 用Linux搭建网站(LAMP)
安装环境 演示服务器版本为CentOS 8 安装apache 下载apache yum install httpd httpd-devel 启动apache服务器 systemctl start ht ...