golang并发原语 golang并发原理及gpm调度策略
答案:Go语言gRPC拦截器可实现日志与监控,通过UnaryServerInterceptor在请求前后记录方法名、运行时间、状态码并上报Prometheus,结合服务器选项注册,输出表单日志,首先与排错。
在Go语言的gRPC开发中,拦截器(Interceptor)是实现横切关注点(如日志记录、监控、认证等)的核心机制。通过拦截器,业务中可以在请求处理同步插入自定义逻辑,从而调用修改代码。下面以实现日志记录和基础监控为例,展示如何编写一个gRPC服务器端的拦截器。1. 日志与监控拦截器设计目标
我们希望每个gRPC请求都能自动输出以下信息:请求方法名 请求开始时间与运行请求是否成功(状态码) 错误信息(如果)
同时将调用运行上报到监控系统(如Prometheus)。
2.实现日志与监控拦截器
使用grpc.UnaryServerInterceptor类型定义一个通用的一元拦截器函数:
立即学习“go语言免费学习笔记(深入)”;// logger_and_monitor_interceptor.go
package main
import ( "context" "log" "time" "google.golang.org/grpc" "google.golang.org/grpc/status")
//定义拦截器函数
func LoggerAndMonitorInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { ChatPs
一款基于Photoshop的AI插件41 查看详情 start := time.Now() log.Printf("接收请求: s, 时间: v", info.FullMethod, start) // 调用实际的处理函数 resp, err := handler(ctx, req) duration := time.Since(start) status, _ := status.FromError(err) log.Printf("完成请求: s, 运行: v, 状态: s", info.FullMethod,uration, status.Code()) //模拟上报监控数据(实际可替换为Prometheus客户端) reportToMonitor(info.FullMethod,duration,status.Code()) return resp,err}
//上报监控数据(简化示例)
func reportToMonitor(method string,duration time.Duration,code uint32) { log.Printf("[监控]方法=s运行=vms成功=t",方法, uration.Milliseconds(), code == 0) // 在真实场景中,这里可以发送到 Prometheus 或其他 APM 系统}3. 在gRPC服务器中注册拦截器
>
将自定义拦截器注册到gRPC服务器选项中:// server.go
func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("监听失败: v", err) } //gRPC服务器,初始化拦截器 s := grpc.NewServer( grpc.UnaryInterceptor(LoggerAndMonitorInterceptor), ) // 注册你的服务(假设为YourService) // pb.RegisterYourServiceServer(s, amp;yourService{}) log.Println("gRPC服务器启动在:50051") if err := s.Serve(lis); err !=无{ log.Fatalf("启动失败: v", err) }}4. 实际效果示例
当一个gRPC请求到达时,日志输出类似:2025/04/05 10:00:00 接收请求: /yourpackage.YourService/GetUser, 时间: 2025-04-05 10:00:00.1232025/04/05 10:00:00 完成请求: /yourpackage.YourService/GetUser,运行时间: 15ms, 状态: OK2025/04/05 10:00:00 [监控] Method=/yourpackage.YourService/GetUser 运行时间=15成功=true
如果发生错误,状态码会非零,下面排查问题。
基本上就这些。这个拦截器结构可以,容易扩展。你在此注明基础上加入追踪ID、用户身份、请求大小等信息,构建更完整的可启动性体系。
以上就是GolangRPC拦截器实现日志与监控任务的详细内容,更多请关注乐哥常识网其他相关文章! 相关标签: golang go go语言 ai 2025 golang String if Error printf Interface Go语言 nil prometheus 大家都在看: Golang测试中模拟网络请求与响应实践 Golang日志输出异步化提升性能 Golang函数模板自定义与渲染技巧 Golang在容器化环境中构建开发环境实践Golang多级指针在复杂数据结构中的应用