gRPC 监控

最近更新时间:2025-06-20 15:35:11

我的收藏
该功能通过手动添加拦截器,实现对 gRPC 微服务的性能监控,覆盖请求生命周期各阶段(启动、消息收发、关闭),支持自定义指标注入与协议级性能分析,助力精准定位网络延迟、流式异常及业务逻辑问题。
注意:
该功能随原生网络监控功能一并开启,否则无法生效。
可运行 demo 工程,选择 gRPC 页面进行该功能的测试上报。

前提条件

iOS 项目已集成 QAPM 5.4.9+。

基础集成(快速接入)

1. 下载 QAPMMonitorClientInterceptor 文件。
2. 将 QAPMMonitorClientInterceptor.swift 文件添加到 Xcode 工程。
3. 创建拦截器工厂。
import Foundation
import GRPC
import Logging

// 假设GreeterClientInterceptorFactoryProtocol、HelloRequest、HelloResponse 是通过业务工程的hello.proto生成的协议
final class QAPMInterceptorFactory: GreeterClientInterceptorFactoryProtocol, @unchecked Sendable {
func makeSayHelloInterceptors() -> [ClientInterceptor<HelloRequest, HelloResponse>] {
let interceptor = QAPMMonitorClientInterceptor<HelloRequest, HelloResponse>()
return [interceptor]
}
}
4. 新建 GrpcModels+QAPM.swift 文件,实现协议拓展。
//假设上述已经实现了HelloRequest、HelloResponse
extension HelloRequest: QAPMGRPCDataProtocol {
public var gRPCRequestData: Data? {
return try? self.serializedData()
}
}
extension HelloResponse: QAPMGRPCDataProtocol {
public var gRPCRequestData: Data? {
return try? self.serializedData()
}
}
5. 创建 gRPC 客户端。
final class SyncGreeterClient {
private let group: EventLoopGroup
private let client: GreeterNIOClient
init(host: String, port: Int) throws {
self.group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let interceptorFactory = QAPMInterceptorFactory()
let channel = try GRPCChannelPool.with(
target: .host(host, port: port),
transportSecurity: .plaintext,
eventLoopGroup: group
)
self.client = GreeterNIOClient(
channel: channel,
interceptors: interceptorFactory
)
}
}

高阶配置(定制化监控)

如果当前拦截器采集的数据不能满足您的业务需求,您可以使用自定义回调接口上报更多的数据,调用方式如下:
final class QAPMInterceptorFactory: GreeterClientInterceptorFactoryProtocol, @unchecked Sendable {
// onStart、sendMessage、onMessage、onClose 通过回调接口注入业务特定数据,可选配置
private var onStart: ((inout QAPMGrpcMeta) -> Void)?
private var sendMessage: ((inout QAPMGrpcMeta) -> Void)?
private var onMessage: ((inout QAPMGrpcMeta) -> Void)?
private var onClose: ((inout QAPMGrpcMeta) -> Void)?
init(
onStart: ((inout QAPMGrpcMeta) -> Void)? = nil,
sendMessage: ((inout QAPMGrpcMeta) -> Void)? = nil,
onMessage: ((inout QAPMGrpcMeta) -> Void)? = nil,
onClose: ((inout QAPMGrpcMeta) -> Void)? = nil
) {
self.onStart = onStart
self.sendMessage = sendMessage
self.onMessage = onMessage
self.onClose = onClose
}
func makeSayHelloInterceptors() -> [ClientInterceptor<HelloRequest, HelloResponse>] {
let interceptor = QAPMMonitorClientInterceptor<HelloRequest, HelloResponse>()
interceptor.onStart = onStart
interceptor.sendMessage = sendMessage
interceptor.onMessage = onMessage
interceptor.onClose = onClose
return [interceptor]
}
}
实现上述接口,我们会在5个不同的时机分别回调。
回调方法
回调时机
onStart
接口开始执行
sendMessage
每次发送消息的时候
onMessage
每次接受消息的时候
onClose
请求结束的时候
uv & ud 字段详解。
字段类型
命名规则
数据类型
数量限制
典型应用场景
uv
uv1 ~ uv10
Int
10个
分段耗时等,主要用于指标的聚合
ud
ud1~ud5
String
5个
地区、服务端 IP 等,主要用于日志上下文的展示
使用示例。
let factory = QAPMInterceptorFactory(
onStart: { meta in
meta.ud1 = UUID().uuidString
},
sendMessage: { meta in
meta.uv1 = Int(Date().timeIntervalSince1970 * 1000)
},
onClose: { meta in
meta.ud2 = "server.ip"
meta.ud3 = "region"
meta.uv2 = Int(Date().timeIntervalSince1970 * 1000)
}
)

校验功能是否正常

gRPC 监控数据聚合上报,每1min上报一次,如打印以下日志,则代表原生网络监控数据上报成功。
检索 Plugin:42,且 protocol 对应的 value 为 grpc。