diff --git a/Sources/InfomaniakCore/Networking/ApiFetcher.swift b/Sources/InfomaniakCore/Networking/ApiFetcher.swift index 1656258..0b10ab0 100644 --- a/Sources/InfomaniakCore/Networking/ApiFetcher.swift +++ b/Sources/InfomaniakCore/Networking/ApiFetcher.swift @@ -161,6 +161,9 @@ open class ApiFetcher { let dataResponse = await validatedRequest.serializingDecodable(ApiResponse.self, automaticallyCancelling: true, decoder: decoder).response + + SentryDebug.httpResponseBreadcrumb(urlRequest: request.convertible.urlRequest, urlResponse: dataResponse.response) + return try handleApiResponse(dataResponse) } diff --git a/Sources/InfomaniakCore/Tracking/SentryDebug.swift b/Sources/InfomaniakCore/Tracking/SentryDebug.swift index 0bf9ced..72042ea 100644 --- a/Sources/InfomaniakCore/Tracking/SentryDebug.swift +++ b/Sources/InfomaniakCore/Tracking/SentryDebug.swift @@ -19,9 +19,10 @@ import Foundation import Sentry -enum SentryDebug { +public enum SentryDebug { enum Category { static let fileMetadata = "FileMetadata" + static let networking = "Networking" } // MARK: FileMetadata @@ -33,4 +34,36 @@ enum SentryDebug { breadcrumb.data = metadata SentrySDK.addBreadcrumb(breadcrumb) } + + public static func httpRequestBreadcrumb(requestId: String?, url: URL, method: String, statusCode: Int?) { + let breadcrumb = Breadcrumb(level: .info, category: Category.networking) + breadcrumb.type = "http" + breadcrumb.message = "" + + var data = [ + "url": url.absoluteString, + "method": method, + "status_code": statusCode ?? -1 + ] as [String: Any] + + if let requestId { + data["request_id"] = requestId + } + + breadcrumb.data = data + + SentrySDK.addBreadcrumb(breadcrumb) + } + + public static func httpResponseBreadcrumb(urlRequest: URLRequest?, urlResponse: HTTPURLResponse?) { + guard let url = urlRequest?.url, + let method = urlRequest?.httpMethod else { return } + + httpRequestBreadcrumb( + requestId: urlResponse?.value(forHTTPHeaderField: "x-request-id"), + url: url, + method: method, + statusCode: urlResponse?.statusCode + ) + } }