From 36cac06a8932499bad8b88c1a0f99c9ffdce9c77 Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Thu, 28 Feb 2019 14:11:21 +0100 Subject: [PATCH 1/7] Cleanup directory constants for monitor --- .../src/main/java/bisq/monitor/metric/P2PNetworkLoad.java | 2 +- .../src/main/java/bisq/monitor/metric/P2PRoundTripTime.java | 2 +- .../main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java | 2 +- .../bisq/monitor/metric/TorHiddenServiceStartupTime.java | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java index 054def146c2..66f71a299f0 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java @@ -76,7 +76,7 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList private static final String MAX_CONNECTIONS = "run.maxConnections"; private static final String HISTORY_SIZE = "run.historySize"; private NetworkNode networkNode; - private final File torHiddenServiceDir = new File("monitor/work/metric_p2pNetworkLoad"); + private final File torHiddenServiceDir = new File("metric_" + getName()); private final ThreadGate hsReady = new ThreadGate(); private final Map buckets = new ConcurrentHashMap<>(); diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java b/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java index 7faf8d88338..0cd7ff75951 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java @@ -61,7 +61,7 @@ public class P2PRoundTripTime extends Metric implements MessageListener, SetupLi private static final String HOSTS = "run.hosts"; private static final String TOR_PROXY_PORT = "run.torProxyPort"; private NetworkNode networkNode; - private final File torHiddenServiceDir = new File("monitor/work/metric_p2pRoundTripTime"); + private final File torHiddenServiceDir = new File("metric_" + getName()); private int nonce; private long start; private List samples; diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java index 657a57841c7..900f7bc471e 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java @@ -82,7 +82,7 @@ public class P2PSeedNodeSnapshot extends Metric implements MessageListener, Setu private static final String TOR_PROXY_PORT = "run.torProxyPort"; Statistics statistics; private NetworkNode networkNode; - private final File torHiddenServiceDir = new File("monitor/work/metric_" + this.getClass().getSimpleName()); + private final File torHiddenServiceDir = new File("metric_" + getName()); private int nonce; final Map bucketsPerHost = new ConcurrentHashMap<>(); private final Set hashes = new TreeSet<>(Arrays::compare); diff --git a/monitor/src/main/java/bisq/monitor/metric/TorHiddenServiceStartupTime.java b/monitor/src/main/java/bisq/monitor/metric/TorHiddenServiceStartupTime.java index 1c8600db911..21be8526eff 100644 --- a/monitor/src/main/java/bisq/monitor/metric/TorHiddenServiceStartupTime.java +++ b/monitor/src/main/java/bisq/monitor/metric/TorHiddenServiceStartupTime.java @@ -18,6 +18,7 @@ package bisq.monitor.metric; import bisq.monitor.Metric; +import bisq.monitor.Monitor; import bisq.monitor.Reporter; import bisq.monitor.ThreadGate; @@ -38,7 +39,7 @@ public class TorHiddenServiceStartupTime extends Metric { private static final String SERVICE_PORT = "run.servicePort"; private static final String LOCAL_PORT = "run.localPort"; - private final String hiddenServiceDirectory = "monitor/work/metric_" + getName(); + private final String hiddenServiceDirectory = "metric_" + getName(); private final ThreadGate gate = new ThreadGate(); public TorHiddenServiceStartupTime(Reporter reporter) { @@ -53,7 +54,7 @@ protected void execute() { int servicePort = Integer.parseInt(configuration.getProperty(SERVICE_PORT, "9999")); // clear directory so we get a new onion address every time - new File(hiddenServiceDirectory).delete(); + new File(Monitor.TOR_WORKING_DIR + "/" + hiddenServiceDirectory).delete(); log.debug("creating the hidden service"); From 6c376778a22d04cca84af5a13906f567debbeb66 Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Thu, 28 Feb 2019 14:56:00 +0100 Subject: [PATCH 2/7] Updated monitor systemd service file --- monitor/bisq-monitor.service | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/monitor/bisq-monitor.service b/monitor/bisq-monitor.service index edd698a613a..892c69ae53b 100644 --- a/monitor/bisq-monitor.service +++ b/monitor/bisq-monitor.service @@ -3,10 +3,14 @@ Description=Bisq network monitor After=network.target [Service] -Type=exec +WorkingDirectory=~ Environment="JAVA_OPTS='-Xmx500M'" ExecStart=/home/bisq/bisq/bisq-monitor /home/bisq/monitor.properties ExecReload=/bin/kill -USR1 $MAINPID +Restart=on-failure + +User=bisq +Group=bisq [Install] WantedBy=multi-user.target From 9f464b3d506693c45ef733e7152a0c0ebf8a92ae Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Sun, 3 Mar 2019 10:47:17 +0100 Subject: [PATCH 3/7] Remove HS from Snapshot Metrics --- .../monitor/metric/P2PSeedNodeSnapshot.java | 42 ++++--------------- .../network/p2p/network/TorNetworkNode.java | 3 +- 2 files changed, 8 insertions(+), 37 deletions(-) diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java index 900f7bc471e..d921300025e 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java @@ -32,7 +32,6 @@ import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.MessageListener; import bisq.network.p2p.network.NetworkNode; -import bisq.network.p2p.network.SetupListener; import bisq.network.p2p.network.TorNetworkNode; import bisq.network.p2p.peers.getdata.messages.GetDataResponse; import bisq.network.p2p.peers.getdata.messages.PreliminaryGetDataRequest; @@ -76,7 +75,7 @@ * */ @Slf4j -public class P2PSeedNodeSnapshot extends Metric implements MessageListener, SetupListener { +public class P2PSeedNodeSnapshot extends Metric implements MessageListener { private static final String HOSTS = "run.hosts"; private static final String TOR_PROXY_PORT = "run.torProxyPort"; @@ -86,7 +85,6 @@ public class P2PSeedNodeSnapshot extends Metric implements MessageListener, Setu private int nonce; final Map bucketsPerHost = new ConcurrentHashMap<>(); private final Set hashes = new TreeSet<>(Arrays::compare); - private final ThreadGate hsReady = new ThreadGate(); private final ThreadGate gate = new ThreadGate(); /** @@ -161,20 +159,12 @@ public P2PSeedNodeSnapshot(Reporter reporter) { @Override protected void execute() { - // in case we do not have a NetworkNode up and running, we create one - if (null == networkNode) { - // prepare the gate - hsReady.engage(); - - // start the network node - networkNode = new TorNetworkNode(Integer.parseInt(configuration.getProperty(TOR_PROXY_PORT, "9054")), - new CoreNetworkProtoResolver(), false, - new AvailableTor(Monitor.TOR_WORKING_DIR, torHiddenServiceDir.getName())); - networkNode.start(this); - - // wait for the HS to be published - hsReady.await(); - } + // start the network node + networkNode = new TorNetworkNode(Integer.parseInt(configuration.getProperty(TOR_PROXY_PORT, "9054")), + new CoreNetworkProtoResolver(), false, + new AvailableTor(Monitor.TOR_WORKING_DIR, torHiddenServiceDir.getName())); + // we do not need to start the networkNode, as we do not need the HS + //networkNode.start(this); // clear our buckets bucketsPerHost.clear(); @@ -321,22 +311,4 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { networkEnvelope.getClass().getSimpleName()); } } - - @Override - public void onTorNodeReady() { - } - - @Override - public void onHiddenServicePublished() { - // open the gate - hsReady.proceed(); - } - - @Override - public void onSetupFailed(Throwable throwable) { - } - - @Override - public void onRequestCustomBridges() { - } } diff --git a/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java b/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java index c79b81c7477..1ae189f8279 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java +++ b/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java @@ -92,6 +92,7 @@ public TorNetworkNode(int servicePort, NetworkProtoResolver networkProtoResolver super(servicePort, networkProtoResolver); this.torMode = torMode; this.streamIsolation = useStreamIsolation; + createExecutorService(); } @@ -106,8 +107,6 @@ public void start(@Nullable SetupListener setupListener) { if (setupListener != null) addSetupListener(setupListener); - createExecutorService(); - // Create the tor node (takes about 6 sec.) createTorAndHiddenService(Utils.findFreeSystemPort(), servicePort); } From 1c4535eab8609926c6652062e7c89d64afe31a36 Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Sun, 3 Mar 2019 10:52:58 +0100 Subject: [PATCH 4/7] Cosmetics --- .../bisq/monitor/metric/P2PSeedNodeSnapshot.java | 12 +++--------- .../java/bisq/monitor/reporter/ConsoleReporter.java | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java index d921300025e..f98bebeb0fd 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java @@ -47,8 +47,6 @@ import java.net.MalformedURLException; -import java.io.File; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -80,9 +78,6 @@ public class P2PSeedNodeSnapshot extends Metric implements MessageListener { private static final String HOSTS = "run.hosts"; private static final String TOR_PROXY_PORT = "run.torProxyPort"; Statistics statistics; - private NetworkNode networkNode; - private final File torHiddenServiceDir = new File("metric_" + getName()); - private int nonce; final Map bucketsPerHost = new ConcurrentHashMap<>(); private final Set hashes = new TreeSet<>(Arrays::compare); private final ThreadGate gate = new ThreadGate(); @@ -160,9 +155,9 @@ public P2PSeedNodeSnapshot(Reporter reporter) { @Override protected void execute() { // start the network node - networkNode = new TorNetworkNode(Integer.parseInt(configuration.getProperty(TOR_PROXY_PORT, "9054")), + final NetworkNode networkNode = new TorNetworkNode(Integer.parseInt(configuration.getProperty(TOR_PROXY_PORT, "9054")), new CoreNetworkProtoResolver(), false, - new AvailableTor(Monitor.TOR_WORKING_DIR, torHiddenServiceDir.getName())); + new AvailableTor(Monitor.TOR_WORKING_DIR, "unused")); // we do not need to start the networkNode, as we do not need the HS //networkNode.start(this); @@ -179,9 +174,8 @@ protected void execute() { NodeAddress target = OnionParser.getNodeAddress(current); // do the data request - nonce = new Random().nextInt(); SettableFuture future = networkNode.sendMessage(target, - new PreliminaryGetDataRequest(nonce, hashes)); + new PreliminaryGetDataRequest(new Random().nextInt(), hashes)); Futures.addCallback(future, new FutureCallback<>() { @Override diff --git a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java index bd6564cf8f5..8d380f1cc90 100644 --- a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java +++ b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java @@ -56,7 +56,7 @@ public void report(Map values, String prefix) { String report = "bisq" + (Version.getBaseCurrencyNetwork() != 0 ? "-" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].getNetwork() : "") + (prefix.isEmpty() ? "" : "." + prefix) + (key.isEmpty() ? "" : "." + key) - + " " + value + " " + timestamp + "\n"; + + " " + value + " " + timestamp; System.err.println("Report: " + report); }); } From dbca87be65aaeedf1b97ca7ad1622f19078d6344 Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Mon, 4 Mar 2019 11:56:09 +0100 Subject: [PATCH 5/7] Added Market metric i.e. trades and their volumes --- monitor/README.md | 4 + .../src/main/java/bisq/monitor/Monitor.java | 2 + .../src/main/java/bisq/monitor/Reporter.java | 12 +- .../java/bisq/monitor/metric/MarketStats.java | 116 ++++++++++++++++++ .../monitor/reporter/ConsoleReporter.java | 17 +-- .../monitor/reporter/GraphiteReporter.java | 59 +++++---- monitor/src/main/resources/metrics.properties | 4 + .../bisq/monitor/PriceNodeStatsTests.java | 5 + .../TorHiddenServiceStartupTimeTests.java | 5 + .../bisq/monitor/TorRoundTripTimeTests.java | 5 + .../bisq/monitor/TorStartupTimeTests.java | 5 + 11 files changed, 199 insertions(+), 35 deletions(-) create mode 100644 monitor/src/main/java/bisq/monitor/metric/MarketStats.java diff --git a/monitor/README.md b/monitor/README.md index bdd507efb21..98ade99b810 100644 --- a/monitor/README.md +++ b/monitor/README.md @@ -93,6 +93,10 @@ PriceNodeStats.enabled=true PriceNodeStats.run.interval=42 PriceNodeStats.run.hosts=http://5bmpx76qllutpcyp.onion, http://xc3nh4juf2hshy7e.onion, http://44mgyoe2b6oqiytt.onion, http://62nvujg5iou3vu3i.onion, http://ceaanhbvluug4we6.onion +#MarketStats Metric +MarketStats.enabled=true +MarketStats.run.interval=191 + ## Reporters are configured via a set of properties as well. ## ## In contrast to Metrics, Reporters do not have a minimal set of properties. diff --git a/monitor/src/main/java/bisq/monitor/Monitor.java b/monitor/src/main/java/bisq/monitor/Monitor.java index 371e1ae02e3..162a5e05952 100644 --- a/monitor/src/main/java/bisq/monitor/Monitor.java +++ b/monitor/src/main/java/bisq/monitor/Monitor.java @@ -17,6 +17,7 @@ package bisq.monitor; +import bisq.monitor.metric.MarketStats; import bisq.monitor.metric.P2PMarketStats; import bisq.monitor.metric.P2PNetworkLoad; import bisq.monitor.metric.P2PSeedNodeSnapshot; @@ -95,6 +96,7 @@ private void start() throws Throwable { metrics.add(new P2PSeedNodeSnapshot(graphiteReporter)); metrics.add(new P2PMarketStats(graphiteReporter)); metrics.add(new PriceNodeStats(graphiteReporter)); + metrics.add(new MarketStats(graphiteReporter)); // prepare configuration reload // Note that this is most likely only work on Linux diff --git a/monitor/src/main/java/bisq/monitor/Reporter.java b/monitor/src/main/java/bisq/monitor/Reporter.java index a26552b4493..5c0202e7f38 100644 --- a/monitor/src/main/java/bisq/monitor/Reporter.java +++ b/monitor/src/main/java/bisq/monitor/Reporter.java @@ -57,8 +57,18 @@ protected Reporter() { * Report our findings. * * @param values Map - * @param prefix for example "bisq.torStartupTime" + * @param prefix for example "torStartupTime" */ public abstract void report(Map values, String prefix); + /** + * Report our findings one by one. + * + * @param key the metric name + * @param value the value to report + * @param timestamp a unix timestamp in milliseconds + * @param prefix for example "torStartupTime" + */ + public abstract void report(String key, String value, String timestamp, String prefix); + } diff --git a/monitor/src/main/java/bisq/monitor/metric/MarketStats.java b/monitor/src/main/java/bisq/monitor/metric/MarketStats.java new file mode 100644 index 00000000000..acee92f92fd --- /dev/null +++ b/monitor/src/main/java/bisq/monitor/metric/MarketStats.java @@ -0,0 +1,116 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.monitor.metric; + +import bisq.monitor.Metric; +import bisq.monitor.Reporter; + +import bisq.asset.Asset; +import bisq.asset.AssetRegistry; + +import bisq.network.p2p.storage.payload.ProtectedStoragePayload; + +import org.berndpruenster.netlayer.tor.TorCtlException; + +import com.runjva.sourceforge.jsocks.protocol.SocksSocket; + +import java.net.HttpURLConnection; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import lombok.extern.slf4j.Slf4j; + +/** + * Uses the markets API to retrieve market volume data. + * + * @author Florian Reimair + * + */ +@Slf4j +public class MarketStats extends Metric { + + // poor mans JSON parser + private final Pattern marketPattern = Pattern.compile("\"market\" ?: ?\"([a-z_]+)\""); + private final Pattern amountPattern = Pattern.compile("\"amount\" ?: ?\"([\\d\\.]+)\""); + private final Pattern volumePattern = Pattern.compile("\"volume\" ?: ?\"([\\d\\.]+)\""); + private final Pattern timestampPattern = Pattern.compile("\"trade_date\" ?: ?([\\d]+)"); + + private final String marketApi = "https://markets.bisq.network"; + private Long lastRun = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(15)); + + public MarketStats(Reporter reporter) { + super(reporter); + } + + @Override + protected void execute() { + try { + // for each configured host + Map result = new HashMap<>(); + + // assemble query + Long now = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()); + String query = "/api/trades?format=json&market=all×tamp_from=" + lastRun + "×tamp_to=" + now; + lastRun = now; // thought about adding 1 second but what if a trade is done exactly in this one second? + + // connect + URLConnection connection = new URL(marketApi + query).openConnection(); + + // prepare to receive data + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + + String all = in.readLine(); + in.close(); + + Arrays.stream(all.substring(0, all.length() - 2).split("}")).forEach(trade -> { + Matcher market = marketPattern.matcher(trade); + Matcher amount = amountPattern.matcher(trade); + Matcher timestamp = timestampPattern.matcher(trade); + market.find(); + if (market.group(1).endsWith("btc")) { + amount = volumePattern.matcher(trade); + } + amount.find(); + timestamp.find(); + System.err.println(getName() + ".volume." + market.group(1) + " " + amount.group(1) + " " + timestamp.group(1).substring(0, timestamp.group(1).length() - 3)); + reporter.report("volume." + market.group(1), amount.group(1), timestamp.group(1), getName()); + }); + } catch (IllegalStateException ignore) { + // no match found + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java index 8d380f1cc90..e3d666dbf21 100644 --- a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java +++ b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java @@ -50,17 +50,20 @@ public void report(long value) { @Override public void report(Map values, String prefix) { - long timestamp = System.currentTimeMillis(); + String timestamp = String.valueOf(System.currentTimeMillis()); values.forEach((key, value) -> { - // https://graphite.readthedocs.io/en/latest/feeding-carbon.html - String report = "bisq" + (Version.getBaseCurrencyNetwork() != 0 ? "-" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].getNetwork() : "") - + (prefix.isEmpty() ? "" : "." + prefix) - + (key.isEmpty() ? "" : "." + key) - + " " + value + " " + timestamp; - System.err.println("Report: " + report); + report(key, value, timestamp, prefix); }); } + @Override + public void report(String key, String value, String timestamp, String prefix) { + System.err.println("Report: bisq" + (Version.getBaseCurrencyNetwork() != 0 ? "-" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].getNetwork() : "") + + (prefix.isEmpty() ? "" : "." + prefix) + + (key.isEmpty() ? "" : "." + key) + + " " + value + " " + timestamp); + } + @Override public void report(Map values) { report(values, ""); diff --git a/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java b/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java index 48d10a2c5f3..8a9a55d9b54 100644 --- a/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java +++ b/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java @@ -55,42 +55,47 @@ public void report(long value) { @Override public void report(Map values, String prefix) { - long timestamp = System.currentTimeMillis() / 1000; + String timestamp = String.valueOf(System.currentTimeMillis()); values.forEach((key, value) -> { - // https://graphite.readthedocs.io/en/latest/feeding-carbon.html - String report = "bisq" + (Version.getBaseCurrencyNetwork() != 0 ? "-" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].getNetwork() : "") - + (prefix.isEmpty() ? "" : "." + prefix) - + (key.isEmpty() ? "" : "." + key) - + " " + value + " " + timestamp + "\n"; + report(key, value, timestamp, prefix); try { - NodeAddress nodeAddress = OnionParser.getNodeAddress(configuration.getProperty("serviceUrl")); - Socket socket; - if (nodeAddress.getFullAddress().contains(".onion")) - socket = new TorSocket(nodeAddress.getHostName(), nodeAddress.getPort()); - else - socket = new Socket(nodeAddress.getHostName(), nodeAddress.getPort()); - - socket.getOutputStream().write(report.getBytes()); - socket.close(); - - try { - // give Tor some slack - // TODO maybe use the pickle protocol? - // https://graphite.readthedocs.io/en/latest/feeding-carbon.html - Thread.sleep(100); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } catch (IOException e) { + // give Tor some slack + // TODO maybe use the pickle protocol? + // https://graphite.readthedocs.io/en/latest/feeding-carbon.html + Thread.sleep(100); + } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } - }); } + @Override + public void report(String key, String value, String timeInMilliseconds, String prefix) { + // https://graphite.readthedocs.io/en/latest/feeding-carbon.html + String report = "bisq" + (Version.getBaseCurrencyNetwork() != 0 ? "-" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].getNetwork() : "") + + (prefix.isEmpty() ? "" : "." + prefix) + + (key.isEmpty() ? "" : "." + key) + + " " + value + " " + Long.valueOf(timeInMilliseconds)/1000 + "\n"; + + try { + NodeAddress nodeAddress = OnionParser.getNodeAddress(configuration.getProperty("serviceUrl")); + Socket socket; + if (nodeAddress.getFullAddress().contains(".onion")) + socket = new TorSocket(nodeAddress.getHostName(), nodeAddress.getPort()); + else + socket = new Socket(nodeAddress.getHostName(), nodeAddress.getPort()); + + socket.getOutputStream().write(report.getBytes()); + socket.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + @Override public void report(Map values) { report(values, ""); diff --git a/monitor/src/main/resources/metrics.properties b/monitor/src/main/resources/metrics.properties index 01b40bbdb3e..436d04cef4c 100644 --- a/monitor/src/main/resources/metrics.properties +++ b/monitor/src/main/resources/metrics.properties @@ -62,6 +62,10 @@ PriceNodeStats.enabled=true PriceNodeStats.run.interval=42 PriceNodeStats.run.hosts=http://5bmpx76qllutpcyp.onion, http://xc3nh4juf2hshy7e.onion, http://44mgyoe2b6oqiytt.onion, http://62nvujg5iou3vu3i.onion, http://ceaanhbvluug4we6.onion +#MarketStats Metric +MarketStats.enabled=true +MarketStats.run.interval=191 + #Another Metric Another.run.interval=5 diff --git a/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java b/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java index a30cd840d68..1024f5c9a0f 100644 --- a/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java +++ b/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java @@ -71,6 +71,11 @@ public void report(Map values, String prefix) { report(values); } + @Override + public void report(String key, String value, String timestamp, String prefix) { + + } + @Override public void report(long value, String prefix) { report(value); diff --git a/monitor/src/test/java/bisq/monitor/TorHiddenServiceStartupTimeTests.java b/monitor/src/test/java/bisq/monitor/TorHiddenServiceStartupTimeTests.java index 74648f5696a..d517bcd5659 100644 --- a/monitor/src/test/java/bisq/monitor/TorHiddenServiceStartupTimeTests.java +++ b/monitor/src/test/java/bisq/monitor/TorHiddenServiceStartupTimeTests.java @@ -67,6 +67,11 @@ public void report(Map values, String prefix) { report(values); } + @Override + public void report(String key, String value, String timestamp, String prefix) { + + } + @Override public void report(long value, String prefix) { report(value); diff --git a/monitor/src/test/java/bisq/monitor/TorRoundTripTimeTests.java b/monitor/src/test/java/bisq/monitor/TorRoundTripTimeTests.java index 6380749a151..b2091806a48 100644 --- a/monitor/src/test/java/bisq/monitor/TorRoundTripTimeTests.java +++ b/monitor/src/test/java/bisq/monitor/TorRoundTripTimeTests.java @@ -71,6 +71,11 @@ public void report(Map values, String prefix) { report(values); } + @Override + public void report(String key, String value, String timestamp, String prefix) { + + } + @Override public void report(long value, String prefix) { report(value); diff --git a/monitor/src/test/java/bisq/monitor/TorStartupTimeTests.java b/monitor/src/test/java/bisq/monitor/TorStartupTimeTests.java index 4918a8c8132..e72325c847a 100644 --- a/monitor/src/test/java/bisq/monitor/TorStartupTimeTests.java +++ b/monitor/src/test/java/bisq/monitor/TorStartupTimeTests.java @@ -55,6 +55,11 @@ public void report(Map values, String prefix) { report(values); } + @Override + public void report(String key, String value, String timestamp, String prefix) { + + } + @Override public void report(long value, String prefix) { report(value); From 004634ed2342b6a0cdb2242830daddd4327fe9c5 Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Tue, 5 Mar 2019 17:55:45 +0100 Subject: [PATCH 6/7] Cleanup monitor gradle --- build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.gradle b/build.gradle index b1914ab7a9d..450836c2d60 100644 --- a/build.gradle +++ b/build.gradle @@ -334,7 +334,6 @@ configure(project(':monitor')) { } dependencies { - compile project(':p2p') compile project(':core') compile "org.slf4j:slf4j-api:$slf4jVersion" compile "ch.qos.logback:logback-core:$logbackVersion" @@ -344,10 +343,6 @@ configure(project(':monitor')) { compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" - compile('com.github.JesusMcCloud.netlayer:tor.native:0.6.2') { - exclude(module: 'slf4j-api') - } - testCompile 'org.junit.jupiter:junit-jupiter-api:5.3.2' testCompile 'org.junit.jupiter:junit-jupiter-params:5.3.2' testCompileOnly "org.projectlombok:lombok:$lombokVersion" From 35914b868289e09b703ffd5be5a65509c8092695 Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Tue, 5 Mar 2019 18:07:53 +0100 Subject: [PATCH 7/7] Fix sign error in Seed node snapshot diffs --- .../src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java index f98bebeb0fd..c213dd86f90 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java @@ -237,7 +237,7 @@ void report() { statistics.values().forEach((messageType, count) -> { try { report.put(OnionParser.prettyPrint(host) + ".relativeNumberOfMessages." + messageType, - String.valueOf(referenceValues.get(messageType).value() - ((Counter) count).value())); + String.valueOf(((Counter) count).value() - referenceValues.get(messageType).value())); } catch (MalformedURLException ignore) { log.error("we should never got here"); }