Skip to content

Commit ed3537a

Browse files
authored
Merge pull request #2955 from traPtitech/feat/opentelemetry
feat: Add OpenTelemetry tracing
2 parents da58a35 + 35e1f87 commit ed3537a

6 files changed

Lines changed: 239 additions & 26 deletions

File tree

cmd/config.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"gorm.io/driver/mysql"
1414
"gorm.io/gorm"
1515
"gorm.io/gorm/logger"
16+
otelgorm "gorm.io/plugin/opentelemetry/tracing"
1617

1718
driverMysql "github.com/go-sql-driver/mysql"
1819
"github.com/traPtitech/traQ/repository"
@@ -440,6 +441,11 @@ func (c Config) getDatabase() (*gorm.DB, error) {
440441
if c.DevMode {
441442
engine.Logger.LogMode(logger.Info)
442443
}
444+
445+
if err := engine.Use(otelgorm.NewPlugin(otelgorm.WithoutQueryVariables())); err != nil {
446+
return nil, fmt.Errorf("failed to setup GORM OpenTelemetry plugin: %w", err)
447+
}
448+
443449
return engine.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4").Session(&gorm.Session{}), nil
444450
}
445451

cmd/serve.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/traPtitech/traQ/utils/jwt"
2323
"github.com/traPtitech/traQ/utils/optional"
2424
"github.com/traPtitech/traQ/utils/random"
25+
"github.com/traPtitech/traQ/utils/tracing"
2526
"github.com/traPtitech/traQ/utils/twemoji"
2627
)
2728

