feat 链路追踪

This commit is contained in:
2026-01-16 22:01:35 +08:00
parent 7cb057fc91
commit e59d106700
11 changed files with 394 additions and 108 deletions

63
module/db.go Normal file
View File

@@ -0,0 +1,63 @@
package module
import (
"git.hlsq.asia/mmorpg/service-common/config"
"git.hlsq.asia/mmorpg/service-common/db/etcd"
"git.hlsq.asia/mmorpg/service-common/db/mysql"
"git.hlsq.asia/mmorpg/service-common/db/redis"
"git.hlsq.asia/mmorpg/service-common/log"
)
// DB 数据库模块
type DB struct {
cfg *config.DBConfig
}
func (m *DB) Init() error {
// ETCD
if m.cfg.Etcd != nil {
if err := etcd.Init(m.cfg.Etcd); err != nil {
return err
}
}
// MYSQL
if m.cfg.MySQL != nil {
if err := mysql.Init(m.cfg.MySQL); err != nil {
return err
}
}
// REDIS
if m.cfg.Redis != nil {
if err := redis.Init(m.cfg.Redis); err != nil {
return err
}
}
return nil
}
func (m *DB) Start() error {
return nil
}
func (m *DB) Stop() error {
if err := etcd.Close(); err != nil {
log.Errorf("close etcd failed: %v", err)
}
if err := mysql.Close(); err != nil {
log.Errorf("close mysql failed: %v", err)
}
if err := redis.Close(); err != nil {
log.Errorf("close redis failed: %v", err)
}
return nil
}
func (m *DB) Bind(data ...any) Module {
if data == nil || len(data) == 0 {
return m
}
if cfg, ok := data[0].(*config.DBConfig); ok {
m.cfg = cfg
}
return m
}

8
module/module.go Normal file
View File

@@ -0,0 +1,8 @@
package module
type Module interface {
Init() error
Start() error
Stop() error
Bind(data ...any) Module
}

69
module/tracer.go Normal file
View File

@@ -0,0 +1,69 @@
package module
import (
"context"
"git.hlsq.asia/mmorpg/service-common/config"
"git.hlsq.asia/mmorpg/service-common/log"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
)
// Tracer 链路追踪模块
type Tracer struct {
tp *sdktrace.TracerProvider
metricCfg *config.MetricConfig
serviceName string
}
func (m *Tracer) Init() error {
exporter, err := otlptracegrpc.New(
context.Background(),
otlptracegrpc.WithInsecure(),
otlptracegrpc.WithEndpoint(m.metricCfg.Jaeger.Endpoint),
)
if err != nil {
return err
}
m.tp = sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(m.serviceName),
)),
)
otel.SetTracerProvider(m.tp)
otel.SetTextMapPropagator(propagation.TraceContext{})
return nil
}
func (m *Tracer) Start() error {
return nil
}
func (m *Tracer) Stop() error {
if m.tp != nil {
if err := m.tp.Shutdown(context.Background()); err != nil {
log.Errorf("stop tracer provider failed: %v", err)
}
}
return nil
}
func (m *Tracer) Bind(data ...any) Module {
if data == nil || len(data) == 0 {
return m
}
if mc, ok := data[0].(*config.MetricConfig); ok {
m.metricCfg = mc
}
if name, ok := data[1].(string); ok {
m.serviceName = name
}
return m
}