Skip to content

Commit 641a8b1

Browse files
committed
feat: support opentelemetry
1 parent dea4bba commit 641a8b1

17 files changed

Lines changed: 456 additions & 50 deletions

File tree

conf/config.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,18 @@ proxy:
1414
socks5: ''
1515
http: ''
1616
https: ''
17+
otel:
18+
enable_otel: false
19+
otel_exporter_type: otlp
20+
otel_exporter_otlp_protocol: http/protobuf
21+
otlp_base_endpoint: http://localhost:4318
22+
otlp_trace_endpoint: ''
23+
otlp_metric_endpoint: ''
24+
otel_api_key: ''
25+
otel_sampling_rate: 1.0
26+
otel_batch_export_schedule_delay: 5000
27+
otel_max_queue_size: 2048
28+
otel_max_export_batch_size: 512
29+
otel_metric_export_interval: 60000
30+
otel_batch_export_timeout: 10000
31+
otel_metric_export_timeout: 30000

go.mod

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,32 @@ require (
66
github.com/gin-gonic/gin v1.10.0
77
github.com/google/uuid v1.6.0
88
github.com/seccomp/libseccomp-golang v0.11.0
9+
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.53.0
10+
go.opentelemetry.io/otel v1.39.0
11+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0
12+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0
13+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0
14+
go.opentelemetry.io/otel/sdk v1.39.0
15+
go.opentelemetry.io/otel/trace v1.39.0
16+
gopkg.in/natefinch/lumberjack.v2 v2.2.1
917
gopkg.in/yaml.v3 v3.0.1
1018
)
1119

