Skip to content

Commit dd6ce8e

Browse files
satyamzCopilot
andauthored
services/friendbot: Instrument friendbot to emit traces (#5796)
Signed-off-by: Satyam Zode <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent 7bc4933 commit dd6ce8e

File tree

11 files changed

+254
-58
lines changed

11 files changed

+254
-58
lines changed

go.mod

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ require (
4646
github.com/spf13/viper v1.17.0
4747
github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2
4848
github.com/stellar/throttled v2.2.3-0.20190823235211-89d75816f59d+incompatible
49-
github.com/stretchr/testify v1.9.0
49+
github.com/stretchr/testify v1.10.0
5050
github.com/tyler-smith/go-bip39 v0.0.0-20180618194314-52158e4697b8
5151
github.com/xdrpp/goxdr v0.1.1
5252
google.golang.org/api v0.183.0
@@ -68,7 +68,14 @@ require (
6868
github.com/docker/docker v27.3.1+incompatible
6969
github.com/docker/go-connections v0.5.0
7070
github.com/fsouza/fake-gcs-server v1.49.2
71+
github.com/go-chi/chi/v5 v5.1.0
72+
github.com/riandyrn/otelchi v0.12.1
7173
github.com/stellar/stellar-rpc v0.9.6-0.20250130160539-be7702aa01ba
74+
go.opentelemetry.io/otel v1.34.0
75+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0
76+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0
77+
go.opentelemetry.io/otel/sdk v1.34.0
78+
go.opentelemetry.io/otel/trace v1.34.0
7279
)
7380

7481
require (
@@ -111,6 +118,7 @@ require (
111118
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
112119
github.com/gorilla/handlers v1.5.2 // indirect
113120
github.com/gorilla/mux v1.8.1 // indirect
121+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
114122
github.com/hashicorp/hcl v1.0.0 // indirect
115123
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
116124
github.com/moby/docker-image-spec v1.3.1 // indirect
@@ -121,23 +129,21 @@ require (
121129
github.com/opencontainers/image-spec v1.1.0 // indirect
122130
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
123131
github.com/pkg/xattr v0.4.9 // indirect
124-
github.com/rogpeppe/go-internal v1.11.0 // indirect
132+
github.com/rogpeppe/go-internal v1.13.1 // indirect
125133
github.com/sagikazarmark/locafero v0.3.0 // indirect
126134
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
127135
github.com/sourcegraph/conc v0.3.0 // indirect
128136
github.com/spf13/afero v1.10.0 // indirect
129137
github.com/subosito/gotenv v1.6.0 // indirect
138+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
130139
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
131140
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
132-
go.opentelemetry.io/otel v1.28.0 // indirect
133-
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect
134-
go.opentelemetry.io/otel/metric v1.28.0 // indirect
135-
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
136-
go.opentelemetry.io/otel/trace v1.28.0 // indirect
141+
go.opentelemetry.io/otel/metric v1.34.0 // indirect
142+
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
137143
go.uber.org/multierr v1.11.0 // indirect
138-
golang.org/x/mod v0.17.0 // indirect
144+
golang.org/x/mod v0.18.0 // indirect
139145
golang.org/x/sync v0.10.0 // indirect
140-
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
146+
golang.org/x/tools v0.22.0 // indirect
141147
google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect
142148
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
143149
gopkg.in/djherbis/atime.v1 v1.0.0 // indirect
@@ -191,7 +197,7 @@ require (
191197
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
192198
golang.org/x/net v0.26.0 // indirect
193199
golang.org/x/oauth2 v0.21.0 // indirect
194-
golang.org/x/sys v0.28.0 // indirect
200+
golang.org/x/sys v0.29.0 // indirect
195201
golang.org/x/term v0.27.0 // indirect
196202
golang.org/x/text v0.21.0 // indirect
197203
golang.org/x/time v0.5.0

go.sum

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JY
200200
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
201201
github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
202202
github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
203+
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
204+
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
203205
github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk=
204206
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
205207
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -468,10 +470,12 @@ github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k
468470
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
469471
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
470472
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
473+
github.com/riandyrn/otelchi v0.12.1 h1:FdRKK3/RgZ/T+d+qTH5Uw3MFx0KwRF38SkdfTMMq/m8=
474+
github.com/riandyrn/otelchi v0.12.1/go.mod h1:weZZeUJURvtCcbWsdb7Y6F8KFZGedJlSrgUjq9VirV8=
471475
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
472476
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
473-
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
474-
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
477+
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
478+
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
475479
github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po=
476480
github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
477481
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
@@ -527,8 +531,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
527531
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
528532
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
529533
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
530-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
531-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
534+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
535+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
532536
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
533537
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
534538
github.com/tyler-smith/go-bip39 v0.0.0-20180618194314-52158e4697b8 h1:g3yQGZK+G6dfF/mw/SOwsTMzUVkpT4hB8pHxpbTXkKw=
@@ -574,22 +578,24 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
574578
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
575579
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
576580
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
581+
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
582+
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
577583
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg=
578584
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0=
579585
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
580586
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
581-
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
582-
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
587+
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
588+
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
583589
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
584590
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
585591
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU=
586592
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk=
587-
go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
588-
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
589-
go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
590-
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
591-
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
592-
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
593+
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
594+
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
595+
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
596+
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
597+
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
598+
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
593599
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
594600
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
595601
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -642,8 +648,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
642648
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
643649
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
644650
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
645-
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
646-
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
651+
golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
652+
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
647653
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
648654
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
649655
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -758,8 +764,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
758764
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
759765
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
760766
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
761-
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
762-
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
767+
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
768+
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
763769
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
764770
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
765771
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -834,8 +840,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
834840
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
835841
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
836842
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
837-
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
838-
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
843+
golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
844+
golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
839845
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
840846
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
841847
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

services/friendbot/docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang:1.23-bullseye as build
1+
FROM golang:1.23-bullseye AS build
22

33
ADD . /src/friendbot
44
WORKDIR /src/friendbot

services/friendbot/friendbot.cfg

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,3 @@ num_minions = 1000
77
base_fee = 100000
88
minion_batch_size = 50
99
submit_tx_retries_allowed = 5
10-

services/friendbot/internal/friendbot.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package internal
22

33
import (
4+
"context"
45
"log"
56
"sync"
67

@@ -22,14 +23,14 @@ type SubmitResult struct {
2223
}
2324

2425
// Pay funds the account at `destAddress`.
25-
func (bot *Bot) Pay(destAddress string) (*hProtocol.Transaction, error) {
26+
func (bot *Bot) Pay(ctx context.Context, destAddress string) (*hProtocol.Transaction, error) {
2627
bot.indexMux.Lock()
2728
log.Printf("Selecting minion at index %d of max length %d", bot.nextMinionIndex, len(bot.Minions))
2829
minion := bot.Minions[bot.nextMinionIndex]
2930
bot.nextMinionIndex = (bot.nextMinionIndex + 1) % len(bot.Minions)
3031
bot.indexMux.Unlock()
3132
resultChan := make(chan SubmitResult)
32-
go minion.Run(destAddress, resultChan)
33+
go minion.Run(ctx, destAddress, resultChan)
3334
maybeSubmitResult := <-resultChan
3435
close(resultChan)
3536
return maybeSubmitResult.maybeTransactionSuccess, maybeSubmitResult.maybeErr
Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,103 @@
11
package internal
22

33
import (
4+
"context"
45
"net/http"
56
"net/url"
67

78
"github.com/stellar/go/protocols/horizon"
89
"github.com/stellar/go/strkey"
910
"github.com/stellar/go/support/render/hal"
1011
"github.com/stellar/go/support/render/problem"
12+
"go.opentelemetry.io/otel"
13+
"go.opentelemetry.io/otel/attribute"
14+
"go.opentelemetry.io/otel/codes"
15+
"go.opentelemetry.io/otel/trace"
16+
)
17+
18+
const (
19+
// Tracer name for friendbot service
20+
tracerName = "stellar-friendbot"
1121
)
1222

1323
// FriendbotHandler causes an account at `Address` to be created.
1424
type FriendbotHandler struct {
1525
Friendbot *Bot
26+
tracer trace.Tracer
27+
}
28+
29+
// NewFriendbotHandler returns friendbot handler based on the tracing enabled
30+
func NewFriendbotHandler(fb *Bot) *FriendbotHandler {
31+
tracer := otel.Tracer(tracerName)
32+
return &FriendbotHandler{
33+
Friendbot: fb,
34+
tracer: tracer,
35+
}
36+
1637
}
1738

1839
// Handle is a method that implements http.HandlerFunc
1940
func (handler *FriendbotHandler) Handle(w http.ResponseWriter, r *http.Request) {
20-
result, err := handler.doHandle(r)
41+
ctx, span := handler.tracer.Start(r.Context(), "friendbot.init_http_request")
42+
defer span.End()
43+
44+
// Add request attributes to span
45+
span.SetAttributes(
46+
attribute.String("http.method", r.Method),
47+
attribute.String("http.url", r.URL.String()),
48+
attribute.String("http.user_agent", r.UserAgent()),
49+
)
50+
51+
result, err := handler.doHandle(ctx, r)
2152
if err != nil {
2253
problem.Render(r.Context(), w, err)
54+
span.SetStatus(codes.Error, err.Error())
2355
return
2456
}
2557

58+
span.SetStatus(codes.Ok, codes.Ok.String())
2659
hal.Render(w, *result)
2760
}
2861

2962
// doHandle is just a convenience method that returns the object to be rendered
30-
func (handler *FriendbotHandler) doHandle(r *http.Request) (*horizon.Transaction, error) {
63+
func (handler *FriendbotHandler) doHandle(ctx context.Context, r *http.Request) (*horizon.Transaction, error) {
64+
ctx, span := handler.tracer.Start(ctx, "friendbot.parse_http_request")
65+
defer span.End()
3166
err := r.ParseForm()
3267
if err != nil {
3368
p := problem.BadRequest
3469
p.Detail = "Request parameters are not escaped or incorrectly formatted."
70+
span.SetStatus(codes.Error, err.Error())
3571
return nil, &p
3672
}
3773

38-
address, err := handler.loadAddress(r)
74+
address, err := handler.loadAddress(ctx, r)
3975
if err != nil {
76+
span.SetStatus(codes.Error, err.Error())
4077
return nil, problem.MakeInvalidFieldProblem("addr", err)
4178
}
42-
return handler.Friendbot.Pay(address)
79+
span.SetStatus(codes.Ok, codes.Ok.String())
80+
return handler.Friendbot.Pay(ctx, address)
4381
}
4482

45-
func (handler *FriendbotHandler) loadAddress(r *http.Request) (string, error) {
83+
func (handler *FriendbotHandler) loadAddress(ctx context.Context, r *http.Request) (string, error) {
84+
_, span := handler.tracer.Start(ctx, "minion.destination_address")
85+
defer span.End()
86+
4687
address := r.Form.Get("addr")
88+
if address == "" {
89+
span.SetStatus(codes.Error, "missing destination account address")
90+
span.SetAttributes(attribute.String("error.type", "missing_parameter"))
91+
}
92+
4793
unescaped, err := url.QueryUnescape(address)
4894
if err != nil {
95+
span.SetStatus(codes.Error, err.Error())
4996
return unescaped, err
5097
}
5198

5299
_, err = strkey.Decode(strkey.VersionByteAccountID, unescaped)
100+
span.SetAttributes(attribute.String("destination.account", address))
101+
span.SetStatus(codes.Ok, codes.Ok.String())
53102
return unescaped, err
54103
}

0 commit comments

Comments
 (0)