@@ -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-
10515func 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
13343func 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 ():
0 commit comments