Skip to content

Commit 57a5889

Browse files
committed
feat(satp): define and implement prometheus metrics in satp-hermes
Signed-off-by: Jorge Santos <jorge.m.santos@tecnico.ulisboa.pt>
1 parent b924326 commit 57a5889

37 files changed

Lines changed: 1104 additions & 108 deletions

packages/cactus-plugin-satp-hermes/docker-compose-satp.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ services:
1313
- 3010:3010/tcp # SERVER_PORT
1414
- 3011:3011/tcp # CLIENT_PORT
1515
- 3012:4010/tcp # API_PORT
16+
depends_on:
17+
- otel-lgtm
18+
1619
#https://grafana.com/blog/2024/03/13/an-opentelemetry-backend-in-a-docker-image-introducing-grafana/otel-lgtm/
1720
otel-lgtm:
1821
image: grafana/otel-lgtm:latest
1922
container_name: otel-lgtm
2023
environment:
21-
ENABLE_LOGS_ALL: true
22-
OTEL_METRIC_EXPORT_INTERVAL: "500"
24+
OTEL_METRIC_EXPORT_INTERVAL: "100"
2325
ports:
2426
- "4000:3000" # Grafana
2527
- "4317:4317" # OpenTelemetry gRPC endpoint

packages/cactus-plugin-satp-hermes/src/main/typescript/api1/dispatcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
type JsObjectSigner,
55
} from "@hyperledger/cactus-common";
66

7-
import { SatpLoggerProvider as LoggerProvider } from "../core/satp-logger-provider";
7+
import { SATPLoggerProvider as LoggerProvider } from "../core/satp-logger-provider";
88
import type { SATPLogger as Logger } from "../core/satp-logger";
99

1010
import { type IWebServiceEndpoint } from "@hyperledger/cactus-core-api";

packages/cactus-plugin-satp-hermes/src/main/typescript/core/satp-logger-provider.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ILoggerOptions, LogLevelDesc } from "@hyperledger/cactus-common";
22
import { SATPLogger } from "./satp-logger";
33
import { MonitorService } from "../services/monitoring/monitor";
44

