mcollina / docker-allcontainers

Get notified when a new container is started or stopped
MIT License
19 stars 9 forks source link

Catch error in JSON.parse, emit error event #10

Closed megastef closed 8 years ago

mcollina commented 8 years ago

You might want to use http://npm.im/fast-json-parse.

megastef commented 8 years ago

Ok, woking on it and dumped wrong json to console. I can reproduce it with docker-compose scale, when many containers are killed at once.

It looks the chunk containes multiple lines.

SyntaxError: Unexpected token { in JSON at position 671
    at Object.parse (native)
    at new Parse (/Users/stefan/sematext/docker-allcontainers/node_modules/fast-json-parse/parse.js:10:23)
    at Parse (/Users/stefan/sematext/docker-allcontainers/node_modules/fast-json-parse/parse.js:5:12)
    at DestroyableTransform._transform (/Users/stefan/sematext/docker-allcontainers/allcontainers.js:30:18)
    at DestroyableTransform.Transform._read (/Users/stefan/sematext/docker-allcontainers/node_modules/readable-stream/lib/_stream_transform.js:184:10)
    at DestroyableTransform.Transform._write (/Users/stefan/sematext/docker-allcontainers/node_modules/readable-stream/lib/_stream_transform.js:172:12)
    at doWrite (/Users/stefan/sematext/docker-allcontainers/node_modules/readable-stream/lib/_stream_writable.js:237:10)
    at writeOrBuffer (/Users/stefan/sematext/docker-allcontainers/node_modules/readable-stream/lib/_stream_writable.js:227:5)
    at DestroyableTransform.Writable.write (/Users/stefan/sematext/docker-allcontainers/node_modules/readable-stream/lib/_stream_writable.js:194:11)
    at write (/Users/stefan/sematext/docker-allcontainers/node_modules/readable-stream/lib/_stream_readable.js:623:24)
{"status":"kill","id":"be815a03562b3d1d21aadf7cc2329e09b9025dd378d1ad69b65955560c50f62c","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"be815a03562b3d1d21aadf7cc2329e09b9025dd378d1ad69b65955560c50f62c","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"6","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_6","signal":"9"}},"time":1465921775,"timeNano":1465921775383442262}
{"status":"kill","id":"fed8b769ecddb87812eb797a45eaa2210a9e5c3d174d336b9eedcbb6df3faf7b","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"fed8b769ecddb87812eb797a45eaa2210a9e5c3d174d336b9eedcbb6df3faf7b","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"25","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_25","signal":"9"}},"time":1465921775,"timeNano":1465921775383038990}
{"status":"kill","id":"2efb3e84d665be3f0145efee60b0386d1a6b7b45c9896b16087b8667bf47f461","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"2efb3e84d665be3f0145efee60b0386d1a6b7b45c9896b16087b8667bf47f461","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"22","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_22","signal":"9"}},"time":1465921775,"timeNano":1465921775383568550}
megastef commented 8 years ago

I've tried to split the lines, but got other JSON parse errors. I could not see what is wrong, in the node console the string got parsed. Are there any special chars in the buffer, e.g. from the Docker protocol? Actually we miss fast kill events, so it becomes a critical issue :(

mcollina commented 8 years ago

What is the original string coming in?

megastef commented 8 years ago

See above. I could dump the buffer, one sec.

megastef commented 8 years ago
started { id: '924126c7f703ba33b4adf51b0145a86db2af8622d5d7672ae0d7db2e3e3463d9',
  image: 'lg-nginx',
  name: 'loggenerator_nginx-log-invalid_14' }
started { id: '70b8bc71d635c256655e3e360e50a451ed6cc61f1321b41c33bdafbf6f046d46',
  image: 'lg-nginx',
  name: 'loggenerator_nginx-log-invalid_16' }
started { id: 'be815a03562b3d1d21aadf7cc2329e09b9025dd378d1ad69b65955560c50f62c',
  image: 'lg-nginx',
  name: 'loggenerator_nginx-log-invalid_6' }

Parse error for this:

