@@ -21,15 +21,16 @@ import (
2121	"net/http" 
2222	"testing" 
2323
24- 	"github.com/pkg/errors" 
2524	"github.com/stretchr/testify/assert" 
2625	"github.com/stretchr/testify/require" 
2726	"go.uber.org/zap/zapcore" 
2827
2928	"go.elastic.co/apm" 
3029	"go.elastic.co/apm/apmtest" 
3130
31+ 	"github.com/elastic/beats/v7/libbeat/common" 
3232	"github.com/elastic/beats/v7/libbeat/logp" 
33+ 	"github.com/elastic/beats/v7/libbeat/logp/configure" 
3334
3435	"github.com/elastic/apm-server/beater/beatertest" 
3536	"github.com/elastic/apm-server/beater/headers" 
@@ -38,31 +39,30 @@ import (
3839)
3940
4041func  TestLogMiddleware (t  * testing.T ) {
41- 	err  :=  logp .DevelopmentSetup (logp .ToObserverOutput ())
42- 	require .NoError (t , err )
4342
4443	testCases  :=  []struct  {
4544		name , message  string 
4645		level          zapcore.Level 
4746		handler        request.Handler 
4847		code           int 
49- 		error          error 
50- 		stacktrace     bool 
5148		traced         bool 
49+ 		ecsKeys        []string 
5250	}{
5351		{
5452			name :    "Accepted" ,
5553			message : "request accepted" ,
5654			level :   zapcore .InfoLevel ,
5755			handler : beatertest .Handler202 ,
5856			code :    http .StatusAccepted ,
57+ 			ecsKeys : []string {"url.original" },
5958		},
6059		{
6160			name :    "Traced" ,
6261			message : "request accepted" ,
6362			level :   zapcore .InfoLevel ,
6463			handler : beatertest .Handler202 ,
6564			code :    http .StatusAccepted ,
65+ 			ecsKeys : []string {"url.original" , "trace.id" , "transaction.id" },
6666			traced :  true ,
6767		},
6868		{
@@ -71,16 +71,15 @@ func TestLogMiddleware(t *testing.T) {
7171			level :   zapcore .ErrorLevel ,
7272			handler : beatertest .Handler403 ,
7373			code :    http .StatusForbidden ,
74- 			error :    errors . New ( "forbidden request" ) ,
74+ 			ecsKeys : [] string { "url.original" ,  "error.message" } ,
7575		},
7676		{
77- 			name :       "Panic" ,
78- 			message :    "internal error" ,
79- 			level :      zapcore .ErrorLevel ,
80- 			handler :    Apply (RecoverPanicMiddleware (), beatertest .HandlerPanic ),
81- 			code :       http .StatusInternalServerError ,
82- 			error :      errors .New ("panic on Handle" ),
83- 			stacktrace : true ,
77+ 			name :    "Panic" ,
78+ 			message : "internal error" ,
79+ 			level :   zapcore .ErrorLevel ,
80+ 			handler : Apply (RecoverPanicMiddleware (), beatertest .HandlerPanic ),
81+ 			code :    http .StatusInternalServerError ,
82+ 			ecsKeys : []string {"url.original" , "error.message" , "error.stack_trace" },
8483		},
8584		{
8685			name :    "Error without keyword" ,
@@ -90,12 +89,19 @@ func TestLogMiddleware(t *testing.T) {
9089				c .Result .StatusCode  =  http .StatusForbidden 
9190				c .Write ()
9291			},
93- 			code : http .StatusForbidden ,
92+ 			code :    http .StatusForbidden ,
93+ 			ecsKeys : []string {"url.original" },
9494		},
9595	}
9696
9797	for  _ , tc  :=  range  testCases  {
9898		t .Run (tc .name , func (t  * testing.T ) {
99+ 			// log setup 
100+ 			configure .Logging ("APM Server test" ,
101+ 				common .MustNewConfigFrom (`{"ecs":true}` ))
102+ 			require .NoError (t , logp .DevelopmentSetup (logp .ToObserverOutput ()))
103+ 
104+ 			// prepare and record request 
99105			c , rec  :=  beatertest .DefaultContextWithResponseRecorder ()
100106			c .Request .Header .Set (headers .UserAgent , tc .name )
101107			if  tc .traced  {
@@ -105,39 +111,27 @@ func TestLogMiddleware(t *testing.T) {
105111			}
106112			Apply (LogMiddleware (), tc .handler )(c )
107113
114+ 			// check log lines 
108115			assert .Equal (t , tc .code , rec .Code )
109- 			for   i ,  entry   :=  range   logp .ObserverLogs ().TakeAll () { 
110- 				 // expect only one log entry per request 
111- 				 assert . Equal ( t ,  i ,  0 ) 
112- 				 assert .Equal (t , logs .Request , entry .LoggerName )
113- 				 assert .Equal (t , tc .level , entry .Level )
114- 				 assert .Equal (t , tc .message , entry .Message )
116+ 			entries   :=  logp .ObserverLogs ().TakeAll ()
117+ 			require . Equal ( t ,  1 ,  len ( entries )) 
118+ 			entry   :=   entries [ 0 ] 
119+ 			assert .Equal (t , logs .Request , entry .LoggerName )
120+ 			assert .Equal (t , tc .level , entry .Level )
121+ 			assert .Equal (t , tc .message , entry .Message )
115122
116- 				ec  :=  entry .ContextMap ()
117- 				t .Logf ("context map: %v" , ec )
118- 
119- 				assert .NotEmpty (t , ec ["request_id" ])
120- 				assert .NotEmpty (t , ec ["method" ])
121- 				assert .Equal (t , c .Request .URL .String (), ec ["URL" ])
122- 				assert .NotEmpty (t , ec ["remote_address" ])
123- 				assert .Contains (t , ec , "event.duration" )
124- 				assert .Equal (t , c .Request .Header .Get (headers .UserAgent ), ec ["user-agent" ])
125- 				// zap encoded type 
126- 				assert .Equal (t , tc .code , int (ec ["response_code" ].(int64 )))
127- 				if  tc .error  !=  nil  {
128- 					assert .Equal (t , tc .error .Error (), ec ["error" ])
129- 				}
130- 				if  tc .stacktrace  {
131- 					assert .NotZero (t , ec ["stacktrace" ])
132- 				}
133- 				if  tc .traced  {
134- 					assert .NotEmpty (t , ec , "trace.id" )
135- 					assert .NotEmpty (t , ec , "transaction.id" )
136- 					assert .Equal (t , ec ["request_id" ], ec ["transaction.id" ])
137- 				} else  {
138- 					assert .NotContains (t , ec , "trace.id" )
139- 					assert .NotContains (t , ec , "transaction.id" )
140- 				}
123+ 			encoder  :=  zapcore .NewMapObjectEncoder ()
124+ 			ec  :=  common.MapStr {}
125+ 			for  _ , f  :=  range  entry .Context  {
126+ 				f .AddTo (encoder )
127+ 				ec .DeepUpdate (encoder .Fields )
128+ 			}
129+ 			keys  :=  []string {"http.request.id" , "http.request.method" , "http.request.body.bytes" ,
130+ 				"source.address" , "user_agent.original" , "http.response.status_code" , "event.duration" }
131+ 			keys  =  append (keys , tc .ecsKeys ... )
132+ 			for  _ , key  :=  range  keys  {
133+ 				ok , _  :=  ec .HasKey (key )
134+ 				assert .True (t , ok , key )
141135			}
142136		})
143137	}
0 commit comments