Skip to content

Commit adc40e1

Browse files
committed
[#242] Extract Class refactoring from ActiveTrace to ActiveRequestRepository
[#242] Extract Class refactoring from ActiveTrace to ActiveRequestRepository
1 parent cf42f1c commit adc40e1

File tree

7 files changed

+62
-84
lines changed

7 files changed

+62
-84
lines changed

lib/client/grpc-data-sender.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,12 +350,12 @@ class GrpcDataSender {
350350
try {
351351
const pStatMessage = dataConvertor.convertStat(stat)
352352
if (log.isDebug()) {
353-
log.debug(`sendStats pStatMessage: ${stat}`)
353+
log.debug('sendStats pStatMessage: ', stat)
354354
}
355355
this.statStream.write(pStatMessage)
356356
} catch (e) {
357357
if (e && e.stack) {
358-
log.error(`sendStat(stat) Error: ${e.stack}`)
358+
log.error('sendStat(stat) Error: ', e)
359359
}
360360
}
361361
}

lib/context/trace-context.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const AsyncSpanChunkBuilder = require('./trace/async-span-chunk-builder')
2323
const ChildTraceBuilder = require('./trace/child-trace-builder')
2424
const DisableChildTrace = require('./trace/disable-child-trace')
2525
const disableAsyncId = require('./trace/disable-async-id')
26-
const ActiveTraceRepository = require('../metric/active-trace-repository')
26+
const activeRequestRepository = require('../metric/active-request-repository')
2727

2828
class TraceContext {
2929
constructor(agentInfo, dataSender, config) {
@@ -35,7 +35,6 @@ class TraceContext {
3535
this.enableSampling = config.sampling
3636
}
3737
this.traceSampler = new TraceSampler(agentInfo, config)
38-
this.activeRequestRepository = new ActiveTraceRepository()
3938
}
4039

4140
getAgentInfo() {
@@ -81,10 +80,10 @@ class TraceContext {
8180
if (!trace) {
8281
return
8382
}
83+
8484
try {
8585
trace.close()
86-
this.activeRequestRepository.remove(trace.getTraceRoot())
87-
// activeTrace.remove(trace)
86+
activeRequestRepository.remove(trace.getTraceRoot())
8887
} catch (e) {
8988
log.error('Fail to complete trace object', e)
9089
}
@@ -118,7 +117,7 @@ class TraceContext {
118117
}
119118

120119
newLocalTrace(traceRoot) {
121-
this.activeRequestRepository.register(traceRoot)
120+
activeRequestRepository.register(traceRoot)
122121
return new DisableTrace(traceRoot)
123122
}
124123

@@ -137,7 +136,7 @@ class TraceContext {
137136
const spanBuilder = new SpanBuilder(traceRoot)
138137
const spanChunkBuilder = new SpanChunkBuilder(traceRoot)
139138
const repository = new SpanRepository(spanChunkBuilder, this.dataSender, this.agentInfo)
140-
this.activeRequestRepository.register(traceRoot)
139+
activeRequestRepository.register(traceRoot)
141140
return new Trace2(spanBuilder, repository)
142141
}
143142

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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 SimpleCache = require('../utils/simple-cache')
10+
const ActiveTraceHistogram = require('./active-trace-histogram')
11+
const HistogramSchema = require('./histogram-schema')
12+
13+
// DefaultActiveTraceRepository.java
14+
class ActiveRequestRepository {
15+
constructor() {
16+
this.activeTraceCache = new SimpleCache()
17+
}
18+
19+
register(localTraceRoot) {
20+
const id = localTraceRoot.getTransactionId()
21+
if (typeof id !== 'string' || id.length < 1) {
22+
return
23+
}
24+
25+
this.activeTraceCache.put(id, localTraceRoot)
26+
}
27+
28+
remove(localTraceRoot) {
29+
const id = localTraceRoot.getTransactionId()
30+
this.activeTraceCache.delete(id)
31+
}
32+
33+
getCurrentActiveTraceHistogram() {
34+
const currentTime = Date.now()
35+
return this.getActiveTraceHistogram(currentTime)
36+
}
37+
38+
getActiveTraceHistogram(currentTime) {
39+
const histogram = new ActiveTraceHistogram(HistogramSchema.NORMAL_SCHEMA)
40+
this.activeTraceCache.getAll().forEach((traceRoot) => {
41+
const elapsedTime = currentTime - traceRoot.getTraceStartTime()
42+
histogram.increase(elapsedTime)
43+
})
44+
return histogram
45+
}
46+
}
47+
48+
module.exports = new ActiveRequestRepository()

lib/metric/active-trace-repository.js

Lines changed: 0 additions & 32 deletions
This file was deleted.

lib/metric/agent-stats-monitor.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
const ResourceStatsCollector = require('./resource-stats-collector')
1010
const log = require('../utils/logger')
11+
const activeRequestRepository = require('../metric/active-request-repository')
1112

1213
class AgentStatsMonitor {
1314
constructor(dataSender, agentId, agentStartTime) {
@@ -47,7 +48,7 @@ class AgentStatsMonitor {
4748
collectInterval: 1000,
4849
memory: this.resourceStatCollector.getMemoryStats(),
4950
cpu: cpuStatus,
50-
// activeTrace: activeTrace.getCurrentActiveTraceHistogram(),
51+
activeTrace: activeRequestRepository.getCurrentActiveTraceHistogram(),
5152
}
5253
}
5354
}

test/stats/active-trace.test.js

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,59 +6,20 @@
66

77
const test = require('tape')
88
const axios = require('axios')
9-
const { fixture, util } = require('../test-helper')
10-
const activeTrace = require('../../lib/metric/active-trace')
119
const agent = require('../support/agent-singleton-mock')
1210
const express = require('express')
1311
const http = require('http')
1412
const grpc = require('@grpc/grpc-js')
1513
const services = require('../../lib/data/v1/Service_grpc_pb')
1614
const spanMessages = require('../../lib/data/v1/Span_pb')
15+
const activeRequestRepository = require('../../lib/metric/active-request-repository')
1716

1817
const TEST_ENV = {
1918
host: 'localhost',
2019
port: 5005,
2120
}
2221
const getServerUrl = (path) => `http://${TEST_ENV.host}:${TEST_ENV.port}${path}`
2322

24-
test(`Should record active trace in multiple call`, function (t) {
25-
agent.bindHttp()
26-
27-
const PATH = '/active-trace'
28-
const LASTONE_PATH = '/active-trace/lastone'
29-
const SHUTDOWN = '/shutdown'
30-
const app = new express()
31-
32-
app.get(PATH, async (req, res) => {
33-
await util.sleep(2000)
34-
res.send('ok get')
35-
})
36-
37-
app.get(LASTONE_PATH, async (req, res) => {
38-
res.send('ok get')
39-
})
40-
41-
const server = app.listen(TEST_ENV.port, async function () {
42-
Promise.all([
43-
axios.get(getServerUrl(PATH), { httpAgent: new http.Agent({ keepAlive: false }) }),
44-
axios.get(getServerUrl(PATH), { httpAgent: new http.Agent({ keepAlive: false }) }),
45-
axios.get(getServerUrl(LASTONE_PATH), { httpAgent: new http.Agent({ keepAlive: false }) }),
46-
]).then((result) => {
47-
t.equal(activeTrace.getAllTraces().length, 0)
48-
t.equal('' + agent.mockAgentStartTime, agent.agentInfo.startTimestamp, "startTimestamp equals")
49-
50-
server.close()
51-
t.end()
52-
}).catch(() => {
53-
server.close()
54-
t.end()
55-
})
56-
})
57-
58-
t.equal(agent.mockAgentId, fixture.config.agentId, "Agent ID equals")
59-
t.equal(agent.agentInfo, agent.pinpointClient.agentInfo, "AgentInfo equals")
60-
})
61-
6223
test(`Active trace should be recorded with HTTP call`, function (t) {
6324
const collectorServer = new grpc.Server()
6425
collectorServer.addService(services.MetadataService, {
@@ -73,7 +34,7 @@ test(`Active trace should be recorded with HTTP call`, function (t) {
7334
const app = new express()
7435
app.get('/active-trace', async (req, res) => {
7536
agent.callbackTraceClose((trace) => {
76-
const actualCached = agent.getTraceContext().activeRequestRepository.activeTraceCache.get(trace.getTraceRoot().getTransactionId())
37+
const actualCached = activeRequestRepository.activeTraceCache.get(trace.getTraceRoot().getTransactionId())
7738
t.equal(actualCached, trace.getTraceRoot(), 'active trace traceRoot is cached')
7839
})
7940
setTimeout(() => {
@@ -85,7 +46,7 @@ test(`Active trace should be recorded with HTTP call`, function (t) {
8546
const result = await axios.get(getServerUrl('/active-trace'), { httpAgent: new http.Agent({ keepAlive: false }) })
8647
t.equal(result.status, 200, 'status code is 200')
8748
server.close(() => {
88-
const cacheSize = agent.getTraceContext().activeRequestRepository.activeTraceCache.cache.size
49+
const cacheSize = activeRequestRepository.activeTraceCache.cache.size
8950
t.equal(cacheSize, 0, 'active trace cache is empty')
9051
t.end()
9152
})

test/support/agent-singleton-mock.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const transactionIdGenerator = require('../../lib/context/sequence-generators').
2323
const closedTraceWrapped = Symbol('closedTraceWrapped')
2424
const stringMetaService = require('../../lib/context/string-meta-service')
2525
const apiMetaService = require('../../lib/context/api-meta-service')
26+
const activeRequestRepository = require('../../lib/metric/active-request-repository')
2627

2728
let traces = []
2829
const resetTraces = () => {
@@ -111,7 +112,7 @@ class MockAgent extends Agent {
111112
if (sampler.getSamplingCountGenerator()) {
112113
sampler.getSamplingCountGenerator().reset()
113114
}
114-
this.traceContext.activeRequestRepository.activeTraceCache.cache.clear()
115+
activeRequestRepository.activeTraceCache.cache.clear()
115116
transactionIdGenerator.reset()
116117

117118
httpShared.clearPathMatcher()

0 commit comments

Comments
 (0)