Skip to content

Commit d82c158

Browse files
authored
Implement OpenTelemetry integration (#2)
* feat: otel * Update ci.yaml * fix
1 parent 2914392 commit d82c158

7 files changed

Lines changed: 691 additions & 16 deletions

File tree

.env.local.sample

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
OIDC_ISSUER_URI=https://cloud-iam.oidc-spa.dev/realms/oidc-spa
22
OIDC_AUDIENCE=account
3-
PORT=8080
3+
PORT=8080
4+
MODE=prod
5+
OTEL_ENABLED=false
6+
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318

.github/workflows/ci.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ jobs:
1414
steps:
1515
- uses: actions/checkout@v4
1616
- uses: actions/setup-node@v4
17+
with:
18+
node-version: 25
1719
- uses: bahmutov/npm-install@v1
1820
- run: yarn build
1921
#- run: yarn test
@@ -42,6 +44,8 @@ jobs:
4244
steps:
4345
- uses: actions/checkout@v4
4446
- uses: actions/setup-node@v4
47+
with:
48+
node-version: 25
4549
- uses: softprops/action-gh-release@v1
4650
with:
4751
name: Release v${{ needs.check_if_version_upgraded.outputs.to_version }}

Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# build environment
2-
FROM node:18-alpine3.17 as build
2+
FROM node:25-alpine as build
33
WORKDIR /app
44
COPY package.json yarn.lock ./
55
RUN yarn install --frozen-lockfile
66
COPY . .
77
RUN yarn build
88

99
# production environment
10-
FROM node:20-alpine3.19
10+
FROM node:25-alpine
1111
COPY --from=build /app/dist .
12-
ENTRYPOINT sh -c "node ."
12+
ENTRYPOINT sh -c "node ."

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@
2323
"dependencies": {
2424
"@hono/node-server": "^1.11.1",
2525
"@hono/node-ws": "^1.0.3",
26+
"@hono/otel": "^1.1.2",
2627
"@hono/zod-openapi": "^0.13.0",
28+
"@opentelemetry/api": "^1.9.0",
29+
"@opentelemetry/exporter-trace-otlp-http": "^0.53.0",
30+
"@opentelemetry/sdk-metrics": "^1.26.0",
31+
"@opentelemetry/sdk-node": "^0.53.0",
32+
"@opentelemetry/sdk-trace-node": "^1.26.0",
2733
"hono": "^4.11.1",
2834
"oidc-spa": "^10.0.0",
2935
"tsafe": "^1.8.12",

src/main.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { z, createRoute, OpenAPIHono } from "@hono/zod-openapi";
22
import { serve } from "@hono/node-server";
33
import { createNodeWebSocket } from "@hono/node-ws";
4+
import { httpInstrumentationMiddleware } from "@hono/otel";
45
import { getUserTodoStore } from "./todo";
56
import { cors } from "hono/cors";
67
import { assert } from "tsafe/assert";
7-
import { bootstrapAuth, getUser, getUser_ws } from "./auth";
8+
import { bootstrapAuth, getUser, getUser_ws } from "./auth";
9+
import { setupTracing } from "./telemetry";
10+
11+
setupTracing();
812

913
(async function main() {
1014
const issuerUri = (() => {
@@ -32,21 +36,26 @@ import { bootstrapAuth, getUser, getUser_ws } from "./auth";
3236
const app = new OpenAPIHono();
3337

3438
app.use("*", cors());
39+
app.use(
40+
"*",
41+
httpInstrumentationMiddleware({ serviceName: "todo-rest-api" })
42+
);
3543

3644
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });
3745

3846
app.get(
3947
"/ws",
4048
upgradeWebSocket(async c => {
41-
4249
const user = await getUser_ws({ req: c.req });
4350

4451
return {
4552
onOpen: (_event, ws) => {
4653
ws.send(`Hello ${user.name}`);
4754
},
4855
onMessage(event, ws) {
49-
ws.send(`I'm not very smart, all I can do is repeat what you say: "${event.data}"`);
56+
ws.send(
57+
`I'm not very smart, all I can do is repeat what you say: "${event.data}"`
58+
);
5059
}
5160
};
5261
})

src/telemetry.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { NodeSDK } from "@opentelemetry/sdk-node";
2+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
3+
import { ConsoleSpanExporter } from "@opentelemetry/sdk-trace-node";
4+
5+
export function setupTracing() {
6+
const sdk = new NodeSDK({
7+
serviceName: "todo-rest-api",
8+
traceExporter:
9+
process.env.MODE === "dev"
10+
? new ConsoleSpanExporter()
11+
: new OTLPTraceExporter()
12+
});
13+
14+
console.log(
15+
process.env.MODE === "dev"
16+
? "Using ConsoleSpanExporter for tracing"
17+
: "Using OTLPTraceExporter for tracing"
18+
);
19+
20+
sdk.start();
21+
}

0 commit comments

Comments
 (0)