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 { LogBuilder } = require ( './utils/log/log-builder' )
10+ const log = require ( './utils/log/logger' )
11+ const dataSenderFactory = require ( './client/data-sender-factory' )
12+ const stringMetaService = require ( './context/string-meta-service' )
13+ const apiMetaService = require ( './context/api-meta-service' )
14+ const sqlMetadataService = require ( './instrumentation/sql/sql-metadata-service' )
15+ const TraceContext = require ( './context/trace-context' )
16+ const { ModuleHook } = require ( './instrumentation/module-hook' )
17+ const Scheduler = require ( './utils/scheduler' )
18+ const AgentStatsMonitor = require ( './metric/agent-stats-monitor' )
19+ const PingScheduler = require ( './metric/ping-scheduler' )
20+ const { getConfig } = require ( './config' )
21+
22+ class Agent {
23+ constructor ( agentInfo , config , logger ) {
24+ this . agentInfo = agentInfo
25+ this . config = config
26+ this . logger = logger
27+ }
28+
29+ start ( ) {
30+ this . logger . warn ( '[Pinpoint Agent] Configuration' , this . config )
31+
32+ if ( typeof this . config ?. enable === 'boolean' && ! this . config . enable ) {
33+ this . logger . warn ( '[Pinpoint Agent][' + this . config . agentId + '] Disabled' )
34+ return
35+ }
36+
37+ this . dataSender . send ( this . agentInfo )
38+ stringMetaService . init ( this . dataSender )
39+ apiMetaService . init ( this . dataSender )
40+ sqlMetadataService . setDataSender ( this . dataSender )
41+
42+ this . traceContext = new TraceContext ( this . agentInfo , this . dataSender , this . config )
43+ this . moduleHook = new ModuleHook ( this )
44+ this . moduleHook . start ( )
45+
46+ this . services . forEach ( service => {
47+ service . call ( this )
48+ } )
49+
50+ this . logger . warn ( '[Pinpoint Agent][' + this . config . agentId + '] Initialized' , this . agentInfo )
51+ }
52+
53+ createTraceObject ( ) {
54+ return this . traceContext . newTraceObject2 ( )
55+ }
56+
57+ currentTraceObject ( ) {
58+ return this . traceContext . currentTraceObject ( )
59+ }
60+
61+ completeTraceObject ( trace ) {
62+ this . traceContext . completeTraceObject ( trace )
63+ }
64+
65+ getAgentInfo ( ) {
66+ return this . agentInfo
67+ }
68+
69+ getTraceContext ( ) {
70+ return this . traceContext
71+ }
72+
73+ shutdown ( ) {
74+ this . mainScheduler ?. stop ( )
75+ this . pingScheduler ?. stop ( )
76+ this . moduleHook ?. stop ( )
77+ }
78+ }
79+
80+ class AgentBuilder {
81+ constructor ( agentInfo ) {
82+ this . agentInfo = agentInfo
83+ this . services = [ ]
84+ this . enableStatsMonitor = true
85+ this . enablePingScheduler = true
86+ this . enableServiceCommand = true
87+ }
88+
89+ setConfig ( config ) {
90+ this . config = config
91+ return this
92+ }
93+
94+ setDataSender ( dataSender ) {
95+ this . dataSender = dataSender
96+ return this
97+ }
98+
99+ addService ( service ) {
100+ this . services . push ( service )
101+ return this
102+ }
103+
104+ disableStatsScheduler ( ) {
105+ this . enableStatsMonitor = false
106+ return this
107+ }
108+
109+ disablePingScheduler ( ) {
110+ this . enablePingScheduler = false
111+ return this
112+ }
113+
114+ disableServiceCommand ( ) {
115+ this . enableServiceCommand = false
116+ return this
117+ }
118+
119+ build ( ) {
120+ if ( ! this . config ) {
121+ this . config = getConfig ( )
122+ }
123+ log . setRootLogger ( LogBuilder . createDefaultLogBuilder ( ) . setConfig ( this . config ) . build ( ) )
124+
125+ const agent = new Agent ( this . agentInfo , this . config , log )
126+ if ( ! this . dataSender ) {
127+ this . dataSender = dataSenderFactory . create ( this . config , this . agentInfo )
128+ }
129+ agent . dataSender = this . dataSender
130+
131+ if ( this . enableStatsMonitor || this . config . enabledStatsMonitor ) {
132+ this . addService ( ( ) => {
133+ this . mainScheduler = new Scheduler ( 5000 )
134+ const agentStatsMonitor = new AgentStatsMonitor ( this . dataSender , this . agentInfo . getAgentId ( ) , this . agentInfo . getAgentStartTime ( ) )
135+ this . mainScheduler . addJob ( ( ) => { agentStatsMonitor . run ( ) } )
136+ this . mainScheduler . start ( )
137+ } )
138+ }
139+
140+ if ( this . enablePingScheduler ) {
141+ this . addService ( ( ) => {
142+ this . pingScheduler = new PingScheduler ( this . dataSender )
143+ } )
144+ }
145+
146+ if ( this . enableServiceCommand ) {
147+ this . addService ( ( ) => {
148+ this . dataSender . sendSupportedServicesCommand ( )
149+ } )
150+ }
151+
152+ agent . services = this . services
153+ return agent
154+ }
155+ }
156+
157+ module . exports = AgentBuilder
0 commit comments