Skip to content

Commit 169e801

Browse files
Generic tasklogger (#13)
1 parent baad313 commit 169e801

11 files changed

+1702
-1090
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:8.1.4-alpine
1+
FROM node:11.10.0-alpine
22

33
WORKDIR /root/cf-runtime
44

Dockerfile.aarch64

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM multiarch/alpine:aarch64-v3.6
22

33
ENV NPM_CONFIG_LOGLEVEL info
4-
ENV NODE_VERSION 8.1.4
4+
ENV NODE_VERSION 11.10.0
55

66
RUN addgroup -g 1000 node \
77
&& adduser -u 1000 -G node -s /bin/sh -D node \

codefresh.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,23 @@ steps:
55

66
install_dependencies:
77
title: 'Installing testing dependencies'
8-
image: codefresh/node-tester-image:8.1.4
8+
image: node:11.10.0
99
commands:
1010
- yarn install --frozen-lockfile
1111

12-
1312
eslint:
1413
title: 'Running linting logic'
15-
image: codefresh/node-tester-image:8.1.4
14+
image: node:11.10.0
1615
commands:
1716
- yarn lint
1817
- yarn no-onlys
1918

2019
unit_test_step:
21-
image: codefresh/node-tester-image:8.1.4
20+
image: node:11.10.0
2221
environment:
2322
- COVERALLS_TOKEN=${{COVERALLS_TOKEN}}
2423
commands:
25-
- yarn test:ci
24+
- yarn test
2625

2726
build_step:
2827
title: "Building production image"

gulpfile.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ gulp.task('no.onlys', function (callback) {
1919

2020

2121
gulp.task('lint', ['clean'], function () {
22-
return gulp.src(['**/*.js', '!**/node_modules/**', '!**/server/migration/**', '!coverage/**/*.js'])
22+
return gulp.src(['**/*.js', '!**/node_modules/**', '!**/server/migration/**', '!coverage/**/*.js', '!test/logger.unit.spec.js'])
2323
.pipe(jshint({lookup: true}))
2424
.pipe(jshint.reporter('default'))
2525
.pipe(jshint.reporter('fail'));

lib/ContainerLogger.js

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,15 @@ class ContainerLogger extends EventEmitter {
1111
constructor({
1212
containerId,
1313
containerInterface,
14-
firebaseLogger,
15-
firebaseLastUpdate,
16-
firebaseMetricsLogs,
14+
stepLogger,
1715
logSizeLimit,
1816
isWorkflowLogSizeExceeded, // eslint-disable-line
1917
loggerStrategy
2018
}) {
2119
super();
2220
this.containerId = containerId;
2321
this.containerInterface = containerInterface;
24-
this.firebaseLogger = firebaseLogger;
25-
this.firebaseLastUpdate = firebaseLastUpdate;
26-
this.firebaseMetricsLogs = firebaseMetricsLogs;
22+
this.stepLogger = stepLogger;
2723
this.loggerStrategy = loggerStrategy;
2824
this.tty = false;
2925
this.logSizeLimit = logSizeLimit;
@@ -107,7 +103,7 @@ class ContainerLogger extends EventEmitter {
107103
stream.on('data', (chunk) => {
108104
const buf = new Buffer(chunk);
109105
const message = buf.toString('utf8');
110-
this._logMessageToFirebase(message, isError);
106+
this._logMessage(message, isError);
111107
});
112108
logger.info(`Listening on stream 'data' event for container: ${this.containerId}`);
113109
}
@@ -120,7 +116,7 @@ class ContainerLogger extends EventEmitter {
120116
if (payload === null) {
121117
break;
122118
}
123-
this._logMessageToFirebase(new Buffer(payload).toString('utf8'), isError);
119+
this._logMessage(new Buffer(payload).toString('utf8'), isError);
124120
header = stream.read(8);
125121
}
126122
});
@@ -131,7 +127,7 @@ class ContainerLogger extends EventEmitter {
131127
return this.logSize > this.logSizeLimit;
132128
}
133129

134-
_logMessageToFirebase(message, isError) {
130+
_logMessage(message, isError) {
135131
if (this.logSizeLimit && (this._stepLogSizeExceeded() || this.isWorkflowLogSizeExceeded()) && !isError) {
136132
if (!this.logExceededLimitsNotified) {
137133
this.logExceededLimitsNotified = true;
@@ -145,12 +141,11 @@ class ContainerLogger extends EventEmitter {
145141
message = `\x1B[31m${message}\x1B[0m`;
146142
}
147143

148-
this.firebaseLogger.push(message);
149-
this.firebaseLastUpdate.set(new Date().getTime());
144+
this.stepLogger.write(message);
150145

151146
if (this.logSizeLimit) {
152147
this.logSize += Buffer.byteLength(message);
153-
this.firebaseMetricsLogs.child('total').set(this.logSize);
148+
this.stepLogger.setLogSize(this.logSize);
154149
}
155150
this.emit('message.logged');
156151
}

lib/index.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ const Logger = require('./logger');
1313

1414
const logger = new Logger({
1515
loggerId: process.env.LOGGER_ID,
16-
firebaseAuthUrl: process.env.FIREBASE_AUTH_URL,
17-
firebaseSecret: process.env.FIREBASE_SECRET,
16+
taskLoggerConfig: JSON.parse(process.env.TASK_LOGGER_CONFIG),
1817
findExistingContainers: process.env.LISTEN_ON_EXISTING,
19-
firebaseMetricsLogsUrl: process.env.FIREBASE_METRICS_LOGS_URL,
2018
logSizeLimit: process.env.LOG_SIZE_LIMIT ? (parseInt(process.env.LOG_SIZE_LIMIT) * 1000000) : undefined,
2119
});
2220

lib/logger.js

Lines changed: 38 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
const fs = require('fs');
44
const _ = require('lodash');
5-
const Firebase = require('firebase');
65
const Docker = require('dockerode');
76
const DockerEvents = require('docker-events');
87
const CFError = require('cf-errors');
@@ -11,26 +10,24 @@ const ContainerStatus = require('./enums').ContainerStatus;
1110
const LoggerStrategy = require('./enums').LoggerStrategy;
1211
const ContainerHandlingStatus = require('./enums').ContainerHandlingStatus;
1312
const ContainerLogger = require('./ContainerLogger');
13+
const { TaskLogger } = require('@codefresh-io/task-logger');
1414

1515
class Logger {
1616

1717
constructor({
1818
loggerId,
19-
firebaseAuthUrl,
20-
firebaseSecret,
19+
taskLoggerConfig,
2120
findExistingContainers,
22-
firebaseMetricsLogsUrl,
2321
logSizeLimit
2422
}) {
2523
this.state = { status: 'init' };
26-
this.firebaseAuthUrl = firebaseAuthUrl;
27-
this.firebaseSecret = firebaseSecret;
24+
this.taskLoggerConfig = taskLoggerConfig;
2825
this.loggerId = loggerId;
2926
this.findExistingContainers = findExistingContainers === 'true';
30-
this.firebaseMetricsLogsUrl = firebaseMetricsLogsUrl;
3127
this.logSizeLimit = logSizeLimit;
3228
this.containerLoggers = [];
3329
this.logSize = 0;
30+
this.taskLogger = undefined;
3431

3532
let dockerSockPath;
3633
if (fs.existsSync('/var/run/codefresh/docker.sock')) {
@@ -51,11 +48,8 @@ class Logger {
5148
* @returns {*}
5249
*/
5350
validate() {
54-
if (!this.firebaseAuthUrl) {
55-
return this._error(new CFError('firebase auth url is missing'));
56-
}
57-
if (!this.firebaseSecret) {
58-
return this._error(new CFError('firebase secret is missing'));
51+
if (!this.taskLoggerConfig) {
52+
return this._error(new CFError('taskLogger configuration is missing'));
5953
}
6054
if (!this.loggerId) {
6155
return this._error(new CFError('logger id is missing'));
@@ -67,38 +61,36 @@ class Logger {
6761
* will attach it self to all created containers that their ids in their labels equals loggerId
6862
* will attach it self to all existing containers if requested
6963
* the container label should be 'io.codefresh.loggerId'
70-
* the path to write the containers logs will be passed through 'io.codefresh.firebaseUrl' label
71-
* @param loggerId
72-
* @param firebaseAuthUrl
73-
* @param firebaseSecret
7464
*/
7565
start() {
7666

7767
logger.info(`Logging container created for logger id: ${this.loggerId}`);
7868

79-
const authRef = new Firebase(this.firebaseAuthUrl);
80-
authRef.authWithCustomToken(this.firebaseSecret, (err) => {
81-
if (err) {
82-
this._error(new CFError({
83-
cause: err,
84-
message: `Failed to authenticate to firebase url ${this.firebaseAuthUrl}`
85-
}));
86-
return;
87-
}
88-
logger.info(`Authenticated to firebase url: ${this.firebaseAuthUrl}`);
89-
this.firebaseMetricsLogs = new Firebase(this.firebaseMetricsLogsUrl);
90-
91-
this._listenForNewContainers();
69+
TaskLogger(this.taskLoggerConfig.task, this.taskLoggerConfig.opts)
70+
.then((taskLogger) => {
71+
taskLogger.on('error', (err) => {
72+
logger.error(err.stack);
73+
});
9274

93-
this.state.status = 'ready';
94-
this._writeNewState();
75+
this.taskLogger = taskLogger;
76+
logger.info(`taskLogger successfully created`);
9577

96-
if (this.findExistingContainers) {
97-
this._listenForExistingContainers();
98-
}
78+
this._listenForNewContainers();
9979

100-
});
80+
this.state.status = 'ready';
81+
this._writeNewState();
10182

83+
if (this.findExistingContainers) {
84+
this._listenForExistingContainers();
85+
}
86+
})
87+
.catch((err) => {
88+
this._error(new CFError({
89+
cause: err,
90+
message: `Failed to create taskLogger`
91+
}));
92+
return;
93+
});
10294
}
10395

10496
/**
@@ -149,19 +141,12 @@ class Logger {
149141
* @param docker
150142
* @param newContainer
151143
*/
152-
_handleContainer(container) {
144+
async _handleContainer(container) { // jshint ignore:line
153145
const containerId = container.Id || container.id;
154146
const containerStatus = container.Status || container.status;
155147
const receivedLoggerId = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.id'];
156-
const receivedFirebaseLogsUrl = _.get(container,
157-
'Labels',
158-
_.get(container, 'Actor.Attributes'))['io.codefresh.logger.firebase.logsUrl'];
159-
const receivedFirebaseLastUpdateUrl = _.get(container,
160-
'Labels',
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'];
148+
const runCreationLogic = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.runCreationLogic'];
149+
const stepName = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.stepName'];
165150
const receivedLogSizeLimit = _.get(container,
166151
'Labels',
167152
_.get(container, 'Actor.Attributes'))['io.codefresh.logger.logSizeLimit'];
@@ -188,23 +173,13 @@ class Logger {
188173
return;
189174
}
190175

191-
if (!receivedFirebaseLogsUrl) {
192-
logger.error(`Container: ${containerId} does contain a firebaseUrl label`);
193-
return;
194-
}
195-
196-
if (!receivedFirebaseLastUpdateUrl) {
197-
logger.error(`Container: ${containerId} does contain a loggerFirebaseLastUpdateUrl label`);
198-
return;
199-
}
200-
201-
if (!receivedFirebaseMetricsLogsUrl) {
202-
logger.error(`Container: ${containerId} does contain a loggerFirebaseMetricsLogsUrl label`);
176+
if (!stepName) {
177+
logger.error(`Container: ${containerId} does not contain a stepName label`);
203178
return;
204179
}
205180

206181
if (!loggerStrategy) {
207-
logger.error(`Container: ${containerId} does contain a loggerStrategy label`);
182+
logger.error(`Container: ${containerId} does not contain a loggerStrategy label`);
208183
return;
209184
}
210185

@@ -222,37 +197,13 @@ class Logger {
222197

223198
this.state[containerId] = { status: ContainerHandlingStatus.INITIALIZING };
224199
logger.info(`Handling container: ${containerId}, status: '${containerStatus}'`);
225-
let firebaseLogger;
226-
try {
227-
firebaseLogger = new Firebase(receivedFirebaseLogsUrl);
228-
} catch (err) {
229-
const error = new CFError({
230-
cause: err,
231-
message: `Failed to create a new firebase logger ref`
232-
});
233-
logger.error(error.toString());
234-
return;
235-
}
236-
237-
let firebaseLastUpdate;
238-
try {
239-
firebaseLastUpdate = new Firebase(receivedFirebaseLastUpdateUrl);
240-
} catch (err) {
241-
const error = new CFError({
242-
cause: err,
243-
message: `Failed to create a new firebase lastUpdate ref`
244-
});
245-
logger.error(error.toString());
246-
return;
247-
}
248-
249-
let firebaseMetricsLogs;
200+
const stepLogger = this.taskLogger.create(stepName, undefined, undefined, runCreationLogic);
250201
try {
251-
firebaseMetricsLogs = new Firebase(receivedFirebaseMetricsLogsUrl);
202+
await stepLogger.restore(); // jshint ignore:line
252203
} catch (err) {
253204
const error = new CFError({
254205
cause: err,
255-
message: `Failed to create a new firebase metricsLogs ref`
206+
message: `Failed to restore step`
256207
});
257208
logger.error(error.toString());
258209
return;
@@ -264,9 +215,7 @@ class Logger {
264215
const containerLogger = new ContainerLogger({
265216
containerId,
266217
containerInterface,
267-
firebaseLogger,
268-
firebaseLastUpdate,
269-
firebaseMetricsLogs,
218+
stepLogger,
270219
logSizeLimit,
271220
isWorkflowLogSizeExceeded: this.logLimitExceeded.bind(this),
272221
loggerStrategy
@@ -290,7 +239,7 @@ class Logger {
290239

291240
_updateTotalLogSize() {
292241
this.logSize = this._getTotalLogSize();
293-
this.firebaseMetricsLogs.child('total').set(this.logSize);
242+
this.taskLogger.setLogSize(this.logSize);
294243
}
295244

296245
/**

package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
{
22
"name": "cf-container-logger",
33
"version": "0.0.4",
4-
"description": "codefresh container logger to firebase",
4+
"description": "codefresh container logger",
55
"keywords": [
66
"cf-container-logger"
77
],
88
"dependencies": {
9+
"@codefresh-io/task-logger": "^0.0.1",
910
"cf-errors": "^0.1.11",
1011
"cf-logs": "git+https://github.com/codefresh-io/cf-logs.git#ceba4f309e52a077747a0c6bf9c3ad02e762dc4b",
1112
"docker-events": "0.0.2",
1213
"dockerode": "^2.3.0",
13-
"firebase": "git+https://github.com/codefresh-io/firebase.git#80b2ed883ff281cd67b53bd0f6a0bbd6f330fed5",
1414
"forever": "^0.15.3",
1515
"lodash": "^4.15.0",
1616
"q": "^1.4.1"
1717
},
1818
"devDependencies": {
19-
"chai": "^3.0.0",
19+
"chai": "^4.2.0",
2020
"gulp": "^3.9.1",
2121
"gulp-coveralls": "^0.1.4",
2222
"gulp-env": "^0.2.0",
@@ -29,16 +29,16 @@
2929
"proxyquire": "^1.7.4",
3030
"run-sequence": "^1.1.0",
3131
"shelljs": "^0.6.0",
32-
"sinon": "^1.17.4",
33-
"sinon-chai": "^2.8.0"
32+
"sinon": "^7.2.4",
33+
"sinon-chai": "^3.3.0"
3434
},
3535
"engines": {
36-
"node": "8.1.4"
36+
"node": ">8.8.0"
3737
},
3838
"scripts": {
3939
"lint": "gulp lint",
4040
"no-onlys": "gulp no.onlys",
41-
"test": "gulp unit_test",
41+
"test": "mocha './{,!(node_modules)/**/}*.spec.js'",
4242
"test:integration": "gulp integ_test",
4343
"test:ci": "gulp unit_test && gulp coveralls && gulp clean",
4444
"coveralls": "gulp coveralls",

0 commit comments

Comments
 (0)