Skip to content

Commit 11a01d3

Browse files
authored
feat: improve tracing (#13)
1 parent 7e7d5e6 commit 11a01d3

16 files changed

+243
-116
lines changed

.dockerignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Ignore everything
2+
*
3+
4+
# Allow the tunnel binary
5+
!/build/tunneld

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ LABEL \
1111
RUN adduser -D -u 1000 tunneld
1212
USER tunneld
1313

14-
COPY tunneld /
14+
COPY ./build/tunneld /
1515

1616
CMD ["/tunneld"]

Makefile

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,11 @@ build/tunneld.tag: build/tunneld
4949
version="$(VERSION)"
5050
tag="ghcr.io/coder/wgtunnel/tunneld:$${version//+/-}"
5151

52-
# make a temp directory, copy the binary into it, and build the image.
53-
temp_dir=$$(mktemp -d)
54-
cp build/tunneld "$$temp_dir"
55-
5652
docker build \
5753
--file Dockerfile \
5854
--build-arg "WGTUNNEL_VERSION=$(VERSION)" \
59-
--tag "$$tag" \
60-
"$$temp_dir"
55+
--tag "$$tag"
6156

62-
rm -rf "$$temp_dir"
6357
echo "$$tag" > "$@"
6458

6559
test:

cmd/tunneld/main.go

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

33
import (
44
"context"
5+
"errors"
56
"io"
67
"log"
78
"net/http"
@@ -121,6 +122,11 @@ func main() {
121122
Usage: "The Honeycomb team ID to send tracing data to. If not specified, tracing will not be shipped anywhere.",
122123
EnvVars: []string{"TUNNELD_TRACING_HONEYCOMB_TEAM"},
123124
},
125+
&cli.StringFlag{
126+
Name: "tracing-service-id",
127+
Usage: "The service ID to annotate all traces with that uniquely identifies this deployment.",
128+
EnvVars: []string{"TUNNELD_TRACING_SERVICE_ID"},
129+
},
124130
},
125131
Action: runApp,
126132
}
@@ -146,6 +152,7 @@ func runApp(ctx *cli.Context) error {
146152
realIPHeader = ctx.String("real-ip-header")
147153
pprofListenAddress = ctx.String("pprof-listen-address")
148154
tracingHoneycombTeam = ctx.String("tracing-honeycomb-team")
155+
tracingServiceID = ctx.String("tracing-service-id")
149156
)
150157
if baseURL == "" {
151158
return xerrors.New("base-url is required. See --help for more information.")
@@ -173,12 +180,12 @@ func runApp(ctx *cli.Context) error {
173180
if tracingHoneycombTeam != "" {
174181
exp, err := newHoneycombExporter(ctx.Context, tracingHoneycombTeam)
175182
if err != nil {
176-
return xerrors.Errorf("failed to create honeycomb telemetry exporter: %w", err)
183+
return xerrors.Errorf("create honeycomb telemetry exporter: %w", err)
177184
}
178185

179186
// Create a new tracer provider with a batch span processor and the otlp
180187
// exporter.
181-
tp := newTraceProvider(exp)
188+
tp := newTraceProvider(exp, tracingServiceID)
182189
otel.SetTracerProvider(tp)
183190
otel.SetTextMapPropagator(
184191
propagation.NewCompositeTextMapPropagator(
@@ -210,7 +217,7 @@ func runApp(ctx *cli.Context) error {
210217

211218
if wireguardKeyFile != "" {
212219
_, err = os.Stat(wireguardKeyFile)
213-
if xerrors.Is(err, os.ErrNotExist) {
220+
if errors.Is(err, os.ErrNotExist) {
214221
logger.Info(ctx.Context, "generating private key to file", slog.F("path", wireguardKeyFile))
215222
key, err := tunnelsdk.GeneratePrivateKey()
216223
if err != nil {

cmd/tunneld/tracing.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import (
77
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
88
"go.opentelemetry.io/otel/sdk/resource"
99
sdktrace "go.opentelemetry.io/otel/sdk/trace"
10-
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
10+
semconv "go.opentelemetry.io/otel/semconv/v1.11.0"
1111
"google.golang.org/grpc/credentials"
12+
13+
"github.com/coder/wgtunnel/buildinfo"
1214
)
1315

1416
func newHoneycombExporter(ctx context.Context, teamID string) (*otlptrace.Exporter, error) {
@@ -24,10 +26,12 @@ func newHoneycombExporter(ctx context.Context, teamID string) (*otlptrace.Export
2426
return otlptrace.New(ctx, client)
2527
}
2628

27-
func newTraceProvider(exp *otlptrace.Exporter) *sdktrace.TracerProvider {
29+
func newTraceProvider(exp *otlptrace.Exporter, serviceID string) *sdktrace.TracerProvider {
2830
rsc := resource.NewWithAttributes(
2931
semconv.SchemaURL,
3032
semconv.ServiceNameKey.String("WireguardTunnel"),
33+
semconv.ServiceInstanceIDKey.String(serviceID),
34+
semconv.ServiceVersionKey.String(buildinfo.Version()),
3135
)
3236

3337
return sdktrace.NewTracerProvider(

compose/.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
CLOUDFLARE_TOKEN=
2+
HONEYCOMB_TEAM=

compose/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.env

compose/Makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Use a single bash shell for each job, and immediately exit on failure
2+
SHELL := bash
3+
.SHELLFLAGS := -ceu
4+
.ONESHELL:
5+
6+
# Don't print the commands in the file unless you specify VERBOSE. This is
7+
# essentially the same as putting "@" at the start of each line.
8+
ifndef VERBOSE
9+
.SILENT:
10+
endif
11+
12+
up:
13+
pushd ..
14+
make -B build
15+
popd
16+
docker compose -p wgtunnel up --build
17+
.PHONY: up

compose/caddy/Dockerfile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
ARG CADDY_VERSION=2.6.4
2+
FROM caddy:${CADDY_VERSION}-builder AS builder
3+
4+
RUN xcaddy build \
5+
--with github.com/lucaslorentz/caddy-docker-proxy/v2 \
6+
--with github.com/caddy-dns/cloudflare
7+
8+
FROM caddy:${CADDY_VERSION}
9+
10+
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
11+
12+
CMD ["caddy", "docker-proxy"]

compose/docker-compose.yml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
version: "3.9"
2+
services:
3+
caddy:
4+
build: ./caddy
5+
ports:
6+
- 8080:80
7+
- 4443:443
8+
environment:
9+
- CADDY_INGRESS_NETWORKS=caddy
10+
networks:
11+
- caddy
12+
volumes:
13+
- /var/run/docker.sock:/var/run/docker.sock
14+
- caddy_data:/data
15+
restart: unless-stopped
16+
17+
tunnel:
18+
build: ..
19+
restart: always
20+
ports:
21+
- 55551:55551/udp
22+
networks:
23+
- caddy
24+
environment:
25+
TUNNELD_LISTEN_ADDRESS: "0.0.0.0:8080"
26+
TUNNELD_BASE_URL: "https://local.try.coder.app:4443"
27+
TUNNELD_WIREGUARD_ENDPOINT: "local.try.coder.app:55551"
28+
TUNNELD_WIREGUARD_PORT: "55551"
29+
TUNNELD_WIREGUARD_KEY_FILE: "/home/tunneld/wg.key"
30+
TUNNELD_WIREGUARD_MTU: "1280"
31+
TUNNELD_WIREGUARD_SERVER_IP: "fcca::1"
32+
TUNNELD_WIREGUARD_NETWORK_PREFIX: "fcca::/16"
33+
TUNNELD_REAL_IP_HEADER: "X-Forwarded-For"
34+
TUNNELD_PPROF_LISTEN_ADDRESS: "127.0.0.1:6060"
35+
TUNNELD_TRACING_HONEYCOMB_TEAM: "${HONEYCOMB_TEAM}"
36+
TUNNELD_TRACING_INSTANCE_ID: "local"
37+
labels:
38+
caddy: "local.try.coder.app, *.local.try.coder.app"
39+
caddy.reverse_proxy: "{{upstreams 8080}}"
40+
caddy.tls.dns: cloudflare ${CLOUDFLARE_TOKEN}
41+
42+
networks:
43+
caddy:
44+
external: true
45+
46+
volumes:
47+
caddy_data: {}

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ go 1.20
44

55
require (
66
cdr.dev/slog v1.4.1
7-
github.com/go-chi/chi v1.5.4
7+
github.com/go-chi/chi/v5 v5.0.8
8+
github.com/go-chi/hostrouter v0.2.0
89
github.com/go-chi/httprate v0.7.1
10+
github.com/riandyrn/otelchi v0.5.1
911
github.com/stretchr/testify v1.8.1
1012
github.com/urfave/cli/v2 v2.24.4
1113
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4
@@ -44,6 +46,7 @@ require (
4446
github.com/russross/blackfriday/v2 v2.1.0 // indirect
4547
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
4648
go.opencensus.io v0.24.0 // indirect
49+
go.opentelemetry.io/contrib v1.0.0 // indirect
4750
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1 // indirect
4851
go.opentelemetry.io/otel/metric v0.33.0 // indirect
4952
go.opentelemetry.io/proto/otlp v0.19.0 // indirect

go.sum

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,19 +95,26 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
9595
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
9696
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
9797
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
98+
github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
9899
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
99100
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
100101
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
101-
github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs=
102-
github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg=
102+
github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs=
103+
github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=
104+
github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
105+
github.com/go-chi/hostrouter v0.2.0 h1:GwC7TZz8+SlJN/tV/aeJgx4F+mI5+sp+5H1PelQUjHM=
106+
github.com/go-chi/hostrouter v0.2.0/go.mod h1:pJ49vWVmtsKRKZivQx0YMYv4h0aX+Gcn6V23Np9Wf1s=
103107
github.com/go-chi/httprate v0.7.1 h1:d5kXARdms2PREQfU4pHvq44S6hJ1hPu4OXLeBKmCKWs=
104108
github.com/go-chi/httprate v0.7.1/go.mod h1:6GOYBSwnpra4CQfAKXu8sQZg+nZ0M1g9QnyFvxrAB8A=
105109
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
106110
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
107111
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
112+
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
113+
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
108114
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
109115
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
110116
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
117+
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
111118
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
112119
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
113120
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -211,6 +218,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
211218
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
212219
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
213220
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
221+
github.com/riandyrn/otelchi v0.5.1 h1:0/45omeqpP7f/cvdL16GddQBfAEmZvUyl2QzLSE6uYo=
222+
github.com/riandyrn/otelchi v0.5.1/go.mod h1:ZxVxNEl+jQ9uHseRYIxKWRb3OY8YXFEu+EkNiiSNUEA=
214223
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
215224
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
216225
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@@ -248,8 +257,11 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
248257
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
249258
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
250259
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
260+
go.opentelemetry.io/contrib v1.0.0 h1:khwDCxdSspjOLmFnvMuSHd/5rPzbTx0+l6aURwtQdfE=
261+
go.opentelemetry.io/contrib v1.0.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM=
251262
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 h1:aUEBEdCa6iamGzg6fuYxDA8ThxvOG240mAvWDU+XLio=
252263
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4/go.mod h1:l2MdsbKTocpPS5nQZscqTR9jd8u96VYZdcpF8Sye7mA=
264+
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
253265
go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4=
254266
go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE=
255267
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1 h1:X2GndnMCsUPh6CiY2a+frAbNsXaPLbB0soHRYhAZ5Ig=
@@ -260,8 +272,10 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1 h1:LYyG/
260272
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1/go.mod h1:QrRRQiY3kzAoYPNLP0W/Ikg0gR6V3LMc+ODSxr7yyvg=
261273
go.opentelemetry.io/otel/metric v0.33.0 h1:xQAyl7uGEYvrLAiV/09iTJlp1pZnQ9Wl793qbVvED1E=
262274
go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI=
275+
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
263276
go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs=
264277
go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys=
278+
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
265279
go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ=
266280
go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk=
267281
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
@@ -414,6 +428,7 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w
414428
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
415429
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
416430
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
431+
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
417432
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
418433
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
419434
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

0 commit comments

Comments
 (0)