Skip to content

Commit 6ebd584

Browse files
author
anahan
committed
Move phpfpm.SlowlogEntry encoder to separate pkg
1 parent dfa3681 commit 6ebd584

2 files changed

Lines changed: 108 additions & 95 deletions

File tree

cmd/docker-fpm-wrapper/slowlog.go

Lines changed: 5 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -4,116 +4,26 @@ import (
44
"context"
55
"fmt"
66
"os"
7-
"path"
8-
"sort"
97

108
"go.uber.org/zap"
11-
"go.uber.org/zap/zapcore"
129
"golang.org/x/sys/unix"
1310

11+
"github.com/code-tool/docker-fpm-wrapper/internal/zapx"
1412
"github.com/code-tool/docker-fpm-wrapper/pkg/phpfpm"
1513
)
1614

17-
type slowlogToZapEncoder struct {
18-
strBuf []string
19-
}
20-
21-
func (sle *slowlogToZapEncoder) reset() {
22-
sle.strBuf = sle.strBuf[:0]
23-
}
24-
25-
func (sle *slowlogToZapEncoder) add(s string) {
26-
if l := len(sle.strBuf); l > 1 && sle.strBuf[l-1] == s {
27-
return
28-
}
29-
30-
i := sort.SearchStrings(sle.strBuf, s)
31-
sle.strBuf = append(sle.strBuf, "")
32-
copy(sle.strBuf[i+1:], sle.strBuf[i:])
33-
34-
sle.strBuf[i] = s
35-
}
36-
37-
func (sle *slowlogToZapEncoder) addDir(p string) {
38-
sle.add(path.Dir(p))
39-
}
40-
41-
func (sle *slowlogToZapEncoder) longestCommonPrefOffset() int {
42-
offset := 0
43-
endPrefix := false
44-
45-
if len(sle.strBuf) <= 0 {
46-
return 0
47-
}
48-
49-
first := sle.strBuf[0]
50-
last := sle.strBuf[len(sle.strBuf)-1]
51-
52-
for i := 0; i < len(first); i++ {
53-
if !endPrefix && string(last[i]) == string(first[i]) {
54-
offset = i + 1
55-
} else {
56-
endPrefix = true
57-
}
58-
}
59-
60-
return offset
61-
}
62-
63-
func (sle *slowlogToZapEncoder) encodeStacktraceEntry(encoder zapcore.ObjectEncoder, entry phpfpm.SlowlogTraceEntry, pathOffset int) {
64-
encoder.AddString("path", entry.Path[pathOffset:])
65-
encoder.AddString("func", entry.FunName)
66-
encoder.AddInt("line", entry.Line)
67-
}
68-
69-
func (sle *slowlogToZapEncoder) encodeStacktrace(stacktrace []phpfpm.SlowlogTraceEntry, pathOffset int) zap.Field {
70-
return zap.Array("trace", zapcore.ArrayMarshalerFunc(func(encoder zapcore.ArrayEncoder) error {
71-
for i := range stacktrace {
72-
err := encoder.AppendObject(
73-
zapcore.ObjectMarshalerFunc(func(encoder zapcore.ObjectEncoder) error {
74-
sle.encodeStacktraceEntry(encoder, stacktrace[i], pathOffset)
75-
76-
return nil
77-
}),
78-
)
79-
80-
if err != nil {
81-
return err
82-
}
83-
}
84-
85-
return nil
86-
}))
87-
}
88-
89-
func (sle *slowlogToZapEncoder) Encode(entry phpfpm.SlowlogEntry) []zap.Field {
90-
sle.reset()
91-
92-
sle.addDir(entry.ScriptFilename)
93-
for i := range entry.Stacktrace {
94-
sle.addDir(entry.Stacktrace[i].Path)
95-
}
96-
97-
pathOffset := sle.longestCommonPrefOffset()
98-
99-
return []zap.Field{
100-
zap.String("filename", entry.ScriptFilename[pathOffset:]),
101-
sle.encodeStacktrace(entry.Stacktrace, pathOffset),
102-
}
103-
}
104-
10515
func startSlowlogProxyForPool(ctx context.Context, pool phpfpm.Pool, out chan phpfpm.SlowlogEntry) error {
10616
if err := os.Remove(pool.SlowlogPath); err != nil && !os.IsNotExist(err) {
107-
return err
17+
return fmt.Errorf("can't remove slowlog file: %w", err)
10818
}
10919

11020
if err := unix.Mkfifo(pool.SlowlogPath, 0666); err != nil {
111-
return err
21+
return fmt.Errorf("can't create linux pipe for slowlog: %w", err)
11222
}
11323

11424
fifoF, err := os.OpenFile(pool.SlowlogPath, os.O_RDWR, os.ModeNamedPipe)
11525
if err != nil {
116-
fmt.Println("Couldn't open pipe with error: ", err)
26+
return fmt.Errorf("can't open pipe with error: %w", err)
11727
}
11828

11929
go func() {
@@ -133,7 +43,7 @@ func startSlowlogProxyForPool(ctx context.Context, pool phpfpm.Pool, out chan ph
13343
func startSlowlogProxies(ctx context.Context, fpmConfig phpfpm.Config, log *zap.Logger) error {
13444
outCh := make(chan phpfpm.SlowlogEntry)
13545
go func() {
136-
slowlogEnc := &slowlogToZapEncoder{strBuf: make([]string, 0, 16)}
46+
slowlogEnc := zapx.NewSlowlogEncoder()
13747
for {
13848
select {
13949
case <-ctx.Done():

internal/zapx/slowlog_enc.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package zapx
2+
3+
import (
4+
"path"
5+
"sort"
6+
7+
"go.uber.org/zap"
8+
"go.uber.org/zap/zapcore"
9+
10+
"github.com/code-tool/docker-fpm-wrapper/pkg/phpfpm"
11+
)
12+
13+
type SlowlogEncoder struct {
14+
strBuf []string
15+
}
16+
17+
func NewSlowlogEncoder() *SlowlogEncoder {
18+
return &SlowlogEncoder{strBuf: make([]string, 0)}
19+
}
20+
21+
func (sle *SlowlogEncoder) reset() {
22+
sle.strBuf = sle.strBuf[:0]
23+
}
24+
25+
func (sle *SlowlogEncoder) add(s string) {
26+
if l := len(sle.strBuf); l > 1 && sle.strBuf[l-1] == s {
27+
return
28+
}
29+
30+
i := sort.SearchStrings(sle.strBuf, s)
31+
sle.strBuf = append(sle.strBuf, "")
32+
copy(sle.strBuf[i+1:], sle.strBuf[i:])
33+
34+
sle.strBuf[i] = s
35+
}
36+
37+
func (sle *SlowlogEncoder) addDir(p string) {
38+
sle.add(path.Dir(p))
39+
}
40+
41+
func (sle *SlowlogEncoder) longestCommonPrefOffset() int {
42+
offset := 0
43+
endPrefix := false
44+
45+
if len(sle.strBuf) <= 0 {
46+
return 0
47+
}
48+
49+
first := sle.strBuf[0]
50+
last := sle.strBuf[len(sle.strBuf)-1]
51+
52+
for i := 0; i < len(first); i++ {
53+
if !endPrefix && last[i] == first[i] {
54+
offset = i + 1
55+
} else {
56+
endPrefix = true
57+
}
58+
}
59+
60+
return offset
61+
}
62+
63+
func (sle *SlowlogEncoder) encodeStacktraceEntry(encoder zapcore.ObjectEncoder, entry phpfpm.SlowlogTraceEntry, pathOffset int) {
64+
encoder.AddString("path", entry.Path[pathOffset:])
65+
encoder.AddString("func", entry.FunName)
66+
encoder.AddInt("line", entry.Line)
67+
}
68+
69+
func (sle *SlowlogEncoder) encodeStacktrace(stacktrace []phpfpm.SlowlogTraceEntry, pathOffset int) zap.Field {
70+
return zap.Array("trace", zapcore.ArrayMarshalerFunc(func(encoder zapcore.ArrayEncoder) error {
71+
for i := range stacktrace {
72+
err := encoder.AppendObject(
73+
zapcore.ObjectMarshalerFunc(func(encoder zapcore.ObjectEncoder) error {
74+
sle.encodeStacktraceEntry(encoder, stacktrace[i], pathOffset)
75+
76+
return nil
77+
}),
78+
)
79+
80+
if err != nil {
81+
return err
82+
}
83+
}
84+
85+
return nil
86+
}))
87+
}
88+
89+
func (sle *SlowlogEncoder) Encode(entry phpfpm.SlowlogEntry) []zap.Field {
90+
sle.reset()
91+
92+
sle.addDir(entry.ScriptFilename)
93+
for i := range entry.Stacktrace {
94+
sle.addDir(entry.Stacktrace[i].Path)
95+
}
96+
97+
pathOffset := sle.longestCommonPrefOffset()
98+
99+
return []zap.Field{
100+
zap.String("filename", entry.ScriptFilename[pathOffset:]),
101+
sle.encodeStacktrace(entry.Stacktrace, pathOffset),
102+
}
103+
}

0 commit comments

Comments
 (0)