111 lines
3.2 KiB
TypeScript
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!"))
|