{"id":13524416,"url":"https://github.com/immobiliare/fastify-metrics","last_synced_at":"2025-10-23T18:50:26.789Z","repository":{"id":36984798,"uuid":"419645285","full_name":"immobiliare/fastify-metrics","owner":"immobiliare","description":"📊 Fastify plugin that integrates metrics collection and dispatch to statsd","archived":false,"fork":false,"pushed_at":"2024-11-29T11:06:35.000Z","size":1803,"stargazers_count":77,"open_issues_count":29,"forks_count":3,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-05-25T00:11:32.839Z","etag":null,"topics":["fastify","grafana","javascript","metrics","monitoring","nodejs","npm","statsd"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/immobiliare.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-21T08:40:26.000Z","updated_at":"2025-05-09T04:08:57.000Z","dependencies_parsed_at":"2023-11-23T06:38:33.806Z","dependency_job_id":"4fa903eb-d365-4649-ab98-ac652097ac9a","html_url":"https://github.com/immobiliare/fastify-metrics","commit_stats":{"total_commits":390,"total_committers":10,"mean_commits":39.0,"dds":0.4487179487179487,"last_synced_commit":"47a52ca1bd042d99cc8e1919d9dcc8eb51d0bf80"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/immobiliare/fastify-metrics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/immobiliare%2Ffastify-metrics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/immobiliare%2Ffastify-metrics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/immobiliare%2Ffastify-metrics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/immobiliare%2Ffastify-metrics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/immobiliare","download_url":"https://codeload.github.com/immobiliare/fastify-metrics/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/immobiliare%2Ffastify-metrics/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265314143,"owners_count":23745201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastify","grafana","javascript","metrics","monitoring","nodejs","npm","statsd"],"created_at":"2024-08-01T06:01:09.889Z","updated_at":"2025-10-23T18:50:21.743Z","avatar_url":"https://github.com/immobiliare.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cimg src=\"./logo.png\" alt=\"logo\" width=\"250px\" /\u003e\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003efastify-metrics\u003c/h1\u003e\n\n[![Release](https://github.com/immobiliare/fastify-metrics/actions/workflows/release.yml/badge.svg)](https://github.com/immobiliare/fastify-metrics/actions/workflows/release.yml)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier?style=flat-square)\n[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg?style=flat-square)](https://github.com/semantic-release/semantic-release)\n![npm (scoped)](https://img.shields.io/npm/v/@immobiliarelabs/fastify-metrics)\n![license](https://img.shields.io/github/license/immobiliare/fastify-metrics)\n\n\u003e A slighlty opinionated [Fastify](https://www.fastify.io/) plugin that collects metrics and dispatches them to [statsd](https://github.com/statsd/statsd).\n\nIf you write your services and apps using `Fastify` and also use `statsd`, this plugin might be for you!\n\nIt automatically collects Node.js process metrics along with routes stats like hit count, timings and errors and uses the [`Dats`](https://github.com/immobiliare/dats) client to send them to a `stasd` collector.\n\n\u003e ⚠️ Fastify 4 introduced some breaking changes, please refer to [this](#fastify-version-support) version support table to find what works best for you!\n\n## Table of Content\n\n\u003c!-- toc --\u003e\n\n  * [Fastify Version Support](#fastify-version-support)\n- [Installation](#installation)\n  * [`npm`](#npm)\n  * [`yarn`](#yarn)\n- [Migration guides](#migration-guides)\n- [Usage](#usage)\n- [Route Configuration](#route-configuration)\n  * [Note](#note)\n- [Metrics collected](#metrics-collected)\n- [Decorators](#decorators)\n  * [Fastify decorators](#fastify-decorators)\n    + [`metrics`](#metrics)\n      - [`metrics.namespace`](#metricsnamespace)\n      - [`metrics.fastifyPrefix`](#metricsfastifyprefix)\n      - [`metrics.routesPrefix`](#metricsroutesprefix)\n      - [`metrics.client`](#metricsclient)\n      - [`metrics.sampler`](#metricssampler)\n      - [`metrics.hrtime2us`](#metricshrtime2us)\n      - [`metrics.hrtime2ns`](#metricshrtime2ns)\n      - [`metrics.hrtime2ms`](#metricshrtime2ms)\n      - [`metrics.hrtime2s`](#metricshrtime2s)\n  * [Request and Reply decorators](#request-and-reply-decorators)\n    + [`getMetricLabel()`](#getmetriclabel)\n    + [`sendTimingMetric(name[, value])`](#sendtimingmetricname-value)\n    + [`sendCounterMetric(name[, value])`](#sendcountermetricname-value)\n    + [`sendGaugeMetric(name, value)`](#sendgaugemetricname-value)\n    + [`sendSetMetric(name, value)`](#sendsetmetricname-value)\n- [Hooks](#hooks)\n- [Request and Reply routeConfig](#request-and-reply-routeconfig)\n- [API](#api)\n  * [Configuration `options`](#configuration-options)\n  * [Routes labels generation modes](#routes-labels-generation-modes)\n      - [computedPrefix](#computedprefix)\n    + [`static` mode](#static-mode)\n      - [`getLabel(options)`](#getlabeloptions)\n    + [`dynamic` mode](#dynamic-mode)\n      - [`getLabel(request, reply)`](#getlabelrequest-reply)\n      - [Example](#example)\n- [Powered Apps](#powered-apps)\n- [Support \u0026 Contribute](#support--contribute)\n- [License](#license)\n\n\u003c!-- tocstop --\u003e\n\n### Fastify Version Support\n\n| `Node.js` | `fastify` | `@immobiliarelabs/fastify-metrics` |\n| --------- | --------- | ---------------------------------- |\n| `\u003e=20`    | `5`       | `7`                                |\n\n## Installation\n\n### `npm`\n\n```bash\n# lastest stable version\n$ npm i -S @immobiliarelabs/fastify-metrics\n# latest development version\n$ npm i -S @immobiliarelabs/fastify-metrics@next\n```\n\n### `yarn`\n\n```bash\n# lastest stable version\n$ yarn add @immobiliarelabs/fastify-metrics\n# latest development version\n$ yarn @immobiliarelabs/fastify-metrics@next\n```\n\n## Migration guides\n\nSee these [migration guides](./MIGRATION_GUIDE.md) if you have to migrate from an older version of the plugin.\n\n## Usage\n\n```js\nconst fastify = require('fastify')();\n\nawait fastify.register(require('@immobiliarelabs/fastify-metrics'), {\n    client: {\n        host: 'udp://someip:someport',\n        namespace: 'ns',\n    },\n});\n\nconst route = {\n    // This is required in order to associate a metric to a route\n    // If an object `metrics` with a `routeId` is not passed the route stats will be\n    // ignored.\n    config: {\n        metrics: {\n            routeId: 'root.getStatus',\n        },\n    },\n    url: '/',\n    method: 'GET',\n    handler(request, reply) {\n        reply.send({ ok: true });\n    },\n};\nfastify.route(route);\n\nfastify.listen(3000);\n```\n\n## Route Configuration\n\nTo configure a route, you have to pass a `metrics` object with the `routeId` key set with a not empty string.\n\nIf the `routeId` is not passed or is set with a falsy value, the route will not be metricated, and all route metrics methods will be disabled.\n\nThere are more usage examples in the [`examples`](./examples) folder.\n\n### Note\n\nThe plugin internally uses the `routeId` key in the `metrics` object of the `Request.routeOptions` or `Reply.request.routeOptions` object to build the label of the metric of a route.\n\nSee\n\n- https://www.fastify.io/docs/latest/Reference/Routes/#config\n- https://www.fastify.io/docs/latest/Reference/Reply/\n- https://www.fastify.io/docs/latest/Reference/Request/\n\n## Metrics collected\n\nThese are the metrics that can be collected with their respective label.\n\n| Name                                                                 | Type      | Unit of measure                 | Description                    |\n| :------------------------------------------------------------------- | :-------- | :------------------------------ | :----------------------------- |\n| `\u003cMETRICS_NAMESPACE\u003e.process.cpu`                                    | `gauge`   | percentage                      | process cpu usage              |\n| `\u003cMETRICS_NAMESPACE\u003e.process.mem.external`                           | `gauge`   | bytes                           | process external memory        |\n| `\u003cMETRICS_NAMESPACE\u003e.process.mem.rss`                                | `gauge`   | bytes                           | process rss memory             |\n| `\u003cMETRICS_NAMESPACE\u003e.process.mem.heapUsed`                           | `gauge`   | bytes                           | process heap used memory       |\n| `\u003cMETRICS_NAMESPACE\u003e.process.mem.heapTotal`                          | `gauge`   | bytes                           | process heap total memory      |\n| `\u003cMETRICS_NAMESPACE\u003e.process.eventLoopDelay`                         | `gauge`   | milliseconds                    | process event loop delay       |\n| `\u003cMETRICS_NAMESPACE\u003e.process.eventLoopUtilization`                   | `gauge`   | absolute number between 0 and 1 | process event loop utilization |\n| `\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.\u003crouteId\u003e.requests`            | `counter` | unit                            | requests count per service     |\n| `\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.\u003crouteId\u003e.errors.\u003cstatusCode\u003e` | `counter` | unit                            | errors count per service       |\n| `\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.\u003crouteId\u003e.request_size`        | `timing`  | bytes                           | request size                   |\n| `\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.\u003crouteId\u003e.response_time`       | `timing`  | milliseconds                    | response time                  |\n| `\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.\u003crouteId\u003e.response_size`       | `timing`  | bytes                           | response size                  |\n\n**To know more about how the `computedPrefix` and the route label are built see [here](#routes-labels-generation-modes)**.\n\n## Decorators\n\nThe plugin adds some decorators to both the fastify instance and the reply object.\n\n### Fastify decorators\n\n#### `metrics`\n\n- \u003c`object`\u003e\n\nAn object containing the following properties:\n\n##### `metrics.namespace`\n\n- \u003c`string`\u003e\n\nThe `namespace` passed to the plugin configuration option.\n\n##### `metrics.fastifyPrefix`\n\n- \u003c`string`\u003e\n\nThe normalized fastify instance `prefix`.\n\n##### `metrics.routesPrefix`\n\n- \u003c`string`\u003e\n\nThe normalized routes `prefix` passed to the `routes.prefix` option.\n\n##### `metrics.client`\n\nThe [Dats](https://github.com/immobiliare/dats) instance.\n\n##### `metrics.sampler`\n\nThe [sampler](https://github.com/dnlup/doc) instance used to sample process metrics, if `options.health` is `true`.\n\n##### `metrics.hrtime2us`\n\nA utility function to convert the legacy `process.hrtime([time])` value to microseconds.\n\nSee [hrtime-utils](https://github.com/dnlup/hrtime-utils#hrtime2ustime).\n\n##### `metrics.hrtime2ns`\n\nA utility function to convert the legacy `process.hrtime([time])` value to nanoseconds.\n\nSee [hrtime-utils](https://github.com/dnlup/hrtime-utils#hrtime2nstime).\n\n##### `metrics.hrtime2ms`\n\nA utility function to convert the legacy `process.hrtime([time])` value to milliseconds.\n\nSee [hrtime-utils](https://github.com/dnlup/hrtime-utils#hrtime2mstime).\n\n##### `metrics.hrtime2s`\n\nA utility function to convert the legacy `process.hrtime([time])` value to seconds.\n\nSee [hrtime-utils](https://github.com/dnlup/hrtime-utils#hrtime2stime).\n\n### Request and Reply decorators\n\n#### `getMetricLabel()`\n\n- **Returns** \u003c`string`\u003e The computed metric label of the route.\n\n#### `sendTimingMetric(name[, value])`\n\n- name \u003c`string`\u003e The name of the metric\n- value \u003c`number`\u003e The value of the metric\n\nIt sends a timing metric. It automatically prepends the route label to the passed `name`. It is just a small wrapper of the native `Dats` client method.\n\n#### `sendCounterMetric(name[, value])`\n\n- name \u003c`string`\u003e The name of the metric\n- value \u003c`number`\u003e The value of the metric\n\nIt sends a counter metric. It automatically prepends the route label to the passed `name`. It is just a small wrapper of the native `Dats` client method.\n\n#### `sendGaugeMetric(name, value)`\n\n- name \u003c`string`\u003e The name of the metric\n- value \u003c`number`\u003e The value of the metric\n\nIt sends a gauge metric. It automatically prepends the route label to the passed `name`. It is just a small wrapper of the native `Dats` client method.\n\n#### `sendSetMetric(name, value)`\n\n- name \u003c`string`\u003e The name of the metric\n- value \u003c`number`\u003e The value of the metric\n\nIt sends a timing metric. It automatically prepends the route label to the passed `name`. It is just a small wrapper of the native `Dats` client method.\n\n## Hooks\n\nThe plugin uses the following hooks:\n\n- `onRoute`: to generate the route labels at startup time if `routes.mode` is set to `'static'`.\n- `onClose`: to close the [Dats](https://github.com/immobiliare/dats) instance and the [sampler](https://github.com/dnlup/doc#new-docsampleroptions) instance.\n- `onRequest`: it registers a hook to count requests and, if `routes.mode` is set to `'dynamic'`, it adds another one to generate the route label.\n- `onResponse`: to measure response time\n- `onError`: to count errors\n\n## Request and Reply routeConfig\n\nThe plugin adds a `metrics` object to the `Request.routeOptions` and `Reply.request.routeOptions` for convenience with the following properties:\n\n- `routeId` \u003c`string`\u003e The id for the current route\n- `fastifyPrefix` \u003c`string`\u003e The prefix of the fastify instance registering the route, with the `/` replaced with `.` and without the `.` at the beginning.\n- `routesPrefix` \u003c`string`\u003e The routes prefix passed to the plugin options and without `.` at the beginning and end.\n\nThese properties can be useful when using a custom [`getLabel`](routes-labels-generation-modes) function.\n\n## API\n\nThis module exports a [plugin registration function](https://github.com/fastify/fastify/blob/master/docs/Plugins-Guide.md#register).\n\n### Configuration `options`\n\n\u003e The plugin is configured with an object with the following properties\n\n- `client` \u003c`Object`|`Client`\u003e The statsd client [configuration](https://github.com/immobiliare/dats#new-clientoptions) object or a [`Client`](https://github.com/immobiliare/dats) instance. When using the options object, a default `onError` function is used to log with level `error` the event with the app logger.\n- `routes` \u003c`boolean`|`Object`\u003e Routes metrics configuration. If set to `false` it disables the collection of all the default routes metrics.\n    - `mode` \u003c`'static'`|`'dynamic'`\u003e The [strategy](#routes-labels-generation-modes) to generate the route metric label.\n    - `prefix` \u003c`string`\u003e The prefix to use for the routes labels (`\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.\u003crouteId\u003e.*`). It defaults to `''` (no prefix).\n    - `getLabel` \u003c`Function`\u003e A custom function to generate the route label. It has a different signature depending on the [mode](#routes-labels-generation-modes).\n    - `timing` \u003c`boolean`\u003e Collect response timings (`\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.\u003crouteId\u003e`). Default: `true`.\n    - `requestSize` \u003c`boolean`\u003e Collect request size (`\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.requests.\u003crouteId\u003e`). Default: `false`.\n    - `responseSize` \u003c`boolean`\u003e Collect response size (`\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.requests.\u003crouteId\u003e`). Default: `false`.\n    - `hits` \u003c`boolean`\u003e Collect requests count (`\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.requests.\u003crouteId\u003e`). Default: `true`.\n    - `errors` \u003c`boolean`\u003e Collect errors count (`\u003cMETRICS_NAMESPACE\u003e.\u003ccomputedPrefix\u003e.errors.\u003crouteId\u003e.\u003cstatusCode\u003e`). Default: `true`.\n- `health` \u003c`boolean`|`Object`\u003e Flag to enable/disable the collection of the process health data(`\u003cMETRICS_NAMESPACE\u003e.process.*`) or an object to configure a subset of the health metrics provided by the [sampler](https://github.com/dnlup/doc#new-docsampleroptions). Default: `true`.\n    - `sampleInterval` \u003c`number`\u003e The number of milliseconds of the interval to get the metrics sample.\n    - `eventLoopOptions` \u003c`Object`\u003e The options object used to configure the core [`monitorEventLoopDelay`](https://nodejs.org/docs/latest-v16.x/api/perf_hooks.html#perf_hooksmonitoreventloopdelayoptions).\n\n### Routes labels generation modes\n\nThere are two different modes to generate the label for each route:\n\n- `static`\n- `dynamic`\n\n##### computedPrefix\n\nIn both modes by default the plugin generates a prefix using:\n\n- the [`fastify` prefix](https://www.fastify.io/docs/latest/Reference/Server/#prefix) used to register the plugin (normalized replacing `/` with `.`), we call it `fastifyPrefix`\n- the routes prefix passed to the plugin option `routes.prefix`, we call it `routesPrefix`\n\nGenerating a computed prefix like this:\n\n`\u003cfastifyPrefix\u003e.\u003croutesPrefix\u003e`\n\n#### `static` mode\n\nIn this mode a [`onRoute` hook](https://www.fastify.io/docs/latest/Reference/Hooks/#onroute) is registered in the `fastify` instance and the plugin generates a label at startup time combining the following strings:\n\n- the [`fastify` prefix](https://www.fastify.io/docs/latest/Reference/Server/#prefix) used to register the plugin, accessible via the `prefix` key of the route registration options.\n- the routes prefix passed in the plugin options, accessible as a parameter of the internal `getLabel` function.\n- the `config.metrics.routeId` string used to configure the route, acessible via the `config` key of the route registration options.\n\nThe `getLabel` function in this mode will have the following signature:\n\n##### `getLabel(options)`\n\n- `options` [\u003c`Object`\u003e](https://www.fastify.io/docs/latest/Reference/Hooks/#onroute) The route registration\n    - `config`\n        - `metrics`\n            - `routeId` \u003c`string`\u003e The id used to initialize the route.\n            - `fastifyPrefix` \u003c`string`\u003e The normalized prefix of the fastify instance registering the route.\n            - `routesPrefix` \u003c`string`\u003e The normalized routes prefix passed to the plugin options.\n- **Returns:** \u003c`string`\u003e The route label string without any `.` at the beginning or end.\n\nPay attention to avoid returing empty strings or strings with leading and trailing `.`.\n\n#### `dynamic` mode\n\nIn this mode a [`onRequest` hook](https://www.fastify.io/docs/latest/Reference/Hooks/#onrequest) is registerd in the `fastify` instance and the plugin generates a label and attaches it to each request and reply combining the following strings:\n\n- the [`fastify` prefix](https://www.fastify.io/docs/latest/Reference/Server/#prefix) used to register the plugin, accessible via the `prefix` key of the `fastify` instance.\n- the routes prefix passed in the plugin options, accessible via the `metricsRoutesPrefix` decorator of the `fastify` instance.\n- the `config.metrics.routeId` string used to configure the route, acessible via the `config` key of the `request` or `reply` context.\n\nThe `getLabel` function in this mode will have the following signature:\n\n##### `getLabel(request, reply)`\n\n- `request`\n- `reply`\n- **Returns:** \u003c`string`\u003e The route label string without any `.` at the beginning or end.\n\nThe `this` context of the function is bound to the fastify instance of the request. Pay attention to avoid returing empty strings or strings with leading and trailing `.`. Also, don't use arrow functions otherwhise the `this` context won't refer to the fastify instance.\n\nIf you don't pass your custom function, the default one returns the same string computed in `static` mode. Hence, the `dynamic` mode is not very useful if you don't define your own `getLabel` function.\n\n##### Example\n\n```js\nconst fastify = require('fastify')();\n\nawait fastify.register(require('@immobiliarelabs/fastify-metrics'), {\n    client: {\n        host: 'udp://someip:someport',\n        namespace: 'ns',\n    },\n    routes: {\n        mode: 'dynamic',\n        getLabel: function (request, reply) {\n            const auth = request.user ? 'user' : 'anonim';\n            const { metrics } = request.routeOptions.config;\n            const routesPrefix = metrics.routesPrefix\n                ? `${metrics.routesPrefix}.`\n                : '';\n            const fastifyPrefix = metrics.fastifyPrefix\n                ? `${metrics.fastifyPrefix}.`\n                : '';\n            const routeId = metrics.routeId ? `${metrics.routeId}.` : '';\n            return `${fastifyPrefix}${routesPrefix}${routeId}${auth}`;\n        },\n    },\n});\n\nconst route = {\n    config: {\n        metrics: {\n            routeId: 'root.getStatus',\n        },\n    },\n    url: '/',\n    method: 'GET',\n    handler(request, reply) {\n        reply.send({ ok: true });\n    },\n};\nfastify.route(route);\n\nfastify.listen(3000);\n```\n\n## Powered Apps\n\n`fastify-metrics` was created by the amazing Node.js team at ImmobiliareLabs, the Tech dept of [Immobiliare.it](https://www.immobiliare.it), the #1 real estate company in Italy.\n\nWe are currently using `fastify-metrics` in our products as well as our internal toolings.\n\n**If you are using fastify-metrics in production [drop us a message](mailto://opensource@immobiliare.it)**.\n\n## Support \u0026 Contribute\n\nMade with ❤️ by [ImmobiliareLabs](https://github.com/immobiliare) \u0026 [Contributors](./CONTRIBUTING.md#contributors)\n\nWe'd love for you to contribute to `fastify-metrics`!\nIf you have any questions on how to use `fastify-metrics`, bugs and enhancement please feel free to reach out by opening a [GitHub Issue](https://github.com/immobiliare/fastify-metrics/issues).\n\n## License\n\n`fastify-metrics` is licensed under the MIT license.  \nSee the [LICENSE](./LICENSE) file for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimmobiliare%2Ffastify-metrics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimmobiliare%2Ffastify-metrics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimmobiliare%2Ffastify-metrics/lists"}