Skip to content

Commit f05aa59

Browse files
authored
fix: Invalid context on GraphQL request errors (#4567)
Fixes SentryNetworkTracker to add an object for GraphQL context instead of a string. Fixes GH-4560
1 parent dbb4b19 commit f05aa59

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Fixes
6+
7+
- Fix GraphQL context for HTTP client error tracking (#4567)
8+
59
### Improvements
610

711
- Track adoption of `enablePersistingTracesWhenCrashing` (#4587)

Sources/Sentry/SentryNetworkTracker.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,10 @@ - (void)captureFailedRequests:(NSURLSessionTask *)sessionTask
456456
context[@"response"] = response;
457457

458458
if (self.isGraphQLOperationTrackingEnabled) {
459-
context[@"graphql_operation_name"] =
460-
[URLSessionTaskHelper getGraphQLOperationNameFrom:sessionTask];
459+
NSString *operationName = [URLSessionTaskHelper getGraphQLOperationNameFrom:sessionTask];
460+
if (operationName != nil) {
461+
context[@"graphql"] = @{ @"operation_name" : operationName };
462+
}
461463
}
462464

463465
event.context = context;

Tests/SentryTests/Integrations/Performance/Network/SentryNetworkTrackerTests.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,47 @@ class SentryNetworkTrackerTests: XCTestCase {
806806
XCTAssertEqual(sentryRequest.fragment, "myFragment")
807807
XCTAssertEqual(sentryRequest.queryString, "query=myQuery")
808808
}
809+
810+
func testCaptureHTTPClientErrorRequest_graphQLEnabled() throws {
811+
let sut = fixture.getSut()
812+
813+
let task = createDataTask {
814+
var request = $0
815+
816+
request.httpMethod = "POST"
817+
request.httpBody = """
818+
{
819+
"operationName": "someOperationName",
820+
"variables": { "a": 1 },
821+
"query": "query someOperationName { someField }"
822+
}
823+
""".data(using: .utf8)
824+
request.allHTTPHeaderFields = ["content-type": "application/json"]
825+
826+
return request
827+
}
828+
task.setResponse(createResponse(code: 500))
829+
830+
sut.urlSessionTask(task, setState: .completed)
831+
832+
let envelope = try XCTUnwrap(
833+
fixture.hub.capturedEventsWithScopes.first,
834+
"Expected to capture 1 event"
835+
)
836+
837+
let graphQLContext = try XCTUnwrap(
838+
envelope.event.context?["graphql"],
839+
"Expected 'graphql' object in context"
840+
)
841+
842+
XCTAssertEqual(graphQLContext.count, 1)
843+
let operationName = try XCTUnwrap(
844+
graphQLContext["operation_name"] as? String,
845+
"Expected graphql.operation_name to be a String"
846+
)
847+
848+
XCTAssertEqual(operationName, "someOperationName")
849+
}
809850

810851
func testCaptureHTTPClientErrorRequest_noSecurityInfo() {
811852
let sut = fixture.getSut()

0 commit comments

Comments
 (0)