@@ -147,6 +147,55 @@ func SetContext(config *Config, w http.ResponseWriter, r *http.Request) (http.Re
147
147
return wrw , r
148
148
}
149
149
150
+ type Reserve struct {
151
+ before time.Time
152
+ config * Config
153
+ contextLogger * ContextLogger
154
+ request * http.Request
155
+ traces string
156
+ }
157
+
158
+ func NewReserve (config * Config , r * http.Request ) * Reserve {
159
+ before := time .Now ()
160
+
161
+ traceId := getTraceId (r )
162
+ if traceId == "" {
163
+ // there is no span yet, so create one
164
+ var ctx context.Context
165
+ traceId , ctx = generateTraceId (r )
166
+ r = r .WithContext (ctx )
167
+ }
168
+
169
+ traces := fmt .Sprintf ("projects/%s/traces/%s" , config .ProjectId , traceId )
170
+
171
+ contextLogger := & ContextLogger {
172
+ out : config .ContextLogOut ,
173
+ Trace : traces ,
174
+ Severity : config .Severity ,
175
+ AdditionalData : config .AdditionalData ,
176
+ loggedSeverity : make ([]Severity , 0 , 10 ),
177
+ Skip : config .Skip ,
178
+ }
179
+ ctx := context .WithValue (r .Context (), contextLoggerKey , contextLogger )
180
+
181
+ return & Reserve {
182
+ before : before ,
183
+ config : config ,
184
+ contextLogger : contextLogger ,
185
+ request : r .WithContext (ctx ),
186
+ traces : traces ,
187
+ }
188
+ }
189
+
190
+ func (rv * Reserve ) LastHandling (wrw * wrappedResponseWriter ) {
191
+ elapsed := time .Since (rv .before )
192
+ maxSeverity := rv .contextLogger .maxSeverity ()
193
+ err := writeRequestLog (rv .request , rv .config , wrw .status , wrw .responseSize , elapsed , rv .traces , maxSeverity )
194
+ if err != nil {
195
+ _ , _ = fmt .Fprintln (os .Stderr , err .Error ())
196
+ }
197
+ }
198
+
150
199
func getTraceId (r * http.Request ) string {
151
200
span := trace .FromContext (r .Context ())
152
201
if span != nil {
0 commit comments