Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

67 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

@naverpay/prometheus

Prometheus ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋ฐ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์œ„ํ•œ TypeScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. PM2 ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ™˜๊ฒฝ์—์„œ์˜ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘์„ ์ง€์›ํ•˜๋ฉฐ, Koa, Hono ๋ฐ Next.js ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๊ตฌ์กฐ

์ด ๋ชจ๋…ธ๋ ˆํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

ํ•ต์‹ฌ Prometheus ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ PM2 ํ†ตํ•ฉ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • Prometheus ํžˆ์Šคํ† ๊ทธ๋žจ ๋ฐ ๊ฒŒ์ด์ง€ ๋ฉ”ํŠธ๋ฆญ ๋“ฑ๋ก
  • PM2 ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋ฐ ์ง‘๊ณ„
  • Next.js ๋ผ์šฐํŠธ ์ •๊ทœํ™”
  • HTTP ์ƒํƒœ ์ฝ”๋“œ ๊ทธ๋ฃนํ™”
  • ๊ธฐ๋ณธ Node.js ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ (๊ธฐ๋ณธ๊ฐ’: true)

Koa.js ํ”„๋ ˆ์ž„์›Œํฌ์šฉ Prometheus ๋ฏธ๋“ค์›จ์–ด ๋ฐ ๋ผ์šฐํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • HTTP ์š”์ฒญ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋ฏธ๋“ค์›จ์–ด
  • ๋ฉ”ํŠธ๋ฆญ ์—”๋“œํฌ์ธํŠธ ๋ผ์šฐํ„ฐ
  • API ํŠธ๋ ˆ์ด์‹ฑ ๋ฏธ๋“ค์›จ์–ด
  • ์š”์ฒญ ๊ฒฝ๋กœ ์ •๊ทœํ™” ์ง€์›

Hono ํ”„๋ ˆ์ž„์›Œํฌ์šฉ Prometheus ๋ฏธ๋“ค์›จ์–ด ๋ฐ ๋ผ์šฐํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • HTTP ์š”์ฒญ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋ฏธ๋“ค์›จ์–ด
  • ๋ฉ”ํŠธ๋ฆญ ์—”๋“œํฌ์ธํŠธ ๋ผ์šฐํ„ฐ
  • API ํŠธ๋ ˆ์ด์‹ฑ ๋ฏธ๋“ค์›จ์–ด
  • ์š”์ฒญ ๊ฒฝ๋กœ ์ •๊ทœํ™” ์ง€์›

Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ํ†ตํ•ฉ ์„œ๋ฒ„ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘์ด ํ†ตํ•ฉ๋œ Next.js ์„œ๋ฒ„
  • ์ž๋™ ๋ผ์šฐํŠธ ํŒจํ„ด ๋งค์นญ
  • PM2 ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ ์ง€์›

์„ค์น˜

๊ฐ ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ์ฝ”์–ด ํŒจํ‚ค์ง€
npm install @naverpay/prometheus-core

# Koa ์‚ฌ์šฉ ์‹œ
npm install @naverpay/prometheus-koa

# Hono ์‚ฌ์šฉ ์‹œ
npm install @naverpay/prometheus-hono

# Next.js ์‚ฌ์šฉ ์‹œ
npm install @naverpay/prometheus-next

๋น ๋ฅธ ์‹œ์ž‘

Koa ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

import Koa from 'koa'
import { createKoaPrometheusExporter } from '@naverpay/prometheus-koa'

const app = new Koa()

const { middleware, router } = await createKoaPrometheusExporter({
  pm2: true, // PM2 ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์‹œ
  metricsPath: '/metrics',
  collectDefaultMetrics: true,
})

app.use(middleware)
app.use(router.routes())

app.listen(3000)

Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

import { createNextServerWithMetrics } from '@naverpay/prometheus-next'

const server = await createNextServerWithMetrics({
  pm2: true,
  nextOptions: { dev: false },
  metricsPath: '/metrics',
})

