Skip to content

Commit 15cb03d

Browse files
noamt-codefreshoren-codefresh
authored andcommitted
SAAS-support-tasklogger-streams-2 (#33)
* - fixed some tests - fixed githubs matching API - cosmetics * support task logger stream api * fixed step logger options reference * revert Dockerfile unwanted commits * fixed write after end error * change task logger package to use stream branch version * dummy commit * updated yarn.lock * fixed tests * wip * Upgraded task logger to 1.5.2 * Upgraded task logger to 1.5.3 * dummy * dummy * Aligned branches to new paging structure * dummy
1 parent 2156838 commit 15cb03d

File tree

6 files changed

+127
-25
lines changed

6 files changed

+127
-25
lines changed

Dockerfile

-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,3 @@ COPY . ./
2222
ENTRYPOINT ["/sbin/tini", "--"]
2323

2424
CMD ["node", "node_modules/.bin/forever", "--minUptime", "1", "--spinSleepTime", "1000", "-c", "node", "lib/index.js"]
25-

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@
1111
# logging strategies
1212
# io.codefresh.loggerStrategy
1313
# logs - will get all container logs from the beginning
14-
# attach - will get all container logs from the point where attach was enabled. usefull for getting all interactive i/o
14+
# attach - will get all container logs from the point where attach was enabled. usefull for getting all interactive i/o
15+
16+

lib/ContainerLogger.js

+90-15
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const Q = require('q');
55
const logger = require('cf-logs').Logger('codefresh:containerLogger');
66
const CFError = require('cf-errors');
77
const LoggerStrategy = require('./enums').LoggerStrategy;
8+
const { Transform, pipeline } = require('stream');
89

910
class ContainerLogger extends EventEmitter {
1011

@@ -42,27 +43,25 @@ class ContainerLogger extends EventEmitter {
4243
})
4344
.then(([stdout, stderr]) => {
4445
logger.info(`Attached stream to container: ${this.containerId}`);
46+
4547
// Listening on the stream needs to be performed different depending if a tty is attached or not
4648
// See documentation of the docker api here: https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/attach-to-a-container
4749
if (this.tty) {
48-
this._handleTtyStream(stdout, false);
49-
if (stderr) {
50-
this._handleTtyStream(stderr, true);
51-
}
52-
} else {
53-
this._handleNonTtyStream(stdout, false);
54-
}
55-
56-
stdout.on('end', () => {
57-
this.stepFinished = true;
58-
logger.info(`stdout end event was fired for container: ${this.containerId}`);
59-
});
6050

61-
if (stderr) {
62-
stderr.on('end', () => {
51+
stdout.on('end', () => {
6352
this.stepFinished = true;
64-
logger.info(`stderr end event was fired for container: ${this.containerId}`);
53+
logger.info(`stdout end event was fired for container: ${this.containerId}`);
6554
});
55+
56+
if (this.stepLogger.opts && this.stepLogger.opts.logsRateLimitConfig) {
57+
logger.info(`Found logger rate limit configuration, using streams api`);
58+
this._streamTty(stdout, stderr);
59+
return;
60+
}
61+
62+
this._registerToTtyStreams(stdout, stderr);
63+
} else {
64+
this._handleNonTtyStream(stdout, false);
6665
}
6766
}, (err) => {
6867
return Q.reject(new CFError({
@@ -99,6 +98,47 @@ class ContainerLogger extends EventEmitter {
9998
]);
10099
}
101100

101+
_streamTty(stdout, stderr) {
102+
103+
pipeline(stdout, this._logSizeLimitStream(), this.stepLogger.writeStream(), (err) => {
104+
if (err) {
105+
logger.error(`Stdout streams pipeline failed on: ${err}`);
106+
return;
107+
}
108+
logger.info('Stdout streams pipeline succeeded.');
109+
});
110+
111+
if (!stderr) {
112+
return;
113+
}
114+
115+
pipeline(stderr, this._logSizeLimitStream(), this._errorTransformerStream(), this.stepLogger.writeStream(), (err) => {
116+
if (err) {
117+
logger.error(`Stderr streams pipeline failed on: ${err}`);
118+
return;
119+
}
120+
logger.info('Stderr streams pipeline succeeded.');
121+
});
122+
123+
stderr.once('end', () => {
124+
this.stepFinished = true;
125+
logger.info(`stderr end event was fired for container: ${this.containerId}`);
126+
});
127+
128+
}
129+
130+
_registerToTtyStreams(stdout, stderr) {
131+
this._handleTtyStream(stdout, false);
132+
133+
if (stderr) {
134+
stderr.once('end', () => {
135+
this.stepFinished = true;
136+
logger.info(`stderr end event was fired for container: ${this.containerId}`);
137+
});
138+
this._handleTtyStream(stderr, true);
139+
}
140+
}
141+
102142
_handleTtyStream(stream, isError) {
103143
stream.on('data', (chunk) => {
104144
const buf = new Buffer(chunk);
@@ -150,6 +190,41 @@ class ContainerLogger extends EventEmitter {
150190
this.emit('message.logged');
151191
}
152192

193+
_errorTransformerStream() {
194+
return new Transform({
195+
transform: (data, encoding, done) => {
196+
const message = `\x1B[31m${data.toString('utf8')}\x1B[0m`;
197+
done(null, Buffer.from(message));
198+
}
199+
});
200+
}
201+
202+
_logSizeLimitStream() {
203+
return new Transform({
204+
transform: (data, encoding, done) => {
205+
if (this.logSizeLimit && (this._stepLogSizeExceeded() || this.isWorkflowLogSizeExceeded())) {
206+
if (!this.logExceededLimitsNotified) {
207+
this.logExceededLimitsNotified = true;
208+
const message = `\x1B[01;93mLog size exceeded for ${this._stepLogSizeExceeded() ? 'this step' : 'the workflow'}.\nThe step will continue to execute until it finished but new logs will not be stored.\x1B[0m\r\n`;
209+
done(null, Buffer.from(message));
210+
return;
211+
}
212+
213+
done(null, Buffer.alloc(0)); // discard chunk
214+
return;
215+
}
216+
217+
if (this.logSizeLimit) {
218+
this.logSize += Buffer.byteLength(data);
219+
this.stepLogger.setLogSize(this.logSize);
220+
}
221+
222+
this.emit('message.logged');
223+
done(null, data);
224+
}
225+
});
226+
}
227+
153228
}
154229

155230
module.exports = ContainerLogger;

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"name": "cf-container-logger",
3-
"version": "0.0.7",
3+
"version": "0.1.0",
44
"description": "codefresh container logger",
55
"keywords": [
66
"cf-container-logger"
77
],
88
"dependencies": {
9-
"@codefresh-io/task-logger": "^0.0.18",
9+
"@codefresh-io/task-logger": "1.5.3",
1010
"cf-errors": "^0.1.11",
1111
"cf-logs": "^1.1.0",
1212
"docker-events": "0.0.2",

service.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version: 1.0.36
1+
version: 1.0.37

yarn.lock

+31-5
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,24 @@
22
# yarn lockfile v1
33

44

5-
"@codefresh-io/task-logger@^0.0.18":
6-
version "0.0.18"
7-
resolved "https://registry.yarnpkg.com/@codefresh-io/task-logger/-/task-logger-0.0.18.tgz#d7d69d4eeeaf9fc4d7ca78abf3a208a951d5f297"
8-
integrity sha512-qDFO88Lkco5zHKGxV4YTNgHwfX5vgODleTgXyHuj1xdCuuZTsOvYmnm/qZcPVkiSb6tKSqKv3QBvMePKi6Ej8g==
5+
"@codefresh-io/task-logger@1.5.3":
6+
version "1.5.3"
7+
resolved "https://registry.yarnpkg.com/@codefresh-io/task-logger/-/task-logger-1.5.3.tgz#9465bd9cd98e63757ce5975dbf17e4341dd5066c"
8+
integrity sha512-r/fL3QXZcYjIt2rabu/dZ6Ooeg1xCVHaNiUyjigEDiWOqPXOKpFh9FiTvqSNSC5QsK4Rs/bU6e8CU/thF9FyDg==
99
dependencies:
1010
cf-errors "^0.1.11"
1111
crypto "0.0.3"
1212
debug "^4.1.1"
1313
firebase "git+https://github.com/codefresh-io/firebase.git#80b2ed883ff281cd67b53bd0f6a0bbd6f330fed5"
14+
firebase-token-generator "^2.0.0"
1415
jsonwebtoken "^8.4.0"
1516
lodash "^3.10.1"
1617
mongodb "^3.1.13"
1718
node-redis-pubsub "^4.0.0"
1819
q "^1.4.1"
1920
redis "^2.8.0"
2021
request "^2.88.0"
22+
requestretry "^4.0.2"
2123
retry "^0.12.0"
2224

2325
"@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.3.0":
@@ -1230,7 +1232,7 @@ extend@^3.0.0, extend@~3.0.0:
12301232
version "3.0.1"
12311233
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
12321234

1233-
extend@~3.0.2:
1235+
extend@^3.0.2, extend@~3.0.2:
12341236
version "3.0.2"
12351237
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
12361238
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
@@ -1365,6 +1367,11 @@ fined@^1.0.1:
13651367
object.pick "^1.2.0"
13661368
parse-filepath "^1.0.1"
13671369

1370+
firebase-token-generator@^2.0.0:
1371+
version "2.0.0"
1372+
resolved "https://registry.yarnpkg.com/firebase-token-generator/-/firebase-token-generator-2.0.0.tgz#9767d759ec13abdc99ba115fd5ea99d8b93d1206"
1373+
integrity sha1-l2fXWewTq9yZuhFf1eqZ2Lk9EgY=
1374+
13681375
"firebase@git+https://github.com/codefresh-io/firebase.git#80b2ed883ff281cd67b53bd0f6a0bbd6f330fed5":
13691376
version "2.4.2"
13701377
resolved "git+https://github.com/codefresh-io/firebase.git#80b2ed883ff281cd67b53bd0f6a0bbd6f330fed5"
@@ -2791,6 +2798,11 @@ lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4:
27912798
version "4.17.4"
27922799
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
27932800

2801+
lodash@^4.17.10:
2802+
version "4.17.15"
2803+
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
2804+
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
2805+
27942806
lodash@^4.17.11:
27952807
version "4.17.11"
27962808
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
@@ -3906,6 +3918,15 @@ request@^2.88.0:
39063918
tunnel-agent "^0.6.0"
39073919
uuid "^3.3.2"
39083920

3921+
requestretry@^4.0.2:
3922+
version "4.1.0"
3923+
resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-4.1.0.tgz#7e8a2247c7d58726d3efb5d25bb1915bca8f0be3"
3924+
integrity sha512-q3IT2vz5vkcMT6xgwB/BWzsmnu7N/27l9fW86U48gt9Mwrce5rSEyFvpAW7Il1/B78/NBUlYBvcCY1RzWUWy7w==
3925+
dependencies:
3926+
extend "^3.0.2"
3927+
lodash "^4.17.10"
3928+
when "^3.7.7"
3929+
39093930
require_optional@^1.0.1:
39103931
version "1.0.1"
39113932
resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
@@ -4735,6 +4756,11 @@ websocket-extensions@>=0.1.1:
47354756
resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
47364757
integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
47374758

4759+
when@^3.7.7:
4760+
version "3.7.8"
4761+
resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
4762+
integrity sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=
4763+
47384764
which@^1.0.9, which@^1.1.1:
47394765
version "1.3.0"
47404766
resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"

0 commit comments

Comments
 (0)