{"type":"Buffer","data":[123,34,115,116,97,116,117,115,34,58,34,107,105,108,108,34,44,34,105,100,34,58,34,54,98,57,50,102,49,48,48,53,102,100,97,98,50,52,99,50,50,102,52,56,102,52,49,99,98,97,57,98,57,48,100,101,50,50,48,52,53,54,54,52,101,50,56,97,98,54,99,97,100,101,49,52,52,53,55,51,55,55,50,100,48,48,55,34,44,34,102,114,111,109,34,58,34,108,103,45,110,103,105,110,120,34,44,34,84,121,112,101,34,58,34,99,111,110,116,97,105,110,101,114,34,44,34,65,99,116,105,111,110,34,58,34,107,105,108,108,34,44,34,65,99,116,111,114,34,58,123,34,73,68,34,58,34,54,98,57,50,102,49,48,48,53,102,100,97,98,50,52,99,50,50,102,52,56,102,52,49,99,98,97,57,98,57,48,100,101,50,50,48,52,53,54,54,52,101,50,56,97,98,54,99,97,100,101,49,52,52,53,55,51,55,55,50,100,48,48,55,34,44,34,65,116,116,114,105,98,117,116,101,115,34,58,123,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,99,111,110,102,105,103,45,104,97,115,104,34,58,34,51,54,98,48,55,57,51,55,100,49,101,49,100,51,102,56,50,49,98,56,51,100,99,55,101,99,97,100,55,99,99,52,50,55,98,49,101,98,98,52,49,100,53,49,56,48,48,51,97,55,55,99,50,98,54,48,101,98,98,57,101,48,55,101,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,99,111,110,116,97,105,110,101,114,45,110,117,109,98,101,114,34,58,34,49,55,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,111,110,101,111,102,102,34,58,34,70,97,108,115,101,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,112,114,111,106,101,99,116,34,58,34,108,111,103,103,101,110,101,114,97,116,111,114,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,115,101,114,118,105,99,101,34,58,34,110,103,105,110,120,45,108,111,103,45,105,110,118,97,108,105,100,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,118,101,114,115,105,111,110,34,58,34,49,46,55,46,49,34,44,34,105,109,97,103,101,34,58,34,108,103,45,110,103,105,110,120,34,44,34,110,97,109,101,34,58,34,108,111,103,103,101,110,101,114,97,116,111,114,95,110,103,105,110,120,45,108,111,103,45,105,110,118,97,108,105,100,95,49,55,34,44,34,115,105,103,110,97,108,34,58,34,49,53,34,125,125,44,34,116,105,109,101,34,58,49,52,54,53,57,50,52,54,52,57,44,34,116,105,109,101,78,97,110,111,34,58,49,52,54,53,57,50,52,54,52,57,50,57,49,51,54,53,48,50,52,125,10,123,34,115,116,97,116,117,115,34,58,34,107,105,108,108,34,44,34,105,100,34,58,34,97,52,54,50,49,53,50,50,55,56,56,51,101,48,52,102,48,55,101,54,54,102,102,98,51,56,52,51,101,48,51,53,55,51,49,54,57,98,49,53,99,101,55,102,99,101,50,97,48,54,49,54,100,56,55,51,50,55,102,102,57,102,53,102,34,44,34,102,114,111,109,34,58,34,108,103,45,110,103,105,110,120,34,44,34,84,121,112,101,34,58,34,99,111,110,116,97,105,110,101,114,34,44,34,65,99,116,105,111,110,34,58,34,107,105,108,108,34,44,34,65,99,116,111,114,34,58,123,34,73,68,34,58,34,97,52,54,50,49,53,50,50,55,56,56,51,101,48,52,102,48,55,101,54,54,102,102,98,51,56,52,51,101,48,51,53,55,51,49,54,57,98,49,53,99,101,55,102,99,101,50,97,48,54,49,54,100,56,55,51,50,55,102,102,57,102,53,102,34,44,34,65,116,116,114,105,98,117,116,101,115,34,58,123,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,99,111,110,102,105,103,45,104,97,115,104,34,58,34,51,54,98,48,55,57,51,55,100,49,101,49,100,51,102,56,50,49,98,56,51,100,99,55,101,99,97,100,55,99,99,52,50,55,98,49,101,98,98,52,49,100,53,49,56,48,48,51,97,55,55,99,50,98,54,48,101,98,98,57,101,48,55,101,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,99,111,110,116,97,105,110,101,114,45,110,117,109,98,101,114,34,58,34,50,56,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,111,110,101,111,102,102,34,58,34,70,97,108,115,101,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,112,114,111,106,101,99,116,34,58,34,108,111,103,103,101,110,101,114,97,116,111,114,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,115,101,114,118,105,99,101,34,58,34,110,103,105,110,120,45,108,111,103,45,105,110,118,97,108,105,100,34,44,34,99,111,109,46,100,111,99,107,101,114,46,99,111,109,112,111,115,101,46,118,101,114,115,105,111,110,34,58,34,49,46,55,46,49,34,44,34,105,109,97,103,101,34,58,34,108,103,45,110,103,105,110,120,34,44,34,110,97,109,101,34,58,34,108,111,103,103,101,110,101,114,97,116,111,114,95,110,103,105,110,120,45,108,111,103,45,105,110,118,97,108,105,100,95,50,56,34,44,34,115,105,103,110,97,108,34,58,34,49,53,34,125,125,44,34,116,105,109,101,34,58,49,52,54,53,57,50,52,54,52,57,44,34,116,105,109,101,78,97,110,111,34,58,49,52,54,53,57,50,52,54,52,57,50,56,57,54,48,50,55,50,50,125,10]}
{"status":"kill","id":"6b92f1005fdab24c22f48f41cba9b90de22045664e28ab6cade144573772d007","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"6b92f1005fdab24c22f48f41cba9b90de22045664e28ab6cade144573772d007","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"17","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_17","signal":"15"}},"time":1465924649,"timeNano":1465924649291365024}
{"status":"kill","id":"a46215227883e04f07e66ffb3843e03573169b15ce7fce2a0616d87327ff9f5f","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"a46215227883e04f07e66ffb3843e03573169b15ce7fce2a0616d87327ff9f5f","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"28","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_28","signal":"15"}},"time":1465924649,"timeNano":1465924649289602722}
megastef commented 8 years ago

