objective categorical abstract machine language personal data server
65
fork

Configure Feed

Select the types of activity you want to include in your feed.

Differentiate pegasus logging from dream logging

futurGH 37774d81 9544dc54

+79 -73
+13 -13
pegasus/lib/api/account_/migrate/migrate.ml
··· 91 91 | Ok () -> 92 92 (true, None) 93 93 | Error e -> 94 - Dream.warning (fun log -> 94 + Log.warn (fun log -> 95 95 log "migration %s: failed to deactivate old account: %s" did e ) ; 96 96 (false, Some e) 97 97 in ··· 131 131 | Some session -> ( 132 132 match%lwt Remote.request_plc_signature old_client with 133 133 | Error e -> 134 - Dream.warning (fun log -> 134 + Log.warn (fun log -> 135 135 log "migration %s: failed to request PLC signature: %s" did e ) ; 136 136 let%lwt () = 137 137 State.set ctx.req ··· 396 396 | Ok () -> 397 397 (true, None) 398 398 | Error err -> 399 - Dream.warning (fun log -> 399 + Log.warn (fun log -> 400 400 log "migration %s: failed to deactivate old account: %s" did err ) ; 401 401 (false, Some err) 402 402 in ··· 442 442 let%lwt () = 443 443 match%lwt Ops.check_account_status ~did with 444 444 | Ok status -> 445 - Dream.info (fun log -> 445 + Log.info (fun log -> 446 446 log 447 447 "migration %s: repo imported, indexed_records=%d, \ 448 448 expected_blobs=%d" 449 449 did status.indexed_records status.expected_blobs ) ; 450 450 Lwt.return_unit 451 451 | Error e -> 452 - Dream.warning (fun log -> 452 + Log.warn (fun log -> 453 453 log "migration %s: failed to check account status: %s" did e ) ; 454 454 Lwt.return_unit 455 455 in 456 456 match%lwt Ops.list_missing_blobs ~did ~limit:50 () with 457 457 | Error e -> 458 - Dream.warning (fun log -> 458 + Log.warn (fun log -> 459 459 log "migration %s: failed to list missing blobs: %s" did e ) ; 460 460 transition_to_plc_token_step ctx ~old_client ~old_pds ~did ~handle 461 461 ~email ~blobs_imported:0 ~blobs_failed:0 ··· 514 514 Ops.list_missing_blobs ~did:state.did ~limit:50 ?cursor () 515 515 with 516 516 | Error e -> 517 - Dream.warning (fun log -> 517 + Log.warn (fun log -> 518 518 log "migration %s: failed to list missing blobs: %s" state.did e ) ; 519 519 transition_to_plc_token_step ctx ~old_client ~old_pds:state.old_pds 520 520 ~did:state.did ~handle:state.handle ~email:state.email ··· 581 581 | Ok _ -> 582 582 Lwt.return [] 583 583 | Error e -> 584 - Dream.warning (fun log -> 584 + Log.warn (fun log -> 585 585 log "migration %s: failed to get old PDS credentials: %s" 586 586 state.did e ) ; 587 587 Lwt.return [] ··· 632 632 let%lwt () = 633 633 match%lwt Ops.check_account_status ~did:state.did with 634 634 | Ok status -> 635 - Dream.info (fun log -> 635 + Log.info (fun log -> 636 636 log 637 637 "migration %s: activating account, \ 638 638 imported_blobs=%d/%d" ··· 640 640 status.expected_blobs ) ; 641 641 Lwt.return_unit 642 642 | Error e -> 643 - Dream.warning (fun log -> 643 + Log.warn (fun log -> 644 644 log 645 645 "migration %s: failed to check status before \ 646 646 activation: %s" ··· 659 659 | Ok () -> 660 660 (true, None) 661 661 | Error e -> 662 - Dream.warning (fun log -> 662 + Log.warn (fun log -> 663 663 log 664 664 "migration %s: failed to deactivate old \ 665 665 account: %s" ··· 861 861 | Ok () -> 862 862 (true, None) 863 863 | Error e -> 864 - Dream.warning (fun log -> 864 + Log.warn (fun log -> 865 865 log 866 866 "migration %s: failed to deactivate old account: %s" 867 867 did e ) ; ··· 895 895 | Ok () -> ( 896 896 match%lwt Ops.list_missing_blobs ~did ~limit:50 () with 897 897 | Error e -> 898 - Dream.warning (fun log -> 898 + Log.warn (fun log -> 899 899 log "migration %s: failed to list missing blobs: %s" 900 900 did e ) ; 901 901 transition_to_plc_token_step ctx ~old_client:client
+1 -1
pegasus/lib/api/account_/migrate/ops.ml
··· 117 117 (fun cid_str -> 118 118 match%lwt Remote.fetch_blob ~did ~cid:cid_str client with 119 119 | Error e -> 120 - Dream.warning (fun log -> 120 + Log.warn (fun log -> 121 121 log "migration %s: failed to fetch blob %s: %s" did cid_str e ) ; 122 122 Lwt.return_error cid_str 123 123 | Ok (data, mimetype) -> (
+2 -2
pegasus/lib/api/account_/migrate/remote.ml
··· 185 185 Lwt.return_ok res.preferences 186 186 with 187 187 | Hermes.Xrpc_error {status; error; _} -> 188 - Dream.warning (fun log -> 188 + Log.warn (fun log -> 189 189 log "migration: failed to fetch preferences: %d %s" status error ) ; 190 190 Lwt.return_ok [] 191 191 | exn -> 192 - Dream.warning (fun log -> 192 + Log.warn (fun log -> 193 193 log "migration: exception fetching preferences: %s" 194 194 (Printexc.to_string exn) ) ; 195 195 Lwt.return_ok []
+1 -1
pegasus/lib/api/identity/resolveHandle.ml
··· 18 18 | Error e -> ( 19 19 try%lwt Xrpc.service_proxy ctx 20 20 with _ -> 21 - Dream.error (fun log -> log "%s" e) ; 21 + Log.err (fun log -> log "%s" e) ; 22 22 Errors.internal_error ~msg:"could not resolve handle" () ) ) )
+1 -1
pegasus/lib/api/identity/updateHandle.ml
··· 105 105 Dream.empty `OK 106 106 | Error e -> 107 107 let msg = update_handle_error_to_string e in 108 - Dream.error (fun log -> log ~request:req "%s" msg) ; 108 + Log.err (fun log -> log "%s" msg) ; 109 109 Errors.invalid_request ~name:"InvalidHandle" msg )
+1 -1
pegasus/lib/api/oauth_/par.ml
··· 8 8 let%lwt client = 9 9 try%lwt Client.fetch_client_metadata req.client_id 10 10 with e -> 11 - Errors.log_exn ~req:ctx.req e ; 11 + Errors.log_exn e ; 12 12 Errors.invalid_request "failed to fetch client metadata" 13 13 in 14 14 if req.response_type <> "code" then
+1 -1
pegasus/lib/api/proxy/appBskyFeedGetFeed.ml
··· 49 49 | None -> 50 50 Errors.invalid_request "missing proxy header" ) 51 51 with e -> 52 - Dream.error (fun log -> 52 + Log.err (fun log -> 53 53 log "failed to fetch feed generator record: %s" 54 54 (Printexc.to_string e) ) ; 55 55 Errors.internal_error ~msg:"failed to fetch feed generator record"
-1
pegasus/lib/api/server/requestPasswordReset.ml
··· 33 33 | Some actor -> 34 34 Lwt.return_some actor 35 35 | None -> 36 - Dream.log "password reset requested for unknown email: %s" email ; 37 36 Lwt.return_none ) 38 37 in 39 38 match actor_opt with
+1 -2
pegasus/lib/api/server/resetPassword.ml
··· 26 26 (fun {req; db; _} -> 27 27 let%lwt {token; password} = Xrpc.parse_body req input_of_yojson in 28 28 match%lwt reset_password ~token ~password db with 29 - | Ok did -> 30 - Dream.log "password reset completed for %s" did ; 29 + | Ok _ -> 31 30 Dream.empty `OK 32 31 | Error InvalidToken -> 33 32 Errors.invalid_request ~name:"InvalidToken" "invalid or expired token"
+6 -6
pegasus/lib/auth.ml
··· 27 27 let now_s = int_of_float (Unix.gettimeofday ()) in 28 28 match Jwt.symmetric_jwt_of_yojson payload with 29 29 | Error e -> 30 - Dream.debug (fun log -> log "bearer jwt decode error: %s" e) ; 30 + Log.debug (fun log -> log "bearer jwt decode error: %s" e) ; 31 31 Lwt.return_error "invalid token format" 32 32 | Ok jwt -> 33 33 if jwt.aud <> Env.did then Lwt.return_error "invalid aud" ··· 259 259 | Error "use_dpop_nonce" -> 260 260 Lwt.return_error @@ Errors.use_dpop_nonce () 261 261 | Error e -> 262 - Dream.debug (fun log -> log ~request:req "dpop error: %s" e) ; 262 + Log.debug (fun log -> log "dpop error: %s" e) ; 263 263 Lwt.return_error @@ Errors.invalid_request ("dpop error: " ^ e) 264 264 | Ok proof -> 265 265 Lwt.return_ok (DPoP {proof}) ··· 268 268 fun {req; db} -> 269 269 match parse_dpop req with 270 270 | Error e -> 271 - Dream.debug (fun log -> log ~request:req "dpop error: %s" e) ; 271 + Log.debug (fun log -> log "dpop error: %s" e) ; 272 272 Lwt.return_error @@ Errors.invalid_request ("dpop error: " ^ e) 273 273 | Ok token -> ( 274 274 match ··· 280 280 | Error "use_dpop_nonce" -> 281 281 Lwt.return_error @@ Errors.use_dpop_nonce () 282 282 | Error e -> 283 - Dream.debug (fun log -> log ~request:req "dpop error: %s" e) ; 283 + Log.debug (fun log -> log "dpop error: %s" e) ; 284 284 Lwt.return_error @@ Errors.invalid_request ("dpop error: " ^ e) 285 285 | Ok proof -> ( 286 286 match Jwt.verify_jwt token ~pubkey:Env.jwt_pubkey with 287 287 | Error e -> 288 - Dream.debug (fun log -> log ~request:req "invalid jwt: %s" e) ; 288 + Log.debug (fun log -> log "invalid jwt: %s" e) ; 289 289 Lwt.return_error @@ Errors.auth_required e 290 290 | Ok (_header, claims) -> ( 291 291 let open Yojson.Safe.Util in ··· 400 400 | Ok _ -> 401 401 check_actor_status did db 402 402 | Error e -> 403 - Dream.debug (fun log -> log "service jwt verification failed: %s" e) ; 403 + Log.debug (fun log -> log "service jwt verification failed: %s" e) ; 404 404 Lwt.return_error 405 405 @@ Errors.invalid_request ~name:"InvalidToken" 406 406 "jwt signature does not match jwt issuer"
+1 -1
pegasus/lib/blob_store.ml
··· 68 68 | Ok () -> 69 69 Lwt.return_unit 70 70 | Error e -> 71 - Dream.error (fun log -> 71 + Log.err (fun log -> 72 72 log "S3 delete failed for %s: %s" key (Util.s3_error_to_string e) ) ; 73 73 Lwt.return_unit ) 74 74 | None ->
+1 -1
pegasus/lib/env.ml
··· 56 56 match getenv_opt "PDS_DPOP_NONCE_SECRET" ~default:"" with 57 57 | "" -> 58 58 let secret = Mirage_crypto_rng_unix.getrandom 32 in 59 - Dream.warning (fun log -> 59 + Log.warn (fun log -> 60 60 log "PDS_DPOP_NONCE_SECRET not set; using PDS_DPOP_NONCE_SECRET=%s" 61 61 ( Base64.(encode ~alphabet:uri_safe_alphabet ~pad:false) secret 62 62 |> Result.get_ok ) ) ;
+7 -9
pegasus/lib/errors.ml
··· 53 53 in 54 54 match exn with 55 55 | InvalidRequestError (error, message) -> 56 - Dream.debug (fun log -> log "invalid request: %s - %s" error message) ; 56 + Log.debug (fun log -> log "invalid request: %s - %s" error message) ; 57 57 format_response error message `Bad_Request 58 58 | InternalServerError (error, message) -> 59 - Dream.debug (fun log -> 60 - log "internal server error: %s - %s" error message ) ; 59 + Log.debug (fun log -> log "internal server error: %s - %s" error message) ; 61 60 format_response error message `Internal_Server_Error 62 61 | AuthError (error, message) -> 63 - Dream.debug (fun log -> log "auth error: %s - %s" error message) ; 62 + Log.debug (fun log -> log "auth error: %s - %s" error message) ; 64 63 format_response error message `Unauthorized 65 64 | NotFoundError (error, message) -> 66 - Dream.debug (fun log -> log "not found error: %s - %s" error message) ; 65 + Log.debug (fun log -> log "not found error: %s - %s" error message) ; 67 66 format_response error message `Not_Found 68 67 | UseDpopNonceError -> 69 - Dream.debug (fun log -> log "use_dpop_nonce error") ; 68 + Log.debug (fun log -> log "use_dpop_nonce error") ; 70 69 Dream.json ~status:`Bad_Request 71 70 ~headers: 72 71 [ ("WWW-Authenticate", {|DPoP error="use_dpop_nonce"|}) 73 72 ; ("Access-Control-Expose-Headers", "DPoP-Nonce, WWW-Authenticate") ] 74 73 {|{ "error": "use_dpop_nonce" }|} 75 74 | e -> 76 - Dream.warning (fun log -> 75 + Log.warn (fun log -> 77 76 log "unexpected internal error: %s" (Printexc.to_string e) ) ; 78 77 format_response "InternalServerError" "Internal server error" 79 78 `Internal_Server_Error 80 79 81 - let log_exn ?req exn = 82 - Dream.error (fun log -> log ?request:req "%s" (Printexc.to_string exn)) 80 + let log_exn = Log.log_exn
+1 -1
pegasus/lib/jwt.ml
··· 159 159 let did = Option.value did ~default:iss_did in 160 160 match%lwt Id_resolver.Did.resolve did with 161 161 | Error e -> 162 - Dream.debug (fun log -> 162 + Log.debug (fun log -> 163 163 log "failed to resolve did %s: %s" did e ) ; 164 164 Lwt.return_error 165 165 @@ InternalError "could not resolve jwt issuer did"
+11
pegasus/lib/log.ml
··· 1 + let default_src = Logs.Src.create "pegasus" 2 + 3 + let debug ?(src = default_src) = Logs.debug ~src 4 + 5 + let err ?(src = default_src) = Logs.err ~src 6 + 7 + let warn ?(src = default_src) = Logs.warn ~src 8 + 9 + let info ?(src = default_src) = Logs.info ~src 10 + 11 + let log_exn exn = err (fun log -> log "%s" (Printexc.to_string exn))
+1 -1
pegasus/lib/oauth/dpop.ml
··· 159 159 else 160 160 match header |> member "jwk" |> ec_jwk_of_yojson with 161 161 | Error e -> 162 - Dream.debug (fun log -> log "error parsing jwk: %s" e) ; 162 + Log.debug (fun log -> log "error parsing jwk: %s" e) ; 163 163 Errors.internal_error () 164 164 | Ok jwk -> ( 165 165 if
+11 -12
pegasus/lib/s3/backup.ml
··· 14 14 in 15 15 match result with 16 16 | Ok _ -> 17 - Dream.info (fun log -> log "S3 backup uploaded: %s" key) ; 17 + Log.info (fun log -> log "S3 backup uploaded: %s" key) ; 18 18 Lwt.return_unit 19 19 | Error e -> 20 - Dream.error (fun log -> 20 + Log.err (fun log -> 21 21 log "S3 backup upload failed for %s: %s" key 22 22 (Util.s3_error_to_string e) ) ; 23 23 Lwt.return_unit ··· 27 27 if Sys.file_exists db_path then ( 28 28 let timestamp = timestamp_string () in 29 29 let key = Printf.sprintf "backups/pegasus-%s.db" timestamp in 30 - Dream.info (fun log -> log "starting main database backup") ; 30 + Log.info (fun log -> log "starting main database backup") ; 31 31 upload_to_s3 ~config ~file_path:db_path ~key ) 32 32 else ( 33 - Dream.warning (fun log -> log "main database not found: %s" db_path) ; 33 + Log.warn (fun log -> log "main database not found: %s" db_path) ; 34 34 Lwt.return_unit ) 35 35 36 36 let backup_user_db ~config ~did : unit Lwt.t = ··· 43 43 else Lwt.return_unit 44 44 45 45 let backup_all_user_dbs ~config ~ds : unit Lwt.t = 46 - Dream.info (fun log -> log "starting backup of user databases") ; 46 + Log.info (fun log -> log "starting backup of user databases") ; 47 47 let rec backup_batch cursor count = 48 48 let%lwt actors = Data_store.list_actors ~cursor ~limit:100 ds in 49 49 match actors with 50 50 | [] -> 51 - Dream.info (fun log -> log "backed up %d user databases" count) ; 51 + Log.info (fun log -> log "backed up %d user databases" count) ; 52 52 Lwt.return_unit 53 53 | actors -> 54 54 let%lwt () = ··· 65 65 let do_backup () : unit Lwt.t = 66 66 match Env.s3_config with 67 67 | Some config when config.backups_enabled -> 68 - Dream.info (fun log -> log "starting S3 backup") ; 68 + Log.info (fun log -> log "starting S3 backup") ; 69 69 let%lwt ds = Data_store.connect () in 70 70 let%lwt () = backup_main_db ~config in 71 71 let%lwt () = backup_all_user_dbs ~config ~ds in 72 - Dream.info (fun log -> log "S3 backup completed") ; 72 + Log.info (fun log -> log "S3 backup completed") ; 73 73 Lwt.return_unit 74 74 | _ -> 75 75 Lwt.return_unit ··· 77 77 let queue_backups () : unit Lwt.t = 78 78 match Env.s3_config with 79 79 | Some config when config.backups_enabled -> 80 - Dream.info (fun log -> log "starting hourly S3 backups") ; 80 + Log.info (fun log -> log "starting hourly S3 backups") ; 81 81 let%lwt () = 82 82 Lwt.catch 83 83 (fun () -> do_backup ()) 84 84 (fun e -> 85 - Dream.error (fun log -> 86 - log "backup failed: %s" (Printexc.to_string e) ) ; 85 + Log.err (fun log -> log "backup failed: %s" (Printexc.to_string e)) ; 87 86 Lwt.return_unit ) 88 87 in 89 88 let rec loop () = ··· 92 91 Lwt.catch 93 92 (fun () -> do_backup ()) 94 93 (fun e -> 95 - Dream.error (fun log -> 94 + Log.err (fun log -> 96 95 log "backup failed: %s" (Printexc.to_string e) ) ; 97 96 Lwt.return_unit ) 98 97 in
+8 -8
pegasus/lib/s3/blob_migration.ml
··· 1 1 let migrate_user ~did : (int * int) Lwt.t = 2 2 match Env.s3_config with 3 3 | Some config when config.blobs_enabled -> 4 - Dream.info (fun log -> log "migrating blobs for user %s" did) ; 4 + Log.info (fun log -> log "migrating blobs for user %s" did) ; 5 5 let%lwt user_db = User_store.connect did in 6 6 let migrated = ref 0 in 7 7 let errors = ref 0 in ··· 38 38 Sys.remove local_path ; incr migrated ; Lwt.return_unit 39 39 ) 40 40 else ( 41 - Dream.warning (fun log -> 41 + Log.warn (fun log -> 42 42 log "local blob file not found: %s" local_path ) ; 43 43 Lwt.return_unit ) ) 44 44 (fun e -> 45 - Dream.error (fun log -> 45 + Log.err (fun log -> 46 46 log "blob migration error for %s: %s" 47 47 (Cid.to_string cid) (Printexc.to_string e) ) ; 48 48 incr errors ; ··· 53 53 migrate_batch (Cid.to_string last_cid) 54 54 in 55 55 let%lwt () = migrate_batch "" in 56 - Dream.info (fun log -> 56 + Log.info (fun log -> 57 57 log "blob migration complete for %s: %d migrated, %d errors" did 58 58 !migrated !errors ) ; 59 59 Lwt.return (!migrated, !errors) 60 60 | _ -> 61 - Dream.error (fun log -> log "S3 blob storage not enabled") ; 61 + Log.err (fun log -> log "S3 blob storage not enabled") ; 62 62 Lwt.return (0, 0) 63 63 64 64 let migrate_all () : unit Lwt.t = 65 65 match Env.s3_config with 66 66 | Some config when config.blobs_enabled -> 67 - Dream.info (fun log -> log "migrating all blobs to S3") ; 67 + Log.info (fun log -> log "migrating all blobs to S3") ; 68 68 let%lwt ds = Data_store.connect () in 69 69 let total_migrated = ref 0 in 70 70 let total_errors = ref 0 in ··· 87 87 migrate_batch last.did 88 88 in 89 89 let%lwt () = migrate_batch "" in 90 - Dream.info (fun log -> 90 + Log.info (fun log -> 91 91 log "blob migration complete: %d total migrated, %d total errors" 92 92 !total_migrated !total_errors ) ; 93 93 Lwt.return_unit 94 94 | _ -> 95 - Dream.error (fun log -> log "S3 blob storage not enabled") ; 95 + Log.err (fun log -> log "S3 blob storage not enabled") ; 96 96 Lwt.return_unit
+1 -1
pegasus/lib/sequencer.ml
··· 498 498 Lexicons.([%xrpc post "com.atproto.sync.requestCrawl"]) 499 499 ~hostname:Env.hostname client ) 500 500 (fun exn -> 501 - Dream.warning (fun log -> 501 + Log.warn (fun log -> 502 502 log "failed to requestCrawl %s: %s" service 503 503 (Printexc.to_string exn) ) ) ) 504 504 Env.crawlers
+2 -2
pegasus/lib/util.ml
··· 561 561 recipients 562 562 |> Option.get 563 563 in 564 - Dream.log "email to %s: %s" to_addr text 564 + Log.info (fun log -> log "email to %s: %s" to_addr text) 565 565 in 566 566 match (Env.smtp_config, Env.smtp_sender) with 567 567 | Some config, Some sender -> ( ··· 571 571 | Ok message -> ( 572 572 try%lwt Letters.send ~config ~sender ~recipients ~message 573 573 with e -> 574 - Errors.log_exn e ; 574 + Log.log_exn e ; 575 575 Lwt.return (log_email ()) ) ) 576 576 | _ -> 577 577 Lwt.return (log_email ())
+8 -8
pegasus/lib/xrpc.ml
··· 112 112 apply_rate_limits ~nsid rate_limits ctx ; 113 113 try%lwt hdlr ctx 114 114 with e -> 115 - if not (is_xrpc_error e) then log_exn ~req:init.req e ; 115 + if not (is_xrpc_error e) then log_exn e ; 116 116 exn_to_response e 117 117 with Rate_limiter.Rate_limit_exceeded status -> 118 118 rate_limit_response status ) ··· 124 124 | Rate_limiter.Rate_limit_exceeded status -> 125 125 rate_limit_response status 126 126 | e -> 127 - if not (is_xrpc_error e) then log_exn ~req:init.req e ; 127 + if not (is_xrpc_error e) then log_exn e ; 128 128 exn_to_response e 129 129 with Redirect r -> Dream.redirect init.req r 130 130 ··· 141 141 in 142 142 match query_json |> of_yojson with 143 143 | Error e -> 144 - Dream.debug (fun log -> log "error parsing query: %s" e) ; 144 + Log.debug (fun log -> log "error parsing query: %s" e) ; 145 145 Errors.internal_error () 146 146 | Ok query -> 147 147 query ··· 173 173 | _ -> 174 174 Lwt.return (`Assoc []) ) 175 175 in 176 + Log.debug (fun l -> l "body: %s" (Yojson.Safe.to_string body_assoc)) ; 176 177 match of_yojson body_assoc with 177 178 | Error e -> 178 - Dream.debug (fun log -> log "error parsing body: %s" e) ; 179 + Log.debug (fun log -> log "error parsing body: %s" e) ; 179 180 Errors.internal_error () 180 181 | Ok body -> 181 182 Lwt.return body ··· 267 268 Body.to_stream body |> Lwt_stream.iter_s (Dream.write stream) ) 268 269 | e -> 269 270 let%lwt () = Body.drain_body body in 270 - Dream.error (fun log -> 271 + Log.err (fun log -> 271 272 log "error when proxying to %s: %s" (Uri.to_string uri) 272 273 (Http.Status.to_string e) ) ; 273 274 Errors.internal_error ~msg:"failed to proxy request" () ) ··· 289 290 Body.to_stream body |> Lwt_stream.iter_s (Dream.write stream) ) 290 291 | e -> 291 292 let%lwt () = Body.drain_body body in 292 - Dream.error (fun log -> 293 + Log.err (fun log -> 293 294 log "error when proxying to %s: %s" (Uri.to_string uri) 294 295 (Http.Status.to_string e) ) ; 295 296 Errors.internal_error ~msg:"failed to proxy request" () ) 296 297 | _ -> 297 298 Errors.invalid_request "unsupported method" ) 298 299 | Error e -> 299 - Dream.error (fun log -> 300 - log ~request:ctx.req "error when resolving destination service: %s" e ) ; 300 + Log.err (fun log -> log "error when resolving destination service: %s" e) ; 301 301 Errors.internal_error ~msg:"failed to resolve destination service" () 302 302 303 303 let service_proxy_handler db req =