Skip to content

Commit d69e54b

Browse files
authored
Merge pull request #3 from ONDC-Official/feat-tracing
Feat tracing
2 parents c21d309 + 4322ccc commit d69e54b

File tree

6 files changed

+85
-5
lines changed

6 files changed

+85
-5
lines changed

.github/workflows/deployment.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ jobs:
5858
echo "REDIS_PORT=${{ secrets.REDIS_PORT }}" >> \$REPO_DIR/backend/.env
5959
echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}" >> \$REPO_DIR/backend/.env
6060
echo "REDIS_USERNAME=${{ secrets.REDIS_USERNAME }}" >> \$REPO_DIR/backend/.env
61-
61+
echo "SERVICE_NAME=${{ vars.SERVICE_NAME }}" >> \$REPO_DIR/backend/.env
62+
echo "TRACE_URL=${{ vars.TRACE_URL }}" >> \$REPO_DIR/backend/.env
6263
EOF
6364
6465
- name: Verify docker-compose.yml files

backend/package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
{
22
"dependencies": {
3+
"@opentelemetry/api": "1.9.0",
4+
"@opentelemetry/auto-instrumentations-node": "0.57.1",
5+
"@opentelemetry/exporter-jaeger": "2.0.0",
6+
"@opentelemetry/exporter-prometheus": "0.200.0",
7+
"@opentelemetry/resources": "^1.8.0",
8+
"@opentelemetry/sdk-logs": "0.200.0",
9+
"@opentelemetry/sdk-metrics": "2.0.0",
10+
"@opentelemetry/sdk-node": "0.200.0",
11+
"@opentelemetry/semantic-conventions": "1.32.0",
312
"@types/axios": "^0.14.4",
413
"axios": "^1.7.9",
514
"connect-redis": "^7.1.1",
@@ -11,6 +20,7 @@
1120
"ioredis": "^5.4.1",
1221
"js-yaml": "^4.1.0",
1322
"jsonwebtoken": "^9.0.2",
23+
"lodash": "^4.17.21",
1424
"ondc-automation-cache-lib": "^1.0.4",
1525
"redis": "^4.7.0",
1626
"uuid": "^11.0.3"
@@ -23,6 +33,7 @@
2333
"@types/express-session": "^1.18.0",
2434
"@types/js-yaml": "^4.0.9",
2535
"@types/jsonwebtoken": "^9.0.7",
36+
"@types/lodash": "^4.17.16",
2637
"@types/node": "^22.10.1",
2738
"copyfiles": "^2.4.1",
2839
"nodemon": "^3.1.7",

backend/src/config/otelConfig.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict';
2+
require('dotenv').config();
3+
console.info("Starting opentelemetry tracing");
4+
const { NodeSDK } = require('@opentelemetry/sdk-node');
5+
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
6+
const { JaegerExporter } = require('@opentelemetry/exporter-jaeger');
7+
const { Resource } = require('@opentelemetry/resources');
8+
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');
9+
10+
const resource = new Resource({
11+
[SemanticResourceAttributes.SERVICE_NAME]: process.env.SERVICE_NAME
12+
});
13+
const sdk = new NodeSDK({
14+
traceExporter: new JaegerExporter({
15+
endpoint: process.env.TRACE_URL,
16+
17+
}),
18+
instrumentations: [getNodeAutoInstrumentations()],
19+
resource,
20+
});
21+
22+
sdk.start();

backend/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
require("./config/otelConfig")
12
import app from './app';
23
import * as dotenv from 'dotenv'
34

backend/src/routes/sessionRoutes.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ import {
1010
createSession,
1111
} from "../controllers/sessionController";
1212
import validateToken from "../middleware";
13+
import otelTracing from "../services/tracing-service";
1314

1415
const router = Router();
1516

1617
router.get("/all", validateToken, getAllSession);
17-
router.get("/", validateToken, getSession);
18-
router.put("/", validateToken, updateSession);
19-
router.delete("/", validateToken, deleteSession);
20-
router.post("/", createSession);
18+
router.get("/", otelTracing('','','query.subscriber_url'),validateToken, getSession);
19+
router.put("/",otelTracing('','','query.subscriber_url'), validateToken, updateSession);
20+
router.delete("/",otelTracing('','','query.subscriber_url'), validateToken, deleteSession);
21+
router.post("/",otelTracing('','body.sessionID'), createSession);
2122
router.post("/updatedb", updateCacheDb);
2223

2324
export default router;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { trace } from '@opentelemetry/api';
2+
import { Request, Response, NextFunction, RequestHandler } from 'express';
3+
import { get } from 'lodash';
4+
5+
/**
6+
* Middleware factory that creates a tracing span with optional dot-notated paths.
7+
*
8+
* @param transaction_id_path - Dot path to transaction_id in req.body (default: 'context.transaction_id')
9+
* @param session_id - Dot path to transaction_id in req.body (default: 'context.transaction_id')
10+
* @param bap_id_path - Dot path to bap_id in req.body (default: 'context.bap_id')
11+
* @param bpp_id_path - Dot path to bpp_id in req.body (default: 'context.bpp_id')
12+
* @returns Express middleware
13+
*/
14+
export function otelTracing(
15+
transaction_id_path: string = 'transaction_id',
16+
session_id_path: string = 'session_id',
17+
bap_id_path: string = 'context.bap_id',
18+
bpp_id_path: string = 'context.bpp_id'
19+
): RequestHandler {
20+
return (req: Request, res: Response, next: NextFunction) => {
21+
const transaction_id: string | undefined = get(req, transaction_id_path);
22+
const session_id: string | undefined = get(req, session_id_path);
23+
const bap_id: string | undefined = get(req, bap_id_path);
24+
const bpp_id: string | undefined = get(req, bpp_id_path);
25+
26+
const tracer = trace.getTracer(process.env.SERVICE_NAME || 'default-service');
27+
28+
const span = tracer.startSpan("trace_span", {
29+
attributes: {
30+
'transaction_id': transaction_id || '',
31+
'session_id': session_id || '',
32+
'bap_id': bap_id || '',
33+
'bpp_id': bpp_id || '',
34+
}
35+
});
36+
37+
span.end();
38+
39+
next();
40+
41+
};
42+
}
43+
44+
export default otelTracing;

0 commit comments

Comments
 (0)