Skip to content

Commit 634f0bf

Browse files
committed
add otel to bash/
1 parent 102a835 commit 634f0bf

9 files changed

Lines changed: 139 additions & 58 deletions

File tree

bash/bash.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package bash
33
import (
44
"bufio"
55
"bytes"
6+
"context"
67
"fmt"
78
"io"
89
"net"
@@ -15,8 +16,12 @@ import (
1516
"github.com/lainio/err2"
1617
. "github.com/lainio/err2/try"
1718
"github.com/vscode-lcode/lcode/v2/bash/webdav"
19+
"github.com/vscode-lcode/lcode/v2/util/err0"
20+
"go.opentelemetry.io/otel"
1821
)
1922

23+
const name = "bash"
24+
2025
type Bash struct {
2126
clients *ttlcache.Cache[string, *webdav.Client]
2227

@@ -54,9 +59,11 @@ func (sh *Bash) Serve(l net.Listener) (err error) {
5459
}
5560

5661
func (sh *Bash) serve(conn net.Conn) (err error) {
62+
_, span := otel.Tracer(name).Start(context.Background(), "serve conn")
63+
defer span.End()
64+
defer err0.Record(&err, span)
5765
defer err2.Handle(&err, func() {
5866
conn.Close()
59-
fmt.Println("serve err:", err)
6067
})
6168

6269
r := bufio.NewReader(conn)

bash/connect.go

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

33
import (
44
"bufio"
5+
"context"
56
"errors"
67
"fmt"
78
"io"
@@ -14,6 +15,8 @@ import (
1415
"github.com/lainio/err2"
1516
. "github.com/lainio/err2/try"
1617
"github.com/vscode-lcode/lcode/v2/bash/webdav"
18+
"github.com/vscode-lcode/lcode/v2/util/err0"
19+
"go.opentelemetry.io/otel"
1720
)
1821

1922
type ID interface {
@@ -31,6 +34,8 @@ type IDGenerator func(client LcodeClient) (ID, error)
3134

3235
func (sh *Bash) Connect(r *bufio.Reader, conn net.Conn) (err error) {
3336
defer conn.Close()
37+
_, span := otel.Tracer(name).Start(context.Background(), "client connect")
38+
defer span.End()
3439
defer err2.Handle(&err, func() {
3540
if errors.Is(err, io.EOF) {
3641
return
@@ -43,7 +48,7 @@ func (sh *Bash) Connect(r *bufio.Reader, conn net.Conn) (err error) {
4348
if errors.Is(err, webdav.ErrPrintHelp) {
4449
return
4550
}
46-
fmt.Println("client connect", err)
51+
err0.Record(&err, span)
4752
})
4853

4954
io.WriteString(conn, "export PS1=''\n")

bash/webdav/client.go

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,14 @@ import (
2121
"github.com/jellydator/ttlcache/v3"
2222
"github.com/lainio/err2"
2323
. "github.com/lainio/err2/try"
24+
"github.com/vscode-lcode/lcode/v2/util/err0"
25+
"go.opentelemetry.io/otel"
26+
"go.opentelemetry.io/otel/attribute"
27+
"go.opentelemetry.io/otel/trace"
2428
)
2529

30+
const name = "bash/webdav"
31+
2632
type Client struct {
2733
conn net.Conn
2834
ID string
@@ -32,7 +38,7 @@ type Client struct {
3238
targets []string
3339
targetsInit *sync.Once
3440

35-
Logger func(file *File, err error)
41+
Ctx context.Context
3642
closed *multicast.Channel[any]
3743

3844
statsLocker *ttlcache.Cache[string, *StatWithLocker]
@@ -62,22 +68,24 @@ func NewClient(conn net.Conn) *Client {
6268
return c
6369
}
6470

65-
func (c *Client) log(err error) {
66-
if c.Logger == nil {
67-
return
68-
}
69-
c.Logger(nil, err)
70-
}
7171
func (c *Client) Open(r *bufio.Reader, version string, id string) (err error) {
72-
defer err2.Handle(&err, func() {
73-
c.log(fmt.Errorf("bash client start failed: %w", err))
74-
})
72+
ctx, span := otel.Tracer(name).Start(context.Background(), "client open")
73+
c.Ctx = ctx
74+
defer err0.Record(&err, span)
75+
7576
To(c.parseArgs(r, version))
7677
To(c.initServerAddr(r, id))
7778
To(c.initID(r))
7879
To(c.initPWD(r))
7980
go c.tasks.Start()
8081
go c.statsLocker.Start()
82+
83+
span.SetAttributes(
84+
attribute.String("host", c.ID),
85+
attribute.String("pwd", c.PWD),
86+
attribute.StringSlice("targets", c.targets),
87+
)
88+
8189
return
8290
}
8391

@@ -94,9 +102,10 @@ func (c *Client) intFlag(version string) *flag.FlagSet {
94102
return f
95103
}
96104
func (c *Client) parseArgs(r *bufio.Reader, version string) (err error) {
97-
defer err2.Handle(&err, func() {
98-
c.log(fmt.Errorf("parse lcode args failed: %w", err))
99-
})
105+
_, span := otel.Tracer(name).Start(c.Ctx, "client parse lcode args")
106+
defer span.End()
107+
defer err0.Record(&err, span)
108+
100109
To1(io.WriteString(c.conn, "echo $@\n"))
101110
line, _ := To2(r.ReadLine())
102111

@@ -117,12 +126,15 @@ func (c *Client) parseArgs(r *bufio.Reader, version string) (err error) {
117126
}
118127

119128
func (c *Client) initServerAddr(r *bufio.Reader, id string) (err error) {
129+
_, span := otel.Tracer(name).Start(c.Ctx, "client init server addr")
130+
defer span.End()
131+
defer err0.Record(&err, span)
120132
defer err2.Handle(&err, func() {
121-
if errors.Is(err, ErrNeedPrint) {
122-
return
133+
if !errors.Is(err, ErrNeedPrint) {
134+
err = ErrServerAddrIncorrect
123135
}
124-
err = ErrServerAddrIncorrect
125136
})
137+
126138
addr, err := net.ResolveTCPAddr("tcp", c.ServerAddr)
127139
if err != nil {
128140
return ErrServerAddrParseFailed
@@ -141,9 +153,10 @@ func (c *Client) initServerAddr(r *bufio.Reader, id string) (err error) {
141153
}
142154

143155
func (c *Client) initID(r *bufio.Reader) (err error) {
144-
defer err2.Handle(&err, func() {
145-
c.log(fmt.Errorf("got default init id failed: %w", err))
146-
})
156+
_, span := otel.Tracer(name).Start(c.Ctx, "client init id")
157+
defer span.End()
158+
defer err0.Record(&err, span)
159+
147160
cmd := "echo $(2>/dev/null dd if=~/.lcode-id || echo 0)-$(2>/dev/null dd if=/proc/sys/kernel/hostname)\n"
148161
To1(io.WriteString(c.conn, cmd))
149162
line, _ := To2(r.ReadLine())
@@ -158,9 +171,10 @@ func (c *Client) StoreID(id string) (err error) {
158171
}
159172

160173
func (c *Client) initPWD(r *bufio.Reader) (err error) {
161-
defer err2.Handle(&err, func() {
162-
c.log(fmt.Errorf("init pwd failed: %w", err))
163-
})
174+
_, span := otel.Tracer(name).Start(c.Ctx, "client init pwd")
175+
defer span.End()
176+
defer err0.Record(&err, span)
177+
164178
To1(io.WriteString(c.conn, "pwd\n"))
165179
pwd, _ := To2(r.ReadLine())
166180
c.PWD = string(pwd)
@@ -198,6 +212,8 @@ func (c *Client) Targets() []string {
198212
}
199213

200214
func (c *Client) Close() {
215+
defer trace.SpanFromContext(c.Ctx).End()
216+
201217
c.tasks.DeleteAll()
202218
c.tasks.Stop()
203219

bash/webdav/file.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,15 @@ import (
1313
"github.com/alessio/shellescape"
1414
"github.com/lainio/err2"
1515
. "github.com/lainio/err2/try"
16+
"github.com/vscode-lcode/lcode/v2/util/err0"
17+
"go.opentelemetry.io/otel"
1618
)
1719

18-
func (f *File) log(err error) {
19-
if f.c.Logger == nil {
20-
return
21-
}
22-
f.c.Logger(f, err)
23-
}
24-
2520
func (f *File) Readdir(count int) (files []fs.FileInfo, err error) {
26-
defer err2.Handle(&err, func() {
27-
f.log(fmt.Errorf("readdir err: %w", err))
28-
})
21+
_, span := otel.Tracer(name).Start(f.Ctx, "file readdir")
22+
defer span.End()
23+
defer err0.Record(&err, span)
24+
2925
list := To1(f.readdir(count))
3026
var wg sync.WaitGroup
3127
wg.Add(len(list))
@@ -83,12 +79,15 @@ func (f *File) _Stat() (finfo fs.FileInfo, err error) {
8379
return
8480
}
8581
func (f *File) _GetStat() (finfo fs.FileInfo, err error) {
82+
_, span := otel.Tracer(name).Start(f.Ctx, "file stat")
83+
defer span.End()
8684
defer err2.Handle(&err, func() {
8785
if errors.Is(err, os.ErrNotExist) {
8886
return
8987
}
90-
f.log(fmt.Errorf("stat err: %w", err))
88+
err0.Record(&err, span)
9189
})
90+
9291
cmd := fmt.Sprintf("TZ=UTC0 ls -Ald --full-time %s", shellescape.Quote(f.name))
9392
conn := To1(f.c.Exec(cmd))
9493
defer conn.Close()

bash/webdav/file2.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package webdav
22

33
import (
4+
"context"
45
"errors"
56
"fmt"
67
"io"
@@ -13,10 +14,16 @@ import (
1314
"github.com/alessio/shellescape"
1415
"github.com/lainio/err2"
1516
. "github.com/lainio/err2/try"
17+
"github.com/vscode-lcode/lcode/v2/util/err0"
18+
"go.opentelemetry.io/otel"
19+
"go.opentelemetry.io/otel/attribute"
20+
"go.opentelemetry.io/otel/trace"
1621
"golang.org/x/net/webdav"
1722
)
1823

1924
type File struct {
25+
Ctx context.Context
26+
2027
c *Client
2128
name string
2229
cursor int64
@@ -40,7 +47,13 @@ var _ webdav.File = (*File)(nil)
4047
var no uint64 = 0
4148

4249
func OpenFile(c *Client, filename string) *File {
50+
ctx, span := otel.Tracer(name).Start(c.Ctx, "file open")
51+
span.SetAttributes(
52+
attribute.String("filepath", filename),
53+
)
4354
return &File{
55+
Ctx: ctx,
56+
4457
no: atomic.AddUint64(&no, 1),
4558

4659
c: c,
@@ -53,6 +66,8 @@ func OpenFile(c *Client, filename string) *File {
5366
}
5467

5568
func (f *File) Close() error {
69+
defer trace.SpanFromContext(f.Ctx).End()
70+
5671
if f.reader != nil {
5772
f.reader.Close()
5873
}
@@ -65,12 +80,15 @@ func (f *File) Close() error {
6580
}
6681

6782
func (f *File) Read(p []byte) (n int, err error) {
83+
_, span := otel.Tracer(name).Start(f.Ctx, "file read")
84+
defer span.End()
6885
defer err2.Handle(&err, func() {
6986
if errors.Is(err, io.EOF) {
7087
return
7188
}
72-
f.log(fmt.Errorf("read err: %w", err))
89+
err0.Record(&err, span)
7390
})
91+
7492
stat := To1(f.Stat())
7593
if stat.IsDir() {
7694
return 0, io.EOF
@@ -90,9 +108,10 @@ func (f *File) Read(p []byte) (n int, err error) {
90108
}
91109

92110
func (f *File) Write(p []byte) (n int, err error) {
93-
defer err2.Handle(&err, func() {
94-
fmt.Println("write err:", err)
95-
})
111+
_, span := otel.Tracer(name).Start(f.Ctx, "file write")
112+
defer span.End()
113+
defer err0.Record(&err, span)
114+
96115
f.writerInit.Do(func() {
97116
cmd := fmt.Sprintf("dd of=%s seek=%d", shellescape.Quote(f.name), f.cursor)
98117
cmd = fmt.Sprintf("%s %s", cmd, "oflag=seek_bytes")
@@ -108,8 +127,10 @@ func (f *File) Write(p []byte) (n int, err error) {
108127
}
109128

110129
func (f *File) Seek(offset int64, whence int) (n int64, err error) {
130+
_, span := otel.Tracer(name).Start(f.Ctx, "file seek")
131+
defer span.End()
111132
defer err2.Handle(&err, func() {
112-
f.log(fmt.Errorf("seek err: %w", err))
133+
span.RecordError(err)
113134
})
114135
switch whence {
115136
case io.SeekStart:

0 commit comments

Comments
 (0)