随着微服务、云原生、DevOps等技术的发展,应用的开发、部署、迭代效率有了巨大提升。同时,开发者对可观测的要求越来越高,例如需要针对多种语言、多种中间件、动态运行的Kubernetes环境定制观测手段。日志服务与阿里云龙蜥社区合作研发了无侵入监控功能,以开放、高性能、无侵入的内核观测技术为广大云上开发者提供更便捷的可观测方式。
采集原理
Logtail无侵入监控的采集程序工作空间包括Kernel Space与User Space。
Kernel Space用于抓取和预处理数据。
抓取:Kernel Hook模块会根据KProbe的定义,拦截网络数据。用于拦截的KProbe内核函数包括connect、accept、write等。
预处理:预处理模块会根据用户态配置进行数据的拦截、丢弃以及数据协议的推断,只有符合需求的数据才会被传递给SendToUserSpace模块,其他数据将被丢弃。SendToUserSpace模块会通过eBPF Map将符合需求的数据由内核态传输到用户态。
User Space用于分析、聚合和管理数据。
分析:Process模块会不断处理eBPF Map中存储的网络数据。首先由于Kernel Space的预处理模块已推断协议类型,所以Process模块将根据此类型进行细粒度的协议分析,例如分析MySQL协议的SQL、分析HTTP协议的状态码等。其次由于Kernel Space传递的元数据信息只有Pid、FD等进程粒度的元信息,而针对Kubernetes可观测场景,Pod、Container等资源定义更有意义,所以Correlate Meta模块会为Process模块处理后的数据绑定容器相关的元数据信息。
聚合:绑定容器相关的元数据信息后,Aggreate模块会对数据进行聚合操作以避免传输重复的数据。例如聚合周期内调用某SQL语句1000次,Aggreate模块会将最终数据抽象为XSQL:1000的形式进行上传。
管理:整个eBPF程序交互着大量的进程与连接数据,因此eBPF程序中对象的生命周期需要与机器实际状态相符。当进程或连接被释放,相应的对象也需要被释放,这就是Connection Management模块与Garbage Collection模块的职责。
在真实的程序运行环境中,虚拟机或Kubernetes节点存在诸多干扰因素,例如不需要关心的进程、本地的网络调用等,因此Logtail无侵入监控采集功能扩展了多种采集选择能力,支持从用户态控制内核态的采集范围。
特性类型 | 说明 |
协议处理 | 支持开启协议解析。 |
支持选择协议解析范围。 | |
连接过滤 | 支持过滤Unix Socket数据。 |
支持过滤本机交互的进程数据。 | |
主机进程过滤 | 支持通过cmdline正则匹配指定需要监控的进程。 |
支持通过cmdline正则匹配排除不需要监控的进程。 | |
K8s进程过滤 | 支持通过Pod名称正则匹配指定需要监控的Pod容器进程。 |
支持通过Pod名称正则匹配排除不需要监控的Pod容器进程。 | |
支持通过Namespace名称正则匹配指定需要监控的容器进程。 | |
支持通过Namespace名称正则匹配排除不需要监控的容器进程。 | |
支持通过Label标签正则匹配指定需要监控的容器进程。 | |
支持通过Label标签正则匹配排除不需要监控的容器进程。 | |
支持通过环境变量正则匹配指定需要监控的容器进程。 | |
支持通过环境变量正则匹配排除不需要监控的容器进程。 |
分析能力
目前无侵入监控已集成于全栈监控中的Kubernetes监控。此处以基于Kubernetes场景,介绍无侵入监控的分析能力。
分析四层网络流量
在云原生场景下,多语言、多协议的服务导致服务的拓扑关系绘制困难,您无法发现集群的热点流量服务,而通过无侵入监控功能则可顺利实现。例如下图展示了frontend服务的上下游服务,不管服务是直接交互、DNS请求还是外部IP调用,该拓扑图都良好地展示了真实的服务网络流量拓扑,并且您可以针对四层网络进行流量包或流量大小的分析,获取基础层的热点服务与瓶颈信息。
目前无侵入监控功能已支持您在四层网络流量中分析HTTP、Redis、MySQL、DNS、PgSQL等多种应用层传输协议。
分析七层网络流量
四层网络流量往往不足以定位问题,此时您可以通过分析七层网络流量,辅助问题排查。
例如:某个Spring Cloud Restful项目的客户端通常使用HTTP发送数据,服务端使用线程池、阻塞队列模式响应客户端请求,而埋点的位置会导致客户端与服务端的计算消耗时间不一致。当流量过多或前序请求大量阻塞时,后续的请求会发生阻塞,此时传统分析手段下的Time1与Time2可能存在巨大差值,且如果埋点位置仅存在于Service B ,则消耗时间可能始终处于正常状态,整个系统的瓶颈问题将被忽略。
此时您可以使用无侵入监控功能,无论是客户端还是服务端,数据来源都是基于真实的内核层处理网络请求的时间,例如Revc、Write、Sendmsg等内核函数,帮助您了解服务的真实运行状态。
全栈监控应用会自动分析所采集到的无侵入监控数据,并通过统计图表形式展示。例如您开启HTTP协议分析后,全程无需埋点,即可通过统计图表了解客户端与服务端真实的运行状态,如下图所示。
同时无侵入监控也支持监控多种中间件(MySQL、Redis、PgSQL等)。例如基于MySQL客户端调用,分析MySQL调用性能情况,如下图所示。
接入数据
您可以在接入数据时,开启无侵入监控功能。目前,无侵入监控功能支持接入Kubernetes数据面监控数据。具体操作,请参见接入Kubernetes数据面监控数据。