From 6c07442918620f222bb03b156f641b883a479c27 Mon Sep 17 00:00:00 2001 From: Oskar Thoren Date: Mon, 15 Jun 2020 12:06:41 +0800 Subject: [PATCH] Add back metrics and grafana server under insecure flag Update RAEDME --- waku/node/README.md | 6 ++++ waku/node/v2/start_network.nim | 64 +++++++++++++++++++++++++++++++++- waku/node/v2/wakunode.nim | 27 ++++++++------ 3 files changed, 86 insertions(+), 11 deletions(-) diff --git a/waku/node/README.md b/waku/node/README.md index 4d0004606..d752eb10e 100644 --- a/waku/node/README.md +++ b/waku/node/README.md @@ -5,3 +5,9 @@ This folder contains Waku node implementations and simulations. Currently, - v1 contains the implementation according to Waku specification v1. - v2 is experimental development with Waku build on top of libp2p. + +## Run simulation + +To get metrics server, etc. + +`make NIMFLAGS="-d:insecure" wakusim2` diff --git a/waku/node/v2/start_network.nim b/waku/node/v2/start_network.nim index 43588e733..ca9cdf33a 100644 --- a/waku/node/v2/start_network.nim +++ b/waku/node/v2/start_network.nim @@ -1,5 +1,5 @@ import - strformat, os, osproc, net, strformat, chronicles, + strformat, os, osproc, net, confutils, strformat, chronicles, json, libp2p/multiaddress, libp2p/crypto/crypto, libp2p/crypto/secp, @@ -11,6 +11,7 @@ import strutils except fromHex const defaults ="--log-level:TRACE --log-metrics --metrics-server --rpc" wakuNodeBin = "build" / "wakunode" + metricsDir = "metrics" portOffset = 2 type @@ -76,6 +77,61 @@ proc fullMeshNetwork(amount: int): seq[NodeInfo] = staticnodes.add(item.address) result.add(initNodeCmd(portOffset + i, staticnodes, label = "full node")) +proc generatePrometheusConfig(nodes: seq[NodeInfo], outputFile: string) = + var config = """ + global: + scrape_interval: 1s + + scrape_configs: + - job_name: "wakusim" + static_configs:""" + var count = 0 + for node in nodes: + let port = 8008 + node.shift + config &= &""" + + - targets: ['127.0.0.1:{port}'] + labels: + node: '{count}'""" + count += 1 + + var (path, file) = splitPath(outputFile) + createDir(path) + writeFile(outputFile, config) + +proc proccessGrafanaDashboard(nodes: int, inputFile: string, + outputFile: string) = + # from https://github.com/status-im/nim-beacon-chain/blob/master/tests/simulation/process_dashboard.nim + var + inputData = parseFile(inputFile) + panels = inputData["panels"].copy() + numPanels = len(panels) + gridHeight = 0 + outputData = inputData + + for panel in panels: + if panel["gridPos"]["x"].getInt() == 0: + gridHeight += panel["gridPos"]["h"].getInt() + + outputData["panels"] = %* [] + for nodeNum in 0 .. (nodes - 1): + var + nodePanels = panels.copy() + panelIndex = 0 + for panel in nodePanels.mitems: + panel["title"] = %* replace(panel["title"].getStr(), "#0", "#" & $nodeNum) + panel["id"] = %* (panelIndex + (nodeNum * numPanels)) + panel["gridPos"]["y"] = %* (panel["gridPos"]["y"].getInt() + (nodeNum * gridHeight)) + var targets = panel["targets"] + for target in targets.mitems: + target["expr"] = %* replace(target["expr"].getStr(), "{node=\"0\"}", "{node=\"" & $nodeNum & "\"}") + outputData["panels"].add(panel) + panelIndex.inc() + + outputData["uid"] = %* (outputData["uid"].getStr() & "a") + outputData["title"] = %* (outputData["title"].getStr() & " (all nodes)") + writeFile(outputFile, pretty(outputData)) + when isMainModule: # TODO: WakuNetworkConf var nodes: seq[NodeInfo] @@ -119,6 +175,12 @@ when isMainModule: sleepDuration += 1 count += 1 + generatePrometheusConfig(nodes, metricsDir / "prometheus" / "prometheus.yml") + proccessGrafanaDashboard(nodes.len, + metricsDir / "waku-grafana-dashboard.json", + metricsDir / "waku-sim-all-nodes-grafana-dashboard.json") + + let errorCode = execCmd(commandStr) if errorCode != 0: error "launch command failed", command=commandStr diff --git a/waku/node/v2/wakunode.nim b/waku/node/v2/wakunode.nim index ec952afc2..642ec463c 100644 --- a/waku/node/v2/wakunode.nim +++ b/waku/node/v2/wakunode.nim @@ -170,17 +170,24 @@ proc run(config: WakuNodeConf) = # Optionally direct connect with a set of nodes if config.staticnodes.len > 0: connectToNodes(wakuProto, config.staticnodes) - if config.logMetrics: - proc logMetrics(udata: pointer) {.closure, gcsafe.} = - {.gcsafe.}: - let - connectedPeers = connected_peers.value - totalMessages = total_messages.value - # NOTE: Just message volume for now, no valid/invalid envelopes - info "Node metrics", connectedPeers, totalMessages - # FIXME Warning: Use setTimer/clearTimer instead; addTimer is deprecated [Deprecated] + when defined(insecure): + if config.metricsServer: + let + address = config.metricsServerAddress + port = config.metricsServerPort + config.portsShift + info "Starting metrics HTTP server", address, port + metrics.startHttpServer($address, Port(port)) + + if config.logMetrics: + proc logMetrics(udata: pointer) {.closure, gcsafe.} = + {.gcsafe.}: + let + connectedPeers = connected_peers.value + totalMessages = total_messages.value + + info "Node metrics", connectedPeers, totalMessages + addTimer(Moment.fromNow(2.seconds), logMetrics) addTimer(Moment.fromNow(2.seconds), logMetrics) - addTimer(Moment.fromNow(2.seconds), logMetrics) runForever()