trustless-generic-relayer/ethereum/ts-scripts/mockIntegration/loadGeneration.ts

111 lines
3.2 KiB
TypeScript

import { ChainInfo, init, loadChains } from "../helpers/env"
import { sendMessage, sleep } from "./messageUtils"
import { Counter, register } from "prom-client"
import Koa from "koa"
import Router from "koa-router"
const promPort = 3000
init()
const chains = loadChains()
export const undeliveredMessages = new Counter({
name: "undelivered_messages",
help: "Counter for number of messages that were not delivered",
labelNames: ["sourceChain", "targetChain"],
})
export const deliveredMessages = new Counter({
name: "delivered_messages",
help: "Counter for number of messages that were successfully delivered",
labelNames: ["sourceChain", "targetChain"],
})
async function run() {
const chainIntervalIdx = process.argv.findIndex((arg) => arg === "--chainInterval")
const salvoIntervalIdx = process.argv.findIndex((arg) => arg === "--salvoInterval")
const chainInterval =
chainIntervalIdx !== -1 ? Number(process.argv[chainIntervalIdx + 1]) : 5_000
const salvoInterval =
salvoIntervalIdx !== -1 ? Number(process.argv[salvoIntervalIdx + 1]) : 60_000
console.log(`chainInterval: ${chainInterval}`)
console.log(`salvoInterval: ${salvoInterval}`)
if (process.argv.find((arg) => arg === "--per-chain")) {
await perChain(chainInterval, salvoInterval)
} else {
await matrix(chainInterval, salvoInterval)
}
}
async function perChain(chainIntervalMS: number, salvoIntervalMS: number) {
console.log(`Sending test messages to and from each chain...`)
for (let salvo = 0; true; salvo++) {
console.log("")
console.log(`Sending salvo ${salvo}`)
for (let i = 0; i < chains.length; ++i) {
const j = i === 0 ? chains.length - 1 : 0
await sendMessageAndReportMetric(chains[i], chains[j], chainIntervalMS)
}
await sleep(salvoIntervalMS)
}
}
async function matrix(chainIntervalMS: number, salvoIntervalMS: number) {
console.log(`Sending test messages to and from every combination of chains...`)
for (let salvo = 0; true; salvo++) {
console.log("")
console.log(`Sending salvo ${salvo}`)
for (let i = 0; i < chains.length; ++i) {
for (let j = 0; i < chains.length; ++i) {
await sendMessageAndReportMetric(chains[i], chains[j], chainIntervalMS)
}
}
await sleep(salvoIntervalMS)
}
}
async function sendMessageAndReportMetric(
sourceChain: ChainInfo,
targetChain: ChainInfo,
chainInterval: number
) {
try {
const notFound = await sendMessage(sourceChain, targetChain, false, true)
const counter = notFound ? undeliveredMessages : deliveredMessages
counter
.labels({
sourceChain: sourceChain.chainId,
targetChain: targetChain.chainId,
})
.inc()
} catch (e) {
console.error(e)
}
await sleep(chainInterval)
}
async function launchMetricsServer() {
const app = new Koa()
const router = new Router()
router.get("/metrics", async (ctx, next) => {
let metrics = await register.metrics()
ctx.body = metrics
})
app.use(router.allowedMethods())
app.use(router.routes())
app.listen(promPort, () =>
console.log(`Prometheus metrics running on port ${promPort}`)
)
}
console.log("Start!")
run().then(() => console.log("Done!"))