Skip to content

Commit 34ae460

Browse files
committed
opentelemetry support
1 parent 5ecc8bc commit 34ae460

528 files changed

Lines changed: 135788 additions & 21 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmd/server.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"context"
45
"fmt"
56
"log/slog"
67
"os"
@@ -15,6 +16,11 @@ import (
1516
"github.com/appclacks/server/pkg/pushgateway"
1617
"github.com/prometheus/client_golang/prometheus"
1718
"github.com/spf13/cobra"
19+
"go.opentelemetry.io/otel"
20+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
21+
"go.opentelemetry.io/otel/sdk/resource"
22+
"go.opentelemetry.io/otel/sdk/trace"
23+
semconv "go.opentelemetry.io/otel/semconv/v1.37.0"
1824
"gopkg.in/yaml.v3"
1925
)
2026

@@ -59,9 +65,30 @@ func runServer(logger *slog.Logger) error {
5965
if err != nil {
6066
return err
6167
}
68+
ctx := context.Background()
69+
exp, err := otlptracehttp.New(ctx)
70+
if err != nil {
71+
return err
72+
}
73+
r := resource.NewWithAttributes(
74+
semconv.SchemaURL,
75+
semconv.ServiceName("appclacks-server"),
76+
)
77+
shutdownFn := func() {}
78+
if os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT") != "" || os.Getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT") != "" {
79+
logger.Info("starting opentelemetry traces export")
80+
tracerProvider := trace.NewTracerProvider(trace.WithBatcher(exp), trace.WithResource(r))
81+
otel.SetTracerProvider(tracerProvider)
82+
shutdownFn = func() {
83+
err := tracerProvider.Shutdown(context.Background())
84+
if err != nil {
85+
panic(err)
86+
}
87+
}
88+
}
89+
defer shutdownFn()
6290
signals := make(chan os.Signal, 1)
6391
errChan := make(chan error)
64-
6592
signal.Notify(
6693
signals,
6794
syscall.SIGINT,

docker-compose.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ services:
1616
POSTGRES_DB: appclacks
1717
POSTGRES_USER: appclacks
1818
POSTGRES_PASSWORD: appclacks
19+
ports:
20+
- "5432:5432"
1921
cabourotte:
2022
image: "appclacks/cabourotte:v2.0.0"
2123
volumes:
2224
- "./dev/cabourotte.yaml:/cabourotte.yaml"
2325
network_mode: "host"
24-
depends_on:
25-
- server
2626
command:
2727
- daemon
2828
- --config

go.mod

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/appclacks/server
33
go 1.24.0
44

55
require (
6+
github.com/XSAM/otelsql v0.41.0
67
github.com/appclacks/go-client v0.0.0-20240727202531-75f46b6cdb27
78
github.com/baidubce/bce-sdk-go v0.9.182
89
github.com/go-playground/validator/v10 v10.30.1
@@ -15,18 +16,25 @@ require (
1516
github.com/prometheus/client_golang v1.23.2
1617
github.com/spf13/cobra v1.10.2
1718
github.com/stretchr/testify v1.11.1
19+
go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.64.0
20+
go.opentelemetry.io/otel v1.39.0
21+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0
22+
go.opentelemetry.io/otel/sdk v1.39.0
1823
gopkg.in/yaml.v3 v3.0.1
1924
)
2025

2126
require (
2227
github.com/beorn7/perks v1.0.1 // indirect
28+
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
2329
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2430
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
2531
github.com/gabriel-vasile/mimetype v1.4.12 // indirect
32+
github.com/go-logr/logr v1.4.3 // indirect
33+
github.com/go-logr/stdr v1.2.2 // indirect
2634
github.com/go-playground/locales v0.14.1 // indirect
2735
github.com/go-playground/universal-translator v0.18.1 // indirect
36+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect
2837
github.com/inconshreveable/mousetrap v1.1.0 // indirect
29-
github.com/kr/text v0.2.0 // indirect
3038
github.com/labstack/gommon v0.4.2 // indirect
3139
github.com/leodido/go-urn v1.4.0 // indirect
3240
github.com/mattn/go-colorable v0.1.14 // indirect
@@ -40,11 +48,19 @@ require (
4048
github.com/stretchr/objx v0.5.2 // indirect
4149
github.com/valyala/bytebufferpool v1.0.0 // indirect
4250
github.com/valyala/fasttemplate v1.2.2 // indirect
51+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
52+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect
53+
go.opentelemetry.io/otel/metric v1.39.0 // indirect
54+
go.opentelemetry.io/otel/trace v1.39.0 // indirect
55+
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
4356
go.yaml.in/yaml/v2 v2.4.3 // indirect
4457
golang.org/x/crypto v0.46.0 // indirect
4558
golang.org/x/net v0.48.0 // indirect
4659
golang.org/x/sys v0.39.0 // indirect
4760
golang.org/x/text v0.32.0 // indirect
4861
golang.org/x/time v0.14.0 // indirect
62+
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect
63+
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect
64+
google.golang.org/grpc v1.77.0 // indirect
4965
google.golang.org/protobuf v1.36.11 // indirect
5066
)

go.sum

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,23 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25
44
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
55
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
66
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
7+
github.com/XSAM/otelsql v0.41.0 h1:uZifjQhZhv5EDYJh+IVk1DiYxQZJBlNSen0MBFnfxB8=
8+
github.com/XSAM/otelsql v0.41.0/go.mod h1:NMQT0PiKoFILp9QgjQz+D5mvW+9mT0suR7OejqrtMaM=
79
github.com/appclacks/go-client v0.0.0-20240727202531-75f46b6cdb27 h1:ey68d9ML7Sco6Qmdgx8nog3dCksXLRCzGD/wsvdXxX0=
810
github.com/appclacks/go-client v0.0.0-20240727202531-75f46b6cdb27/go.mod h1:ZOQEaU5H5BTLZr326dMjvVbB+pdkeRX3emyu4cEq9GU=
911
github.com/baidubce/bce-sdk-go v0.9.182 h1:DUNNEzQh5Gk198izzjt39L/HlURbltTK4nBzNfEn6HQ=
1012
github.com/baidubce/bce-sdk-go v0.9.182/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg=
1113
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
1214
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
15+
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
16+
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
1317
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
1418
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1519
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
1620
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
1721
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
1822
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
1923
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
20-
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
2124
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
2225
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2326
github.com/dhui/dktest v0.4.6 h1:+DPKyScKSEp3VLtbMDHcUq6V5Lm5zfZZVb0Sk7Ahom4=
@@ -34,6 +37,7 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
3437
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
3538
github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=
3639
github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
40+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
3741
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
3842
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
3943
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -52,10 +56,14 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
5256
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
5357
github.com/golang-migrate/migrate/v4 v4.19.1 h1:OCyb44lFuQfYXYLx1SCxPZQGU7mcaZ7gH9yH4jSFbBA=
5458
github.com/golang-migrate/migrate/v4 v4.19.1/go.mod h1:CTcgfjxhaUtsLipnLoQRWCrjYXycRz/g5+RWDuYgPrE=
59+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
60+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
5561
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
5662
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
5763
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
5864
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
65+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg=
66+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4=
5967
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
6068
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
6169
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
@@ -108,8 +116,8 @@ github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+L
108116
github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI=
109117
github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws=
110118
github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
111-
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
112-
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
119+
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
120+
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
113121
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
114122
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
115123
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
@@ -124,16 +132,30 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
124132
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
125133
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
126134
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
127-
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
128-
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
135+
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
136+
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
137+
go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.64.0 h1:9PCiXc7BmfD7+BI8POoc3bQSoRSEo01eNqPVu1/+pDY=
138+
go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.64.0/go.mod h1:NGBbj2Bgb5Oe/35f9WaU3qRnOey+7X+bxnnSS5zzvLA=
129139
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
130140
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
131-
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
132-
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
133-
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
134-
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
135-
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
136-
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
141+
go.opentelemetry.io/contrib/propagators/b3 v1.39.0 h1:PI7pt9pkSnimWcp5sQhUA9OzLbc3Ba4sL+VEUTNsxrk=
142+
go.opentelemetry.io/contrib/propagators/b3 v1.39.0/go.mod h1:5gV/EzPnfYIwjzj+6y8tbGW2PKWhcsz5e/7twptRVQY=
143+
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
144+
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
145+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0=
146+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8=
147+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4=
148+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU=
149+
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
150+
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
151+
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
152+
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
153+
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
154+
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
155+
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
156+
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
157+
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
158+
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
137159
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
138160
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
139161
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
@@ -150,6 +172,14 @@ golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
150172
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
151173
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
152174
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
175+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
176+
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
177+
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls=
178+
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto=
179+
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww=
180+
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
181+
google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM=
182+
google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig=
153183
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
154184
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
155185
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

internal/database/healthcheck.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"time"
88

99
"github.com/appclacks/server/pkg/healthcheck/aggregates"
10-
1110
er "github.com/mcorbin/corbierror"
1211
)
1312

internal/database/root.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"log/slog"
99
"time"
1010

11+
otelsql "github.com/XSAM/otelsql"
1112
"github.com/appclacks/server/internal/validator"
1213
"github.com/golang-migrate/migrate/v4"
1314
"github.com/golang-migrate/migrate/v4/database/postgres"
@@ -16,6 +17,8 @@ import (
1617
"github.com/jmoiron/sqlx"
1718
_ "github.com/lib/pq"
1819
er "github.com/mcorbin/corbierror"
20+
"go.opentelemetry.io/otel"
21+
semconv "go.opentelemetry.io/otel/semconv/v1.37.0"
1922
)
2023

2124
//go:embed migrations/*.sql
@@ -43,17 +46,43 @@ func New(logger *slog.Logger, config Configuration, probers uint) (*Database, er
4346
return nil, err
4447
}
4548
connectionString := fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s sslmode=%s", config.Host, config.Port, config.Username, config.Database, config.Password, config.SSLMode)
46-
db, err := sqlx.Connect("postgres", connectionString)
49+
50+
dbConn, err := otelsql.Open("postgres", connectionString,
51+
otelsql.WithTracerProvider(otel.GetTracerProvider()),
52+
otelsql.WithAttributes(
53+
semconv.DBSystemNamePostgreSQL,
54+
),
55+
otelsql.WithSpanOptions(otelsql.SpanOptions{
56+
Ping: true,
57+
RowsNext: true,
58+
DisableErrSkip: true,
59+
OmitConnResetSession: true,
60+
OmitConnectorConnect: false,
61+
OmitConnPrepare: false,
62+
OmitRows: false,
63+
}),
64+
)
4765
if err != nil {
66+
return nil, fmt.Errorf("fail to open database connection: %w", err)
67+
}
68+
69+
db := sqlx.NewDb(dbConn, "postgres")
70+
71+
if err := db.Ping(); err != nil {
4872
return nil, fmt.Errorf("fail to connect to the database: %w", err)
4973
}
74+
5075
db.SetConnMaxLifetime(time.Duration(60) * time.Second)
5176
db.SetMaxOpenConns(10)
5277
db.SetMaxIdleConns(10)
5378
driver, err := postgres.WithInstance(db.DB, &postgres.Config{})
5479
if err != nil {
5580
return nil, fmt.Errorf("fail to create postgres migration driver: %w", err)
5681
}
82+
_, err = otelsql.RegisterDBStatsMetrics(db.DB)
83+
if err != nil {
84+
return nil, err
85+
}
5786
source, err := iofs.New(migrationsFS, "migrations")
5887
if err != nil {
5988
return nil, fmt.Errorf("fail to create source migration driver: %w", err)

internal/http/integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func fromJson(t *testing.T, s any, data []byte) {
4040

4141
func readBody(t *testing.T, body io.ReadCloser) []byte {
4242
b, err := io.ReadAll(body)
43-
defer body.Close()
43+
defer body.Close() //nolint
4444
assert.NoError(t, err)
4545
return b
4646
}

internal/http/server.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
er "github.com/mcorbin/corbierror"
1919
"github.com/prometheus/client_golang/prometheus"
2020
"github.com/prometheus/client_golang/prometheus/promhttp"
21+
"go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho"
2122
)
2223

2324
type Server struct {
@@ -76,6 +77,7 @@ func NewServer(logger *slog.Logger, config Configuration, registry *prometheus.R
7677
}
7778

7879
e.HTTPErrorHandler = errorHandler(logger)
80+
e.Use(otelecho.Middleware("appclacks-server"))
7981
e.Use(middlewares.MetricsMiddleware(reqHistogram, respCounter, logger))
8082
e.GET("/healthz", func(ec echo.Context) error {
8183
return ec.JSON(http.StatusOK, "ok")

pkg/healthcheck/aggregates/definition.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ func ToHealthcheckDefinition(templateType string, definition string) (Healthchec
4545
return &def, nil
4646
}
4747

48-
return nil, fmt.Errorf("Invalid template type %s", templateType)
48+
return nil, fmt.Errorf("invalid template type %s", templateType)
4949

5050
}

vendor/github.com/XSAM/otelsql/.gitignore

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)