Skip to content
This repository was archived by the owner on Aug 17, 2020. It is now read-only.

Commit 5a1148d

Browse files
committed
changes
1 parent ecdca21 commit 5a1148d

File tree

3 files changed

+80
-56
lines changed

3 files changed

+80
-56
lines changed

autoinstrument/init.go

+29-21
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,39 @@ var (
1818

1919
func init() {
2020
once.Do(func() {
21-
var m *testing.M
22-
var mRunMethod reflect.Method
23-
var ok bool
24-
mType := reflect.TypeOf(m)
25-
if mRunMethod, ok = mType.MethodByName("Run"); !ok {
26-
return
27-
}
28-
29-
var runPatch *mpatch.Patch
30-
var err error
31-
runPatch, err = mpatch.PatchMethodByReflect(mRunMethod, func(m *testing.M) int {
32-
logOnError(runPatch.Unpatch())
33-
defer func() {
34-
logOnError(runPatch.Patch())
35-
}()
36-
scopetesting.PatchTestingLogger()
37-
defer scopetesting.UnpatchTestingLogger()
38-
return scopeagent.Run(m)
39-
})
40-
logOnError(err)
21+
patchMRun()
22+
scopetesting.PatchTRun()
23+
scopetesting.PatchBRun()
4124
})
4225
}
4326

44-
func logOnError(err error) {
27+
func patchMRun() {
28+
var m *testing.M
29+
var mRunMethod reflect.Method
30+
var ok bool
31+
mType := reflect.TypeOf(m)
32+
if mRunMethod, ok = mType.MethodByName("Run"); !ok {
33+
return
34+
}
35+
36+
var runPatch *mpatch.Patch
37+
var err error
38+
runPatch, err = mpatch.PatchMethodByReflect(mRunMethod, func(m *testing.M) int {
39+
logOnError(runPatch.Unpatch())
40+
defer func() {
41+
logOnError(runPatch.Patch())
42+
}()
43+
scopetesting.PatchTestingLogger()
44+
defer scopetesting.UnpatchTestingLogger()
45+
return scopeagent.Run(m)
46+
})
47+
logOnError(err)
48+
}
49+
50+
func logOnError(err error) bool {
4551
if err != nil {
4652
instrumentation.Logger().Println(err)
53+
return true
4754
}
55+
return false
4856
}

instrumentation/testing/init.go

+47-32
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package testing
22

33
import (
44
"flag"
5-
"os"
65
"reflect"
76
"runtime"
87
"testing"
@@ -14,7 +13,9 @@ import (
1413
)
1514

1615
var (
17-
parallel int
16+
parallel int
17+
tRunPatched bool
18+
bRunPatched bool
1819
)
1920

2021
// Initialize the testing instrumentation
@@ -54,7 +55,7 @@ func Init(m *testing.M) {
5455
benchmarks = append(benchmarks, testing.InternalBenchmark{
5556
Name: benchmark.Name,
5657
F: func(b *testing.B) { // Indirection of the original benchmark
57-
if envDMPatch, set := os.LookupEnv("SCOPE_DISABLE_MONKEY_PATCHING"); !set || envDMPatch == "" {
58+
if bRunPatched {
5859
funcValue(b)
5960
} else {
6061
startBenchmark(b, funcPointer, funcValue)
@@ -64,36 +65,50 @@ func Init(m *testing.M) {
6465
}
6566
*intBenchmarks = benchmarks
6667
}
68+
}
6769

68-
if envDMPatch, set := os.LookupEnv("SCOPE_DISABLE_MONKEY_PATCHING"); !set || envDMPatch == "" {
69-
// We monkey patch the `testing.T.Run()` func to auto instrument sub tests
70-
var t *testing.T
71-
tType := reflect.TypeOf(t)
72-
if tRunMethod, ok := tType.MethodByName("Run"); ok {
73-
_, err := mpatch.PatchMethodByReflect(tRunMethod, func(t *testing.T, name string, f func(t *testing.T)) bool {
74-
pc, _, _, _ := runtime.Caller(1)
75-
gT := FromTestingT(t)
76-
return gT.Run(name, func(childT *testing.T) {
77-
addAutoInstrumentedTest(childT)
78-
childTest := StartTestFromCaller(childT, pc)
79-
defer childTest.end()
80-
f(childT)
81-
})
82-
})
83-
logOnError(err)
84-
}
70+
func PatchTRun() {
71+
// We monkey patch the `testing.T.Run()` func to auto instrument sub tests
72+
var t *testing.T
73+
var tRunMethod reflect.Method
74+
var ok bool
75+
tType := reflect.TypeOf(t)
76+
if tRunMethod, ok = tType.MethodByName("Run"); !ok {
77+
return
78+
}
8579

86-
// We monkey patch the `testing.B.Run()` func to auto instrument sub benchmark
87-
var b *testing.B
88-
bType := reflect.TypeOf(b)
89-
if bRunMethod, ok := bType.MethodByName("Run"); ok {
90-
_, err := mpatch.PatchMethodByReflect(bRunMethod, func(b *testing.B, name string, f func(b *testing.B)) bool {
91-
pc, _, _, _ := runtime.Caller(1)
92-
return FromTestingB(b).Run(name, func(b *testing.B) {
93-
StartBenchmark(b, pc, f)
94-
})
95-
})
96-
logOnError(err)
97-
}
80+
_, err := mpatch.PatchMethodByReflect(tRunMethod, func(t *testing.T, name string, f func(t *testing.T)) bool {
81+
pc, _, _, _ := runtime.Caller(1)
82+
gT := FromTestingT(t)
83+
return gT.Run(name, func(childT *testing.T) {
84+
addAutoInstrumentedTest(childT)
85+
childTest := StartTestFromCaller(childT, pc)
86+
defer childTest.end()
87+
f(childT)
88+
})
89+
})
90+
if !logOnError(err) {
91+
tRunPatched = true
92+
}
93+
}
94+
95+
func PatchBRun() {
96+
// We monkey patch the `testing.B.Run()` func to auto instrument sub benchmark
97+
var b *testing.B
98+
var bRunMethod reflect.Method
99+
var ok bool
100+
bType := reflect.TypeOf(b)
101+
if bRunMethod, ok = bType.MethodByName("Run"); !ok {
102+
return
103+
}
104+
105+
_, err := mpatch.PatchMethodByReflect(bRunMethod, func(b *testing.B, name string, f func(b *testing.B)) bool {
106+
pc, _, _, _ := runtime.Caller(1)
107+
return FromTestingB(b).Run(name, func(b *testing.B) {
108+
StartBenchmark(b, pc, f)
109+
})
110+
})
111+
if !logOnError(err) {
112+
bRunPatched = true
98113
}
99114
}

instrumentation/testing/logger.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -149,17 +149,18 @@ func patch(methodName string, methodBody func(test *Test, argsValues []reflect.V
149149
methodBody(test, in[1:])
150150
return nil
151151
})
152-
logOnError(err)
153-
if err == nil {
152+
if !logOnError(err) {
154153
patches[methodName] = methodPatch
155154
patchPointers[reflect.ValueOf(methodBody).Pointer()] = true
156155
}
157156
}
158157

159-
func logOnError(err error) {
158+
func logOnError(err error) bool {
160159
if err != nil {
161160
instrumentation.Logger().Println(err)
161+
return true
162162
}
163+
return false
163164
}
164165

165166
func isAPatchPointer(ptr uintptr) bool {

0 commit comments

Comments
 (0)