当前位置:

首页 > 编程开发 > Golang RPC拦截器日志监控实现示例

Golang RPC拦截器日志监控实现示例

答案:Go语言gRPC拦截器可实现日志与监控,通过UnaryServerInterceptor在请求前后记录方法名、耗时、状态码并上报Prometheus,结合server选项注册,输出结构化日志,便于观测与排错。

答案:Go语言gRPC拦截器可实现日志与监控,通过UnaryServerInterceptor在请求前后记录方法名、耗时、状态码并上报Prometheus,结合server选项注册,输出结构化日志,便于观测与排错。

GolangRPC拦截器实现日志与监控示例

在Go语言的gRPC开发中,拦截器(Interceptor)是实现横切关注点(如日志记录、监控、认证等)的核心机制。通过拦截器,可以在请求处理前后插入自定义逻辑,而无需修改业务代码。下面以实现日志记录和基础监控为例,展示如何编写一个gRPC服务器端的拦截器。

1. 日志与监控拦截器设计目标

我们希望每个gRPC请求都能自动输出以下信息:

  • 请求方法名
  • 请求开始时间与耗时
  • 请求是否成功(状态码)
  • 错误信息(如有)

同时将调用耗时上报到监控系统(例如Prometheus)。

2. 实现日志与监控拦截器

使用grpc.UnaryServerInterceptor类型定义一个通用的一元拦截器函数:

// 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) {

  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, duration, 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", method, duration.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, &yourService{})
  log.Println("gRPC服务器启动在 :50051")
  if err := s.Serve(lis); err != nil {
    log.Fatalf("启动失败: %v", err)
  }
}

4. 实际效果示例

当一个gRPC请求到达时,日志输出类似:

2025/04/05 10:00:00 接收请求: /yourpackage.YourService/GetUser, 时间: 2025-04-05 10:00:00.123
2025/04/05 10:00:00 完成请求: /yourpackage.YourService/GetUser, 耗时: 15ms, 状态: OK
2025/04/05 10:00:00 [监控] 方法=/yourpackage.YourService/GetUser 耗时=15 成功=true

如果发生错误,状态码会非零,便于排查问题。

基本上就这些。这个拦截器结构清晰,易于扩展。你可以在此基础上加入追踪ID、用户身份、请求大小等信息,构建更完整的可观测性体系。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Golang rpc
相关文章 更多
探索Golang的广泛应用领域
探索Golang的广泛应用领域

了解一下Golang在哪些行业有广泛的应用场景吧!近年来,随着技术的不断演进和企业对效率和性能的追求,Golang(Go语言)逐渐成为了一种备受关注的编程语言。Golang的简洁、高效以及并发性等特点,使其在许多行业中得到广泛的应用。本文将介绍一些应用场景中,Golang所发挥的重要作用。首先,Golang在互联网领域的应用非常广泛。例如,谷歌、腾讯等大型互

Golang单元测试与压力测试:提升语言学习项目质量的必备工具
Golang单元测试与压力测试:提升语言学习项目质量的必备工具

在Go语言项目中,测试环节往往被低估,但实际踩过的坑能写满一本小册子。先说个核心判断:项目上线前不跑go test,等于没测;只跑go test -bench=.当压力测试,等于白压。下面从几个关键点展开,帮你避开常见误区。 go test 不执行测试函数?先查这四个硬约束 终端输出no test

golang如何实现访问者模式_golang访问者模式实现实践
golang如何实现访问者模式_golang访问者模式实现实践

在Go中实现访问者模式需避免Accept与Visit方法不同步,Visitor接口需显式覆盖所有节点类型。用FuncVisitor代替struct实现可避免代码膨胀,遍历逻辑应由节点自身控制。AST场景下推荐使用ast.Inspect配合类型断言,避免手动编写Accept方法。

golang如何实现WAL预写日志_golang WAL预写日志实现步骤
golang如何实现WAL预写日志_golang WAL预写日志实现步骤

WAL预写日志的可靠性依赖于日志写入先于数据修改落盘,需使用os.O_SYNC或os.O_DSYNC同步标志,确保数据不丢失。日志条目必须带长度前缀,采用二进制流格式。文件滚动与清理需原子替换,避免读写冲突。崩溃恢复时需精准定位最后一条完整日志,通过长度前缀校验和截断处理实现。

golang如何实现二维码条形码生成_golang二维码条形码生成实现指南
golang如何实现二维码条形码生成_golang二维码条形码生成实现指南

生成条形码用boombuler/barcode需注意宽高比例与空白边距;生成二维码用skip2/go-qrcode需注意纠错等级与中文编码。合成图像可用image.Draw拼接。扫码失败常因静区不足或DPI过低,建议预留足够边距并提高DPI至300以上。

golang如何实现二叉树遍历_golang二叉树遍历实现攻略
golang如何实现二叉树遍历_golang二叉树遍历实现攻略

Go语言二叉树节点必须用指针类型定义,递归遍历仅改变访问根节点顺序,迭代遍历需手动维护栈或队列,层序用切片模拟队列。空节点用nil,递归深度过大时推荐迭代写法避免栈溢出。

golang如何实现无状态认证方案_golang无状态认证方案实现方案
golang如何实现无状态认证方案_golang无状态认证方案实现方案

先说几个核心判断:JWT(JSON Web Token)是Go语言实现无状态认证的基石,但直接套用示例代码,大概率会在生产环境出问题。密钥硬编码、exp校验失败、中间件透传丢失上下文、Token被重放——这些都不是“跑通就行”的小麻烦。 JWT的核心结构,说白了就是Header.Payload.Si

Golang怎么替换字符串内容_Golang如何用Replace批量替换文本【操作】
Golang怎么替换字符串内容_Golang如何用Replace批量替换文本【操作】

Go字符串替换中,strings.Replace函数需指定替换次数n,n为负数时替换所有;正数则限制替换次数。与之对应,ReplaceAll可简化全量替换,但必须注意n的语义。

golang如何理解结构体字段标签tag_golang结构体字段标签tag方法
golang如何理解结构体字段标签tag_golang结构体字段标签tag方法

结构体字段标签类型为reflect.StructTag,需通过Get方法安全取值。手动解析易出错,常见问题包括字段未导出或未正确解引用。读取tag需依次检查指针、解引用、确认结构体类型,并跳过私有字段。私有字段的tag反射不可见,嵌套结构体同理。

golang如何排查tcp异常关闭_golang排查tcp异常关闭方法
golang如何排查tcp异常关闭_golang排查tcp异常关闭方法

Go中TCP异常断开通过读写错误、超时和心跳发现。`Read()`返回`io.EOF`表示正常关闭,`Write()`出现`brokenpipe`说明连接已断。应对策略包括设置`SetDeadline`、检查`RemoteAddr`、避免仅用`io.EOF`判断,并统一处理读错误以捕获FIN/RST。排查工具`ss`需关注`st`、`timer`、`retr

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
IntelliJ IDEA macOS版
IntelliJ IDEA macOS版
Mac

IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

PyCharm macOS版
PyCharm macOS版
Mac

JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

WebStorm macOS版
WebStorm macOS版
Mac

JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

WINDOWS 更多
IntelliJ IDEA Windows版
IntelliJ IDEA Windows版
Windows

JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

PhpStorm Windows版
PhpStorm Windows版
Windows

PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

PyCharm Windows版
PyCharm Windows版
Windows

PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,