server.listen(3000)

๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘

๊ฐ ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค:

HTTP ์š”์ฒญ ๋ฉ”ํŠธ๋ฆญ

  • ๋ฉ”ํŠธ๋ฆญ๋ช…: http_request_duration_seconds
  • ํƒ€์ž…: Histogram
  • ๋ผ๋ฒจ: status_code, method, path

API ์š”์ฒญ ๋ฉ”ํŠธ๋ฆญ (Koa API ํŠธ๋ ˆ์ด์‹ฑ)

  • ๋ฉ”ํŠธ๋ฆญ๋ช…: http_api_request_duration_seconds
  • ํƒ€์ž…: Histogram
  • ๋ผ๋ฒจ: path, status, method

์„œ๋น„์Šค ์ƒํƒœ ๋ฉ”ํŠธ๋ฆญ

  • ๋ฉ”ํŠธ๋ฆญ๋ช…: up
  • ํƒ€์ž…: Gauge
  • ์„ค๋ช…: ์„œ๋น„์Šค ๊ฐ€์šฉ์„ฑ (1 = ์‹คํ–‰ ์ค‘, 0 = ์ค‘๋‹จ)

๊ธฐ๋ณธ Node.js ๋ฉ”ํŠธ๋ฆญ

  • CPU ์‚ฌ์šฉ๋ฅ 
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
  • ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ง€์—ฐ
  • HTTP ์š”์ฒญ ์ง€์†์‹œ๊ฐ„
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํ†ต๊ณ„

PM2 ํด๋Ÿฌ์Šคํ„ฐ ์ง€์›

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” PM2 ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ž๋™์œผ๋กœ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค:

  1. ๊ฐ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์ฒด ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘
  2. ๋ฉ”ํŠธ๋ฆญ ์—”๋“œํฌ์ธํŠธ ์š”์ฒญ ์‹œ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘
  3. Prometheus ํ‘œ์ค€์— ๋”ฐ๋ผ ๋ฉ”ํŠธ๋ฆญ์„ ์ง‘๊ณ„ํ•˜์—ฌ ๋ฐ˜ํ™˜

๊ณ ๊ธ‰ ์„ค์ •

์š”์ฒญ ๋ฐ”์ดํŒจ์Šค

ํŠน์ • ์š”์ฒญ์„ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘์—์„œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const { middleware } = await createKoaPrometheusExporter({
  pm2: true,
  bypass: (context) => {
    // ํ—ฌ์Šค์ฒดํฌ ์š”์ฒญ ์ œ์™ธ
    return context.path === '/health'
  }
})

๊ฒฝ๋กœ ์ •๊ทœํ™”

๋™์  ๋ผ์šฐํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const { middleware } = await createKoaPrometheusExporter({
  pm2: true,
  normalizePath: (context) => {
    // /user/123 -> /user/:id
    return context.path.replace(/\/\d+/g, '/:id')
  }
})

์ƒํƒœ ์ฝ”๋“œ ํฌ๋งทํŒ…

์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ปค์Šคํ…€ ํ˜•์‹์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const { middleware } = await createKoaPrometheusExporter({
  pm2: true,
  formatStatusCode: (context) => {
    if (context.status >= 400) return 'error'
    if (context.status >= 300) return 'redirect'
    return 'success'
  }
})

๋ผ์ด์„ผ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ผ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์—ฌํ•˜๊ธฐ

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์š”์ฒญ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ง€์›

๋ฌธ์˜์‚ฌํ•ญ์ด๋‚˜ ์ง€์›์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

Package ์ถ”๊ฐ€ํ•˜๊ธฐ

> pnpm turbo gen init

? What is the name of the package? (You can skip the `@naverpay/` prefix) random
? Enter a space separated list of dependencies you would like to install react
Scope: all 4 workspace projects
Packages: +1
+
Progress: resolved 679, reused 665, downloaded 0, added 0, done