1220
require (
1321
github.com/bytedance/sonic v1.13.2 // indirect
1422
github.com/bytedance/sonic/loader v0.2.4 // indirect
23+
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
24+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1525
github.com/cloudwego/base64x v0.1.5 // indirect
1626
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
1727
github.com/gin-contrib/sse v1.1.0 // indirect
28+
github.com/go-logr/logr v1.4.3 // indirect
29+
github.com/go-logr/stdr v1.2.2 // indirect
1830
github.com/go-playground/locales v0.14.1 // indirect
1931
github.com/go-playground/universal-translator v0.18.1 // indirect
2032
github.com/go-playground/validator/v10 v10.26.0 // indirect
2133
github.com/goccy/go-json v0.10.5 // indirect
34+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
2235
github.com/json-iterator/go v1.1.12 // indirect
2336
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
2437
github.com/leodido/go-urn v1.4.0 // indirect
@@ -28,11 +41,16 @@ require (
2841
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
2942
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
3043
github.com/ugorji/go/codec v1.2.12 // indirect
44+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
45+
go.opentelemetry.io/otel/metric v1.39.0 // indirect
46+
go.opentelemetry.io/proto/otlp v1.2.0 // indirect
3147
golang.org/x/arch v0.17.0 // indirect
3248
golang.org/x/crypto v0.45.0 // indirect
3349
golang.org/x/net v0.47.0 // indirect
34-
golang.org/x/sys v0.38.0 // indirect
50+
golang.org/x/sys v0.39.0 // indirect
3551
golang.org/x/text v0.31.0 // indirect
52+
google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect
53+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect
54+
google.golang.org/grpc v1.63.2 // indirect
3655
google.golang.org/protobuf v1.36.6 // indirect
37-
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
3856
)

go.sum

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1
33
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
44
github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
55
github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
6+
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
7+
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
8+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
9+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
610
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
711
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
812
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
@@ -15,6 +19,11 @@ github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w
1519
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
1620
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
1721
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
22+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
23+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
24+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
25+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
26+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
1827
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
1928
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
2029
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
@@ -25,17 +34,23 @@ github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc
2534
github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
2635
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
2736
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
28-
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
29-
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
37+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
38+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
3039
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
3140
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
3241
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
42+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is=
43+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM=
3344
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
3445
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
3546
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
3647
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
3748
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
3849
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
50+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
51+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
52+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
53+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
3954
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
4055
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
4156
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -49,6 +64,8 @@ github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0
4964
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
5065
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
5166
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
67+
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
68+
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
5269
github.com/seccomp/libseccomp-golang v0.11.0 h1:SDkcBRqGLP+sezmMACkxO1EfgbghxIxnRKfd6mHUEis=
5370
github.com/seccomp/libseccomp-golang v0.11.0/go.mod h1:5m1Lk8E9OwgZTTVz4bBOer7JuazaBa+xTkM895tDiWc=
5471
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -59,29 +76,62 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
5976
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
6077
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
6178
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
62-
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
63-
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
79+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
80+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
6481
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
6582
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
6683
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
6784
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
85+
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
86+
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
87+
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.53.0 h1:ktt8061VV/UU5pdPF6AcEFyuPxMizf/vU6eD1l+13LI=
88+
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.53.0/go.mod h1:JSRiHPV7E3dbOAP0N6SRPg2nC/cugJnVXRqP018ejtY=
89+
go.opentelemetry.io/contrib/propagators/b3 v1.28.0 h1:XR6CFQrQ/ttAYmTBX2loUEFGdk1h17pxYI8828dk/1Y=
90+
go.opentelemetry.io/contrib/propagators/b3 v1.28.0/go.mod h1:DWRkzJONLquRz7OJPh2rRbZ7MugQj62rk7g6HRnEqh0=
91+
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
92+
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
93+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE=
94+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs=
95+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 h1:1wp/gyxsuYtuE/JFxsQRtcCDtMrO2qMvlfXALU5wkzI=
96+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0/go.mod h1:gbTHmghkGgqxMomVQQMur1Nba4M0MQ8AYThXDUjsJ38=
97+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0 h1:8UPA4IbVZxpsD76ihGOQiFml99GPAEZLohDXvqHdi6U=
98+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0/go.mod h1:MZ1T/+51uIVKlRzGw1Fo46KEWThjlCBZKl2LzY5nv4g=
99+
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
100+
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
101+
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
102+
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
103+
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
104+
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
105+
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
106+
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
107+
go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94=
108+
go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A=
109+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
110+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
68111
golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU=
69112
golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
70113
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
71114
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
72115
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
73116
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
74117
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
75-
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
76-
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
118+
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
119+
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
77120
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
78121
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
79-
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
80-
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
122+
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=
123+
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=
124+
google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=
125+
google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=
126+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=
127+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
128+
google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
129+
google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
81130
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
82131
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
83-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
84132
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
133+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
134+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
85135
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
86136
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
87137
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/controller/run.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ func RunSandboxController(c *gin.Context) {
1414
Preload string `json:"preload" form:"preload"`
1515
EnableNetwork bool `json:"enable_network" form:"enable_network"`
1616
}) {
17-
switch req.Language {
17+
switch req.Language {
1818
case "python3":
19-
c.JSON(200, service.RunPython3Code(c, req.Code, req.Preload, &runner_types.RunnerOptions{
19+
c.JSON(200, service.RunPython3Code(c.Request.Context(), req.Code, req.Preload, &runner_types.RunnerOptions{
2020
EnableNetwork: req.EnableNetwork,
2121
}))
2222
case "nodejs":
23-
c.JSON(200, service.RunNodeJsCode(c, req.Code, req.Preload, &runner_types.RunnerOptions{
23+
c.JSON(200, service.RunNodeJsCode(c.Request.Context(), req.Code, req.Preload, &runner_types.RunnerOptions{
2424
EnableNetwork: req.EnableNetwork,
2525
}))
2626
default:

internal/core/runner/nodejs/nodejs.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import (
1515
"github.com/langgenius/dify-sandbox/internal/core/runner"
1616
"github.com/langgenius/dify-sandbox/internal/core/runner/types"
1717
"github.com/langgenius/dify-sandbox/internal/static"
18+
"github.com/langgenius/dify-sandbox/internal/telemetry"
19+
"go.opentelemetry.io/otel"
20+
"go.opentelemetry.io/otel/attribute"
1821
)
1922

2023
type NodeJsRunner struct {
@@ -71,6 +74,11 @@ func (p *NodeJsRunner) Run(
7174
)
7275
cmd.Env = []string{}
7376

77+
// inject trace context into env (only if OTel enabled)
78+
if static.GetDifySandboxGlobalConfigurations().Otel.Enable {
79+
cmd.Env = append(cmd.Env, telemetry.InjectTraceEnv(ctx)...)
80+
}
81+
7482
if len(configuration.AllowedSyscalls) > 0 {
7583
cmd.Env = append(
7684
cmd.Env,
@@ -80,11 +88,25 @@ func (p *NodeJsRunner) Run(
8088
)
8189
}
8290

91+
tr := otel.Tracer("dify-sandbox/runner")
92+
_, span := tr.Start(ctx, "node.exec")
93+
span.SetAttributes(
94+
attribute.Int("code.length", len(code)),
95+
attribute.Int64("timeout.ms", int64(timeout/time.Millisecond)),
96+
)
8397
// capture the output
8498
err = output_handler.CaptureOutput(ctx, cmd)
8599
if err != nil {
100+
span.RecordError(err)
101+
span.End()
86102
return err
87103
}
104+
// end span when done
105+
doneCh := output_handler.GetDone()
106+
go func() {
107+
<-doneCh
108+
span.End()
109+
}()
88110

89111
return nil
90112
})

internal/core/runner/python/python.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import (
1717
"github.com/langgenius/dify-sandbox/internal/core/runner"
1818
"github.com/langgenius/dify-sandbox/internal/core/runner/types"
1919
"github.com/langgenius/dify-sandbox/internal/static"
20+
"github.com/langgenius/dify-sandbox/internal/telemetry"
21+
"go.opentelemetry.io/otel"
22+
"go.opentelemetry.io/otel/attribute"
2023
)
2124

2225
type PythonRunner struct {
@@ -60,6 +63,11 @@ func (p *PythonRunner) Run(
6063
cmd.Env = []string{}
6164
cmd.Dir = LIB_PATH
6265

66+
// inject trace context into env for potential child instrumentation (only if OTel enabled)
67+
if static.GetDifySandboxGlobalConfigurations().Otel.Enable {
68+
cmd.Env = append(cmd.Env, telemetry.InjectTraceEnv(ctx)...)
69+
}
70+
6371
if configuration.Proxy.Socks5 != "" {
6472
cmd.Env = append(cmd.Env, fmt.Sprintf("HTTPS_PROXY=%s", configuration.Proxy.Socks5))
6573
cmd.Env = append(cmd.Env, fmt.Sprintf("HTTP_PROXY=%s", configuration.Proxy.Socks5))
@@ -80,12 +88,29 @@ func (p *PythonRunner) Run(
8088
)
8189
}
8290

83-
err = outputHandler.CaptureOutput(ctx, cmd)
91+
tr := otel.Tracer("dify-sandbox/runner")
92+
ctx, span := tr.Start(ctx, "python.exec")
93+
span.SetAttributes(
94+
attribute.Int("code.length", len(code)),
95+
attribute.Int64("timeout.ms", int64(timeout/time.Millisecond)),
96+
)
97+
err = outputHandler.CaptureOutput(ctx, cmd)
8498
if err != nil {
99+
span.RecordError(err)
100+
span.End()
85101
return nil, nil, nil, err
86102
}
87103

88-
return outputHandler.GetStdout(), outputHandler.GetStderr(), outputHandler.GetDone(), nil
104+
// End span when process signals done; service layer will still have its parent span open.
105+
doneCh := outputHandler.GetDone()
106+
wrappedDone := make(chan bool)
107+
go func() {
108+
<-doneCh
109+
span.End()
110+
wrappedDone <- true
111+
}()
112+
113+
return outputHandler.GetStdout(), outputHandler.GetStderr(), wrappedDone, nil
89114
}
90115

91116
func (p *PythonRunner) InitializeEnvironment(code string, preload string, options *types.RunnerOptions) (string, string, error) {

internal/middleware/identity.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package middleware
2+
3+
import (
4+
"github.com/gin-gonic/gin"
5+
"github.com/langgenius/dify-sandbox/internal/static"
6+
appLog "github.com/langgenius/dify-sandbox/internal/utils/log"
7+
"go.opentelemetry.io/otel/attribute"
8+
"go.opentelemetry.io/otel/trace"
9+
)
10+
11+
// Identity middleware extracts tenant/user identity from path/header, attaches to context,
12+
// and sets tenant.id attribute on the current span when OpenTelemetry is enabled.
13+
func Identity() gin.HandlerFunc {
14+
return func(c *gin.Context) {
15+
ctx := c.Request.Context()
16+
// Prefer path param :tenant_id, fallback to headers
17+
tenantID := c.Param("tenant_id")
18+
if tenantID == "" {
19+
tenantID = c.GetHeader("X-Tenant-ID")
20+
if tenantID == "" {
21+
tenantID = c.GetHeader("X-Tenant-Id")
22+
}
23+
}
24+
25+
userID := c.GetHeader("X-User-ID")
26+
userType := c.GetHeader("X-User-Type")
27+
28+
if tenantID != "" || userID != "" || userType != "" {
29+
ctx = appLog.WithIdentity(ctx, appLog.Identity{TenantID: tenantID, UserID: userID, UserType: userType})
30+
}
31+
32+
// If tracing enabled, annotate the active HTTP span.
33+
if static.GetDifySandboxGlobalConfigurations().Otel.Enable && tenantID != "" {
34+
span := trace.SpanFromContext(ctx)
35+
sc := span.SpanContext()
36+
if sc.IsValid() {
37+
span.SetAttributes(attribute.String("tenant.id", tenantID))
38+
}
39+
}
40+
41+
c.Request = c.Request.WithContext(ctx)
42+
c.Next()
43+
}
44+
}

0 commit comments

Comments
 (0)