腾讯云可观测平台 gRPC 监控(功能配置)

该功能通过手动添加拦截器,实现对 gRPC 微服务的性能监控,覆盖请求生命周期各阶段(启动、消息收发、关闭),支持自定义指标注入与协议级性能分析,助力精准定位网络延迟、流式异常及业务逻辑问题。

相关产品
腾讯云可观测平台 产品页,含版本规格、价格与购买入口。

一、前提条件

iOS 项目已集成 QAPM 5.4.9+。

二、基础集成(快速接入)

1. 下载 QAPMMonitorClientInterceptor 文件。

2. 将 QAPMMonitorClientInterceptor.swift 文件添加到 Xcode 工程。

3. 创建拦截器工厂。

import Foundationimport GRPCimport 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。

赞 (0)
上一篇 5天前
下一篇 5天前