From bd5b3dfd4af4294b17017a13d65ccb8c31e2140b Mon Sep 17 00:00:00 2001 From: Wei Deng Date: Fri, 1 May 2020 11:43:36 -0600 Subject: [PATCH] fixed a number of bugs with docker-metrics on Mac, including file system permissions, and error handling logic when prom/grafana config files are wiped out unexpectedly --- .../java/io/nosqlbench/engine/cli/NBCLI.java | 8 ++--- .../engine/docker/DockerHelper.java | 6 +++- .../engine/docker/DockerMetricsManager.java | 35 +++++++++++++++++-- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java index fab1b332f..26e027f62 100644 --- a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java +++ b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java @@ -186,11 +186,9 @@ public class NBCLI { logger.info("Docker metrics is enabled. Docker must be installed for this to work"); DockerMetricsManager dmh = new DockerMetricsManager(); dmh.startMetrics(); - String info = "Docker Containers are started, for grafana and prometheus, hit" + - "these urls in your browser: http://:3000 and http://:9090" + - "the default grafana creds are admin/admin"; - logger.info(info); - System.out.println(info); + String warn = "Docker Containers are started, for grafana and prometheus, hit" + + "these urls in your browser: http://:3000 and http://:9090"; + logger.warn(warn); if (reportGraphiteTo != null) { logger.warn(String.format("Docker metrics are enabled (--docker-metrics)" + " but graphite reporting (--report-graphite-to) is set to %s \n" + diff --git a/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerHelper.java b/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerHelper.java index 98e261147..187ead0fc 100644 --- a/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerHelper.java +++ b/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerHelper.java @@ -213,7 +213,11 @@ public class DockerHelper { logger.info(String.format("Hupping config")); if (reload != null) { - post(reload, null, false, "reloading config"); + try { + post(reload, null, false, "reloading config"); + } catch (Exception e) { + logger.error(String.format("Unexpected config/state for docker container %s, consider removing the container", name)); + } } return runningContainers.get(0); diff --git a/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerMetricsManager.java b/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerMetricsManager.java index a81c61add..c7409898e 100644 --- a/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerMetricsManager.java +++ b/engine-docker/src/main/java/io/nosqlbench/engine/docker/DockerMetricsManager.java @@ -54,7 +54,10 @@ public class DockerMetricsManager { String name = "grafana"; List port = Arrays.asList(3000); - setupGrafanaFiles(ip); + boolean grafanaFilesExist = grafanaFilesExist(); + if (!grafanaFilesExist) { + setupGrafanaFiles(ip); + } List volumeDescList = Arrays.asList( userHome + "/.nosqlbench/grafana:/var/lib/grafana:rw" @@ -80,7 +83,9 @@ public class DockerMetricsManager { logger.info("grafana container started, http listening"); - configureGrafana(); + if (!grafanaFilesExist) { + configureGrafana(); + } } private void startPrometheus(String ip) { @@ -91,7 +96,9 @@ public class DockerMetricsManager { String name = "prom"; List port = Arrays.asList(9090); - setupPromFiles(ip); + if (!promFilesExist()) { + setupPromFiles(ip); + } List volumeDescList = Arrays.asList( //cwd+"/docker-metrics/prometheus:/prometheus", @@ -170,6 +177,9 @@ public class DockerMetricsManager { "/prometheus"); Set perms = new HashSet<>(); + perms.add(PosixFilePermission.OWNER_READ); + perms.add(PosixFilePermission.OWNER_WRITE); + perms.add(PosixFilePermission.OWNER_EXECUTE); perms.add(PosixFilePermission.OTHERS_READ); perms.add(PosixFilePermission.OTHERS_WRITE); perms.add(PosixFilePermission.OTHERS_EXECUTE); @@ -215,6 +225,24 @@ public class DockerMetricsManager { } } + private boolean grafanaFilesExist() { + File nosqlbenchDir = new File(userHome, "/.nosqlbench/"); + boolean exists = nosqlbenchDir.exists(); + if (exists) { + File grafana = new File(userHome, "/.nosqlbench/grafana"); + exists = grafana.exists(); + } + return exists; + } + private boolean promFilesExist() { + File nosqlbenchDir = new File(userHome, "/.nosqlbench/"); + boolean exists = nosqlbenchDir.exists(); + if (exists) { + File prom = new File(userHome, "/.nosqlbench/grafana"); + exists = prom.exists(); + } + return exists; + } private void setupGrafanaFiles(String ip) { @@ -243,6 +271,7 @@ public class DockerMetricsManager { private void configureGrafana() { post("http://localhost:3000/api/dashboards/db", "docker/dashboards/analysis.json", true, "load analysis dashboard"); post("http://localhost:3000/api/datasources", "docker/datasources/prometheus-datasource.yaml", true, "configure data source"); + logger.warn("default grafana creds are admin/admin"); }