โ•ญ Warning โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                   โ”‚
โ”‚   Ignored build scripts: core-js-pure.                                            โ”‚
โ”‚   Run "pnpm approve-builds" to pick which dependencies should be allowed to run   โ”‚
โ”‚   scripts.                                                                        โ”‚
โ”‚                                                                                   โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

Done in 950ms using pnpm v10.13.1
>>> Changes made:
  โ€ข Config sanitized (function)
  โ€ข /packages/random/package.json (add)
  โ€ข /packages/random/tsconfig.json (add)
  โ€ข /packages/random/src/index.ts (add)
  โ€ข /packages/random/package.json (modify)
  โ€ข Package scaffolded (function)

์Šคํฌ๋ฆฝํŠธ

๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์œ„ํ•œ ์‚ฌ์ „ ์ •์˜๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

์Šคํฌ๋ฆฝํŠธ ์„ค๋ช…
pnpm start ๋ชจ๋“  ํŒจํ‚ค์ง€์—์„œ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰.
pnpm build Monorepo์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œ.
pnpm test ๋ชจ๋“  ํŒจํ‚ค์ง€์—์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰.
pnpm lint ESLint๋กœ ์ฝ”๋“œ ๋ฆฐํŠธ.
pnpm lint:fix ๋ฆฐํŠธ ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •.
pnpm prettier Prettier๋กœ ํฌ๋งท ํ™•์ธ.
pnpm prettier:fix Prettier๋กœ ์ฝ”๋“œ ํฌ๋งท ์ž๋™ ์ˆ˜์ •.
pnpm markdownlint Markdown ํŒŒ์ผ ๋ฆฐํŠธ ์‹คํ–‰.
pnpm markdownlint:fix Markdown ๋ฆฐํŠธ ๋ฌธ์ œ ์ž๋™ ์ˆ˜์ •.
pnpm clean ์ž‘์—… ๊ณต๊ฐ„ ์ดˆ๊ธฐํ™” ๋ฐ ์˜์กด์„ฑ ์žฌ์„ค์น˜.
pnpm release:canary Canary ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ (Git ํƒœ๊ทธ ์—†์Œ).
pnpm release ์•ˆ์ • ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ.

๋ฆฐํŠธ ๋ฐ ํฌ๋งทํŒ…

ESLint์™€ Prettier๊ฐ€ ๋ฆฐํŠธ์™€ ์ฝ”๋“œ ํฌ๋งทํŒ…์„ ์œ„ํ•ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ESLint Config: @naverpay/eslint-config
  • Prettier Config: @naverpay/prettier-config

Git ์ปค๋ฐ‹ ์ „ lint-staged๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋ฆฐํŠธ ๋ฐ ํฌ๋งทํŒ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.


Markdown ๋ฆฐํŠธ

Markdown ํŒŒ์ผ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด @naverpay/markdown-lint๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™ ์‹คํ–‰:

pnpm markdownlint
pnpm markdownlint:fix

Changeset ๋ฐ ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ

๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ฐฐํฌ๋Š” Changesets๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


Contribution Guide

  1. ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํฌํฌํ•˜๊ณ  ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋“  ๋ฆฐํŠธ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์„ ์ ์ด๋‚˜ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค๋ฉด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— Issue๋ฅผ ์—ด์–ด์ฃผ์„ธ์š”.


๋ผ์ด์„ ์Šค

์ด ํ…œํ”Œ๋ฆฟ์€ ๋„ค์ด๋ฒ„ ํŒŒ์ด๋‚ธ์…œ ์œ ์ €ํ”Œ๋žซํผ ์‚ฐํ•˜ ๊ณตํ†ต๊ฐœ๋ฐœTF (@NaverPayDev/frontend)์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋ฉฐ, ํ•ด๋‹น ๋ผ์ด์„ ์Šค ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

About

Integrating Prometheus exporter with PM2 for monitoring Node.js (Koa / Hono / Next.js) apps

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages