NeuTracer 教程
主页
  • 背景介绍
  • 项目架构
  • 数据收集
  • 服务端
  • 异常检测
项目测试
主页
  • 背景介绍
  • 项目架构
  • 数据收集
  • 服务端
  • 异常检测
项目测试
  • 详细介绍

    • 背景介绍
    • 项目架构
    • 数据收集
    • 服务端
    • 异常检测

分布式追踪数据传输协议

tracer_service.proto 定义了 NeuTracer 框架中用于跨系统传输性能追踪数据的 gRPC 协议。该协议支持多种系统资源监控数据的批量传输,包括函数调用、CPU、内存、网络、IO 和 GPU 使用情况。协议采用 Protocol Buffers 进行数据序列化,比 JSON 更高效,通过字段编号确保版本兼容性,支持双向通信,适合实时监控场景,可以生成多种语言的客户端和服务端代码。

协议定义了六种主要的跟踪数据类型,每种类型对应系统的不同维度。TraceData 记录函数调用的入口和出口事件,包含函数名、时间戳、调用计数和平均执行时间。CPUTraceData 监控进程在 CPU 上的运行情况,记录 CPU 利用率、运行/等待时间。MemoryTraceData 跟踪内存分配和释放活动。NetworkTraceData 监控网络连接和数据传输,统计流量和识别突发行为。IOTraceData 记录磁盘读写操作,监测 I/O 延迟和吞吐量。GPUTraceData 提供简洁的 GPU 活动记录,包含时间戳和堆栈信息。

message TraceBatch {
  repeated TraceData trace_data = 1;
  repeated GPUTraceData gpu_trace_data = 2;
  repeated CPUTraceData cpu_trace_data = 3;
  repeated MemoryTraceData memory_trace_data = 4;
  repeated NetworkTraceData network_trace_data = 5;
  repeated IOTraceData io_trace_data = 6;
}

service TracerService {
  rpc SendTraceBatch(TraceBatch) returns (TraceResponse);
  rpc GetStatus(StatusRequest) returns (StatusResponse);
}

协议定义了两个主要的 RPC 服务:SendTraceBatch 用于发送批量追踪数据到服务器,GetStatus 用于查询服务器状态,包括是否活跃和已接收的追踪数量。

协议通过 Protocol Buffers 编译器生成了 Python 客户端/服务端代码,tracer_service_pb2.py 包含消息类型定义,tracer_service_pb2_grpc.py 包含客户端存根和服务实现接口。该协议主要应用于分布式系统监控跨多台机器收集性能数据,中央节点将分散的监控数据集中处理和分析,为前端可视化工具提供结构化数据。 这是python端与协议对应的数据结构TracerServicer的定义:

# TracerServicer 核心实现
class TracerServicer(trace_pb2_grpc.TraceServiceServicer):
    def __init__(self):
        self.processors = {
            'function': FunctionTraceProcessor(),
            'cpu': CPUTraceProcessor(),
            'memory': MemTraceProcessor(),
            'network': NetworkTraceProcessor(),
            'io': IOTraceProcessor(),
            'gpu': GPUTraceProcessor()
        }
    
    def SendTraces(self, request, context):
        trace_type = self.detect_trace_type(request)
        processor = self.processors[trace_type]
        processor.process_traces(request.traces)
        return trace_pb2.TraceResponse(success=True)