{"_id":"@balena/node-monitoring","_rev":"107-10a686bd9f73ffb830d5ed4022e9dfd7","name":"@balena/node-monitoring","dist-tags":{"latest":"3.0.2"},"versions":{"2.0.0-node-monitoring-c8d49a00db62c4edb2165c292490b52af5482a09":{"name":"@balena/node-monitoring","version":"2.0.0-node-monitoring-c8d49a00db62c4edb2165c292490b52af5482a09","author":"","license":"ISC","_id":"@balena/node-monitoring@2.0.0-node-monitoring-c8d49a00db62c4edb2165c292490b52af5482a09","maintainers":[{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"petrosagg","email":"petrosagg@gmail.com"},{"name":"balena.io","email":"accounts+npm@balena.io"}],"dist":{"shasum":"63eaaf5dada759515a727effcc5762dcd777d884","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.0.0-node-monitoring-c8d49a00db62c4edb2165c292490b52af5482a09.tgz","fileCount":56,"integrity":"sha512-tUjNySO60JawAK9fXJrlwh03aYpszeoon73TrlAIaW1MvfZAeZeUsuIkv/RBnDUbnQYGn45ltjCLgL0AieTRww==","signatures":[{"sig":"MEUCIQD9rGT2bayc7cxsYQzeE4wuoX42Pxsba+cIAF5Pnf6hgQIgKEILD9h0stHckgAbhrtVAHXSGCU/coFhfRMQ2Yoldw8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":71456,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLz+dCRA9TVsSAnZWagAAOUUP/0O9mEIU853+7KxmjY20\nVqMd+Yw+adTOCOJIAqlUZaYYd4XhKCeAiud6p27kk4DNyAPvFXgK0R10uBOZ\niLxRXyN1LljikOLEviaLCxkODt3iIes4tjrbZHismYhTlvbMwIGRZmn+P12I\nhyPecjYOr6p/BCAijhPMuqMfRZ8L1CHEGtDDOGJVglPqXyolE0A3wvNdvb2c\nFO7/oqxo5f9vUHZ5d/SJ0uQ9NUt5NEspTWqLzuvklZmIhYafbNSeYf+HrTtq\ngLWkUFFgvHRXx6TepS1xPu8xjAlyBRs5ncXaaWtI+Oz02apgSnmLDHk8KZ50\n0AkFwBYzUAFlF1IAXx1CU6CHdV/sCZRYv1XYU8xHEiHr9Nvima/SXYlR92Et\nSqvRMQtvYiemdtc/tYz8ASWejwUV7LN7NbOfIUWG9VPefvgGN2YWzQjw6YJR\nQgAftjK7LtVSfh4if2nLhzdWAHqMgtgV3qbbhdFi5Fex16yhdJQ8c2+ukSLK\nTVv6Y/47jVOELXoM5RUjApJHCsTgKOv4XSfuxNdZ/U4UfF0Z48DF60JDeF2p\nBmMfKB2I5uSdSNnvCKgKOHOHDueE0BH7CvBZfh6dmq/HeSA5najPADlcOQsZ\nQHBguheJgAPhDHGIJO15nP0HlcJ09GkATGvP/UA5pPSrMrkGoXqwxJE9QKE+\nHfAm\r\n=P992\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"c8d49a00db62c4edb2165c292490b52af5482a09","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && ./automation/test.sh","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.0.0-node-monitoring-c8d49a00db62c4edb2165c292490b52af5482a09_1596931997423_0.5309739617331641","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.0.0":{"name":"@balena/node-monitoring","version":"2.0.0","author":"","license":"ISC","_id":"@balena/node-monitoring@2.0.0","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"dd46c3d3bfaf523babe4edf084668139b8bdf157","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.0.0.tgz","fileCount":56,"integrity":"sha512-l+5gsvE6USC5xwCRSRRmhD1uljbz5mjO/tBR8Pyfwc6NmNfAr9zHUsR3RxhEB7TR2ga7xzhOVFUWI1v+MinsEw==","signatures":[{"sig":"MEQCID6KEmO0SaBZ9ZkOi2mSQZd+xZTXZmAMOvZZGupMqGhSAiBe0lbjpMo3EJ7zR/mD3HiQRrKl309PDTDKxIcrmAqXNA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":71399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL0A+CRA9TVsSAnZWagAAxowQAIykHMQHmFXRkYR6r6k0\nRbx/ysQf6gR9XGEWmPmqxSUSSIJyOUmPIPRAn325SmPSJrcO6GKUQnZ5Sw80\nUPyIj9GuBbQ0VNnKcR5c1GAT2QE/K6usyVjoILjzYPgdGh4v5Mn2k8Z3Beu1\nQxzQqoO1r2sLFToA0ND+Mo3I755uxLRQ5VKQE5v8b2bhN4+KLQftH7KZm7xE\nzx9G1qFfNDR/ORRS0bOuL1ZT9C0nLwZ/ISkdUgLjspmfoiY7DaKNYPXfGpix\nmRLxGwi5o2U/128ETfKaljXM1ikxtqXKWNZWtKSIvpSnjYYDVQ4jlRGoGTOj\neo0Cq+2re+fPUmR30uIOiqGOFxMigCaGBmyDSlEoWFghS/pU5mjssMfLWpED\n0UeHmbkcqstGs/PGiWCF9ZCAtSQ58rADHdctY7y1XyY0ZHLm0AdWPI5w+ELL\n9r8oh34x9qJ3CPofz6klxSzy608I/Pl7xQIThrJeMm/KW5I1YjjX1zf5vCqr\ngZUq7eV8tDNfmfgkT49o9qTktFRzChm5OnTwdKsuyu/hodonrE4rAoYfxpxb\n6JMrnxKJwmb1A6V1a2+lkuyMS/9ZItzahJowqpQRnZLVVEuQ6V/8XEZRgxMZ\ndAtAxUtHLRjiZfhG9mPo38mhQ/HVf2h5zR46seOOqyArJC5L6nPGIQgM/zia\nVYEe\r\n=r0B3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"3574f8ecd4c8e4d9dadcf6bbcf0cecf2eef768eb","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && ./automation/test.sh","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.0.0_1596932157776_0.3789242677264173","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.0.1-remove-unused-files-956ba850f359b8917cc33ca5cee2aae38a4f3383":{"name":"@balena/node-monitoring","version":"2.0.1-remove-unused-files-956ba850f359b8917cc33ca5cee2aae38a4f3383","author":"","license":"ISC","_id":"@balena/node-monitoring@2.0.1-remove-unused-files-956ba850f359b8917cc33ca5cee2aae38a4f3383","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"8ce304f7e7baa696f349ae305d7942c1c531aa68","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.0.1-remove-unused-files-956ba850f359b8917cc33ca5cee2aae38a4f3383.tgz","fileCount":31,"integrity":"sha512-dRZDqvVq8L1BdcWlz6f688mT2ZJb0t+dKrBSFIy0iT00muzj+UVAxSj/yVKPz3U4pFMezqiFiq2Mw+a938X4Rw==","signatures":[{"sig":"MEQCICAStFIndDk2BeMLtcpzQfhuSER4xQ7VbQyLV8rsrVaPAiAKUOhfrrsUcs2aCesn5MCjruAQvADqroSsetyrrkOUNA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39168,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL0VBCRA9TVsSAnZWagAATqkP/jJ1U1CcWPCDUwzk1gnp\nitSGbT8kw6o8ZXJkl/ejgdGX744/W/U93X6VxguCCMSBEDUNZEuAAPfSVBX5\nqCUqd2M33MtzkQUTKAOqbis266AdJts1g3FTfMHdVyiLYHte47s4z/AuYFQl\ngWqQ5wy85hNJEbJEgbRoNJ6vGxgBESLsHYnuJtVj1L/jQUwEqgj3q/TtXJvX\nmVZCR86rw+kIzroDmFUoLeQnWtu+3KugOJAOjEkzDwPX0tlmsuYWPl28Wr4a\nx4WvoJ3dmOCiCwLEmFQullpKyjinIwWMZQrLl67OCg6gnUASdNthr6v8iptF\nMyyfnuFdGYzcCWOE9rVxt8E/JUZHtgC042X3bDSXHhYpchK2rgr7kWK5FRJA\nYQjMTyGjkp8qan+jAEdw60/QsxgGIN1gqA7uwlmNC4zqwFG+gfC0XEccYoSB\nzCU+pFNrDspknsH3t8cC6FP+vx+Lb4bUtC8mU6ZewBbw95Pim1MNSz3nqfHC\n5joQHH4BhloScH5x14iszZ0b+V+ALBS59ZvEtxliD2hwGW7imW5D4tq+7iLZ\n9/3/TXEUy7c1y2pJsi+fJrgeC3XjQjd3nNbKudYAe/J4BFPSJnncuIQ+iZcO\nkJxMYbZOX8v098Hf2EXlG7d02CCdVG3NccarbvpsqfdjNGLO7RJAOXcsMJzx\n116T\r\n=uvPZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"956ba850f359b8917cc33ca5cee2aae38a4f3383","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && ./automation/test.sh","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.0.1-remove-unused-files-956ba850f359b8917cc33ca5cee2aae38a4f3383_1596933440719_0.4658563642004805","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.0.1-use-monitoring-dir-db9a166ad139bea0901357951264850a6ad6bdf5":{"name":"@balena/node-monitoring","version":"2.0.1-use-monitoring-dir-db9a166ad139bea0901357951264850a6ad6bdf5","author":"","license":"ISC","_id":"@balena/node-monitoring@2.0.1-use-monitoring-dir-db9a166ad139bea0901357951264850a6ad6bdf5","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"b5e7e28e136ba0f158d61a69f1a41b9e94bf3891","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.0.1-use-monitoring-dir-db9a166ad139bea0901357951264850a6ad6bdf5.tgz","fileCount":56,"integrity":"sha512-hQOLep+fDUDSznjz5nHd7PFwjAy9dBIZ/yfhZ20LjAM6LenoM5Ta9JofMQIQglTtMDNUlqCcHJ1NFn0UBmEMUw==","signatures":[{"sig":"MEUCIHPKeBZGtiNUqgrzYd4E52dw1bd5YwYQzwhqbvUEdjxiAiEA+3D96TiaCPUaOViXSYJQHIxh1DiFoPfeFGtztT/EVZY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":71631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL0dFCRA9TVsSAnZWagAA1OYQAI4NYLdppj8D5Q+KT71k\nhH2Q2A7bjW4dh1e4dWgvyTfpGNb1QFJtuh+b5BzTL2aThG+cVfVl+/Ws7MH2\nOaQOPOAZb1CcmoS8A7FwuvI9X9A8RiTAq+jhmxncjDCrsmYqQ8KaK6Qx1vug\nzAVtc84QH6LNJNJb0MPvem1r7NiWT89ILO4bgHsg/62moL9anuuZZGwy2mz8\nruO7NavIKcZciwV5Q5XTTGz5FnPjrF6uWlj2vtKBppsvmpGz7/C5WJgvDzJB\n73Nn4/mF9fW75rtLqJ3G3dihZZLenyaHhDtE5fkUTwPV/2jYT4c4POzzCLJO\nU7Qe6qE71c/Rj+b5Slo3ZiVJjQ6fq6hU4TTMe8hc+bOWItix8WHTMqx507tp\nUGONPahqUfk9G3SDOUU1l3q02SmxXDq7lqpe/TC5ae2JHUT9IsEKJ3RyBJYb\nH9Mt3qsyEf3QzWHKSpxUpz+tnrhcVst2s29XQ+U8P3dqAALPLbuxGA/Ipv32\n1VwBho2f1MbTjF6Asm3vG6/OejS2VntT4mUMGGQCaquVYogzLwg8+L21BeI2\ngVcmEaqVZxkhIxOLSRltvX7cpz4gvJoNn+oOoGeYfrDklR2eFSGBRIHgXVpp\nQ087+ggdhxPD0hd4kle91ZCBLNE2yt6AsQXahWblzRuOUwwAfviWBZYcDwWY\nrKoO\r\n=O7zN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"db9a166ad139bea0901357951264850a6ad6bdf5","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && ./automation/test.sh","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.0.1-use-monitoring-dir-db9a166ad139bea0901357951264850a6ad6bdf5_1596933956695_0.9222340915366247","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.0.1":{"name":"@balena/node-monitoring","version":"2.0.1","author":"","license":"ISC","_id":"@balena/node-monitoring@2.0.1","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"e9071293efe08992cc6f6ed5445c4ad3b135a148","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.0.1.tgz","fileCount":56,"integrity":"sha512-r+7hGGSM8HciIzZOsBvBpK3K01LtPkuolU25cUHTYucFbpB/y0W8gbTdEmIKR1gpN8yQE6Ar74uszafhqOrEGw==","signatures":[{"sig":"MEYCIQDKYI7SI+KpptTQS2c/Zypq4ycNYpQuzQmbpn4J7a4AvQIhAOjE4rQ8qZWcn/wapz8gTIHJZa+WfXhYu72iBEh8OWkC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":71571,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL0gDCRA9TVsSAnZWagAAO/QP/RkE1+YqjpCTGMvfAj5h\n5gS6LW+bxv0K6s8gAgDr46qyo34GATzCTFFQPl8DZknHDo9sc0HL4Nb02mTO\nbgNN2wBfhoeo1GObkuuGJy/R4PY8vjAEoPpGgvPUC9Bm0y80thKOy0ccw5+A\nOecYsKwo4T02fRqjPxFAbKwKxx2mlUi8aMYQJvpF4ag8wB8y4LPN6ccKfIEO\nZBHl0UQgqoGR9Ts1fSSp7nQhbHJOhKjeumc1iJwn2cvhYQ2ZIZNMyJ23ZP4h\ngVirLjsoAX55OB0c8cjWy2vxfETtYt4mD0CZ6HGiQLFD3ZX2Yh0jv9feJMQB\n8ZwzdUBVuqcCAI1resLrYeq4j35vlyz4oQnaQO3347Gtviim166+fILQnakr\nnRhnFtF0Bd/hjrpVZOwWCDPJhXdyIAxla1mzoiyJs4m93jOSQ5DLo5iuDVml\nNfYCN3MoizMKf8gT6fUVhgTkv0LtS+cP1jfFHGCsct6WIbKUZwh/0FtpmcOc\nDhHIp/kVYgkdOrJtfD4uFXAr6/4qbr0x8SUdaRQ9uuHBqyV/U4UAGIwHb0V+\ncGuFoqvNr86YfWLcu2mhi7MdpPfRx1j9cpw/gOgx3OpNA4ilKrLNslJ6gpCE\n9kNtJIu50kglTRvrcxuL+9X3kAvBJWMyR0RkiSGRefWJGb0PfVyPhnigdPih\nOprQ\r\n=dQ1L\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"c22ddb2f8bba1fad0c8fdb99ae92a66a8c4802cd","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && ./automation/test.sh","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.0.1_1596934147443_0.7057282559595028","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.0.2-remove-unused-files-efbfdc377f06b6fda1128acba7390f667128a583":{"name":"@balena/node-monitoring","version":"2.0.2-remove-unused-files-efbfdc377f06b6fda1128acba7390f667128a583","author":"","license":"ISC","_id":"@balena/node-monitoring@2.0.2-remove-unused-files-efbfdc377f06b6fda1128acba7390f667128a583","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"7cfc266a5242fb43cd2bb59c1b9af3cce871fb4e","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.0.2-remove-unused-files-efbfdc377f06b6fda1128acba7390f667128a583.tgz","fileCount":31,"integrity":"sha512-qucgmaKhD5yQGCxgw1QGV7uiLwawvOQtURurIYVMAso+YENsBMzOFb77Ty1Yz20zcpENj1qmOgh7eyjcy2UOGA==","signatures":[{"sig":"MEQCIC7KSyUAw0howNNK69kJ86fFfKpb1fnbu3yAPwOk+gn/AiAV3t8R3gsbwZJn/xhHOV0VmApnVAkwq6hjV7haj/YNEQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39428,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL1rsCRA9TVsSAnZWagAA23oP/ilZvoIFfDLNp7QX+Mi4\n544VYBLgaE81RwXIwTEJHk1kJclalCbdZMCbQqzpvBKMc9n8WoNrgWWR2jrN\nKG5C5nWPMuuoG6Q81Uy/INBftrkQmDX+Ta9loQ13agto2pJHt9MD1i9kr7rc\nNVxVjGRI5H2kfMQ4IXzjM+V5QsM9wsjz0+Pz1GbfKum5GHDSg5KS89F5sgXI\nSDxmp+7DHQyMIB8Vp2pHdjL3XWgnDJRL7ADyOtNLSoilcCb/OWty3nleRhVM\nN5/B5eiA81xaJeEOo9RG04X0uf4/vA0deO3IYPyncOuyzgKm0ubPCMNtv32E\n9TEdgQF70tk9SqhtMnUEiMkyPIGMyEnTAJFbz8MbnASDZJgfgqVDdAqAgB7q\njneodhSIe9+6b6bUTApkfCsvb4iLqrXH8NyNRi1aFlw4eYDysm7OKlSMUFwn\nrdJfxA3UeQy2fFVzQqd1rzop/eT+rOUg+1qGJQZeT+eDCwYCxst5b0F1QuT/\nSMWzC6/zSoF/c3kt8jB3DOecBUQ9WlN/odmIvSkzhqqT6NIxi+/MTX9R21u6\nPsO53Nm1v5SZ1GUjTRTrUvDX4RxtTRSeq+dx/GWVF7gqQeT9N83fxAR54DcF\nWBqnu88X1xdYnb3ATgcqGRXJiWK/vdWvuZ9zsd9clAK2ZdDIBdG59rfUL8qR\nvrqJ\r\n=vGkY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"efbfdc377f06b6fda1128acba7390f667128a583","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.0.2-remove-unused-files-efbfdc377f06b6fda1128acba7390f667128a583_1596938987715_0.3726593779231375","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.0.2":{"name":"@balena/node-monitoring","version":"2.0.2","author":"","license":"ISC","_id":"@balena/node-monitoring@2.0.2","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"5dc26fd09b39303e6ebbfe7c56fca855be450e9b","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.0.2.tgz","fileCount":31,"integrity":"sha512-UPyadDYNcKC4xze2xsENQIZb8DSm/p/pCkTsDWhaAR7vG4jqBijxBa2QwPRg1ZhjcduP/2zCdqjxGnwz9Ykbeg==","signatures":[{"sig":"MEUCIEsa4fe8rzuYsOYkPJnaxoooqCDJU7agE3lJ1Zy3M1igAiEA9abLlRs2UOvMrYVsX+YtwrtuTnOpG9nEr2KM5Ip+h+U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39367,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL1uKCRA9TVsSAnZWagAAigMP/1fQuOEjLCCpGz0DDv6t\nSNH0wJbO6bQ3Ah4PWaTjVAkinrE/qSABJ5PkYp2bsEzpuHzKKUfG++HdmhpJ\nsShm0f+UlVYnmbyh470FD+FwE8JX8Iwu4/sTpUt4VVyO+c/IOKAu/4htPb3G\nJ/brNXWy6PDXiY1AaJ1iPZBT/g1QxI3HmGdZGm7hrbSivrWW5HQx1odWp8qj\nF7X9UhfdWgAqhAd5+zycj1YhhyU7lEepChKnLkGBYKhxEF8aI1euTtAuOd2d\n2sSOScsb0xp+nkZIArW+4Yve467vdckfD9cWOQwOsDICy76CR2z4n9toiDHZ\nFPHD8+WNJCbwN0f6JzvbdmoXpzSoyVHYCupLd+eeSEW/wPG74628xd2EbYFU\n/5UASsvDE2No0e+hROxPxsy32/X0YsFHkIIn5a1+KwXUyOy2AGTP83/9ERan\njqLFnWkVvAr8yCRSD9acswT95OlcpjtxmLSGw2izgjTI+mqIQmgg9m2IrFyO\nvxBdOJ+ev9ZdUeITcQ4rCa/eS5Oho5/aw9UuPWaSWdnnFPEEkgjJ/tFHmD8a\nO0NOGMfd04h2nlJP0hXQFJnZJgnGm67nzfBhBJ0Jhfu/T43N12QOe8W53bBA\nOvrkHhmxoXe+ZklcxJxp5QRXwco9NXpSuAFCLEAp9kZoCHk/oyNYQL7hjb8w\nrJ07\r\n=7gLo\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"7e6149a15f963d3669900264ce5cee4c1cb7f862","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.0.2_1596939146411_0.11960748536875188","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.0-underscore-labelnaming-2c3958d2312a4411581bddc1081d9318b831e13b":{"name":"@balena/node-monitoring","version":"3.0.0-underscore-labelnaming-2c3958d2312a4411581bddc1081d9318b831e13b","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.0-underscore-labelnaming-2c3958d2312a4411581bddc1081d9318b831e13b","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"acc203573e3cc0cfd5f707c918b8bc8abf0bbdaa","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.0-underscore-labelnaming-2c3958d2312a4411581bddc1081d9318b831e13b.tgz","fileCount":31,"integrity":"sha512-7FSa9sdzid3AVutglXns8/Eh5psD8qYCCCNsmXX2K2ONzrkH/2cSJpQRAhhGRKoJpZ7syLmibuY3eOt1qaAw7w==","signatures":[{"sig":"MEYCIQD3eieqd94Um/RJp9aAjFPwKgJ4vJ4OFDntv2uzOsTonQIhAOz2mZ/jTag4XIh4rInrfCUT3T/TueatuCxAQTXNQQFs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39534,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL2AwCRA9TVsSAnZWagAAc+sQAIeOw17e2wzMoabJu4dO\nF3OFQp5EQEPMHqpQG4x6bRdy8xkVAuEyhnWVLQ+o21Z/KXbgX9Z0YLkulGAj\nAH5jEi3auQKqDij5s4WkNO0B3d7RcYTp5AhBY7inIrRDwp9/pdP8a138d89z\npG9CNVwEGpcNDugYFmCgvoi/QvYm/rM3wTA2IYrpFm1sbRygLVj6B0wyDcYm\ncfKtRhB8F5WrzmhZCpVYgmD7qc9y4q7I6IWFxjWcetC8OBJ9EL6tZ1BreafO\nsOV9sAh40SKmg/yzBVpDlKSLkeUeiXAIPMGoMKWQQhvCIfQxQ1HTWb6kqa0D\n/jOL99rLE3Afzme9FaRQUiYP/EAeRSOyLUEfbQziiHWCYpy2DNxTuFtQYKob\nvNbyFgSZ9WKax785J4GkxiqjlD2FZ3DpDCboN7d4nsQEXPWnEKxKiUKjZuLd\nTyDaK67VlpxtzXozfiWSYJxftlhDIg0WukfTwMMm67eYQr7VWJ4MQiOYA0GR\nnQcS7A1TXG8S5Zfpm+DIOfsCDStzl+BNCENKdOFbWSoQ1aRxejFcxEJysQlr\nBk7Xwo70UId8TYOZ8C5ZZWS7pJanElhI4T1u5I2FhjMEB19LggIC0eZLE0kl\n7NmC6iUJCxq6h29Oj66eKeCCdwi5R6L31Mq8zU4xpLPjkgblAJsuZHpODZUS\nEjMb\r\n=GSsz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"2c3958d2312a4411581bddc1081d9318b831e13b","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.0-underscore-labelnaming-2c3958d2312a4411581bddc1081d9318b831e13b_1596940335700_0.5751954497732676","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.1.0-add-svc-name-label-2409719ca93dce886675744a5028cbf9c9e4e6df":{"name":"@balena/node-monitoring","version":"2.1.0-add-svc-name-label-2409719ca93dce886675744a5028cbf9c9e4e6df","author":"","license":"ISC","_id":"@balena/node-monitoring@2.1.0-add-svc-name-label-2409719ca93dce886675744a5028cbf9c9e4e6df","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"aa07980d5b86a7d07574063a098dba7e29638d82","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.1.0-add-svc-name-label-2409719ca93dce886675744a5028cbf9c9e4e6df.tgz","fileCount":31,"integrity":"sha512-ZSy0CsSRpvkNHxYhXh/GN1FurvP/kvmoDIRBNBwyT/fA5JaWedS5haeubPradV6eL1DVeUW/gfThvVmVV5RixQ==","signatures":[{"sig":"MEQCIBc8Ynde22owJCbCGGNFOYIDo8exmNnGQelqfTBGHambAiAsbQmr4raTUlScNGSW3PLMx5EYCGI2/pWN3ss6xlyRbQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39999,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL2DhCRA9TVsSAnZWagAAEhAP/iIZikgR0DDb3XT51UKM\nRNZQLFK4VkNTWowU05FP+YgFwT91XD5lWXFEE0O6bJy9WmgFi5OpK+Uk0nZ9\n2KjUnnnIhBvea2KWKSGJnZ6GZr2WGti/0iuVA1yJA5qCp1L7BRGJI2SAuwiL\nfxryigIaoi/AMSMG6+TjNj3D43dfkCh/mbU6SfAMg+oDzBZcNSabfbIget1b\neVFVAOwsT2SeL96TfPBUsWCEJuXthKSYKL8khqzWu0kmXbInPcXSCkb8g3YW\n3jyzJhRXakd+YVysQ2ZhVZWCC1RC7d1IVbYzyK2pYI94GSxD7eFs7hVOnko8\nt4ssxB1vF42JP5fvbwjKyECExPQbD/8zqFO87030rOLefJqhldfE/fxv8wd/\nHjv+6g9s20vC9g+30pSDfS9O+w2fkYH4cX4hdIOo/WChgdIuEci6j16Sho6b\nmSQ45XHoSfZgsKfEFaJQYnrQiOUjYZab0RNb6b8q/peKcNJMwDoDKGyzvvTC\nvW0ek4hz2ZkRPSjGILm7Xhrq8CeFeCIVGZisOZF8mxJ3sW3fGq4KzaPxTjHS\nrw5eqom/sOqPRcq1R2D0pMmPcNRw7jlM8wNj8hUFx1XX/ZRa3+o6dtNJo5kU\nYcnMcB6/xKiZ6YRtNcHtNX6kkqJoarr6dNUEeI79JTSoJUmA1KWv3BBgeAoE\nhyQb\r\n=YS4V\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"2409719ca93dce886675744a5028cbf9c9e4e6df","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.1.0-add-svc-name-label-2409719ca93dce886675744a5028cbf9c9e4e6df_1596940513287_0.1767122888158117","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.0-underscore-labelnaming-63c0158d611f196f176af02aeff2eb80a4bbb2a1":{"name":"@balena/node-monitoring","version":"3.0.0-underscore-labelnaming-63c0158d611f196f176af02aeff2eb80a4bbb2a1","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.0-underscore-labelnaming-63c0158d611f196f176af02aeff2eb80a4bbb2a1","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"bc2bfc4f0c4f534de82d8418832c45f11e394e15","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.0-underscore-labelnaming-63c0158d611f196f176af02aeff2eb80a4bbb2a1.tgz","fileCount":31,"integrity":"sha512-+snVGvjrV4mQ0qxFgn+gipoMnoVyS2DafHuYeLbjxADFQ38oQYrXQtQdfDLPo5PawSu4/SupwfVDx+LQfOYXpA==","signatures":[{"sig":"MEYCIQC1DPSl5TmFm9SbY3j4q0bC5QdXu6SZxqc/71QItx3ALAIhAJbA7Zmj0j/JN32ZRKEWTnP8Z7irVAXbH6MnawELOcsH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39536,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL2FECRA9TVsSAnZWagAAySMP/iP0cTJCfutdFv4ZJsvd\nsidp8kVFXX+kfRniQB7mur18MmIIx3C7t7nHp9Pmt7awSENcna+LNikDH7YP\nDbZg7rfVk13QLoUY7FUE2eU9q1XCwtp5LVm0dBX4flYbkV91qCvOg21DW4yH\n94T0mBP+MLZSvf3Mv8lE2/XUvi/XRgG8w1N/6ymgr6h/ThVs16hgEcTuolis\nIagtcfaHs/b3gOAj3l2guRAxfLg9LD6WbnCRFOi8G1UC79Q0ngAhsu5t1wrN\nC08yiOWYC56m8u+XRkAgkpKIQj1PBjQ/nS2fBaYxxi3EfnozN4E+Pi0KyLaI\nM/5aEkrYH31ve4JYNedr3jDh3982UiNojh+ir9pSrkC5O5k4Us1ecgIi8SgV\n+wiUosSHxz9h7PIDUZv9/JJIZ6iepgLKXt8s7d1ALO6DJUFsphxUbsLwuKUh\n29vC5M45AvnAZ0bCJqt0Hs+VreGjmG5P50MKIxfPmeAqb+nhGNk4IlQV+6F/\n6PuIHjPjQGjIgxO072Ec0LNIEqcA1MPThsd+uBG7bezhL4q4SjdmruZrHlGT\nfwmCoF0W0bZipQ4j3e+RzQZNP7XWqPCroo6HYezsh2NchVF0rr98RNNiVpta\nimJdyXibqZUnexgrreB7OU/vusVNksArUvMg4DK7owQWGZkkUkMFnf7SHKws\n9P7g\r\n=Qe3I\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"63c0158d611f196f176af02aeff2eb80a4bbb2a1","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.0-underscore-labelnaming-63c0158d611f196f176af02aeff2eb80a4bbb2a1_1596940612253_0.9606900263187075","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.1.0-add-svc-name-label-675fe83760b6f09d39f8fd0bf64d008d9c1d5f6a":{"name":"@balena/node-monitoring","version":"2.1.0-add-svc-name-label-675fe83760b6f09d39f8fd0bf64d008d9c1d5f6a","author":"","license":"ISC","_id":"@balena/node-monitoring@2.1.0-add-svc-name-label-675fe83760b6f09d39f8fd0bf64d008d9c1d5f6a","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"e21ab2959ee03a8aceef20e02082b3e2f1ec6f5a","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.1.0-add-svc-name-label-675fe83760b6f09d39f8fd0bf64d008d9c1d5f6a.tgz","fileCount":31,"integrity":"sha512-KlPZkEtgmWUzsLZA4v6sT1ToldyTgzF3Cy4kIxMN3lfESPYUPbOcP0/ML1kP/C+6BBeDTIC1DCwQiAkjnCnenA==","signatures":[{"sig":"MEUCIHlNLzGFKhxCkbVxdgPGAKth/17wKV8VHjPc6mV9mro6AiEAhB36RbBuaI4BoK4b/rFhnvjXN2mHyHpLFoRsTOZFKKQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40001,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL2KRCRA9TVsSAnZWagAAfyoP+QAr/6g4R0tmd0RxhZHq\nmr4gJ8vMlPk0dOv69DdsDeBgyrCVAYb8MzHRXzkGw6XcBMSrNXkLoYmw60bf\ndbU4qzzY6Fkg0CnNhpo+WG8Tk2aq//h+Z34ZK10D7tc5QpfW/gAaSKaAz6g6\n7Cje7N0ORcch3Ysd5H8rGQQKLEQiR8lwIsZnyBL4/zCDEFgAfshYr5z90xln\nztQqy9XKYNhDbOz667sWtwYrlPH4/G/+2G7XnQSoEmZS9gXhCs89usD9Q2AZ\nI8t5SN3pOOpBTwci2ulrSvBdubKg+F2JVXpaKayPI3UxAgL85FOu/LTRlnwv\n0yjCZJ1PNKefyKE2JD3QQRfGDNPjYeR3kzPtCHTPAJfIb+TDmTvEa5R+OEg6\ntc1gHnShds53nR7jhuzyODl5WVErL5mwUJTkmUgiQ3+xC8HzMQdhwi4Fud6Q\nwXTEwXjvQ/yTrV1ImrS1bmcyKM4uxuGPV20k1PHgrXGG6aRa2lwJLQ6FAfKl\nTXE22WMvEsEgMhIowouW15zPfHPsGHwl2oAnT9jsNVI19gziPPmBpLOmtVUR\nBcf4qdi9UBz1fNiiygHdz5vlOgcZi4nR9zZBx9OiiKGy+SIlbFwCkrFUUIqB\nFW7457KpwOZv7XLzB7HHbLc4QZ2dwb0gYt9zz1R0smYjZvsBMLoGGN7uOm9e\nPTAa\r\n=cTFG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"675fe83760b6f09d39f8fd0bf64d008d9c1d5f6a","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.1.0-add-svc-name-label-675fe83760b6f09d39f8fd0bf64d008d9c1d5f6a_1596940945028_0.8177716452485273","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"2.1.0":{"name":"@balena/node-monitoring","version":"2.1.0","author":"","license":"ISC","_id":"@balena/node-monitoring@2.1.0","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"1d09b780e77d1d344e37246ef64c91c3a4f06416","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-2.1.0.tgz","fileCount":31,"integrity":"sha512-UmU/9QhmI2ZzTTnIWkNbPdZNs6cbN230ygA7cD41WUZQ4W1CU2R2hLzSZU50941yK3Xd/HjP87mgQTf1UDxgug==","signatures":[{"sig":"MEUCIE2xNBcbgq9bSGHkO6ltHDUYkaJXpnSLHlzIQ/UV5/jyAiEA/UTKMcAiOAjESnPnTheaJRIDXwePfM2YbExArD5elg4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39941,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL2M3CRA9TVsSAnZWagAA+gwP/3nlfWrzVGS2wiYRG778\nlumVBM+sD7ZBrjYJylbGQLqhLPZxwIklqyYKt5s7k/n/LCfWMbfNfm3SWNm2\nbFJjW5xKYWo/RPqK6uYcLuBIV38+AH+00+s6uLyC0ae8YjiOnd1Lt2jEmFpd\nErJXLhIH62AVvWtkLREukM0D1MGYZmwDpSFDiF0GZSXFYf3d7L7KCPiWJoBd\nHNU5ytyvaYUSqJa2nTAdJ+f31IsJno7Pv/vWDqdhoH+v+BdxfHHN0ROsXnE3\nh8e2GayclYQEPU9Z3sxtVoOdoLdof32WVt05boZqTD1GRb7DDFyUY+6xTttS\noRnjGbJfY4rob4atQopGgqps2LVbzMx0XlQI2xLyb5bODjk8LumLwiy24/hz\nlE2VKTPWipYwglsye787y5Z+iQaMhgaIfSLozsfzMjbat+/VHUBZOq89pcQ4\nOE7ASMtsVi+gzcAh09i2mnqzigCl1AaLVQAQb3LSHoe035XxcB0VbosviLXL\nPvuU1cShWvwUIN0QixsP4c4hKBNNFXCbd/fcPwH6VTPZpsxl8XopM2fA5P6N\nQjcmPd/6pzRyAd4X2+jNpDuWXeesIGVCP4u25PmvcQTMY4Z5Z/HwNm0AnsKS\npphEn3eqrt9p7ZnBtg45YRya2kiXgaPIr0AjQuITaUcILOJb/zoRzLmIS2tL\nKnoU\r\n=fpIi\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"4ed1bd87cb9666bc971e57f70789d64964dfcdac","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_2.1.0_1596941111461_0.7025034223278142","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.0-underscore-labelnaming-0a112020bd7fb829bdf11983282ca8e0e7065abe":{"name":"@balena/node-monitoring","version":"3.0.0-underscore-labelnaming-0a112020bd7fb829bdf11983282ca8e0e7065abe","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.0-underscore-labelnaming-0a112020bd7fb829bdf11983282ca8e0e7065abe","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"3cc428f17048af168749d59475f4b34786524850","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.0-underscore-labelnaming-0a112020bd7fb829bdf11983282ca8e0e7065abe.tgz","fileCount":31,"integrity":"sha512-OOuILc6itp7CFq1eXzSNFZ4r//bdPWfa4/pHRXikaa5X9qe7LFx2Ys1pA6LmHuhSMEf4pFdS+YNNdBO8T/n/Fw==","signatures":[{"sig":"MEYCIQDrpQf/Id9ol8/5UMMzZfwtpqOqqPnZ/oDf/z4v6yOqxQIhAJHe6MRWLJgQ9++wLlUT1Osc7bPwvfgjkIeZd+7HBf8Q","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40110,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL2P5CRA9TVsSAnZWagAASPwP/j412eWHWu+rNPv1Bpr7\nDNO3q8iwMz5cNGNYiBg+Vg2ySerhdf2dXGoeYvhe+RVJZIgKfyAxb2Jw6GU3\nP169XBH7HhTKfcG3K2f+yQpMubNE6XhyQYhymvc3jZBSQ4+BHty2n9c7cZq+\n2BaZUqLADs30t2lEUjG4GZ2fNls7G8rA8wyQw0WRXG9lu/RXMghnB0HsBrqd\nwMTFX91aT87cbOIHxBy62TiWlCZ/6xZZ5cKqjS7w9HMHqrRY/UyxK6AxmlJX\nShIEiuBVLM2BJRVWFBbWI+m/o2xREZ0/O1aToGtUw4m5eBtriWb0Gobd3uBL\nXqcfxsd2tbuR0/l7AWjpmIG8jzR5LWk6UzqRyFd/LoQr3YPzgTZMjnl1FGHp\n2kQE71dc0X1ybvXiJGRdbmMWK6ln/ZD37sSiazlhsHBN7XlnqaiYKTXIcr+8\nxmOShrLZALIdMVHxu1Xdp1OYEMxm/WY/e65WxNdhX+4ymu1KrM+3b7gi365u\ntSPHiM5HW0fQwZZCUm0byuCIL9ksVTNaa9zPlf4LRNsbU/KLIqXxYim5lrTs\nkOkjQz6wcxrTbkPexJdr/75imFm3SUIyEohRhxUlmbZexYRe5tygaoLjG0eI\nrSrL06a4OXVKRM2CtmCqsk9KiJ8F/I8AmAwLwuYT526vvfAX8giOD9/0E+nl\nw+wo\r\n=7VQZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"0a112020bd7fb829bdf11983282ca8e0e7065abe","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.0-underscore-labelnaming-0a112020bd7fb829bdf11983282ca8e0e7065abe_1596941304861_0.19851337853152962","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.0":{"name":"@balena/node-monitoring","version":"3.0.0","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.0","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"d4eae0408d976e71963078019c1110bcfe9c1dfe","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.0.tgz","fileCount":31,"integrity":"sha512-PqN4RPnL8q8GarKbsWOmGRMGNh7vjZaTV+02/lWom01+7md1Uew9eFe/Ih9b4QD1HH4juGTIyIqmSbf/vnn6sg==","signatures":[{"sig":"MEQCIBIurzvTlHnx3JwZtqcpg3DvaIyDkxhZ2XpPbbmyGRCkAiBWHsaWW3qBTs+stePpRVbkcWFWWKX1PRAARhlWmp/z3g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40046,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL2SwCRA9TVsSAnZWagAABRIP/0h5s8g3gXnvh3wkk9S9\ngiTHpWgPcQelcb6WOOG1G/qHUouF8xIgyYlfinA9KDwqs82yoJeD8iISpT/9\nfJer3vkI7n917cr4DMaakVIxY/uYlkFCAvLxWR5JCUtc9fRSiQnXefPhn5Yy\nYBTGniGgcSd5fTMGMKQtCYWJd54fP7yZEjl+ZSRK6Kfa6yD+S4uk2a9xaHaY\nvvba1N4Y3PZLdKs/vG5TqeVcKrJostKYqw5wyXbGOdK4ihtUE77CCZg3fBr3\nIm4K7BqnziTAJwZV33LyE2JCgGDtyBwtsukxMxfaDj+O4RAuBxH/aADQ7OvC\nuYkPEH0vfzlVGYWpRnV6lyFzf4f9b49glazmg8CVzMwQqFDInaBgxoHcaghR\nICbJThfvZAsZ4dZ7HbhO7K1dVMVLvCIMawhapXF0ccRVj/8UvQnUpyCQV/JU\nmVuPt2tKdtFh7vPmkXIykMRSKFEOnbDC3kJq6EFg01HmZSus4ZE52yO24uCW\nCRSquTAONMfGsOEdKDZ3SEo+1oQooveN3qZCFrKPciWFw3GuB8NDnpAqjRj7\nAQWvoglKQJFsfXcMuLb5/H6U7i31wPVPkS5iv9hBeHiNBddb9VSVyqKC0HLt\n2r6TeDKuWUIcWGRbSgjf7vwFOo1lvZL3UqX1BeJZEmAmtopV5T+TyvhSJOEG\nAZVH\r\n=E4IV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"ebacf0e9c3491574cbef35e6ceed46908155957d","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.0_1596941487777_0.05257206894945221","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.1-add-readme-self-serve-monitoring-diagram-17a98561f2835aec3a9b6a2cef1feecdad7c4c98":{"name":"@balena/node-monitoring","version":"3.0.1-add-readme-self-serve-monitoring-diagram-17a98561f2835aec3a9b6a2cef1feecdad7c4c98","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.1-add-readme-self-serve-monitoring-diagram-17a98561f2835aec3a9b6a2cef1feecdad7c4c98","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"bc7075c1f5f62af384ca875ea9cf9beb2d3012bc","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.1-add-readme-self-serve-monitoring-diagram-17a98561f2835aec3a9b6a2cef1feecdad7c4c98.tgz","fileCount":31,"integrity":"sha512-Iw943ogUIJkz+8ZPE7pECYiqqvlzx9RkhtpGqIPz5ghpkygLI3FSAkeZI35dEf/2R84Y71h/ze2kaLU559ssVg==","signatures":[{"sig":"MEYCIQDtmNKjEzBUiGird3F2iBD0oghjT88pIwdW9nZpeqKkJQIhAKH3S0VmJ0ripYtaDSWKLcDJFL+Wbgsx9L4wIp8vG0Oa","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40421,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfMZOMCRA9TVsSAnZWagAAiRwQAIBwYhn3P3CHkeJHsE/c\noNh+UTbUY7cJ/oiQ2nPU9VRoofqSj70vpy2dOxMVPvqe/QlYuZxIFyq+InQO\nJXfJCxUlZY2QK+qBASr4R+Nc+KzbiWpgHIyLnC296JuydjPuuYe9mU30cSGP\nX91l3d3JrlIhHKGmxLonEcBO+6GPvbpQyBbvRa9xsJTiwTsS1K6C8Q8PZL5K\nzEYIOVNZhu3xk00izwEUrql5PUOY8zZAUkbkfqDvEKNOyplVJtJ0dAk4A5WE\nYHR6pMOQiYG6w5ACimd6kitLf+33WW5uAevIZXqAFUP736bnMxWe8Eq3DYEL\n0xWL+ub44h3axzPO04DWtVUkyNgZrkg6F2s2j0Gv6l29Kws3JfjMJLy6mDqX\n46Rkmh2WTqY3URnnsB7hdcI6Ijb4wP2iNV/fhg/brmWxXYerqYWcYJDD7tZD\nbsqg+BRIbFt13+9Q3HnK9+hDTmHSlSFb4a9AfOPMlDUV3DKKx3s4500RuegJ\nfVAXtymmWx56+KQ9wudL84r9pJvK5+3UM/hy4US+KReS0m3O1/bysUCUpx5c\nVpIIk6l2rJdonnVO7Pz+vD7X81w825S6wyzUnvYOnM1Q7sJbCXIvEiOfmxeW\n61H17s4B5EyW+VldRWWhzvIg779yH8ie4EVj/KaMiqHyBRf9ErtCraT+J7eN\nLXnC\r\n=DX4R\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Ideas\n\n1. Standardization: Provides a module which standardizes aspects of monitoring setup (metrics object construction / use)\n\n2. Source of truth: Enforces a config object which defines the metrics, alerts, recording rules\n\n3. Modularization: apps define (and expose for discovery) their *own* alerts, recording rules, dashboards, rather than a central repo\n\n### Self-serve monitoring\n\n![diagram of self-serve monitoring](https://docs.google.com/drawings/d/e/2PACX-1vQZgiN8yOzRARuJx5infWM-yS9ldKT-nbXZ0FInfGLlInjNdcvYG3AYOaC0XdOxho2uJt5ThMcqEC3A/pub?w=893&amp;h=694)\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"17a98561f2835aec3a9b6a2cef1feecdad7c4c98","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.1-add-readme-self-serve-monitoring-diagram-17a98561f2835aec3a9b6a2cef1feecdad7c4c98_1597084555515_0.9364952782366769","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.1":{"name":"@balena/node-monitoring","version":"3.0.1","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.1","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"4eff5d66e98ded5b0511b9cb0d1df1f6280945b6","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.1.tgz","fileCount":31,"integrity":"sha512-1fn5qGcrkEXax85IezPdvV1SPpqRO0J6tL78i99Vpc8XC7KJx3KWNcF99RGZn2+AhDiG43o19Wb9hoDO3Dz0Bw==","signatures":[{"sig":"MEYCIQDO21E515OvgyV/koK9ztkHxJv9zOOtmuBDLdrvYc4+AwIhALfsqs8y0reQlHpCIUbPx5WCajfp5QgdlBB/zVIF6jNp","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40339,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfMZRGCRA9TVsSAnZWagAASccP/2BAq9dRrEIIcQbimqvs\nIhXwbfQPm3opkjyLupzRgZwD5n1rFp9tlGQWhuFmz0GE11TR6CWH4hfUojRj\nD+qzfvUGBqA6n0egm3ObK7JJREd7AjqBHwGz/gJh7uR/6PgAnH0GNJqrMc1i\nKYc8gYrEkixGJgxfmA8Ql/7E1UINpr72BGuM76mOjn/kggqS7wyTsqCih9oI\nCoQ7jaWxZJsQizjjvO5dkDTrU6dKck0oE6RsPGlr4U3eQLbs+bpEGs3gGB73\nLtdYZ8CXQezMnkOoPRy1DvMZJnKj11sdo/fusfNF9Gxq5CCiK32nrW/tEpj5\nwM0pXsl2sFBNcxD8FJ/EBMUWXUuQUP8/1r0k0B5sB2B0UdfxA/MDIa6HjbqW\n/oo74Xi2w7G0L7YqWuhJ9Ivad75qKDyGH1iPafBOzE81YyTyqU+0T1m0o55D\n3u/TTpOl79x0mnRpinPV8YP4S/F6t3UVfv5yIc/pOZ2i2U5KKOEQRU+JJ0Hx\nOChLaWhJ3RQca/LVGhzWdmQNbw299VAuadVYm9OlKTtRJSDdrNhaRoCWUF36\nia693bHa9HYKjF95MU3s0cZVnCZdPEchE6JX2gbQBXTu9vho4VJy01FUy5HX\nbXJ0eZ3VbNA1kVXpHxy+8GVGOM0qHy7DZTuXhpWp1b5hitez+jyermghZXcS\nDwRr\r\n=O66R\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"7b3860e6ca1e9fc7a24a204ef8caba2785120057","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.1_1597084742433_0.3948041511915481","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.2-streamline-readme-4985487006ef481cc056dcaa412cb6d625a69879":{"name":"@balena/node-monitoring","version":"3.0.2-streamline-readme-4985487006ef481cc056dcaa412cb6d625a69879","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.2-streamline-readme-4985487006ef481cc056dcaa412cb6d625a69879","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"072e895d7b9e9eb9c666e97828751a3cf41d487b","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.2-streamline-readme-4985487006ef481cc056dcaa412cb6d625a69879.tgz","fileCount":31,"integrity":"sha512-Kt8FwnwkV5SMfTG00tzW2tc8/uSvv1tXW6dSERQlYSPpKQz+iO2EQj/Exo1horNaWMzbG+w2bN3ENf68WSIRhg==","signatures":[{"sig":"MEQCIDDqFs6SuEv/AB7bTcmfjP4XA8XcnrjpFC5PYKumrHlpAiATfBhLmtbaOvbpQ40CtO3r9fJ3+8FAhYDtvaVlMuzXiw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfMaDNCRA9TVsSAnZWagAAaywP/1/ekeIfqniqOQVZJ865\nn/hgCjMLkp/IuXqSuRYxXhbBjgjPVRM2k3b4nzZl0AaKcJ/rrWcRisLSNGXc\nKIa2wOtAAWHq1O8MqTbW4ynaPwiBysvSxeKTnn9UzLzx1eDZE9sXZDK3klfk\nw422Zi0Y+5EEfXy6aII+rYLDBm2Huv6xCm3O4BHQ1+8zkbseshHgOQ2Lqrx+\ndkXZE2pjkv3C/eDMXnS0R/NONq87mXaEv3gFK/8SJbjRgTaGkZ/ZkUUx7bep\n8gpsEcvC2QRmTWggl+dFZCslon4QFsUBwBQljLfGyeUE4Iv3uF6XRaGvsqiD\nRayxMJZog0AI4lmNPsbEepdF2XH8BSY4j+2UnGBOU5D4VqeoNSzlXcvI5gAh\nr3dTO27NvBcDqshOUoar822IkXpkxTpx9WjwFfMj88BIZ2gyydUYkXgG79Bd\n55tnM35czFlqfcC3jVvdnfNUPTfEAmwUcLXl6BZmkz6//sumJH0NoLVggcT5\nzF96CaBbRJyv5EuK3zZHko8IKJ8SZ6iJnqfR3nwwIBL3cUWuTrQ37qFz9jgb\nPNXE/zYI6v3VMaugACnkVrSkgue+USXwSKkdAz5auoObY6k6WnALB/+MuDgc\n5coJpd3uLiUXRHXEupBn6wKcwIOiO42py/JjrbXNewTQm6KlNvgodW1bGjHU\nI3io\r\n=JjqK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"readme":"node-monitoring\n===\n\n### Self-serve monitoring\n\n![diagram of self-serve monitoring](https://docs.google.com/drawings/d/e/2PACX-1vQZgiN8yOzRARuJx5infWM-yS9ldKT-nbXZ0FInfGLlInjNdcvYG3AYOaC0XdOxho2uJt5ThMcqEC3A/pub?w=893&amp;h=694)\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","gitHead":"4985487006ef481cc056dcaa412cb6d625a69879","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.2-streamline-readme-4985487006ef481cc056dcaa412cb6d625a69879_1597087949309_0.28906459965227627","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."},"3.0.2":{"name":"@balena/node-monitoring","version":"3.0.2","author":"","license":"ISC","_id":"@balena/node-monitoring@3.0.2","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"kaisoz","email":"tomast@balena.io"},{"name":"nazrhom","email":"nazrhom@gmail.com"},{"name":"petrosagg","email":"petrosagg@gmail.com"}],"dist":{"shasum":"effa1e7a713d508e17525743663d2f2eb8f7109b","tarball":"https://registry.npmjs.org/@balena/node-monitoring/-/node-monitoring-3.0.2.tgz","fileCount":31,"integrity":"sha512-VFjqWgPQgueTUzORCOI6OWNt2N9qyrHXnYPgxp2xkX4HTVLqTqNDqv7Gk++v9/wmhZRkDrYH4glRKt/bXCp3xw==","signatures":[{"sig":"MEUCIQCZBpDl8PltDHg/A0pbAEpBIQv7nVDNaMZPw0wouNNzfwIgKEXJMzXp8u/HIKglx5v6qu+65+QILStuC+B5F75My3I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh12QtCRA9TVsSAnZWagAAEiUP/0A6ePBc8wHoHBVWOkp/\nghat5X+M6478GcO7PT+73HSylm10/dKXMoJ/Og9jQom/vDs66KjsdqjMFkqV\nJivmbmRdYerqt8LDU543HodKGd/TTAwBmuj9TvAc5/mOQfuEWL4q2oDUbZov\nZ4DW36wL/bfu1sks0s8S2QxMuIejAKtPIQETb37ZVOF+dhAyp9dwhN7XdwKn\nW+QnTWC2KWOo86NW+WQ/CKQpXDd0EwNgrzbycj/CyGsnJrhSDRwN57AwOtHR\nEkOVXVP7dby367NihSb8B3UE6EfufAMF/EV+L5PzchyinDh1mT0besSJTYR2\npEgA2PjDKWpN7GEWcfppeTqZZ4xeFC8Plz385B2bWWrHCyXxwG00oBrGXrjO\nOERVbm9easbSXgtleY6ktFAVRWJOGZ2YQCDb6FCAzKXj5nR4x/sq1KtTDgWV\nWohXnBvWIOgjQ8NYkWdG64dFtzb9ay4oYL8UNgu0TGfo0sAVM0t216WSQe2z\nxyJ9IjYL4z+/oH/Jq5pzeX7yNOL5/DndveqFSoS5ehgRtwNHn/VvaVEVKTaC\nLZFbD4b98+CHXRd3q729qpsDjkF0eH5HSyUdF4mUNafcpyPN4JfYaoZwE+3v\nXrwMwJS6jNxEi0EASMMYxq0+cdZ2nM5V4qDlS3X+yurcKYHwrFdOkl3QW5ei\n5wba\r\n=K1Oi\r\n-----END PGP SIGNATURE-----\r\n"},"main":"out/index.js","husky":{"hooks":{"pre-push":"npm run lint","pre-commit":"lint-staged"}},"gitHead":"b2a6f788e385220d4b46d0db06595da385e721c8","scripts":{"lint":"npm run lint:typescript","test":"npm run lint && npm run prepare && npm run mochatest","build":"npx tsc --project ./tsconfig.build.json","prepare":"npm run build","prettify":"resin-lint --typescript --fix src/","mochatest":"TS_NODE_FILES=true npx mocha --exit -r ts-node/register test/*.spec.ts","lint:typescript":"resin-lint --typescript src/ && tsc --noEmit"},"_npmUser":{"name":"balena.io","email":"accounts+npm@balena.io"},"_npmVersion":"6.14.5","description":"node-monitoring ===","directories":{},"_nodeVersion":"10.20.1","dependencies":{"express":"^4.17.1","js-yaml":"^3.14.0","on-finished":"^2.3.0","prom-client":"^12.0.0","@types/express":"^4.17.6","@types/js-yaml":"^3.12.5","@types/on-finished":"^2.3.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","husky":"^4.2.5","mocha":"^7.2.0","ts-node":"^8.10.1","node-fetch":"^2.6.0","resin-lint":"^3.3.1","@types/chai":"^4.2.11","lint-staged":"^10.2.6","@types/mocha":"^7.0.2","@types/node-fetch":"^2.5.7"},"_npmOperationalInternal":{"tmp":"tmp/node-monitoring_3.0.2_1597088109999_0.9832437143580781","host":"s3://npm-registry-packages"},"deprecated":"Deprecated: no longer maintained. The GitHub repository has been archived and no further releases will be published."}},"time":{"created":"2020-08-09T00:13:17.243Z","modified":"2026-01-29T10:03:52.195Z","2.0.0-node-monitoring-c8d49a00db62c4edb2165c292490b52af5482a09":"2020-08-09T00:13:17.525Z","2.0.0":"2020-08-09T00:15:57.943Z","2.0.1-remove-unused-files-956ba850f359b8917cc33ca5cee2aae38a4f3383":"2020-08-09T00:37:20.919Z","2.0.1-use-monitoring-dir-db9a166ad139bea0901357951264850a6ad6bdf5":"2020-08-09T00:45:56.801Z","2.0.1":"2020-08-09T00:49:07.719Z","2.0.2-remove-unused-files-efbfdc377f06b6fda1128acba7390f667128a583":"2020-08-09T02:09:47.871Z","2.0.2":"2020-08-09T02:12:26.530Z","3.0.0-underscore-labelnaming-2c3958d2312a4411581bddc1081d9318b831e13b":"2020-08-09T02:32:16.017Z","2.1.0-add-svc-name-label-2409719ca93dce886675744a5028cbf9c9e4e6df":"2020-08-09T02:35:13.413Z","3.0.0-underscore-labelnaming-63c0158d611f196f176af02aeff2eb80a4bbb2a1":"2020-08-09T02:36:52.377Z","2.1.0-add-svc-name-label-675fe83760b6f09d39f8fd0bf64d008d9c1d5f6a":"2020-08-09T02:42:25.158Z","2.1.0":"2020-08-09T02:45:11.598Z","3.0.0-underscore-labelnaming-0a112020bd7fb829bdf11983282ca8e0e7065abe":"2020-08-09T02:48:25.108Z","3.0.0":"2020-08-09T02:51:27.915Z","3.0.1-add-readme-self-serve-monitoring-diagram-17a98561f2835aec3a9b6a2cef1feecdad7c4c98":"2020-08-10T18:35:55.670Z","3.0.1":"2020-08-10T18:39:02.569Z","3.0.2-streamline-readme-4985487006ef481cc056dcaa412cb6d625a69879":"2020-08-10T19:32:29.455Z","3.0.2":"2020-08-10T19:35:10.120Z"},"license":"ISC","description":"node-monitoring ===","maintainers":[{"name":"balena.io","email":"accounts+npm@balena.io"},{"name":"page","email":"page@balena.io"}],"readme":"node-monitoring\n===\n\n### Self-serve monitoring\n\n![diagram of self-serve monitoring](https://docs.google.com/drawings/d/e/2PACX-1vQZgiN8yOzRARuJx5infWM-yS9ldKT-nbXZ0FInfGLlInjNdcvYG3AYOaC0XdOxho2uJt5ThMcqEC3A/pub?w=893&amp;h=694)\n\n### Basic usage\n\n![diagram of node-monitoring usage](https://docs.google.com/drawings/d/e/2PACX-1vQ4hqdIU7mpEvMnukgKqFdCqaacOodd-z0jLJgCDOvUqEejZ4lG2SOKVH3fLlHOu3sWS-6Fs6Q-GC13/pub?w=841&amp;h=609)\n\n### Metrics\n\nMetrics are defined by the `monitoringConfig.metrics.{counter,gauge,histogram,summary}` objects, for example:\n\n```\n{\n    metrics: {\n\tcounter: [\n\t    {\n\t    name: \"builder_build_complete_total\",\n\t    help: \"number of build requests completed\"\n\t    }\n\t],\n\thistogram: [\n\t    {\n\t    name: \"builder_build_image_size_bytes\",\n\t    help: \"bytes per image built\",\n\t    buckets: imageSizeBuckets\n\t    }\n\t]\n    }\n}\n```\n\nThe schema for each object is that schema expected as argument by the constructors for `prometheus.Counter`, `prometheus.Histogram`, etc. in the [`prom-client`](https://github.com/siimon/prom-client) nodejs prometheus client library.\n\nOnce the code using this module has constructed a `Monitoring` object as in the diagram above, metrics objects (of the types from `prom-client`) can be accessed on the `monitoring.metrics` object (as also shown in the diagram).\n\n### Alerting-rules / Recording-rules\n\nThe schema for defining alerting rules and recording rules on the `alerting_rules` and `recording_rules` keys of the `monitoringConfig` object is the JSON equivalent of the YAML schema defined by the Prometheus documentation ([alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/), [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)).\n\n### Discovery\n\n- Any `.json` files representing grafana dashboards in `/etc/monitoring/dashboards/` will be discoverable on `:9393/dashboards`.\n\n- Prometheus metrics will be discoverable on `:9090/metrics`.\n\n- Alerting rules and recording rules will be discoverable on `:9393/alerting-rules`, `:9393/recording-rules`.\n","readmeFilename":"README.md"}