@@ -14,12 +14,23 @@ const ContainerLogger = require('./ContainerLogger');
14
14
15
15
class Logger {
16
16
17
- constructor ( loggerId , firebaseAuthUrl , firebaseSecret , findExistingContainers ) {
17
+ constructor ( {
18
+ loggerId,
19
+ firebaseAuthUrl,
20
+ firebaseSecret,
21
+ findExistingContainers,
22
+ firebaseMetricsLogsUrl,
23
+ logSizeLimit
24
+ } ) {
18
25
this . state = { status : 'init' } ;
19
26
this . firebaseAuthUrl = firebaseAuthUrl ;
20
27
this . firebaseSecret = firebaseSecret ;
21
28
this . loggerId = loggerId ;
22
29
this . findExistingContainers = findExistingContainers === 'true' ;
30
+ this . firebaseMetricsLogsUrl = firebaseMetricsLogsUrl ;
31
+ this . logSizeLimit = logSizeLimit ;
32
+ this . containerLoggers = [ ] ;
33
+ this . logSize = 0 ;
23
34
24
35
let dockerSockPath ;
25
36
if ( fs . existsSync ( '/var/run/codefresh/docker.sock' ) ) {
@@ -75,6 +86,7 @@ class Logger {
75
86
return ;
76
87
}
77
88
logger . info ( `Authenticated to firebase url: ${ this . firebaseAuthUrl } ` ) ;
89
+ this . firebaseMetricsLogs = new Firebase ( this . firebaseMetricsLogsUrl ) ;
78
90
79
91
this . _listenForNewContainers ( ) ;
80
92
@@ -118,6 +130,19 @@ class Logger {
118
130
} ) ;
119
131
}
120
132
133
+
134
+ logLimitExceeded ( ) {
135
+ // TODO in the future when we allow a workflow to use multuple dinds, this will not be correct
136
+ // we need to get the total size of logs from all dinds
137
+ return this . logSizeLimit && this . _getTotalLogSize ( ) > this . logSizeLimit ;
138
+ }
139
+
140
+ _getTotalLogSize ( ) {
141
+ return _ . reduce ( this . containerLoggers , ( sum , containerLogger ) => {
142
+ return sum + containerLogger . logSize ;
143
+ } , 0 ) ;
144
+ }
145
+
121
146
/**
122
147
* receives a container and decides if to start listening on it
123
148
* @param loggerId
@@ -134,6 +159,12 @@ class Logger {
134
159
const receivedFirebaseLastUpdateUrl = _ . get ( container ,
135
160
'Labels' ,
136
161
_ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.firebase.lastUpdateUrl' ] ;
162
+ const receivedFirebaseMetricsLogsUrl = _ . get ( container ,
163
+ 'Labels' ,
164
+ _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.firebase.metricsLogs' ] ;
165
+ const receivedLogSizeLimit = _ . get ( container ,
166
+ 'Labels' ,
167
+ _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.logSizeLimit' ] ;
137
168
const loggerStrategy = _ . get ( container , 'Labels' , _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.strategy' ] ;
138
169
139
170
if ( ! containerId ) {
@@ -167,6 +198,11 @@ class Logger {
167
198
return ;
168
199
}
169
200
201
+ if ( ! receivedFirebaseMetricsLogsUrl ) {
202
+ logger . error ( `Container: ${ containerId } does contain a loggerFirebaseMetricsLogsUrl label` ) ;
203
+ return ;
204
+ }
205
+
170
206
if ( ! loggerStrategy ) {
171
207
logger . error ( `Container: ${ containerId } does contain a loggerStrategy label` ) ;
172
208
return ;
@@ -210,8 +246,33 @@ class Logger {
210
246
return ;
211
247
}
212
248
249
+ let firebaseMetricsLogs ;
250
+ try {
251
+ firebaseMetricsLogs = new Firebase ( receivedFirebaseMetricsLogsUrl ) ;
252
+ } catch ( err ) {
253
+ const error = new CFError ( {
254
+ cause : err ,
255
+ message : `Failed to create a new firebase metricsLogs ref`
256
+ } ) ;
257
+ logger . error ( error . toString ( ) ) ;
258
+ return ;
259
+ }
260
+
261
+ const logSizeLimit = receivedLogSizeLimit ? ( parseInt ( receivedLogSizeLimit ) * 1000000 ) : undefined ;
262
+
213
263
const containerInterface = this . docker . getContainer ( containerId ) ;
214
- const containerLogger = new ContainerLogger ( containerId , containerInterface , firebaseLogger , firebaseLastUpdate , loggerStrategy ) ;
264
+ const containerLogger = new ContainerLogger ( {
265
+ containerId,
266
+ containerInterface,
267
+ firebaseLogger,
268
+ firebaseLastUpdate,
269
+ firebaseMetricsLogs,
270
+ logSizeLimit,
271
+ isWorkflowLogSizeExceeded : this . logLimitExceeded . bind ( this ) ,
272
+ loggerStrategy
273
+ } ) ;
274
+ this . containerLoggers . push ( containerLogger ) ;
275
+ containerLogger . on ( 'message.logged' , this . _updateTotalLogSize . bind ( this ) ) ;
215
276
216
277
containerLogger . start ( )
217
278
. done ( ( ) => {
@@ -227,6 +288,11 @@ class Logger {
227
288
} ) ;
228
289
}
229
290
291
+ _updateTotalLogSize ( ) {
292
+ this . logSize = this . _getTotalLogSize ( ) ;
293
+ this . firebaseMetricsLogs . child ( 'total' ) . set ( this . logSize ) ;
294
+ }
295
+
230
296
/**
231
297
* Will check if a container was already handled (no matter what the handling status is)
232
298
* @param containerId
0 commit comments