https://github.com/ltd5552/gin-observability
基于porm-go、otelgin、zap实现对gin的可观测性支持
https://github.com/ltd5552/gin-observability
gin-gonic observability opentelemetry-go prometheus zap
Last synced: about 2 months ago
JSON representation
基于porm-go、otelgin、zap实现对gin的可观测性支持
- Host: GitHub
- URL: https://github.com/ltd5552/gin-observability
- Owner: Ltd5552
- Created: 2022-11-28T02:26:44.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-04-09T02:06:31.000Z (about 2 years ago)
- Last Synced: 2025-03-28T01:53:30.187Z (2 months ago)
- Topics: gin-gonic, observability, opentelemetry-go, prometheus, zap
- Language: Go
- Homepage:
- Size: 84 KB
- Stars: 6
- Watchers: 1
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# gin-observability
项目整体基于gin框架,实现了对prometheus(metric)、otelgin(trace)、zap(log)的封装添加,达到开箱即用
### What it can do?
- metric:封装了三个基于gauge类型的指标,能够反馈api的请求次数、错误、请求耗时(R.E.D)
- trace:封装使用了otelgin官方的中间件,能够在gin.context传递trace信息
- log:封装了zap的初始化过程,自定义了输出格式,通过gin.context添加了traceID和spanID### What it can't do?
- metric:仅仅作为客户端的exporter。不能进行数据的分析、告警与可视化,需配合prometheus和grafana等使用
- trace:不包含任何exporter。不能直接观测到链路信息,仅在日志中输出,若需要请参考otel文档并结合jaeger等使用
- log:可选择性结合gin.context使用。为了到达日志记录traceID和spanID的效果则必须传入gin.context### 使用
``` shell
go get -u github.com/Ltd5552/gin-observability
```
#### 集成使用为了更加方便,引入了observability包将metric和trace模块整合到一起,可直接使用即可
``` go
import "github.com/Ltd5552/gin-observability/observability"r := gin.New()
// 传入gin.engine和应用名(作为链路的服务名)
observability.Set(r, "ServerName")
defer log.Sync()
```#### 分别使用
**若仅需要metric功能:**
``` go
import(
"github.com/gin-gonic/gin"
"github.com/Ltd5552/gin-observability/metric"
)r := gin.New()
// 设置metric
metric.Set(r)
```**若仅需要trace和log功能:**
``` go
import(
"github.com/gin-gonic/gin"
"github.com/Ltd5552/gin-observability/trace"
"github.com/Ltd5552/gin-observability/log"
)r := gin.New()
// 设置trace
trace.Set(r, "gin-observability")defer log.Sync()
r.GET("/get", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "get",
})
// 使用普通的zap的log
log.Info("get successfully")
// 使用能打印traceID和spanID的log
log.InfoWithID(c, "get successfully")})
```
**若三个都用到使用集成的observability模块**
``` go
import(
"github.com/gin-gonic/gin"
"github.com/Ltd5552/gin-observability/observability"
"github.com/Ltd5552/gin-observability/log"
)r := gin.New()
observability.Set(r, "gin-observability")
defer log.Sync()
r.GET("/get", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "get",
})
// 使用普通的zap的log
log.Info("get successfully", zap.String("ping", "pong"))
// 使用能打印traceID和spanID的log
log.InfoWithID(c, "get successfully", zap.String("ping", "pong"))})
```
### P.S
三个模块均能单独使用,但trace和log相互依赖才有效果,而metric则完全独立
### What's the next?
设想:采用option模式,增添更多的可选择性:
- 是否添加trace exporter
- 是否自定义log日志文件参数