Skip to content

Commit 816d98d

Browse files
committed
feat: api monitoring
1 parent 3560d38 commit 816d98d

File tree

4 files changed

+111
-1
lines changed

4 files changed

+111
-1
lines changed

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@ MONGO_URI=mongodb://localhost:27017/your-database-name
66
# Auth Plugin
77
AUTH_DISCOVERY_URL=https://login.microsoftonline.com/c917f3e2-9322-4926-9bb3-daca730413ca/v2.0/.well-known/openid-configuration
88
AUTH_CLIENT_ID=b4bc4b9a-7162-44c5-bb50-fe935dce1f5a
9+
10+
# Loki Host
11+
# LOKI_HOST=http://localhost:3100

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@
3737
"@sinclair/typebox": "^0.34.41",
3838
"fastify": "^5.6.2",
3939
"fastify-cli": "7.4.1",
40+
"fastify-metrics": "^12.1.0",
4041
"fastify-plugin": "^5.1.0",
4142
"jsonwebtoken": "^9.0.2",
4243
"jwks-rsa": "^3.2.0",
43-
"openid-client": "^6.8.1"
44+
"openid-client": "^6.8.1",
45+
"pino-loki": "^3.0.0"
4446
},
4547
"devDependencies": {
4648
"@commitlint/cli": "^20.1.0",

src/app.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,21 @@ import {
1111
RawRequestDefaultExpression,
1212
RawServerDefault,
1313
} from "fastify";
14+
import { createRequire } from "module";
1415
import * as path from "path";
1516
import { fileURLToPath } from "url";
1617

18+
const require = createRequire(import.meta.url);
19+
const fastifyMetrics = require("fastify-metrics");
20+
1721
const __filename = fileURLToPath(import.meta.url);
1822
const __dirname = path.dirname(__filename);
1923

2024
export type AppOptions = {
2125
// Place your custom options for app below here.
2226
// MongoDB URI (Optional)
2327
// mongoUri: string;
28+
lokiHost?: string;
2429
} & FastifyServerOptions &
2530
Partial<AutoloadPluginOptions> &
2631
AuthPluginOptions;
@@ -49,6 +54,7 @@ const options: AppOptions = {
4954
// mongoUri: getOption("MONGO_URI")!,
5055
authDiscoveryURL: getOption("AUTH_DISCOVERY_URL")!,
5156
authClientID: getOption("AUTH_CLIENT_ID")!,
57+
lokiHost: getOption("LOKI_HOST", false),
5258
authSkip: (() => {
5359
const opt = getOption("AUTH_SKIP", false);
5460
if (opt !== undefined) {
@@ -59,6 +65,21 @@ const options: AppOptions = {
5965
})(),
6066
};
6167

68+
if (options.lokiHost) {
69+
options.logger = {
70+
level: "info",
71+
transport: {
72+
target: "pino-loki",
73+
options: {
74+
batching: true,
75+
interval: 5,
76+
host: options.lokiHost,
77+
labels: { application: "template-service" },
78+
},
79+
},
80+
};
81+
}
82+
6283
// Support Typebox
6384
export type FastifyTypebox = FastifyInstance<
6485
RawServerDefault,
@@ -83,6 +104,12 @@ const app: FastifyPluginAsync<AppOptions> = async (
83104
origin: "*",
84105
});
85106

107+
// Register Metrics
108+
await fastify.register(fastifyMetrics, {
109+
endpoint: "/metrics",
110+
defaultMetrics: { enabled: true },
111+
});
112+
86113
// Register Swagger & Swagger UI & Scalar
87114
await fastify.register(import("@fastify/swagger"), {
88115
openapi: {

yarn.lock

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,13 @@ __metadata:
686686
languageName: node
687687
linkType: hard
688688

689+
"@opentelemetry/api@npm:^1.4.0":
690+
version: 1.9.0
691+
resolution: "@opentelemetry/api@npm:1.9.0"
692+
checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add
693+
languageName: node
694+
linkType: hard
695+
689696
"@pinojs/redact@npm:^0.4.0":
690697
version: 0.4.0
691698
resolution: "@pinojs/redact@npm:0.4.0"
@@ -1342,6 +1349,13 @@ __metadata:
13421349
languageName: node
13431350
linkType: hard
13441351

1352+
"bintrees@npm:1.0.2":
1353+
version: 1.0.2
1354+
resolution: "bintrees@npm:1.0.2"
1355+
checksum: 10c0/132944b20c93c1a8f97bf8aa25980a76c6eb4291b7f2df2dbcd01cb5b417c287d3ee0847c7260c9f05f3d5a4233aaa03dec95114e97f308abe9cc3f72bed4a44
1356+
languageName: node
1357+
linkType: hard
1358+
13451359
"brace-expansion@npm:^1.1.7":
13461360
version: 1.1.12
13471361
resolution: "brace-expansion@npm:1.1.12"
@@ -2080,6 +2094,18 @@ __metadata:
20802094
languageName: node
20812095
linkType: hard
20822096

2097+
"fastify-metrics@npm:^12.1.0":
2098+
version: 12.1.0
2099+
resolution: "fastify-metrics@npm:12.1.0"
2100+
dependencies:
2101+
fastify-plugin: "npm:^5.0.0"
2102+
prom-client: "npm:^15.1.3"
2103+
peerDependencies:
2104+
fastify: ">=5"
2105+
checksum: 10c0/b42940b8c7cbfcd86182b9a85b53dc903727c73523cf14ff465fca7a64ffa966dcf14e9af944efdecfb1be027f2cb356dbaf5126f25c789eed6cd5b6d4767e24
2106+
languageName: node
2107+
linkType: hard
2108+
20832109
"fastify-plugin@npm:^4.5.1":
20842110
version: 4.5.1
20852111
resolution: "fastify-plugin@npm:4.5.1"
@@ -3611,6 +3637,27 @@ __metadata:
36113637
languageName: node
36123638
linkType: hard
36133639

3640+
"pino-abstract-transport@npm:^3.0.0":
3641+
version: 3.0.0
3642+
resolution: "pino-abstract-transport@npm:3.0.0"
3643+
dependencies:
3644+
split2: "npm:^4.0.0"
3645+
checksum: 10c0/4486e1b9508110aaf963d07741ac98d660b974dd51d8ad42077d215118e27cda20c64da46c07c926898d52540aab7c6b9c37dc0f5355c203bb1d6a72b5bd8d6c
3646+
languageName: node
3647+
linkType: hard
3648+
3649+
"pino-loki@npm:^3.0.0":
3650+
version: 3.0.0
3651+
resolution: "pino-loki@npm:3.0.0"
3652+
dependencies:
3653+
pino-abstract-transport: "npm:^3.0.0"
3654+
pump: "npm:^3.0.3"
3655+
bin:
3656+
pino-loki: dist/cli.mjs
3657+
checksum: 10c0/d7d83b8989366ff73d461f0c39adf1c7000c54a658f282cdb0e035e0fea88ac63933bd0f84dd13fbfcc210581f54b97389ff104f501559ea635c5316a1a6b398
3658+
languageName: node
3659+
linkType: hard
3660+
36143661
"pino-pretty@npm:^13.0.0":
36153662
version: 13.0.0
36163663
resolution: "pino-pretty@npm:13.0.0"
@@ -3810,6 +3857,16 @@ __metadata:
38103857
languageName: node
38113858
linkType: hard
38123859

3860+
"prom-client@npm:^15.1.3":
3861+
version: 15.1.3
3862+
resolution: "prom-client@npm:15.1.3"
3863+
dependencies:
3864+
"@opentelemetry/api": "npm:^1.4.0"
3865+
tdigest: "npm:^0.1.1"
3866+
checksum: 10c0/816525572e5799a2d1d45af78512fb47d073c842dc899c446e94d17cfc343d04282a1627c488c7ca1bcd47f766446d3e49365ab7249f6d9c22c7664a5bce7021
3867+
languageName: node
3868+
linkType: hard
3869+
38133870
"pump@npm:^3.0.0":
38143871
version: 3.0.0
38153872
resolution: "pump@npm:3.0.0"
@@ -3820,6 +3877,16 @@ __metadata:
38203877
languageName: node
38213878
linkType: hard
38223879

3880+
"pump@npm:^3.0.3":
3881+
version: 3.0.3
3882+
resolution: "pump@npm:3.0.3"
3883+
dependencies:
3884+
end-of-stream: "npm:^1.1.0"
3885+
once: "npm:^1.3.1"
3886+
checksum: 10c0/ada5cdf1d813065bbc99aa2c393b8f6beee73b5de2890a8754c9f488d7323ffd2ca5f5a0943b48934e3fcbd97637d0337369c3c631aeb9614915db629f1c75c9
3887+
languageName: node
3888+
linkType: hard
3889+
38233890
"punycode@npm:^2.1.0, punycode@npm:^2.3.0":
38243891
version: 2.3.1
38253892
resolution: "punycode@npm:2.3.1"
@@ -4160,6 +4227,15 @@ __metadata:
41604227
languageName: node
41614228
linkType: hard
41624229

4230+
"tdigest@npm:^0.1.1":
4231+
version: 0.1.2
4232+
resolution: "tdigest@npm:0.1.2"
4233+
dependencies:
4234+
bintrees: "npm:1.0.2"
4235+
checksum: 10c0/10187b8144b112fcdfd3a5e4e9068efa42c990b1e30cd0d4f35ee8f58f16d1b41bc587e668fa7a6f6ca31308961cbd06cd5d4a4ae1dc388335902ae04f7d57df
4236+
languageName: node
4237+
linkType: hard
4238+
41634239
"template-api@workspace:.":
41644240
version: 0.0.0-use.local
41654241
resolution: "template-api@workspace:."
@@ -4185,13 +4261,15 @@ __metadata:
41854261
eslint-plugin-prettier: "npm:^5.5.4"
41864262
fastify: "npm:^5.6.2"
41874263
fastify-cli: "npm:7.4.1"
4264+
fastify-metrics: "npm:^12.1.0"
41884265
fastify-plugin: "npm:^5.1.0"
41894266
fastify-tsconfig: "npm:^3.0.0"
41904267
globals: "npm:^16.5.0"
41914268
husky: "npm:^9.1.7"
41924269
jsonwebtoken: "npm:^9.0.2"
41934270
jwks-rsa: "npm:^3.2.0"
41944271
openid-client: "npm:^6.8.1"
4272+
pino-loki: "npm:^3.0.0"
41954273
prettier: "npm:3.7.4"
41964274
prettier-plugin-jsdoc: "npm:^1.7.0"
41974275
typescript: "npm:^5.9.3"

0 commit comments

Comments
 (0)