wrong-json.txt

Dumped to disk with fs.writeFileSync()

mcollina commented 8 years ago

not sure, Docker json is not "proper json" sometimes.

megastef commented 8 years ago

It should be possible to parse the lines. Used the dump in node console.

> y   = new Buffer (x.data)
<Buffer 7b 22 73 74 61 74 75 73 22 3a 22 6b 69 6c 6c 22 2c 22 69 64 22 3a 22 63 63 65 64 30 30 30 34 65 34 38 66 63 61 31 62 37 33 32 31 38 39 30 64 30 31 36 ... >
> y.toString()
'{"status":"kill","id":"cced0004e48fca1b7321890d016be30a9f8f74ae41c0a54b5cb7dba392eb4f12","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"cced0004e48fca1b7321890d016be30a9f8f74ae41c0a54b5cb7dba392eb4f12","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"24","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_24","signal":"9"}},"time":1465925475,"timeNano":1465925475453789236}\n{"status":"kill","id":"fed8b769ecddb87812eb797a45eaa2210a9e5c3d174d336b9eedcbb6df3faf7b","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"fed8b769ecddb87812eb797a45eaa2210a9e5c3d174d336b9eedcbb6df3faf7b","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"25","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_25","signal":"9"}},"time":1465925475,"timeNano":1465925475453938710}\n'
> y.toString().split('\n')
[ '{"status":"kill","id":"cced0004e48fca1b7321890d016be30a9f8f74ae41c0a54b5cb7dba392eb4f12","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"cced0004e48fca1b7321890d016be30a9f8f74ae41c0a54b5cb7dba392eb4f12","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"24","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_24","signal":"9"}},"time":1465925475,"timeNano":1465925475453789236}',
  '{"status":"kill","id":"fed8b769ecddb87812eb797a45eaa2210a9e5c3d174d336b9eedcbb6df3faf7b","from":"lg-nginx","Type":"container","Action":"kill","Actor":{"ID":"fed8b769ecddb87812eb797a45eaa2210a9e5c3d174d336b9eedcbb6df3faf7b","Attributes":{"com.docker.compose.config-hash":"36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e","com.docker.compose.container-number":"25","com.docker.compose.oneoff":"False","com.docker.compose.project":"loggenerator","com.docker.compose.service":"nginx-log-invalid","com.docker.compose.version":"1.7.1","image":"lg-nginx","name":"loggenerator_nginx-log-invalid_25","signal":"9"}},"time":1465925475,"timeNano":1465925475453938710}',
  '' ]
> JSON.parse(y.toString().split('\n')[0])
{ status: 'kill',
  id: 'cced0004e48fca1b7321890d016be30a9f8f74ae41c0a54b5cb7dba392eb4f12',
  from: 'lg-nginx',
  Type: 'container',
  Action: 'kill',
  Actor: 
   { ID: 'cced0004e48fca1b7321890d016be30a9f8f74ae41c0a54b5cb7dba392eb4f12',
     Attributes: 
      { 'com.docker.compose.config-hash': '36b07937d1e1d3f821b83dc7ecad7cc427b1ebb41d518003a77c2b60ebb9e07e',
        'com.docker.compose.container-number': '24',
        'com.docker.compose.oneoff': 'False',
        'com.docker.compose.project': 'loggenerator',
        'com.docker.compose.service': 'nginx-log-invalid',
        'com.docker.compose.version': '1.7.1',
        image: 'lg-nginx',
        name: 'loggenerator_nginx-log-invalid_24',
        signal: '9' } },
  time: 1465925475,
  timeNano: 1465925475453789200 }
> 
megastef commented 8 years ago

Hi, the last PR runs stable for me. Spinning up 50 containers with Docker-Compose and then stop them all without an error and seeing all events. Feel free to adjust, I'm not the best node developer, and had to remove through2 to get this running with split().

megastef commented 8 years ago

@mcollina Do you have an idea how I could fiddle this in docker-loghose / docker-stats etc. ? As they depend on docker-allcontainers? Thought about walking to node_modules/docker-loghose and run there 'npm i megastef/docker-allcontainers' - but quite a hack. So I could test Sematext Docker Agent with this... and build new images ...

mcollina commented 8 years ago

have a look at https://docs.npmjs.com/cli/link.

megastef commented 8 years ago

Thx, right npm link 👍 .... this could be merged from my point of view.

mcollina commented 8 years ago

Released as 0.5.0. There was a problem with split.