@@ -9,7 +9,6 @@ const dc = require('dc-polyfill')
9
9
const crashtracker = require ( '../crashtracking' )
10
10
11
11
const { promisify } = require ( 'util' )
12
- const zlib = require ( 'zlib' )
13
12
14
13
const profileSubmittedChannel = dc . channel ( 'datadog:profiling:profile-submitted' )
15
14
const spanFinishedChannel = dc . channel ( 'dd-trace:span:finish' )
@@ -96,38 +95,6 @@ class Profiler extends EventEmitter {
96
95
}
97
96
}
98
97
99
- try {
100
- const clevel = config . uploadCompression . level
101
- switch ( config . uploadCompression . method ) {
102
- case 'gzip' :
103
- this . _compressionFn = promisify ( zlib . gzip )
104
- if ( clevel !== undefined ) {
105
- this . _compressionOptions = {
106
- level : clevel
107
- }
108
- }
109
- break
110
- case 'zstd' :
111
- if ( typeof zlib . zstdCompress === 'function' ) {
112
- this . _compressionFn = promisify ( zlib . zstdCompress )
113
- if ( clevel !== undefined ) {
114
- this . _compressionOptions = {
115
- params : {
116
- [ zlib . constants . ZSTD_c_compressionLevel ] : clevel
117
- }
118
- }
119
- }
120
- } else {
121
- const zstdCompress = require ( '@datadog/libdatadog' ) . load ( 'datadog-js-zstd' ) . zstd_compress
122
- const level = clevel ?? 0 // 0 is zstd default compression level
123
- this . _compressionFn = ( buffer ) => Promise . resolve ( Buffer . from ( zstdCompress ( buffer , level ) ) )
124
- }
125
- break
126
- }
127
- } catch ( err ) {
128
- this . _logError ( err )
129
- }
130
-
131
98
try {
132
99
const start = new Date ( )
133
100
for ( const profiler of config . profilers ) {
@@ -224,6 +191,43 @@ class Profiler extends EventEmitter {
224
191
}
225
192
}
226
193
194
+ _getCompressionFn ( ) {
195
+ if ( this . _compressionFn === undefined ) {
196
+ try {
197
+ const clevel = this . _config . uploadCompression . level
198
+ switch ( this . _config . uploadCompression . method ) {
199
+ case 'gzip' :
200
+ this . _compressionFn = promisify ( require ( 'zlib' ) . gzip )
201
+ if ( clevel !== undefined ) {
202
+ this . _compressionOptions = {
203
+ level : clevel
204
+ }
205
+ }
206
+ break
207
+ case 'zstd' :
208
+ if ( typeof zlib . zstdCompress === 'function' ) {
209
+ this . _compressionFn = promisify ( require ( 'zlib' ) . zstdCompress )
210
+ if ( clevel !== undefined ) {
211
+ this . _compressionOptions = {
212
+ params : {
213
+ [ zlib . constants . ZSTD_c_compressionLevel ] : clevel
214
+ }
215
+ }
216
+ }
217
+ } else {
218
+ const zstdCompress = require ( '@datadog/libdatadog' ) . load ( 'datadog-js-zstd' ) . zstd_compress
219
+ const level = clevel ?? 0 // 0 is zstd default compression level
220
+ this . _compressionFn = ( buffer ) => Promise . resolve ( Buffer . from ( zstdCompress ( buffer , level ) ) )
221
+ }
222
+ break
223
+ }
224
+ } catch ( err ) {
225
+ this . _logError ( err )
226
+ }
227
+ }
228
+ return this . _compressionFn
229
+ }
230
+
227
231
async _collect ( snapshotKind , restart = true ) {
228
232
if ( ! this . _enabled ) return
229
233
@@ -259,9 +263,13 @@ class Profiler extends EventEmitter {
259
263
await Promise . all ( profiles . map ( async ( { profiler, profile } ) => {
260
264
try {
261
265
const encoded = await profiler . encode ( profile )
262
- const compressed = encoded instanceof Buffer && this . _compressionFn !== undefined
263
- ? await this . _compressionFn ( encoded , this . _compressionOptions )
264
- : encoded
266
+ let compressed = encoded
267
+ if ( encoded instanceof Buffer ) {
268
+ const compressionFn = this . _getCompressionFn ( )
269
+ if ( compressionFn !== undefined ) {
270
+ compressed = await compressionFn ( encoded , this . _compressionOptions )
271
+ }
272
+ }
265
273
encodedProfiles [ profiler . type ] = compressed
266
274
this . _logger . debug ( ( ) => {
267
275
const profileJson = JSON . stringify ( profile , ( key , value ) => {
0 commit comments