5-
export class SatpLoggerProvider {
5+
export class SATPLoggerProvider {
66
private static loggers: Map<string, SATPLogger> = new Map();
77
private static logLevel: LogLevelDesc = "warn";
88

@@ -11,14 +11,14 @@ export class SatpLoggerProvider {
1111
monitorService: MonitorService,
1212
): SATPLogger {
1313
// make sure log level is set to global default if otherwise wasn't provided
14-
loggerOptions.level = loggerOptions.level || SatpLoggerProvider.logLevel;
14+
loggerOptions.level = loggerOptions.level || SATPLoggerProvider.logLevel;
1515

16-
let logger: SATPLogger | undefined = SatpLoggerProvider.loggers.get(
16+
let logger: SATPLogger | undefined = SATPLoggerProvider.loggers.get(
1717
loggerOptions.label,
1818
);
1919
if (!logger) {
2020
logger = new SATPLogger(loggerOptions, monitorService);
21-
SatpLoggerProvider.loggers.set(loggerOptions.label, logger);
21+
SATPLoggerProvider.loggers.set(loggerOptions.label, logger);
2222
}
2323
return logger;
2424
}
@@ -27,9 +27,9 @@ export class SatpLoggerProvider {
2727
logLevel: LogLevelDesc,
2828
applyToCachedLoggers = true,
2929
): void {
30-
SatpLoggerProvider.logLevel = logLevel;
30+
SATPLoggerProvider.logLevel = logLevel;
3131
if (applyToCachedLoggers) {
32-
SatpLoggerProvider.loggers.forEach((logger: SATPLogger) =>
32+
SATPLoggerProvider.loggers.forEach((logger: SATPLogger) =>
3333
logger.setLogLevel(logLevel as LogLevelDesc),
3434
);
3535
}

packages/cactus-plugin-satp-hermes/src/main/typescript/core/satp-session.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { stringify as safeStableStringify } from "safe-stable-stringify";
33

44
import { Checks, LogLevelDesc } from "@hyperledger/cactus-common";
55

6-
import { SatpLoggerProvider as LoggerProvider } from "./satp-logger-provider";
6+
import { SATPLoggerProvider as LoggerProvider } from "./satp-logger-provider";
77
import { SATPLogger as Logger } from "./satp-logger";
88

99
import {
@@ -180,7 +180,7 @@ export class SATPSession {
180180
sessionData.satpMessages.stage3 = create(Stage3MessagesSchema, {});
181181
sessionData.state = State.ONGOING;
182182

183-
this.monitorService.incrementCounter("created_sessions", 2);
183+
this.monitorService.incrementCounter("created_sessions");
184184
} catch (err) {
185185
span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });
186186
span.recordException(err);

packages/cactus-plugin-satp-hermes/src/main/typescript/core/stage-handlers/stage0-handler.ts

Lines changed: 104 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SatpLoggerProvider as LoggerProvider } from "../../core/satp-logger-provider";
1+
import { SATPLoggerProvider as LoggerProvider } from "../../core/satp-logger-provider";
22
import { SATPLogger as Logger } from "../../core/satp-logger";
33
import { SATPSession } from "../satp-session";
44
import { Stage0ServerService } from "../stage-services/server/stage0-server-service";
@@ -78,11 +78,14 @@ export class Stage0SATPHandler implements SATPHandler {
7878
const fnTag = `${this.getHandlerIdentifier()}#${stepTag}`;
7979
const { span, context: ctx } = this.monitorService.startSpan(fnTag);
8080
return context.with(ctx, async () => {
81+
const attributes: Record<
82+
string,
83+
undefined | string | number | boolean | string[] | number[] | boolean[]
84+
> = {};
8185
try {
8286
let session: SATPSession | undefined;
8387
try {
8488
this.Log.debug(`${fnTag}, New Session...`);
85-
//console.log("aii: ", stringify(req));
8689
this.Log.debug(`${fnTag}, Request: ${safeStableStringify(req)}}`);
8790

8891
session = this.sessions.get(req.sessionId);
@@ -121,6 +124,25 @@ export class Stage0SATPHandler implements SATPHandler {
121124

122125
saveMessageInSessionData(session.getServerSessionData(), message);
123126

127+
attributes.satp_phase = 0;
128+
attributes.operation = "newSession";
129+
130+
const startTimestamp =
131+
session.getServerSessionData().processedTimestamps?.stage0
132+
?.newSessionRequestMessageTimestamp;
133+
const endTimestamp =
134+
session.getServerSessionData().processedTimestamps?.stage0
135+
?.newSessionResponseMessageTimestamp;
136+
137+
if (startTimestamp && endTimestamp) {
138+
const duration = Number(endTimestamp) - Number(startTimestamp);
139+
await this.monitorService.incrementCounter(
140+
"operation_duration",
141+
duration,
142+
attributes,
143+
);
144+
}
145+
124146
return message;
125147
} catch (error) {
126148
this.Log.error(
@@ -131,6 +153,32 @@ export class Stage0SATPHandler implements SATPHandler {
131153
)}`,
132154
);
133155
setError(session, MessageType.NEW_SESSION_RESPONSE, error);
156+
157+
attributes.senderNetworkId =
158+
session?.getServerSessionData().senderAsset?.networkId?.id ||
159+
undefined;
160+
attributes.receiverNetworkId =
161+
session?.getServerSessionData().receiverAsset?.networkId?.id ||
162+
undefined;
163+
attributes.senderGatewayNetworkId =
164+
session?.getClientSessionData().senderGatewayNetworkId || undefined;
165+
attributes.receiverGatewayNetworkId =
166+
session?.getServerSessionData().recipientGatewayNetworkId ||
167+
undefined;
168+
attributes.assetProfileId =
169+
session?.getServerSessionData().assetProfileId || undefined;
170+
attributes.sessionId = session?.getSessionId() || undefined;
171+
attributes.sourceLedgerAssetId =
172+
session?.getClientSessionData().sourceLedgerAssetId || undefined;
173+
attributes.recipientLedgerAssetId =
174+
session?.getServerSessionData().recipientLedgerAssetId || undefined;
175+
attributes.satp_phase = 0;
176+
177+
this.monitorService.incrementCounter(
178+
"failed_transactions",
179+
1,
180+
attributes,
181+
);
134182
return await this.serverService.newSessionErrorResponse(error);
135183
}
136184
} catch (err) {
@@ -151,6 +199,10 @@ export class Stage0SATPHandler implements SATPHandler {
151199
const fnTag = `${this.getHandlerIdentifier()}#${stepTag}`;
152200
const { span, context: ctx } = this.monitorService.startSpan(fnTag);
153201
return context.with(ctx, async () => {
202+
const attributes: Record<
203+
string,
204+
undefined | string | number | boolean | string[] | number[] | boolean[]
205+
> = {};
154206
try {
155207
let session: SATPSession | undefined;
156208
try {
@@ -163,6 +215,8 @@ export class Stage0SATPHandler implements SATPHandler {
163215
throw new SessionNotFoundError(fnTag);
164216
}
165217

218+
span.setAttribute("sessionId", session.getSessionId() || "");
219+
166220
await this.serverService.checkPreSATPTransferRequest(req, session);
167221

168222
saveMessageInSessionData(session.getServerSessionData(), req);
@@ -185,6 +239,25 @@ export class Stage0SATPHandler implements SATPHandler {
185239

186240
saveMessageInSessionData(session.getServerSessionData(), message);
187241

242+
attributes.satp_phase = 0;
243+
attributes.operation = "preSATPTransfer";
244+
245+
const startTimestamp =
246+
session.getServerSessionData().processedTimestamps?.stage0
247+
?.preSatpTransferRequestMessageTimestamp;
248+
const endTimestamp =
249+
session.getServerSessionData().processedTimestamps?.stage0
250+
?.preSatpTransferResponseMessageTimestamp;
251+
252+
if (startTimestamp && endTimestamp) {
253+
const duration = Number(endTimestamp) - Number(startTimestamp);
254+
await this.monitorService.incrementCounter(
255+
"operation_duration",
256+
duration,
257+
attributes,
258+
);
259+
}
260+
188261
return message;
189262
} catch (error) {
190263
this.Log.error(
@@ -195,6 +268,31 @@ export class Stage0SATPHandler implements SATPHandler {
195268
)}`,
196269
);
197270
setError(session, MessageType.PRE_SATP_TRANSFER_RESPONSE, error);
271+
attributes.senderNetworkId =
272+
session?.getServerSessionData().senderAsset?.networkId?.id ||
273+
undefined;
274+
attributes.receiverNetworkId =
275+
session?.getServerSessionData().receiverAsset?.networkId?.id ||
276+
undefined;
277+
attributes.senderGatewayNetworkId =
278+
session?.getClientSessionData().senderGatewayNetworkId || undefined;
279+
attributes.receiverGatewayNetworkId =
280+
session?.getServerSessionData().recipientGatewayNetworkId ||
281+
undefined;
282+
attributes.assetProfileId =
283+
session?.getServerSessionData().assetProfileId || undefined;
284+
attributes.sessionId = session?.getSessionId() || undefined;
285+
attributes.sourceLedgerAssetId =
286+
session?.getClientSessionData().sourceLedgerAssetId || undefined;
287+
attributes.recipientLedgerAssetId =
288+
session?.getServerSessionData().recipientLedgerAssetId || undefined;
289+
attributes.satp_phase = 0;
290+
291+
this.monitorService.incrementCounter(
292+
"failed_transactions",
293+
1,
294+
attributes,
295+
);
198296
return await this.serverService.preSATPTransferErrorResponse(
199297
error,
200298
session,
@@ -255,6 +353,8 @@ export class Stage0SATPHandler implements SATPHandler {
255353
throw new SessionNotFoundError(fnTag);
256354
}
257355

356+
span.setAttribute("sessionId", session.getSessionId() || "");
357+
258358
const message = await this.clientService.newSessionRequest(
259359
session,
260360
this.gatewayId,
@@ -314,6 +414,8 @@ export class Stage0SATPHandler implements SATPHandler {
314414
throw new SessionNotFoundError(fnTag);
315415
}
316416

417+
span.setAttribute("sessionId", session.getSessionId() || "");
418+
317419
const newSession = await this.clientService.checkNewSessionResponse(
318420
response,
319421
session,

0 commit comments

Comments
 (0)