{"_id":"r-dockerstats","_rev":"1-9440ab3c67985776c1e8ab12e4034a84","name":"r-dockerstats","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"r-dockerstats","version":"0.1.0","description":"`{dockerstats}` is a small wrapper around `docker stats` that returns the output of this command as an R data.frame. ","directories":{"man":"man","test":"tests"},"scripts":{"test":"Rscript -e 'devtools::check()'","compile-readme":"Rscript -e 'knitr::knit(\"Readme.Rmd\")'","postinstall":"Rscript -e 'source(\"install.R\")'"},"repository":{"type":"git","url":"git+https://github.com/ColinFay/dockerstats.git"},"keywords":["RStats","Docker"],"author":{"name":"Colin Fay","email":"contact@colinfay.me","url":"https://colinfay.me"},"license":"MIT","bugs":{"url":"https://github.com/ColinFay/dockerstats/issues"},"homepage":"https://github.com/ColinFay/dockerstats#readme","man":[],"gitHead":"2f15876a10c51d80918ab06df318c111202927b9","_id":"r-dockerstats@0.1.0","_nodeVersion":"13.12.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-RsH+yhCrSnAe5rIoea2SF3t6Vg1dnqS9dj08ycFD5lw8+Flp/tqOV0dAkyw+RKo3m5G+41n4k9zp+Il2uIuWIg==","shasum":"7dddb83c54ea7b25be55cabae3ab030f2bfdec29","tarball":"https://registry.npmjs.org/r-dockerstats/-/r-dockerstats-0.1.0.tgz","fileCount":35,"unpackedSize":137656,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIHyhCRA9TVsSAnZWagAAnRsQAITWq2XSHYJaxedfWDgq\nUlMyzaG8kHPsvLLNxknHvAUiuV670s9tBmCc84DapkgIQr9dM6I1VkXFSrPC\nWuJniS3EEkV1e3hot7nVNVWoI73a7bZsXLig1HoFEfnvGsmapuR/EA9yN1qc\n+LfBOsK4gXkKwXlNtYSsN4s3c2eTak4EmN0nAsNkB/ZydujriwkpX7i434qu\nqve39lqfkqE1+cAVoQjJIy6BsaTQc3ggLERSP4hixrVjzycV96vIuyZ9aAf8\nH+luNj5Ko+ehSvdlDRaOpPQw3BvW6pj9tfA45LLKen5t1VZj49E/fVdE/sQB\ntGxiCUc4niP0UiS6P+Ae1dz224wAUIq5rOMFeDQsTNq8vQL0Svt9b2QBsXOl\nZHLEXrDRKhs2nRgmneEbVUXuzShzYT2fXDcKunYBKTv/Lv0Dr0Wa3/yF1G1i\nOxfgWlW72lGEofquHD9Jsl/qXCoLgpHydzGm4EUDQxZy0ATQkBf40ty3PiSS\nj8A61lERo9Z/mjtMEYcW0FQG6+jBWurpdmKflD6GoCt6nrul5+5n5XDoznhp\nDHOJx6jpaT2sa8JYYwqT+oy/m6Uhj0kNczZUCgs2O/IZxC/4Q7z3l6GauCi3\nVumN0PgBx+EAHvSRyAbtSNqYjyIfA+0ViOAHQjdAx46jtprQXqYT2Pf/d8wd\n4Mvw\r\n=va0I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0KrRpH+HUmM2io7SB1lf02xPt8UamCYXRo7at229a5wIgCvp3GAyLOHbNaLwEHNG3avo0jaHqVbGnydmbd6294PM="}]},"maintainers":[{"name":"colinfay","email":"contact@colinfay.me"}],"_npmUser":{"name":"colinfay","email":"contact@colinfay.me"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r-dockerstats_0.1.0_1595964577256_0.5475343149045651"},"_hasShrinkwrap":false}},"time":{"created":"2020-07-28T19:29:37.256Z","0.1.0":"2020-07-28T19:29:37.352Z","modified":"2022-05-14T00:06:20.108Z"},"maintainers":[{"name":"colinfay","email":"contact@colinfay.me"}],"description":"`{dockerstats}` is a small wrapper around `docker stats` that returns the output of this command as an R data.frame. ","homepage":"https://github.com/ColinFay/dockerstats#readme","keywords":["RStats","Docker"],"repository":{"type":"git","url":"git+https://github.com/ColinFay/dockerstats.git"},"author":{"name":"Colin Fay","email":"contact@colinfay.me","url":"https://colinfay.me"},"bugs":{"url":"https://github.com/ColinFay/dockerstats/issues"},"license":"MIT","readme":"---\noutput: github_document\n---\n\n<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n\n\n# dockerstats\n\n<!-- badges: start -->\n<!-- badges: end -->\n\n`{dockerstats}` is a small wrapper around `docker stats` that returns the output of this command as an R data.frame. \n\nNote that this package calls `system(\"docker stats\")` so you should be able to do this from your R command line. I'll probably refactor that at some point. \n\n## Installation\n\nYou can install the released version of `{dockerstats}` from GitHub with:\n\n``` r\nremotes::install_github(\"ColinFay/dockerstats\")\n```\n\n## How to \n\n\n```r\nlibrary(dockerstats)\n```\n\n\n### dockerstats()\n\nBy default, `dockerstats()` returns the stats for running containers. \n\n\n```r\ndockerstats()\n#>      Container                   Name           ID CPUPerc MemUsage MemLimit\n#> 1 e9466ba17125           mongohexmake e9466ba17125    0.48 43.25MiB  7.78GiB\n#> 2 b42363b330ab                  mongo b42363b330ab    0.75 40.88MiB  7.78GiB\n#> 3 8dfb014a0631              resources 8dfb014a0631    0.00 29.26MiB  7.78GiB\n#> 4 ecd996cba38a santa_cruz_portainer_1 ecd996cba38a    0.00 6.988MiB  7.78GiB\n#>   MemPerc   NetI   NetO BlockI BlockO PIDs         record_time extra\n#> 1    0.54 2.29kB     0B     0B     0B   28 2020-07-28 21:02:16      \n#> 2    0.51 2.62kB     0B     0B     0B   19 2020-07-28 21:02:16      \n#> 3    0.37 2.71kB     0B     0B     0B   11 2020-07-28 21:02:16      \n#> 4    0.09 8.37kB 1.68kB     0B     0B    9 2020-07-28 21:02:16\n```\n\nYou can return stats for all containers (not just running)\n\n\n```r\ndockerstats(all = TRUE)\n#>       Container                   Name           ID CPUPerc MemUsage MemLimit\n#> 1  eb985c606999         upbeat_wozniak eb985c606999    0.00       0B       0B\n#> 2  eb7d0415dfa1             sweet_wing eb7d0415dfa1    0.00       0B       0B\n#> 3  c1c63e2c7d33            musing_benz c1c63e2c7d33    0.00       0B       0B\n#> 4  9fcbf834ee8b       agitated_volhard 9fcbf834ee8b    0.00       0B       0B\n#> 5  e329a33958a1     romantic_engelbart e329a33958a1    0.00       0B       0B\n#> 6  fd1d0c07e381      priceless_shirley fd1d0c07e381    0.00       0B       0B\n#> 7  37b5a31bbfc4       wonderful_turing 37b5a31bbfc4    0.00       0B       0B\n#> 8  c3cc59fce2a2        tender_driscoll c3cc59fce2a2    0.00       0B       0B\n#> 9  d438eca27f96      tender_archimedes d438eca27f96    0.00       0B       0B\n#> 10 10bac3456a1d          mongopassoire 10bac3456a1d    0.00       0B       0B\n#> 11 5ed98ecefcb6       upbeat_blackwell 5ed98ecefcb6    0.00       0B       0B\n#> 12 e9466ba17125           mongohexmake e9466ba17125    2.04 43.25MiB  7.78GiB\n#> 13 a456c8a467cf           busy_feistel a456c8a467cf    0.00       0B       0B\n#> 14 47c0ac2602b3          elated_easley 47c0ac2602b3    0.00       0B       0B\n#> 15 18e6809f7a95        romantic_agnesi 18e6809f7a95    0.00       0B       0B\n#> 16 ef3a3b33ed8c         loving_volhard ef3a3b33ed8c    0.00       0B       0B\n#> 17 9e7c90eda54e      wizardly_driscoll 9e7c90eda54e    0.00       0B       0B\n#> 18 c62a91479168    compassionate_allen c62a91479168    0.00       0B       0B\n#> 19 2ee1d5f01540    objective_blackburn 2ee1d5f01540    0.00       0B       0B\n#> 20 ce75c6dcad2f          quirky_euclid ce75c6dcad2f    0.00       0B       0B\n#> 21 8c64c0370319          lucid_shirley 8c64c0370319    0.00       0B       0B\n#> 22 a2a58d754efb          busy_williams a2a58d754efb    0.00       0B       0B\n#> 23 d353c759bf3d           tender_raman d353c759bf3d    0.00       0B       0B\n#> 24 f93e82d1c593            nice_rhodes f93e82d1c593    0.00       0B       0B\n#> 25 1cef3c241a1c      eloquent_margulis 1cef3c241a1c    0.00       0B       0B\n#> 26 eb3a4583a390        objective_tharp eb3a4583a390    0.00       0B       0B\n#> 27 c7f543ef53c0        loving_meninsky c7f543ef53c0    0.00       0B       0B\n#> 28 3247e4779202     nostalgic_elbakyan 3247e4779202    0.00       0B       0B\n#> 29 5c461ee2bbea     zealous_mcclintock 5c461ee2bbea    0.00       0B       0B\n#> 30 b509a833bb52  suspicious_cartwright b509a833bb52    0.00       0B       0B\n#> 31 e5ac54a2edb4        upbeat_brattain e5ac54a2edb4    0.00       0B       0B\n#> 32 80e51b7a61df    romantic_montalcini 80e51b7a61df    0.00       0B       0B\n#> 33 8a595f83a067         jolly_williams 8a595f83a067    0.00       0B       0B\n#> 34 395a3ba78348    wizardly_tereshkova 395a3ba78348    0.00       0B       0B\n#> 35 efc300481527       dazzling_burnell efc300481527    0.00       0B       0B\n#> 36 d91936f361a3          gifted_snyder d91936f361a3    0.00       0B       0B\n#> 37 a60d1fd426d1            musing_wing a60d1fd426d1    0.00       0B       0B\n#> 38 196663e1dd52      competent_jackson 196663e1dd52    0.00       0B       0B\n#> 39 23c1eeb530c2    sharp_proskuriakova 23c1eeb530c2    0.00       0B       0B\n#> 40 6f5a49d56ab6       confident_kepler 6f5a49d56ab6    0.00       0B       0B\n#> 41 97eb1993c421        elastic_keldysh 97eb1993c421    0.00       0B       0B\n#> 42 69e348364e7c          quirky_edison 69e348364e7c    0.00       0B       0B\n#> 43 b42363b330ab                  mongo b42363b330ab    1.08 40.88MiB  7.78GiB\n#> 44 64e200e0933e                  admin 64e200e0933e    0.00       0B       0B\n#> 45 8dfb014a0631              resources 8dfb014a0631    0.00 29.26MiB  7.78GiB\n#> 46 7381d705b6d8  agitated_varahamihira 7381d705b6d8    0.00       0B       0B\n#> 47 a45dbd67d219       quizzical_cannon a45dbd67d219    0.00       0B       0B\n#> 48 57fedea63d72           epic_galileo 57fedea63d72    0.00       0B       0B\n#> 49 92140aeea11a  agitated_grothendieck 92140aeea11a    0.00       0B       0B\n#> 50 0393e9ba4cbb        awesome_bardeen 0393e9ba4cbb    0.00       0B       0B\n#> 51 472f8aec4cb9         vigorous_tesla 472f8aec4cb9    0.00       0B       0B\n#> 52 82701dd21050       determined_hugle 82701dd21050    0.00       0B       0B\n#> 53 b1d99c260250          cranky_liskov b1d99c260250    0.00       0B       0B\n#> 54 ecd996cba38a santa_cruz_portainer_1 ecd996cba38a    0.12 6.988MiB  7.78GiB\n#>    MemPerc   NetI   NetO BlockI BlockO PIDs         record_time extra\n#> 1     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 2     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 3     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 4     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 5     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 6     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 7     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 8     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 9     0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 10    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 11    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 12    0.54 2.29kB     0B     0B     0B   28 2020-07-28 21:02:18      \n#> 13    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 14    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 15    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 16    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 17    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 18    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 19    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 20    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 21    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 22    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 23    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 24    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 25    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 26    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 27    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 28    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 29    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 30    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 31    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 32    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 33    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 34    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 35    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 36    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 37    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 38    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 39    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 40    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 41    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 42    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 43    0.51 2.62kB     0B     0B     0B   19 2020-07-28 21:02:18      \n#> 44    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 45    0.37 2.71kB     0B     0B     0B   11 2020-07-28 21:02:18      \n#> 46    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 47    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 48    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 49    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 50    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 51    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 52    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 53    0.00     0B     0B     0B     0B    0 2020-07-28 21:02:18      \n#> 54    0.09 8.37kB 1.68kB     0B     0B    9 2020-07-28 21:02:18\n```\n\nOr from a subset of containers:\n\n\n```r\ndockerstats(\"mongo\", \"proxy\")\n#> Warning in system(com, intern = TRUE): running command 'docker stats --no-\n#> stream mongo proxy --format \"{{.Container}},{{.Name}},{{.ID}},{{.CPUPerc}},\n#> {{.MemUsage}},{{.NetIO}},{{.BlockIO}},{{.MemPerc}},{{.PIDs}}\"' had status 1\n#> Unable to find any container running.\n#>  [1] Container   Name        ID          CPUPerc     MemUsage    MemLimit   \n#>  [7] MemPerc     NetI        NetO        BlockI      BlockO      PIDs       \n#> [13] record_time extra      \n#> <0 rows> (or 0-length row.names)\n```\n\nThe `extra` param is used to add extra information to the recording, which can be usefull is you want to tag the specific recording. \n\nFor example, here we mimic a connection on the `hexmake` container\n\n\n\n\n```r\nsystem(\"docker run --name hexmake --rm -p 2811:80 colinfay/hexmake\", wait = FALSE)\n\n```\n\n\n\n\n```r\nlibrary(crrri)\nchrome <- Chrome$new(\n  bin = pagedown::find_chrome(), \n  debug_port = httpuv::randomPort()\n)\n\nclient <- chrome$connect(callback = function(client) {\n  Page <- client$Page\n  Page$navigate(url = \"http://localhost:2811\")\n  print({\n    dockerstats::dockerstats(\"hexmake\", extra = \"Connection via chrome\")\n  })\n})\n\nchrome$close()\n```\n\n\n### dockerstats_recurse\n\n`dockerstats_recurse()` is a wrapper around `dockerstats()` that runs every `every` seconds, calling the `callback` function everytime a loop is completed. \n\nBy default, the callback is `print`, but you can define your own. For example, this function will run the `dockerstats()` fun every 2 seconds and save it to a file. \n\n\n```r\ndockerstats_recurse(\n  \"hexmake\",\n  callback = function(res){\n    print(\n      paste(\"Mem usage: \", res$MemUsage)\n    )\n    write.table(\n      res, \n      \"dockerstats.csv\", \n      append = TRUE, \n      col.names = FALSE, \n      row.names = FALSE, \n      sep = \",\"\n    )\n  }\n)\n```\n\nAs this is a pretty common use-case, a wrapper for this is implemented: \n\n\n```r\ndockerstats_recurse(\n  \"hexmake\",\n  callback = append_csv(\"dockerstats.csv\", print = TRUE)\n)\n```\n\nKill the container once done\n\n\n```r\nsystem(\"docker kill hexmake\")\n```\n\n\n## Byte conversions\n\nTo handle the `MemUsage` columns, expressed as `byte`, `{dockerstats}` provides a series of functions to convert to byte, kib, mib or gib. \n\nThe unit is kept in `attr(\"units\")` of the result\n\n\n```r\ndock_stats <- dockerstats()\ndock_stats$MemUsag\n#> [1] \"43.26MiB\" \"40.88MiB\" \"29.26MiB\" \"6.988MiB\"\n# Convert to kib\nto_kib(dock_stats$MemUsag)\n#> [1] 44298.240 41861.120 29962.240  7155.712\n#> attr(,\"unit\")\n#> [1] \"kib\"\n```\n\n\n## How columns are transformed\n\n+ `CPUPerc` and `MemPerc` are stripped from the trailing `%`, and are turned into numeric\n\n+ `MEM USAGE / LIMIT` is splitted into two columns, `MemUsage` and `MemLimit\n\n+ `NET I/O` and `BLOCK I/O` are splitted into two columns, respectively `NetI` & `NetO`, and `BlockI` & `BlockO`\n\n## Manipulate columns expressed in bite size\n\nYou can call `as_fs_byte()` from the `{fs}` package to manipulate the columns which are expressed in bytes. \n\n\n```r\ndock_stats <- dockerstats()\n\ndock_stats$MemUsage <- to_kib(dock_stats$MemUsag)\n```\n\n\n```r\nlibrary(ggplot2)\nggplot(\n  dock_stats, \n  aes(\n    reorder(Name, MemUsage), \n    MemUsage\n  )\n) + \n  geom_col() +\n  scale_y_continuous(labels = scales::label_bytes(units = \"kiB\")) + \n  coord_flip() + \n  labs(\n    title = \"MemUsage of running containers\", \n    y = \"MemUsage in kiB\", \n    x = \"Containers\"\n  )\n```\n\n<img src=\"man/figures/README-unnamed-chunk-14-1.png\" title=\"plot of chunk unnamed-chunk-14\" alt=\"plot of chunk unnamed-chunk-14\" width=\"100%\" />\n","readmeFilename":"README.md"}