Skip to content

Commit 9f22953

Browse files
committed
feat: Removed accessing transaction from segment
1 parent 58b1e59 commit 9f22953

File tree

5 files changed

+34
-30
lines changed

5 files changed

+34
-30
lines changed

lib/common.js

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,12 @@ function createResolverSegment({ shim, parent, resolver, formattedPath }) {
8282
* @param {Object} params.config plugin config
8383
* @param {Object} segment relevant resolver segment
8484
* @param {string} scope name of transaction
85+
* @param {Transaction} transaction active transaction
8586
*/
86-
function recordResolveSegment(segment, scope) {
87+
function recordResolveSegment(segment, scope, transaction) {
8788
const duration = segment.getDurationInMillis()
8889
const exclusive = segment.getExclusiveDurationInMillis()
8990

90-
const transaction = segment.transaction
91-
9291
const attributes = segment.getAttributes()
9392
const fieldName = attributes[FIELD_NAME_ATTR]
9493
const fieldType = attributes[PARENT_TYPE_ATTR]
@@ -102,12 +101,10 @@ function recordResolveSegment(segment, scope) {
102101
}
103102
}
104103

105-
function recordOperationSegment(segment, scope) {
104+
function recordOperationSegment(segment, scope, transaction) {
106105
const duration = segment.getDurationInMillis()
107106
const exclusive = segment.getExclusiveDurationInMillis()
108107

109-
const transaction = segment.transaction
110-
111108
createMetricPairs(transaction, segment.name, scope, duration, exclusive)
112109
}
113110

@@ -132,9 +129,10 @@ function createModuleUsageMetric(agent) {
132129
*
133130
* @param {Object} context apollo request context
134131
* @param {Segment} operationSegment default segment created in request start
132+
* @param {Transaction} transaction active transaction
135133
* @return {Boolean} true if document could be parsed from context
136134
*/
137-
function updateOperationSegmentName(context, operationSegment) {
135+
function updateOperationSegmentName(context, operationSegment, transaction) {
138136
const operationDetails = getOperationDetails(context)
139137
if (operationDetails) {
140138
const { operationName, operationType, deepestUniquePath, cleanedQuery } = operationDetails
@@ -157,7 +155,7 @@ function updateOperationSegmentName(context, operationSegment) {
157155

158156
const segmentName = formattedOperation
159157
const transactionName = formattedOperation
160-
setTransactionName(operationSegment.transaction, transactionName)
158+
setTransactionName(transaction, transactionName)
161159
operationSegment.name = `${OPERATION_PREFIX}/${segmentName}`
162160
return true
163161
}
@@ -172,14 +170,13 @@ function updateOperationSegmentName(context, operationSegment) {
172170
*
173171
* @param {Object} params
174172
* @param {Object} params.config plugin config
175-
* @param {Object} params.info info key from resolver context
176-
* @param {Object} params.operationSegment operation segment
173+
* @param {Object} paramst.info info key from resolver context
174+
* @param {Object} params.transaction active transaction
177175
* @param {Object} params.args args key from resolver context
178176
*
179177
*/
180-
function maybeCaptureFieldMetrics({ config, info, operationSegment, args }) {
178+
function maybeCaptureFieldMetrics({ config, info, transaction, args }) {
181179
if (config.captureFieldMetrics) {
182-
const transaction = operationSegment.transaction
183180
const fieldName = info.fieldName
184181
const fieldType = info.parentType.toString()
185182
captureFieldMetrics({ transaction, args, fieldName, fieldType })

lib/error-helper.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ class ErrorHelper {
3030

3131
noticeError(instrumentationApi, error) {
3232
error = error.originalError || error
33-
const activeSegment = instrumentationApi.getActiveSegment()
34-
const transaction = activeSegment && activeSegment.transaction
33+
const transaction = instrumentationApi.tracer.getTransaction()
3534
instrumentationApi.agent.errors.add(transaction, error, error.extensions)
3635
}
3736
}

lib/hooks.js

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ module.exports = function requestDidStart({ api, shim, logger, config }, request
4343
logger.trace('Begin requestDidStart')
4444

4545
const requestParent = shim.getActiveSegment()
46+
const transaction = shim.tracer.getTransaction()
4647

4748
if (!requestParent) {
4849
logger.trace('No active segment found at query start. Not recording.')
@@ -60,10 +61,10 @@ module.exports = function requestDidStart({ api, shim, logger, config }, request
6061

6162
return {
6263
didResolveOperation: didResolveOperation.bind(null, {
63-
shim,
6464
config,
6565
logger,
66-
operationSegment
66+
operationSegment,
67+
transaction
6768
}),
6869
didEncounterErrors: didEncounterErrors.bind(null, { shim, operationSegment }),
6970
executionDidStart() {
@@ -79,7 +80,8 @@ module.exports = function requestDidStart({ api, shim, logger, config }, request
7980
config,
8081
logger,
8182
operationSegment,
82-
requestContext
83+
requestContext,
84+
transaction
8385
})
8486
}
8587
},
@@ -88,7 +90,8 @@ module.exports = function requestDidStart({ api, shim, logger, config }, request
8890
shim,
8991
config,
9092
logger,
91-
operationSegment
93+
operationSegment,
94+
transaction
9295
})
9396
}
9497
}
@@ -104,14 +107,10 @@ module.exports = function requestDidStart({ api, shim, logger, config }, request
104107
* @param {TraceSegment} params.operationSegment the segment capturing the operation
105108
* @param {GraphQLRequestContext} requestContext context on operation resolution
106109
*/
107-
function didResolveOperation({ shim, config, logger, operationSegment }, requestContext) {
108-
updateOperationSegmentName(requestContext, operationSegment)
110+
function didResolveOperation({ config, logger, operationSegment, transaction }, requestContext) {
111+
updateOperationSegmentName(requestContext, operationSegment, transaction)
109112
if (shouldIgnoreTransaction(requestContext.operation, config, logger)) {
110-
const activeSegment = shim.getActiveSegment()
111-
if (activeSegment) {
112-
const transaction = activeSegment.transaction
113-
transaction.setForceIgnore(true)
114-
}
113+
transaction.setForceIgnore(true)
115114
}
116115
}
117116

@@ -146,15 +145,15 @@ function didEncounterErrors({ shim, operationSegment }, requestContext) {
146145
* @returns {Function} handler once field resolves, used to handle errors
147146
*/
148147
function willResolveField(
149-
{ api, shim, logger, config, operationSegment, requestContext },
148+
{ api, shim, logger, config, operationSegment, requestContext, transaction },
150149
resolverContext
151150
) {
152151
const { info, args } = resolverContext
153152
const pathArray = flattenToArray(info.path)
154153
const formattedPath = pathArray.reverse().join('.')
155154
const flattenedArgs = flattenArgs({ obj: args })
156155

157-
maybeCaptureFieldMetrics({ operationSegment, info, args: flattenedArgs, config })
156+
maybeCaptureFieldMetrics({ transaction, info, args: flattenedArgs, config })
158157

159158
if (!config.captureScalars && !isTopLevelField(info) && isScalar(info)) {
160159
return null
@@ -237,13 +236,16 @@ function fieldResolver({ shim, requestContext, resolverSegment, currentSegment }
237236
* @param {TraceSegment} params.operationSegment the segment capturing the operation
238237
* @param {GraphQLRequestContext} requestContext context on operation resolution
239238
*/
240-
function willSendResponse({ api, shim, config, logger, operationSegment }, requestContext) {
239+
function willSendResponse(
240+
{ api, shim, config, logger, operationSegment, transaction },
241+
requestContext
242+
) {
241243
// check if operation segment was never updated from default name
242244
// If so, try to rename before setting the transaction name to `*`
243245
if (operationSegment.name === DEFAULT_OPERATION_NAME) {
244-
const updated = updateOperationSegmentName(requestContext, operationSegment)
246+
const updated = updateOperationSegmentName(requestContext, operationSegment, transaction)
245247
if (!updated) {
246-
setTransactionName(operationSegment.transaction, '*')
248+
setTransactionName(transaction, '*')
247249
}
248250
}
249251

tests/unit/create-plugin.test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ test('createPlugin edge cases', async (t) => {
3434
}
3535
},
3636
getActiveSegment: sinon.stub().returns({}),
37+
tracer: {
38+
getTransaction: sinon.stub().returns({ nameState: { setName: sinon.stub() } })
39+
},
3740
createSegment: sinon.stub().callsFake((name) => {
3841
ctx.nr.operationSegment.name = name
3942
return ctx.nr.operationSegment

tests/unit/error-helper.test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ class MockedInstrumentationApi {
3030
}
3131

3232
this.getActiveSegment = () => {}
33+
this.tracer = {
34+
getTransaction: () => {}
35+
}
3336
}
3437
}
3538

0 commit comments

Comments
 (0)