Skip to content

Commit 072def7

Browse files
committed
[pinpoint-apm#285] Client Side gRPC Stream deadline retry refactoring
* The stream deadline configuration is loaded from pinpoint-config-default.json * Any value (null, undefined) should not terminate the agent because it needs to load JSON data and perform arithmetic.
1 parent 612f19d commit 072def7

4 files changed

+65
-16
lines changed

lib/client/grpc-data-sender.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const activeRequestRepository = require('../metric/active-request-repository')
2525
const { setInterval } = require('node:timers/promises')
2626
const DeadlineOptionsBuilder = require('./deadline-options-builder')
2727
const { logError } = require('./grpc-errors')
28+
const StreamDeadlineOptionsBuilder = require('./stream-deadline-options-builder')
2829

2930
// AgentInfoSender.java
3031
// refresh daily
@@ -39,17 +40,16 @@ class GrpcDataSender {
3940
this.collectorStatPort = collectorStatPort
4041
this.collectorSpanPort = collectorSpanPort
4142

43+
this.unaryDeadlineOptionsBuilder = new DeadlineOptionsBuilder()
4244
this.initializeClients()
4345
this.initializeMetadataClients()
44-
this.initializeSpanStream(collectorIp, collectorSpanPort, config)
45-
this.initializeStatStream(collectorIp, collectorStatPort, config)
4646
this.initializePingStream()
4747
this.initializeAgentInfoScheduler()
4848
this.initializeProfilerClients(collectorIp, collectorTcpPort, config)
4949

50-
this.commandEchoDeadlineOptionsBuilder = new DeadlineOptionsBuilder()
51-
this.agentInfoOptionsBuilder = new DeadlineOptionsBuilder()
52-
this.metadataOptionsBuilder = new DeadlineOptionsBuilder()
50+
this.clientSideStreamDeadlineOptionsBuilder = new StreamDeadlineOptionsBuilder(config)
51+
this.initializeSpanStream(collectorIp, collectorSpanPort, config)
52+
this.initializeStatStream(collectorIp, collectorStatPort, config)
5353
}
5454

5555
close() {
@@ -158,7 +158,7 @@ class GrpcDataSender {
158158

159159
sendAgentInfo(agentInfo, callback) {
160160
const pAgentInfo = dataConvertor.convertAgentInfo(agentInfo)
161-
let options = this.agentInfoOptionsBuilder.build()
161+
let options = this.unaryDeadlineOptionsBuilder.build()
162162
this.agentClient.requestAgentInfo(pAgentInfo, options, (err, response) => {
163163
logError('sendAgentInfo err: ', err)
164164
if (typeof callback === 'function') {
@@ -169,7 +169,7 @@ class GrpcDataSender {
169169
this.closeScheduler()
170170
if (this.agentInfoDailyScheduler) {
171171
this.removeJobForAgentInfo = this.agentInfoDailyScheduler.addJob(() => {
172-
options = this.agentInfoOptionsBuilder.build()
172+
options = this.unaryDeadlineOptionsBuilder.build()
173173
this.agentClient.requestAgentInfo(pAgentInfo, options, (err, response) => {
174174
logError('sendAgentInfo err: ', err)
175175
if (typeof callback === 'function') {
@@ -183,7 +183,7 @@ class GrpcDataSender {
183183

184184
sendApiMetaInfo(apiMetaInfo, callback) {
185185
const pApiMetaData = dataConvertor.convertApiMetaInfo(apiMetaInfo)
186-
const options = this.metadataOptionsBuilder.build()
186+
const options = this.unaryDeadlineOptionsBuilder.build()
187187
this.metadataClient.requestApiMetaData(pApiMetaData, options, (err, response) => {
188188
logError(err)
189189
if (callback) {
@@ -194,7 +194,7 @@ class GrpcDataSender {
194194

195195
sendStringMetaInfo(stringMetaInfo, callback) {
196196
const pStringMetaData = dataConvertor.convertStringMetaInfo(stringMetaInfo)
197-
const options = this.metadataOptionsBuilder.build()
197+
const options = this.unaryDeadlineOptionsBuilder.build()
198198
this.metadataClient.requestStringMetaData(pStringMetaData, options, (err, response) => {
199199
logError(err)
200200
if (callback) {
@@ -205,7 +205,7 @@ class GrpcDataSender {
205205

206206
sendSqlMetaInfo(sqlMetaData, callback) {
207207
const pSqlMetaData = sqlMetaData.valueOfProtocolBuffer()
208-
const options = this.metadataOptionsBuilder.build()
208+
const options = this.unaryDeadlineOptionsBuilder.build()
209209
this.metadataClient.requestSqlMetaData(pSqlMetaData, options, (err, response) => {
210210
logError(err)
211211
if (callback) {
@@ -216,7 +216,7 @@ class GrpcDataSender {
216216

217217
sendSqlUidMetaData(sqlMetaData, callback) {
218218
const pSqlMetaData = sqlMetaData.valueOfProtocolBuffer()
219-
const options = this.metadataOptionsBuilder.build()
219+
const options = this.unaryDeadlineOptionsBuilder.build()
220220
this.metadataClient.requestSqlUidMetaData(pSqlMetaData, options, (err, response) => {
221221
logError(err)
222222
if (callback) {
@@ -349,7 +349,7 @@ class GrpcDataSender {
349349
}
350350

351351
sendCommandEcho(commandEchoResponse, callback) {
352-
let options = this.commandEchoDeadlineOptionsBuilder.build()
352+
let options = this.unaryDeadlineOptionsBuilder.build()
353353
this.profilerClient.commandEcho(commandEchoResponse, options, (err, response) => {
354354
if (err) {
355355
log.error(err)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* Pinpoint Node.js Agent
3+
* Copyright 2020-present NAVER Corp.
4+
* Apache License v2.0
5+
*/
6+
7+
'use strict'
8+
9+
const DeadlineOptionsBuilder = require('./deadline-options-builder')
10+
11+
const defaultSeconds = 10 * 60 // 10 minutes
12+
class StreamDeadlineOptionsBuilder extends DeadlineOptionsBuilder {
13+
constructor(config) {
14+
const seconds = isNaN(config?.streamDeadlineMinutesClientSide) ? defaultSeconds : config.streamDeadlineMinutesClientSide * 60
15+
super(seconds)
16+
}
17+
}
18+
19+
module.exports = StreamDeadlineOptionsBuilder

test/client/grpc-stream-deadline.test.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ test('sendAgentInfo deadline and metadata', (t) => {
176176

177177
t.end()
178178
}
179-
grpcDataSender.agentInfoOptionsBuilder.setSeconds(0.1)
179+
grpcDataSender.unaryDeadlineOptionsBuilder.setSeconds(0.1)
180180

181181
grpcDataSender.sendAgentInfo({
182182
hostname: 'hostname',
@@ -227,7 +227,7 @@ test('sendAgentInfo deadline and no agent name metadata', (t) => {
227227
})
228228

229229
function deadlineFunctionalTest() {
230-
grpcDataSender.agentInfoOptionsBuilder.setSeconds(0.1)
230+
grpcDataSender.unaryDeadlineOptionsBuilder.setSeconds(0.1)
231231

232232
const callback = (err, response) => {
233233
t.false(response, '2st sendAgentInfo response is undefined')
@@ -287,7 +287,7 @@ test('sendApiMetaInfo deadline', (t) => {
287287
})
288288

289289
function apiMetaInfoFunctionalTest() {
290-
grpcDataSender.metadataOptionsBuilder.setSeconds(0.1)
290+
grpcDataSender.unaryDeadlineOptionsBuilder.setSeconds(0.1)
291291
grpcDataSender.sendApiMetaInfo({
292292
hostname: 'hostname',
293293
"serviceType": 1400,
@@ -342,7 +342,7 @@ test('sendStringMetaInfo deadline', (t) => {
342342
})
343343

344344
function stringMetaInfoFunctionalTest() {
345-
grpcDataSender.metadataOptionsBuilder.setSeconds(0.1)
345+
grpcDataSender.unaryDeadlineOptionsBuilder.setSeconds(0.1)
346346
grpcDataSender.sendStringMetaInfo({
347347
hostname: 'hostname',
348348
"serviceType": 1400,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Pinpoint Node.js Agent
3+
* Copyright 2021-present NAVER Corp.
4+
* Apache License v2.0
5+
*/
6+
7+
'use strict'
8+
9+
const test = require('tape')
10+
const agent = require('../support/agent-singleton-mock')
11+
const StreamDeadlineOptionsBuilder = require('../../lib/client/stream-deadline-options-builder')
12+
13+
test('stream deadline options from config without exceptions', function (t) {
14+
agent.bindHttp({ 'stream-deadline-minutes': null })
15+
let dut = new StreamDeadlineOptionsBuilder(agent.config)
16+
t.equal(dut.deadlineSeconds, 0, 'If stream deadline seconds JSON is null, Node.js runtime is returned as 0')
17+
18+
agent.bindHttp({ 'stream-deadline-minutes': undefined })
19+
dut = new StreamDeadlineOptionsBuilder(agent.config)
20+
t.equal(dut.deadlineSeconds, 600, 'If stream deadline seconds JSON is undefined, returns default 600 seconds')
21+
22+
agent.bindHttp({ 'stream-deadline-minutes': { 'client-side': 1 }})
23+
dut = new StreamDeadlineOptionsBuilder(agent.config)
24+
t.equal(dut.deadlineSeconds, 60, 'If stream deadline seconds JSON is 1, returns 60 seconds')
25+
26+
agent.bindHttp()
27+
dut = new StreamDeadlineOptionsBuilder(agent.config)
28+
t.equal(dut.deadlineSeconds, 600, 'If stream deadline seconds JSON is not set, returns default 600 seconds')
29+
t.end()
30+
})

0 commit comments

Comments
 (0)