Skip to content

Commit

Permalink
Merge pull request #5 from herrmannplatz/feature/fastify-5
Browse files Browse the repository at this point in the history
feat: support fastify@5
  • Loading branch information
herrmannplatz authored Jan 21, 2025
2 parents 8f24474 + 173c5e0 commit df2bf10
Show file tree
Hide file tree
Showing 10 changed files with 88 additions and 54 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ jobs:
name: Release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 20.x
- run: npm it
Expand Down
2 changes: 1 addition & 1 deletion LICENCE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2023 herrmannplatz
Copyright (c) 2025 herrmannplatz

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# fastify-datadog

![CI](https://github.com/herrmannplatz/fastify-datadog/actions/workflows/release.yaml/badge.svg)
[![npm version](https://badge.fury.io/js/fastify-datadog.svg)](https://badge.fury.io/js/fastify-datadog) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://standardjs.com/)
[![npm version](https://badge.fury.io/js/fastify-datadog.svg)](https://badge.fury.io/js/fastify-datadog) [![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-brightgreen?style=flat)](https://github.com/neostandard/neostandard)

> 🐶 [Datadog](https://www.datadoghq.com) plugin for fastify. Influenced by [node-connect-datadog](https://github.com/AppPress/node-connect-datadog)
Expand Down
6 changes: 6 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
'use strict'

module.exports = require('neostandard')({
ignores: require('neostandard').resolveIgnoresFromGitignore(),
ts: true
})
21 changes: 21 additions & 0 deletions example/example.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
'use strict'

const { StatsD } = require('hot-shots')

const fastify = require('fastify')()

fastify.register(require('..'), {
dogstatsd: new StatsD(),
tags: ['app:example'],
})

fastify.get('/', function handler (request, reply) {
reply.send({ hello: 'world' })
})

fastify.listen({ port: 3000 }, (err) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
})
8 changes: 4 additions & 4 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/// <reference types="node" />

import { FastifyPluginCallback } from 'fastify';
import { StatsD } from 'hot-shots';
import { FastifyPluginCallback } from 'fastify'
import { StatsD } from 'hot-shots'

export interface FastifyDatadogOptions {
dogstatsd: StatsD
Expand All @@ -12,6 +12,6 @@ export interface FastifyDatadogOptions {
responseCode?: boolean
}

declare const fastifyDatadog: FastifyPluginCallback<FastifyDatadogOptions>;
declare const fastifyDatadog: FastifyPluginCallback<FastifyDatadogOptions>

export default fastifyDatadog;
export default fastifyDatadog
2 changes: 1 addition & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,6 @@ async function fastifyDatadog (fastify, options = {}) {
}

module.exports = fp(fastifyDatadog, {
fastify: '4.x',
fastify: '5.x',
name: 'fastify-datadog'
})
14 changes: 7 additions & 7 deletions index.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import fastify from 'fastify';
import { StatsD } from 'hot-shots';
import datadogPlugin from '.';
import fastify from 'fastify'
import { StatsD } from 'hot-shots'
import datadogPlugin from '.'

const app1 = fastify();
const app1 = fastify()

app1.register(datadogPlugin, {
dogstatsd: new StatsD()
});
})

const app2 = fastify();
const app2 = fastify()

app2.register(datadogPlugin, {
dogstatsd: new StatsD(),
Expand All @@ -17,4 +17,4 @@ app2.register(datadogPlugin, {
method: true,
path: true,
responseCode: true
});
})
63 changes: 35 additions & 28 deletions index.test.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
/* eslint-env jest */
'use strict'

const { it, mock, describe, beforeEach, afterEach } = require('node:test')
const assert = require('node:assert')

const Fastify = require('fastify')
const fastifyDatatog = require('./index')

const dogstatsdMock = {
increment: jest.fn(),
histogram: jest.fn()
increment: mock.fn(),
histogram: mock.fn()
}

describe('fastify-datadog', () => {
Expand All @@ -16,12 +20,15 @@ describe('fastify-datadog', () => {

afterEach(() => {
fastify.close()
jest.clearAllMocks()
dogstatsdMock.histogram.mock.resetCalls()
dogstatsdMock.increment.mock.resetCalls()
})

it('should throw error if dogstatsd option is missing', async () => {
await expect(fastify.register(fastifyDatatog, { dogstatsd: undefined }))
.rejects.toEqual(Error('Missing dogstatsd option.'))
await assert.rejects(
async () => fastify.register(fastifyDatatog, { dogstatsd: undefined }),
{ message: 'Missing dogstatsd option.' }
)
})

it('should track response time', async () => {
Expand All @@ -31,10 +38,10 @@ describe('fastify-datadog', () => {

await fastify.inject('/users/123456')

expect(dogstatsdMock.histogram.mock.calls.length).toEqual(1)
expect(dogstatsdMock.histogram.mock.calls[0][0]).toEqual('node.fastify.router.response_time')
expect(dogstatsdMock.histogram.mock.calls[0][1]).toBeGreaterThan(0)
expect(dogstatsdMock.histogram.mock.calls[0][3][0]).toEqual('route:/users/:id')
assert.strictEqual(dogstatsdMock.histogram.mock.calls.length, 1)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[0], 'node.fastify.router.response_time')
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[1] > 0, true)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[3][0], 'route:/users/:id')
})

it('should track method', async () => {
Expand All @@ -44,11 +51,11 @@ describe('fastify-datadog', () => {

await fastify.inject('/users/123456')

expect(dogstatsdMock.histogram.mock.calls.length).toEqual(1)
expect(dogstatsdMock.histogram.mock.calls[0][0]).toEqual('node.fastify.router.response_time')
expect(dogstatsdMock.histogram.mock.calls[0][1]).toBeGreaterThan(0)
expect(dogstatsdMock.histogram.mock.calls[0][3][0]).toEqual('route:/users/:id')
expect(dogstatsdMock.histogram.mock.calls[0][3][1]).toEqual('method:get')
assert.strictEqual(dogstatsdMock.histogram.mock.calls.length, 1)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[0], 'node.fastify.router.response_time')
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[1] > 0, true)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[3][0], 'route:/users/:id')
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[3][1], 'method:get')
})

it('should track response code', async () => {
Expand All @@ -58,15 +65,15 @@ describe('fastify-datadog', () => {

await fastify.inject('/users/123456')

expect(dogstatsdMock.histogram.mock.calls.length).toEqual(1)
expect(dogstatsdMock.histogram.mock.calls[0][0]).toEqual('node.fastify.router.response_time')
expect(dogstatsdMock.histogram.mock.calls[0][1]).toBeGreaterThan(0)
expect(dogstatsdMock.histogram.mock.calls[0][3][0]).toEqual('route:/users/:id')
expect(dogstatsdMock.histogram.mock.calls[0][3][1]).toEqual('response_code:200')
assert.strictEqual(dogstatsdMock.histogram.mock.calls.length, 1)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[0], 'node.fastify.router.response_time')
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[1] > 0, true)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[3][0], 'route:/users/:id')
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[3][1], 'response_code:200')

expect(dogstatsdMock.increment.mock.calls.length).toEqual(2)
expect(dogstatsdMock.increment.mock.calls[0][0]).toEqual('node.fastify.router.response_code.200')
expect(dogstatsdMock.increment.mock.calls[1][0]).toEqual('node.fastify.router.response_code.all')
assert.strictEqual(dogstatsdMock.increment.mock.calls.length, 2)
assert.strictEqual(dogstatsdMock.increment.mock.calls[0].arguments[0], 'node.fastify.router.response_code.200')
assert.strictEqual(dogstatsdMock.increment.mock.calls[1].arguments[0], 'node.fastify.router.response_code.all')
})

it('should track method', async () => {
Expand All @@ -76,10 +83,10 @@ describe('fastify-datadog', () => {

await fastify.inject('/users/123456')

expect(dogstatsdMock.histogram.mock.calls.length).toEqual(1)
expect(dogstatsdMock.histogram.mock.calls[0][0]).toEqual('node.fastify.router.response_time')
expect(dogstatsdMock.histogram.mock.calls[0][1]).toBeGreaterThan(0)
expect(dogstatsdMock.histogram.mock.calls[0][3][0]).toEqual('route:/users/:id')
expect(dogstatsdMock.histogram.mock.calls[0][3][1]).toEqual('path:/users/123456')
assert.strictEqual(dogstatsdMock.histogram.mock.calls.length, 1)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[0], 'node.fastify.router.response_time')
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[1] > 0, true)
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[3][0], 'route:/users/:id')
assert.strictEqual(dogstatsdMock.histogram.mock.calls[0].arguments[3][1], 'path:/users/123456')
})
})
20 changes: 10 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
"types": "index.d.ts",
"scripts": {
"test": "npm run test:unit && npm run test:typescript",
"test:unit": "jest --coverage",
"test:unit": "node --test --experimental-test-coverage",
"test:typescript": "tsd",
"posttest": "npm run lint",
"lint": "standard",
"lint:fix": "standard --fix"
"lint": "eslint",
"lint:fix": "eslint --fix"
},
"keywords": [
"datadog",
Expand All @@ -21,15 +21,15 @@
"author": "herrmannplatz <[email protected]>",
"license": "MIT",
"dependencies": {
"fastify-plugin": "^4.5.1"
"fastify-plugin": "^5.0.1"
},
"devDependencies": {
"@types/node": "^20.10.4",
"fastify": "^4.24.3",
"hot-shots": "^10.0.0",
"jest": "^29.7.0",
"standard": "^17.1.0",
"tsd": "^0.29.0"
"@types/node": "^22.10.7",
"eslint": "^9.18.0",
"fastify": "^5.2.1",
"hot-shots": "^10.2.1",
"neostandard": "^0.12.0",
"tsd": "^0.31.2"
},
"repository": {
"type": "git",
Expand Down

0 comments on commit df2bf10

Please sign in to comment.