@@ -39,6 +40,17 @@ func serveCommand() *cobra.Command {
3940

4041
logger.Info(fmt.Sprintf("traQ %s (revision %s)", Version, Revision))
4142

43+
// OpenTelemetry Tracing
44+
shutdownTracer, err := tracing.InitTracer(context.Background(), "traQ")
45+
if err != nil {
46+
logger.Fatal("failed to initialize tracer", zap.Error(err))
47+
}
48+
defer func() {
49+
if err := shutdownTracer(context.Background()); err != nil {
50+
logger.Error("failed to shutdown tracer", zap.Error(err))
51+
}
52+
}()
53+
4254
// Stackdriver Profiler
4355
if c.GCP.Stackdriver.Profiler.Enabled {
4456
if err := initStackdriverProfiler(&c); err != nil {

go.mod

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ require (
3434
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674
3535
github.com/guregu/null v4.0.0+incompatible
3636
github.com/hajimehoshi/go-mp3 v0.3.4
37+
github.com/jfreymuth/oggvorbis v1.0.5
3738
github.com/json-iterator/go v1.1.12
3839
github.com/labstack/echo-contrib v0.50.1
3940
github.com/labstack/echo/v4 v4.15.1
@@ -57,6 +58,8 @@ require (
5758
github.com/spf13/viper v1.21.0
5859
github.com/stretchr/testify v1.11.1
5960
github.com/zitadel/oidc/v3 v3.45.5
61+
go.opentelemetry.io/contrib/exporters/autoexport v0.67.0
62+
go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.67.0
6063
go.uber.org/zap v1.27.1
6164
golang.org/x/crypto v0.49.0
6265
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90
@@ -68,16 +71,20 @@ require (
6871
gopkg.in/yaml.v3 v3.0.1
6972
gorm.io/driver/mysql v1.6.0
7073
gorm.io/gorm v1.31.1
74+
gorm.io/plugin/opentelemetry v0.1.16
7175
)
7276

7377
require (
7478
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 // indirect
7579
buf.build/go/protovalidate v1.1.2 // indirect
7680
buf.build/go/protoyaml v0.6.0 // indirect
81+
github.com/ClickHouse/ch-go v0.61.5 // indirect
82+
github.com/ClickHouse/clickhouse-go/v2 v2.30.0 // indirect
7783
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
7884
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect
7985
github.com/benbjohnson/clock v1.3.5 // indirect
8086
github.com/bep/debounce v1.2.1 // indirect
87+
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
8188
github.com/containerd/errdefs v1.0.0 // indirect
8289
github.com/containerd/errdefs/pkg v0.3.0 // indirect
8390
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
@@ -86,12 +93,20 @@ require (
8693
github.com/distribution/reference v0.6.0 // indirect
8794
github.com/frostbyte73/core v0.1.1 // indirect
8895
github.com/gammazero/deque v1.2.1 // indirect
96+
github.com/go-faster/city v1.0.1 // indirect
97+
github.com/go-faster/errors v0.7.1 // indirect
8998
github.com/go-jose/go-jose/v3 v3.0.4 // indirect
9099
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
91100
github.com/goccy/go-json v0.10.3 // indirect
92101
github.com/google/cel-go v0.27.0 // indirect
102+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
93103
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
94104
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
105+
github.com/hashicorp/go-version v1.6.0 // indirect
106+
github.com/jackc/pgpassfile v1.0.0 // indirect
107+
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
108+
github.com/jackc/pgx/v5 v5.5.5 // indirect
109+
github.com/jackc/puddle/v2 v2.2.1 // indirect
95110
github.com/jfreymuth/vorbis v1.0.2 // indirect
96111
github.com/jxskiss/base62 v1.1.0 // indirect
97112
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
@@ -111,6 +126,8 @@ require (
111126
github.com/nats-io/nkeys v0.4.15 // indirect
112127
github.com/nats-io/nuid v1.0.1 // indirect
113128
github.com/nxadm/tail v1.4.11 // indirect
129+
github.com/paulmach/orb v0.11.1 // indirect
130+
github.com/pierrec/lz4/v4 v4.1.21 // indirect
114131
github.com/pion/datachannel v1.6.0 // indirect
115132
github.com/pion/dtls/v3 v3.1.2 // indirect
116133
github.com/pion/ice/v4 v4.2.0 // indirect
@@ -127,17 +144,37 @@ require (
127144
github.com/pion/transport/v4 v4.0.1 // indirect
128145
github.com/pion/turn/v4 v4.1.4 // indirect
129146
github.com/pion/webrtc/v4 v4.2.6 // indirect
147+
github.com/pkg/errors v0.9.1 // indirect
148+
github.com/prometheus/otlptranslator v1.0.0 // indirect
130149
github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect
131150
github.com/redis/go-redis/v9 v9.17.2 // indirect
132151
github.com/segmentio/asm v1.2.1 // indirect
152+
github.com/shopspring/decimal v1.4.0 // indirect
133153
github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
134154
github.com/twitchtv/twirp v8.1.3+incompatible // indirect
135155
github.com/wlynxg/anet v0.0.5 // indirect
136156
github.com/zeebo/xxh3 v1.1.0 // indirect
157+
go.opentelemetry.io/contrib/bridges/prometheus v0.67.0 // indirect
158+
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 // indirect
159+
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0 // indirect
160+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 // indirect
161+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0 // indirect
162+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect
163+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect
164+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 // indirect
165+
go.opentelemetry.io/otel/exporters/prometheus v0.64.0 // indirect
166+
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0 // indirect
167+
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 // indirect
168+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 // indirect
169+
go.opentelemetry.io/otel/log v0.18.0 // indirect
170+
go.opentelemetry.io/otel/sdk/log v0.18.0 // indirect
171+
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
137172
go.uber.org/atomic v1.11.0 // indirect
138173
go.uber.org/zap/exp v0.3.0 // indirect
139174
go.yaml.in/yaml/v2 v2.4.3 // indirect
140175
go.yaml.in/yaml/v3 v3.0.4 // indirect
176+
gorm.io/driver/clickhouse v0.7.0 // indirect
177+
gorm.io/driver/postgres v1.5.11 // indirect
141178
)
142179

143180
require (
@@ -163,7 +200,7 @@ require (
163200
github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2 // indirect
164201
github.com/ajg/form v1.5.1 // indirect
165202
github.com/ajstarks/svgo v0.0.0-20210406150507-75cfd577ce75 // indirect
166-
github.com/andybalholm/brotli v1.0.4 // indirect
203+
github.com/andybalholm/brotli v1.1.1 // indirect
167204
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect
168205
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 // indirect
169206
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 // indirect
@@ -213,7 +250,6 @@ require (
213250
github.com/googleapis/gax-go/v2 v2.18.0 // indirect
214251
github.com/imkira/go-interpol v1.1.0 // indirect
215252
github.com/inconshreveable/mousetrap v1.1.0 // indirect
216-
github.com/jfreymuth/oggvorbis v1.0.5
217253
github.com/jinzhu/inflection v1.0.0 // indirect
218254
github.com/jinzhu/now v1.1.5 // indirect
219255
github.com/klauspost/compress v1.18.4 // indirect
@@ -235,7 +271,7 @@ require (
235271
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
236272
github.com/prometheus/client_model v0.6.2 // indirect
237273
github.com/prometheus/common v0.67.5 // indirect
238-
github.com/prometheus/procfs v0.19.2 // indirect
274+
github.com/prometheus/procfs v0.20.1 // indirect
239275
github.com/sagikazarmark/locafero v0.11.0 // indirect
240276
github.com/sanity-io/litter v1.5.5 // indirect
241277
github.com/sergi/go-diff v1.2.0 // indirect
@@ -258,11 +294,11 @@ require (
258294
go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect
259295
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect
260296
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
261-
go.opentelemetry.io/otel v1.40.0 // indirect
262-
go.opentelemetry.io/otel/metric v1.40.0 // indirect
263-
go.opentelemetry.io/otel/sdk v1.40.0 // indirect
264-
go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect
265-
go.opentelemetry.io/otel/trace v1.40.0 // indirect
297+
go.opentelemetry.io/otel v1.42.0
298+
go.opentelemetry.io/otel/metric v1.42.0 // indirect
299+
go.opentelemetry.io/otel/sdk v1.42.0
300+
go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect
301+
go.opentelemetry.io/otel/trace v1.42.0 // indirect
266302
go.uber.org/multierr v1.11.0 // indirect
267303
golang.org/x/mod v0.34.0 // indirect
268304
golang.org/x/sys v0.42.0 // indirect
@@ -271,7 +307,7 @@ require (
271307
golang.org/x/tools v0.43.0 // indirect
272308
google.golang.org/appengine/v2 v2.0.6 // indirect
273309
google.golang.org/genproto v0.0.0-20260217215200-42d3e9bedb6d // indirect
274-
google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d // indirect
310+
google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect
275311
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect
276312
google.golang.org/grpc v1.79.2 // indirect
277313
google.golang.org/protobuf v1.36.11 // indirect

0 commit comments

Comments
 (0)