@@ -41,7 +41,8 @@ type LogJSON struct {
4141
4242// ReturnedQueryLogs to return a JSON with query logs
4343type ReturnedQueryLogs struct {
44- Data []QueryLogJSON `json:"data"`
44+ Data []QueryLogJSON `json:"data"`
45+ Download string `json:"download"`
4546}
4647
4748// QueryTargetNode to return the target of a on-demand query
@@ -168,6 +169,93 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
168169
169170// JSONQueryLogsHandler for JSON query logs by query name
170171func (h * HandlersAdmin ) JSONQueryLogsHandler (w http.ResponseWriter , r * http.Request ) {
172+ if h .DebugHTTPConfig .Enabled {
173+ utils .DebugHTTPDump (h .DebugHTTP , r , h .DebugHTTPConfig .ShowBody )
174+ }
175+ // Extract environment
176+ envVar := r .PathValue ("env" )
177+ if envVar == "" {
178+ log .Info ().Msg ("error getting environment" )
179+ return
180+ }
181+ // Check if environment is valid
182+ if ! h .Envs .Exists (envVar ) {
183+ log .Info ().Msgf ("error unknown environment (%s)" , envVar )
184+ return
185+ }
186+ // Get environment
187+ env , err := h .Envs .Get (envVar )
188+ if err != nil {
189+ log .Err (err ).Msgf ("error getting environment %s" , envVar )
190+ return
191+ }
192+ // Get context data
193+ ctx := r .Context ().Value (sessions .ContextKey (sessions .CtxSession )).(sessions.ContextValue )
194+ // Check permissions
195+ if ! h .Users .CheckPermissions (ctx [sessions .CtxUser ], users .QueryLevel , env .UUID ) {
196+ log .Info ().Msgf ("%s has insufficient permissions" , ctx [sessions .CtxUser ])
197+ return
198+ }
199+ // Extract query name
200+ // FIXME verify name
201+ name := r .PathValue ("name" )
202+ if name == "" {
203+ log .Info ().Msg ("error getting name" )
204+ return
205+ }
206+ // Iterate through targets to get logs
207+ queryLogJSON := []QueryLogJSON {}
208+ var downloadUrl string
209+ // Get logs
210+ if h .DBLogger != nil {
211+ queryLogs , err := h .DBLogger .QueryLogs (name )
212+ if err != nil {
213+ log .Err (err ).Msg ("error getting logs" )
214+ return
215+ }
216+ // TODO customize max number of logs to show
217+ if h .OptimizedUI && len (queryLogs ) > 100 {
218+ downloadUrl = "/json-download/query/" + envVar + "/" + name
219+ } else {
220+ // Prepare data to be returned
221+ for _ , q := range queryLogs {
222+ // Get target node
223+ node , err := h .Nodes .GetByUUID (q .UUID )
224+ if err != nil {
225+ node .UUID = q .UUID
226+ node .Localname = ""
227+ }
228+ _c := CreationTimes {
229+ Display : utils .PastFutureTimes (q .CreatedAt ),
230+ Timestamp : strconv .Itoa (int (q .CreatedAt .Unix ())),
231+ }
232+ qData , err := json .Marshal (q .Data )
233+ if err != nil {
234+ log .Err (err ).Msg ("error serializing logs" )
235+ continue
236+ }
237+ _l := QueryLogJSON {
238+ Created : _c ,
239+ Target : QueryTargetNode {
240+ UUID : node .UUID ,
241+ Name : node .Localname ,
242+ },
243+ Data : string (qData ),
244+ }
245+ queryLogJSON = append (queryLogJSON , _l )
246+ }
247+ }
248+ }
249+ returned := ReturnedQueryLogs {
250+ Data : queryLogJSON ,
251+ Download : downloadUrl ,
252+ }
253+ // Serialize and serve JSON
254+ utils .HTTPResponse (w , utils .JSONApplicationUTF8 , http .StatusOK , returned )
255+ }
256+
257+ // JSONDownloadQueryLogsHandler for JSON query logs by query name
258+ func (h * HandlersAdmin ) JSONDownloadQueryLogsHandler (w http.ResponseWriter , r * http.Request ) {
171259 if h .DebugHTTPConfig .Enabled {
172260 utils .DebugHTTPDump (h .DebugHTTP , r , h .DebugHTTPConfig .ShowBody )
173261 }
@@ -239,9 +327,20 @@ func (h *HandlersAdmin) JSONQueryLogsHandler(w http.ResponseWriter, r *http.Requ
239327 queryLogJSON = append (queryLogJSON , _l )
240328 }
241329 }
242- returned := ReturnedQueryLogs {
243- Data : queryLogJSON ,
330+ // Prepare JSON data for download
331+ jsonData , err := json .MarshalIndent (queryLogJSON , "" , " " )
332+ if err != nil {
333+ log .Err (err ).Msg ("error marshaling query logs" )
334+ utils .HTTPResponse (w , utils .JSONApplicationUTF8 , http .StatusInternalServerError , nil )
335+ return
336+ }
337+ // Set headers for file download
338+ filename := name + "_logs.json"
339+ desc := "Logs for " + name
340+ utils .HTTPDownload (w , desc , filename , int64 (len (jsonData )))
341+ // Write the file content
342+ w .WriteHeader (http .StatusOK )
343+ if _ , err := w .Write (jsonData ); err != nil {
344+ log .Err (err ).Msg ("error writing response" )
244345 }
245- // Serialize and serve JSON
246- utils .HTTPResponse (w , utils .JSONApplicationUTF8 , http .StatusOK , returned )
247346}
0 commit comments