* [bug#46435] [PATCH] gnu: Add netdata.
@ 2021-02-11 8:09 Léo Le Bouter via Guix-patches via
2021-02-11 8:14 ` Léo Le Bouter via Guix-patches via
0 siblings, 1 reply; 2+ messages in thread
From: Léo Le Bouter via Guix-patches via @ 2021-02-11 8:09 UTC (permalink / raw)
To: 46435; +Cc: Léo Le Bouter
* gnu/packages/monitoring.scm (netdata): New variable.
* gnu/packages/patches/netdata-0001-use-system-python.patch,
gnu/packages/patches/netdata-0002-use-system-exim4.patch,
gnu/packages/patches/netdata-0003-use-python3.patch,
gnu/packages/patches/netdata-0004-use-sh.patch,
gnu/packages/patches/netdata-0005-use-bash.patch,
gnu/packages/patches/netdata-no-files-in-etc-and-var.patch,
gnu/packages/patches/netdata-web-remove-antifeatures-spyware.patch: New
patches.
* gnu/local.mk (dist_patch_DATA): Register them.
---
gnu/local.mk | 7 +
gnu/packages/monitoring.scm | 106 +
.../netdata-0001-use-system-python.patch | 131 +
.../netdata-0002-use-system-exim4.patch | 12 +
.../patches/netdata-0003-use-python3.patch | 29 +
.../patches/netdata-0004-use-sh.patch | 12 +
.../patches/netdata-0005-use-bash.patch | 13 +
.../netdata-no-files-in-etc-and-var.patch | 129 +
...data-web-remove-antifeatures-spyware.patch | 4466 +++++++++++++++++
9 files changed, 4905 insertions(+)
create mode 100644 gnu/packages/patches/netdata-0001-use-system-python.patch
create mode 100644 gnu/packages/patches/netdata-0002-use-system-exim4.patch
create mode 100644 gnu/packages/patches/netdata-0003-use-python3.patch
create mode 100644 gnu/packages/patches/netdata-0004-use-sh.patch
create mode 100644 gnu/packages/patches/netdata-0005-use-bash.patch
create mode 100644 gnu/packages/patches/netdata-no-files-in-etc-and-var.patch
create mode 100644 gnu/packages/patches/netdata-web-remove-antifeatures-spyware.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index 8a31bfef64..8d1e6a6fa5 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1388,6 +1388,13 @@ dist_patch_DATA = \
%D%/packages/patches/m4-gnulib-libio.patch \
%D%/packages/patches/ncompress-fix-softlinks.patch \
%D%/packages/patches/netcdf-date-time.patch \
+ %D%/packages/patches/netdata-0001-use-system-python.patch \
+ %D%/packages/patches/netdata-0002-use-system-exim4.patch \
+ %D%/packages/patches/netdata-0003-use-python3.patch \
+ %D%/packages/patches/netdata-0004-use-sh.patch \
+ %D%/packages/patches/netdata-0005-use-bash.patch \
+ %D%/packages/patches/netdata-no-files-in-etc-and-var.patch \
+ %D%/packages/patches/netdata-web-remove-antifeatures-spyware.patch
%D%/packages/patches/netpbm-CVE-2017-2586.patch \
%D%/packages/patches/netpbm-CVE-2017-2587.patch \
%D%/packages/patches/netsurf-message-timestamp.patch \
diff --git a/gnu/packages/monitoring.scm b/gnu/packages/monitoring.scm
index 75a422921c..b0673c8321 100644
--- a/gnu/packages/monitoring.scm
+++ b/gnu/packages/monitoring.scm
@@ -41,24 +41,31 @@
#:use-module (gnu packages curl)
#:use-module (gnu packages check)
#:use-module (gnu packages compression)
+ #:use-module (gnu packages cups)
#:use-module (gnu packages databases)
+ #:use-module (gnu packages disk)
#:use-module (gnu packages django)
+ #:use-module (gnu packages gawk)
#:use-module (gnu packages gd)
#:use-module (gnu packages gettext)
#:use-module (gnu packages image)
#:use-module (gnu packages mail)
#:use-module (gnu packages ncurses)
#:use-module (gnu packages networking)
+ #:use-module (gnu packages node)
#:use-module (gnu packages libevent)
+ #:use-module (gnu packages linux)
#:use-module (gnu packages pcre)
#:use-module (gnu packages perl)
#:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages protobuf)
#:use-module (gnu packages python)
#:use-module (gnu packages python-web)
#:use-module (gnu packages python-xyz)
#:use-module (gnu packages rrdtool)
#:use-module (gnu packages time)
#:use-module (gnu packages tls)
+ #:use-module (gnu packages version-control)
#:use-module (gnu packages web))
(define-public nagios
@@ -575,3 +582,102 @@ future system load (i.e., capacity planning).")
;; license:gpl2 for other plugins
(license (list license:expat license:gpl2))))
+(define-public netdata
+ ;; TODO: Support go plugins, if not more.
+ (package
+ (name "netdata")
+ (version "1.29.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/netdata/netdata")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "137qx7m9h2qk1pcy3i8rf7yk744zi7ps3867psy2r45l7k3flrss"))
+ (patches
+ (search-patches
+ ;; Remove Google Analytics, Google Tag Manager, update popups,
+ ;; global default registry and Netdata Cloud support (nonfree
+ ;; service).
+ "netdata-web-remove-antifeatures-spyware.patch"
+ ;; From Nix
+ "netdata-no-files-in-etc-and-var.patch"
+ ;; From Debian
+ "netdata-0001-use-system-python.patch"
+ "netdata-0002-use-system-exim4.patch"
+ "netdata-0003-use-python3.patch"
+ "netdata-0004-use-sh.patch"
+ "netdata-0005-use-bash.patch"))))
+ (build-system gnu-build-system)
+ (arguments
+ `(#:configure-flags (list "--localstatedir=/var"
+ "--sysconfdir=/etc"
+ "--disable-cloud")
+ #:phases
+ (modify-phases %standard-phases
+ (add-after 'install 'wrap-netdata
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (wrap-program
+ (string-append (assoc-ref outputs "out") "/sbin/netdata")
+ `("DO_NOT_TRACK" = (,"1"))
+ `("PYTHONPATH" ":" prefix (,(getenv "PYTHONPATH")))
+ `("PATH" ":" prefix ,(map
+ (lambda (input)
+ (string-append
+ (assoc-ref inputs input)
+ "/bin"))
+ '("coreutils" "grep" "findutils" "sed"
+ "dmidecode" "hddtemp" "iproute2"
+ "iw" "lm-sensors" "netcat" "curl"
+ "fping" "procps" "which" "gawk"
+ "node"))))
+ #t)))))
+ (native-inputs
+ `(("git" ,git-minimal)
+ ("pkg-config" ,pkg-config)
+ ("protobuf-c" ,protobuf-c)
+ ("autoconf" ,autoconf)
+ ("automake" ,automake)))
+ (inputs
+ ;; TODO: Add optional libnetfilter-acct
+ `(("util-linux:lib" ,util-linux "lib") ;; for libuuid
+ ("libuv" ,libuv)
+ ("zlib" ,zlib)
+ ("openssl" ,openssl)
+ ("lz4" ,lz4)
+ ("libcap" ,libcap)
+ ("libmnl" ,libmnl)
+ ("snappy" ,snappy)
+ ("cups" ,cups-minimal)
+ ("python" ,python)
+ ("python-pyyaml" ,python-pyyaml)
+ ("python-urllib3" ,python-urllib3)
+ ("python-six" ,python-six)
+ ("python-psycopg2" ,python-psycopg2)
+ ("python-pymysql" ,python-pymysql)
+ ("python-requests" ,python-requests)
+ ;; TODO: Add apcupsd
+ ("coreutils" ,coreutils)
+ ("grep" ,grep)
+ ("findutils" ,findutils)
+ ("sed" ,sed)
+ ("dmidecode" ,dmidecode)
+ ("hddtemp" ,hddtemp)
+ ("iproute2" ,iproute)
+ ("iw" ,iw)
+ ("lm-sensors" ,lm-sensors)
+ ("netcat" ,netcat-openbsd)
+ ("curl" ,curl)
+ ("fping" ,fping)
+ ("procps" ,procps)
+ ("which" ,which)
+ ("gawk" ,gawk)
+ ("node" ,node)))
+ (home-page "https://www.netdata.cloud/")
+ (synopsis "Zero-configuration real-time performance monitoring")
+ (description "Netdata's distributed, real-time monitoring Agent collects
+thousands of metrics from systems, hardware, containers, and applications with
+zero configuration.")
+ (license license:gpl3)))
diff --git a/gnu/packages/patches/netdata-0001-use-system-python.patch b/gnu/packages/patches/netdata-0001-use-system-python.patch
new file mode 100644
index 0000000000..5a14159d52
--- /dev/null
+++ b/gnu/packages/patches/netdata-0001-use-system-python.patch
@@ -0,0 +1,131 @@
+Author: Lennart Weller <lhw@ring0.de>
+Description: Ignore embedded python modules.
+
+diff -Naurp netdata.orig/collectors/python.d.plugin/Makefile.am netdata/collectors/python.d.plugin/Makefile.am
+--- netdata.orig/collectors/python.d.plugin/Makefile.am
++++ netdata/collectors/python.d.plugin/Makefile.am
+@@ -145,109 +145,3 @@ dist_third_party_DATA = \
+ python_modules/third_party/monotonic.py \
+ python_modules/third_party/filelock.py \
+ $(NULL)
+-
+-pythonyaml2dir=$(pythonmodulesdir)/pyyaml2
+-dist_pythonyaml2_DATA = \
+- python_modules/pyyaml2/__init__.py \
+- python_modules/pyyaml2/composer.py \
+- python_modules/pyyaml2/constructor.py \
+- python_modules/pyyaml2/cyaml.py \
+- python_modules/pyyaml2/dumper.py \
+- python_modules/pyyaml2/emitter.py \
+- python_modules/pyyaml2/error.py \
+- python_modules/pyyaml2/events.py \
+- python_modules/pyyaml2/loader.py \
+- python_modules/pyyaml2/nodes.py \
+- python_modules/pyyaml2/parser.py \
+- python_modules/pyyaml2/reader.py \
+- python_modules/pyyaml2/representer.py \
+- python_modules/pyyaml2/resolver.py \
+- python_modules/pyyaml2/scanner.py \
+- python_modules/pyyaml2/serializer.py \
+- python_modules/pyyaml2/tokens.py \
+- $(NULL)
+-
+-pythonyaml3dir=$(pythonmodulesdir)/pyyaml3
+-dist_pythonyaml3_DATA = \
+- python_modules/pyyaml3/__init__.py \
+- python_modules/pyyaml3/composer.py \
+- python_modules/pyyaml3/constructor.py \
+- python_modules/pyyaml3/cyaml.py \
+- python_modules/pyyaml3/dumper.py \
+- python_modules/pyyaml3/emitter.py \
+- python_modules/pyyaml3/error.py \
+- python_modules/pyyaml3/events.py \
+- python_modules/pyyaml3/loader.py \
+- python_modules/pyyaml3/nodes.py \
+- python_modules/pyyaml3/parser.py \
+- python_modules/pyyaml3/reader.py \
+- python_modules/pyyaml3/representer.py \
+- python_modules/pyyaml3/resolver.py \
+- python_modules/pyyaml3/scanner.py \
+- python_modules/pyyaml3/serializer.py \
+- python_modules/pyyaml3/tokens.py \
+- $(NULL)
+-
+-python_urllib3dir=$(pythonmodulesdir)/urllib3
+-dist_python_urllib3_DATA = \
+- python_modules/urllib3/__init__.py \
+- python_modules/urllib3/_collections.py \
+- python_modules/urllib3/connection.py \
+- python_modules/urllib3/connectionpool.py \
+- python_modules/urllib3/exceptions.py \
+- python_modules/urllib3/fields.py \
+- python_modules/urllib3/filepost.py \
+- python_modules/urllib3/response.py \
+- python_modules/urllib3/poolmanager.py \
+- python_modules/urllib3/request.py \
+- $(NULL)
+-
+-python_urllib3_utildir=$(python_urllib3dir)/util
+-dist_python_urllib3_util_DATA = \
+- python_modules/urllib3/util/__init__.py \
+- python_modules/urllib3/util/connection.py \
+- python_modules/urllib3/util/request.py \
+- python_modules/urllib3/util/response.py \
+- python_modules/urllib3/util/retry.py \
+- python_modules/urllib3/util/selectors.py \
+- python_modules/urllib3/util/ssl_.py \
+- python_modules/urllib3/util/timeout.py \
+- python_modules/urllib3/util/url.py \
+- python_modules/urllib3/util/wait.py \
+- $(NULL)
+-
+-python_urllib3_packagesdir=$(python_urllib3dir)/packages
+-dist_python_urllib3_packages_DATA = \
+- python_modules/urllib3/packages/__init__.py \
+- python_modules/urllib3/packages/ordered_dict.py \
+- python_modules/urllib3/packages/six.py \
+- $(NULL)
+-
+-python_urllib3_backportsdir=$(python_urllib3_packagesdir)/backports
+-dist_python_urllib3_backports_DATA = \
+- python_modules/urllib3/packages/backports/__init__.py \
+- python_modules/urllib3/packages/backports/makefile.py \
+- $(NULL)
+-
+-python_urllib3_ssl_match_hostnamedir=$(python_urllib3_packagesdir)/ssl_match_hostname
+-dist_python_urllib3_ssl_match_hostname_DATA = \
+- python_modules/urllib3/packages/ssl_match_hostname/__init__.py \
+- python_modules/urllib3/packages/ssl_match_hostname/_implementation.py \
+- $(NULL)
+-
+-python_urllib3_contribdir=$(python_urllib3dir)/contrib
+-dist_python_urllib3_contrib_DATA = \
+- python_modules/urllib3/contrib/__init__.py \
+- python_modules/urllib3/contrib/appengine.py \
+- python_modules/urllib3/contrib/ntlmpool.py \
+- python_modules/urllib3/contrib/pyopenssl.py \
+- python_modules/urllib3/contrib/securetransport.py \
+- python_modules/urllib3/contrib/socks.py \
+- $(NULL)
+-
+-python_urllib3_securetransportdir=$(python_urllib3_contribdir)/_securetransport
+-dist_python_urllib3_securetransport_DATA = \
+- python_modules/urllib3/contrib/_securetransport/__init__.py \
+- python_modules/urllib3/contrib/_securetransport/bindings.py \
+- python_modules/urllib3/contrib/_securetransport/low_level.py \
+- $(NULL)
+diff -Naurp netdata.orig/collectors/python.d.plugin/python_modules/bases/loaders.py netdata/collectors/python.d.plugin/python_modules/bases/loaders.py
+--- netdata.orig/collectors/python.d.plugin/python_modules/bases/loaders.py
++++ netdata/collectors/python.d.plugin/python_modules/bases/loaders.py
+@@ -9,10 +9,7 @@ from sys import version_info
+ PY_VERSION = version_info[:2]
+
+ try:
+- if PY_VERSION > (3, 1):
+- from pyyaml3 import SafeLoader as YamlSafeLoader
+- else:
+- from pyyaml2 import SafeLoader as YamlSafeLoader
++ from yaml import SafeLoader as YamlSafeLoader
+ except ImportError:
+ from yaml import SafeLoader as YamlSafeLoader
+
diff --git a/gnu/packages/patches/netdata-0002-use-system-exim4.patch b/gnu/packages/patches/netdata-0002-use-system-exim4.patch
new file mode 100644
index 0000000000..0e23618399
--- /dev/null
+++ b/gnu/packages/patches/netdata-0002-use-system-exim4.patch
@@ -0,0 +1,12 @@
+Author: Sven Hartge <sven@svenhartge.de>
+Description: Debian has exim in /usr/sbin which is not in the default path.
+
+diff -Naurp netdata.orig/collectors/python.d.plugin/exim/exim.conf netdata/collectors/python.d.plugin/exim/exim.conf
+--- netdata.orig/collectors/python.d.plugin/exim/exim.conf
++++ netdata/collectors/python.d.plugin/exim/exim.conf
+@@ -88,4 +88,4 @@ update_every: 10
+ # AUTO-DETECTION JOBS
+
+ local:
+- command: 'exim -bpc'
++ command: '/usr/sbin/exim -bpc'
diff --git a/gnu/packages/patches/netdata-0003-use-python3.patch b/gnu/packages/patches/netdata-0003-use-python3.patch
new file mode 100644
index 0000000000..e55089271a
--- /dev/null
+++ b/gnu/packages/patches/netdata-0003-use-python3.patch
@@ -0,0 +1,29 @@
+Author: Sander Klein <debian-bugs@roedie.nl>
+Description: Debian uses by default python 2 instead of python3.
+
+diff -Naurp netdata.orig/collectors/python.d.plugin/python.d.plugin.in netdata/collectors/python.d.plugin/python.d.plugin.in
+--- netdata.orig/collectors/python.d.plugin/python.d.plugin.in
++++ netdata/collectors/python.d.plugin/python.d.plugin.in
+@@ -1,21 +1,4 @@
+-#!/usr/bin/env bash
+-'''':;
+-pybinary=$(which python || which python3 || which python2)
+-filtered=()
+-for arg in "$@"
+-do
+- case $arg in
+- -p*) pybinary=${arg:2}
+- shift 1 ;;
+- *) filtered+=("$arg") ;;
+- esac
+-done
+-if [ "$pybinary" = "" ]
+-then
+- echo "ERROR python IS NOT AVAILABLE IN THIS SYSTEM"
+- exit 1
+-fi
+-exec "$pybinary" "$0" "${filtered[@]}" # '''
++#!/usr/bin/python3
+
+ # -*- coding: utf-8 -*-
+ # Description:
diff --git a/gnu/packages/patches/netdata-0004-use-sh.patch b/gnu/packages/patches/netdata-0004-use-sh.patch
new file mode 100644
index 0000000000..6c8e93bfba
--- /dev/null
+++ b/gnu/packages/patches/netdata-0004-use-sh.patch
@@ -0,0 +1,12 @@
+Author: Daniel Baumann <daniel.baumann@progress-linux.org>
+Description: Fix shebang hack to not depend on bash.
+
+diff -Naurp netdata.orig/collectors/node.d.plugin/node.d.plugin.in netdata/collectors/node.d.plugin/node.d.plugin.in
+--- netdata.orig/collectors/node.d.plugin/node.d.plugin.in
++++ netdata/collectors/node.d.plugin/node.d.plugin.in
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env bash
++#!/bin/sh
+ ':' //; exec "$(command -v nodejs || command -v node || echo "ERROR node IS NOT AVAILABLE IN THIS SYSTEM")" "$0" "$@"
+
+ // shebang hack from:
diff --git a/gnu/packages/patches/netdata-0005-use-bash.patch b/gnu/packages/patches/netdata-0005-use-bash.patch
new file mode 100644
index 0000000000..53b7fc5b31
--- /dev/null
+++ b/gnu/packages/patches/netdata-0005-use-bash.patch
@@ -0,0 +1,13 @@
+Author: Daniel Baumann <daniel.baumann@progress-linux.org>
+Description: Using bash instead of sh for edit-config.
+ It reads /etc/profile which often contains bash specific configuration.
+
+diff -Naurp netdata.orig/system/edit-config.in netdata/system/edit-config.in
+--- netdata.orig/system/edit-config.in
++++ netdata/system/edit-config.in
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env sh
++#!/bin/bash
+
+ [ -f /etc/profile ] && . /etc/profile
+
diff --git a/gnu/packages/patches/netdata-no-files-in-etc-and-var.patch b/gnu/packages/patches/netdata-no-files-in-etc-and-var.patch
new file mode 100644
index 0000000000..594805fdf1
--- /dev/null
+++ b/gnu/packages/patches/netdata-no-files-in-etc-and-var.patch
@@ -0,0 +1,129 @@
+From 4ecc1475be94a384c122594b5f7d455beb64a2f0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= <joerg@thalheim.io>
+Date: Sat, 22 Feb 2020 06:42:14 +0000
+Subject: [PATCH] no files in etc and var
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jörg Thalheim <joerg@thalheim.io>
+---
+ collectors/Makefile.am | 2 +-
+ collectors/charts.d.plugin/Makefile.am | 2 +-
+ collectors/node.d.plugin/Makefile.am | 2 +-
+ collectors/python.d.plugin/Makefile.am | 2 +-
+ collectors/statsd.plugin/Makefile.am | 2 +-
+ health/Makefile.am | 2 +-
+ system/Makefile.am | 3 +--
+ web/Makefile.am | 2 +-
+ 8 files changed, 8 insertions(+), 9 deletions(-)
+
+diff --git a/collectors/Makefile.am b/collectors/Makefile.am
+index 9bb52958..c9799165 100644
+--- a/collectors/Makefile.am
++++ b/collectors/Makefile.am
+@@ -32,7 +32,7 @@ usercustompluginsconfigdir=$(configdir)/custom-plugins.d
+ usergoconfigdir=$(configdir)/go.d
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(usercustompluginsconfigdir)
+ $(INSTALL) -d $(DESTDIR)$(usergoconfigdir)
+
+diff --git a/collectors/charts.d.plugin/Makefile.am b/collectors/charts.d.plugin/Makefile.am
+index 03c7f0a9..01985db0 100644
+--- a/collectors/charts.d.plugin/Makefile.am
++++ b/collectors/charts.d.plugin/Makefile.am
+@@ -34,7 +34,7 @@ dist_userchartsconfig_DATA = \
+ $(NULL)
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(userchartsconfigdir)
+
+ chartsconfigdir=$(libconfigdir)/charts.d
+diff --git a/collectors/node.d.plugin/Makefile.am b/collectors/node.d.plugin/Makefile.am
+index c3142d43..95e32445 100644
+--- a/collectors/node.d.plugin/Makefile.am
++++ b/collectors/node.d.plugin/Makefile.am
+@@ -26,7 +26,7 @@ dist_usernodeconfig_DATA = \
+ $(NULL)
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(usernodeconfigdir)
+
+ nodeconfigdir=$(libconfigdir)/node.d
+diff --git a/collectors/python.d.plugin/Makefile.am b/collectors/python.d.plugin/Makefile.am
+index e678f86a..29a319da 100644
+--- a/collectors/python.d.plugin/Makefile.am
++++ b/collectors/python.d.plugin/Makefile.am
+@@ -32,7 +32,7 @@ dist_userpythonconfig_DATA = \
+ $(NULL)
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(userpythonconfigdir)
+
+ pythonconfigdir=$(libconfigdir)/python.d
+diff --git a/collectors/statsd.plugin/Makefile.am b/collectors/statsd.plugin/Makefile.am
+index b01302d1..f5b77da4 100644
+--- a/collectors/statsd.plugin/Makefile.am
++++ b/collectors/statsd.plugin/Makefile.am
+@@ -17,5 +17,5 @@ dist_userstatsdconfig_DATA = \
+ $(NULL)
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(userstatsdconfigdir)
+diff --git a/health/Makefile.am b/health/Makefile.am
+index 853ed0d7..210330a6 100644
+--- a/health/Makefile.am
++++ b/health/Makefile.am
+@@ -19,7 +19,7 @@ dist_userhealthconfig_DATA = \
+ $(NULL)
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(userhealthconfigdir)
+
+ healthconfigdir=$(libconfigdir)/health.d
+diff --git a/system/Makefile.am b/system/Makefile.am
+index ad68c655..74f032f9 100644
+--- a/system/Makefile.am
++++ b/system/Makefile.am
+@@ -17,11 +17,10 @@ include $(top_srcdir)/build/subst.inc
+ SUFFIXES = .in
+
+ dist_config_SCRIPTS = \
+- edit-config \
+ $(NULL)
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(configdir)
+
+ nodist_noinst_DATA = \
+diff --git a/web/Makefile.am b/web/Makefile.am
+index ccaccd76..16a2977e 100644
+--- a/web/Makefile.am
++++ b/web/Makefile.am
+@@ -12,7 +12,7 @@ SUBDIRS = \
+ usersslconfigdir=$(configdir)/ssl
+
+ # Explicitly install directories to avoid permission issues due to umask
+-install-exec-local:
++no-install-exec-local:
+ $(INSTALL) -d $(DESTDIR)$(usersslconfigdir)
+
+ dist_noinst_DATA = \
+--
+2.25.0
+
diff --git a/gnu/packages/patches/netdata-web-remove-antifeatures-spyware.patch b/gnu/packages/patches/netdata-web-remove-antifeatures-spyware.patch
new file mode 100644
index 0000000000..0b3be9a5d2
--- /dev/null
+++ b/gnu/packages/patches/netdata-web-remove-antifeatures-spyware.patch
@@ -0,0 +1,4466 @@
+diff --git a/registry/registry_init.c b/registry/registry_init.c
+index ffdb83f3..2d5460fd 100644
+--- a/registry/registry_init.c
++++ b/registry/registry_init.c
+@@ -36,7 +36,7 @@ int registry_init(void) {
+ registry.save_registry_every_entries = (unsigned long long)config_get_number(CONFIG_SECTION_REGISTRY, "registry save db every new entries", 1000000);
+ registry.persons_expiration = config_get_number(CONFIG_SECTION_REGISTRY, "registry expire idle persons days", 365) * 86400;
+ registry.registry_domain = config_get(CONFIG_SECTION_REGISTRY, "registry domain", "");
+- registry.registry_to_announce = config_get(CONFIG_SECTION_REGISTRY, "registry to announce", "https://registry.my-netdata.io");
++ registry.registry_to_announce = config_get(CONFIG_SECTION_REGISTRY, "registry to announce", "");
+ registry.hostname = config_get(CONFIG_SECTION_REGISTRY, "registry hostname", netdata_configured_hostname);
+ registry.verify_cookies_redirects = config_get_boolean(CONFIG_SECTION_REGISTRY, "verify browser cookies support", 1);
+
+diff --git a/web/gui/Makefile.am b/web/gui/Makefile.am
+index c69380f9..8a8f01e5 100644
+--- a/web/gui/Makefile.am
++++ b/web/gui/Makefile.am
+@@ -46,10 +46,6 @@ dist_noinst_DATA = \
+ $(NULL)
+
+ dist_web_DATA = \
+- demo.html \
+- demo2.html \
+- demosites.html \
+- demosites2.html \
+ dashboard.html \
+ dashboard.js \
+ dashboard_info.js \
+@@ -62,7 +58,6 @@ dist_web_DATA = \
+ main.css \
+ main.js \
+ console.html \
+- infographic.html \
+ robots.txt \
+ refresh-badges.js \
+ sitemap.xml \
+diff --git a/web/gui/console.html b/web/gui/console.html
+index b85b4ffb..2debd1c5 100644
+--- a/web/gui/console.html
++++ b/web/gui/console.html
+@@ -12,18 +12,6 @@
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
+ <link rel="icon" href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP9JREFUeNpiYBgFo+A/w34gpiZ8DzWzAYgNiHGAA5UdgA73g+2gcyhgg/0DGQoweB6IBQYyFCCOGOBQwBMd/xnW09ERDtgcoEBHB+zHFQrz6egIBUasocDAcJ9OxWAhE4YQI8MDILmATg7wZ8QRDfQKhQf4Cie6pAVGPA4AhQKo0BCgZRAw4ZSBpIWJNI6CD4wEKikBaFqgVSgcYMIrzcjwgcahcIGRiPYCLUPBkNhWUwP9akVcoQBpatG4MsLviAIqWj6f3Absfdq2igg7IIEKDVQKEzN5ofAenJCp1I8gJRTug5tfkGIdR1FDniMI+QZUjF8Amn5htOdHCAAEGACE6B0cS6mrEwAAAABJRU5ErkJggg==" />
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
+- <!-- Google Tag Manager -->
+- <script>(function (w, d, s, l, i) {
+- w[l] = w[l] || []; w[l].push({
+- 'gtm.start':
+- new Date().getTime(), event: 'gtm.js'
+- }); var f = d.getElementsByTagName(s)[0],
+- j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =
+- 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f);
+- })(window, document, 'script', 'dataLayer', 'GTM-N6CBMJD');
+- window.dataLayer = window.dataLayer || [];
+- </script>
+- <!-- End Google Tag Manager -->
+ <script>
+ function loadJSFile(filename) {
+ const s = document.createElement("script")
+@@ -39,28 +27,13 @@
+ l.setAttribute("href", filename)
+ document.getElementsByTagName("head")[0].appendChild(l)
+ }
+-
+- var cloudBaseURL = localStorage.getItem("cloud.baseURL") || "https://netdata.cloud"
+-
+- loadCSSFile(`${cloudBaseURL}/static/console/main.css?v=4`)
+ </script>
+ </head>
+
+ <body class="mdc-theme--background mdc-typography">
+- <!-- Google Tag Manager (noscript) -->
+- <noscript>
+- <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N6CBMJD" height="0" width="0"
+- style="display:none;visibility:hidden"></iframe>
+- </noscript>
+- <!-- End Google Tag Manager (noscript) -->
+ <main id="app" class="console-app" data-host="agent"></main>
+ <script>
+ const main = document.getElementById("app")
+- main.setAttribute("data-static-base-url", cloudBaseURL)
+- main.setAttribute("data-api-base-url", cloudBaseURL)
+- main.setAttribute("data-api-base-url-v2", cloudBaseURL)
+-
+- loadJSFile(`${cloudBaseURL}/static/console/main.js?v=4`)
+ </script>
+ <script>
+ var netdataTheme = "white"
+diff --git a/web/gui/dashboard.js b/web/gui/dashboard.js
+index 53e9090b..0afa0d0f 100644
+--- a/web/gui/dashboard.js
++++ b/web/gui/dashboard.js
+@@ -9926,25 +9926,14 @@ NETDATA.alarms = {
+
+ NETDATA.registry = {
+ server: null, // the netdata registry server
+- isCloudEnabled: false,// is netdata.cloud functionality enabled?
+- cloudBaseURL: null, // the netdata cloud base url
+ person_guid: null, // the unique ID of this browser / user
+ machine_guid: null, // the unique ID the netdata server that served dashboard.js
+ hostname: 'unknown', // the hostname of the netdata server that served dashboard.js
+ machines: null, // the user's other URLs
+ machines_array: null, // the user's other URLs in an array
+ person_urls: null,
+- anonymous_statistics_checked: false,
+ MASKED_DATA: "***",
+
+- isUsingGlobalRegistry: function() {
+- return NETDATA.registry.server == "https://registry.my-netdata.io";
+- },
+-
+- isRegistryEnabled: function() {
+- return !(NETDATA.registry.isUsingGlobalRegistry() || isSignedIn())
+- },
+-
+ parsePersonUrls: function (person_urls) {
+ NETDATA.registry.person_urls = person_urls;
+
+@@ -9998,26 +9987,8 @@ NETDATA.registry = {
+ NETDATA.registry.hello(NETDATA.serverDefault, function (data) {
+ if (data) {
+ NETDATA.registry.server = data.registry;
+- if (data.cloud_base_url !== "") {
+- NETDATA.registry.isCloudEnabled = true;
+- NETDATA.registry.cloudBaseURL = data.cloud_base_url;
+- } else {
+- NETDATA.registry.isCloudEnabled = false;
+- NETDATA.registry.cloudBaseURL = "";
+- }
+ NETDATA.registry.machine_guid = data.machine_guid;
+ NETDATA.registry.hostname = data.hostname;
+- if (!NETDATA.registry.anonymous_statistics_checked) {
+- NETDATA.registry.anonymous_statistics_checked=true;
+- if (data.anonymous_statistics) {
+- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=false;j.src=
+- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+- })(window,document,'script','dataLayer','GTM-N6CBMJD');
+- dataLayer.push({"anonymous_statistics" : "true", "machine_guid" : data.machine_guid});
+- }
+- }
+ NETDATA.registry.access(2, function (person_urls) {
+ NETDATA.registry.parsePersonUrls(person_urls);
+ });
+@@ -10066,12 +10037,8 @@ NETDATA.registry = {
+ let name = NETDATA.registry.MASKED_DATA;
+ let url = NETDATA.registry.MASKED_DATA;
+
+- if (!NETDATA.registry.isUsingGlobalRegistry()) {
+- // If the user is using a private registry keep sending identifiable
+- // data.
+- name = NETDATA.registry.hostname;
+- url = NETDATA.serverDefault;
+- }
++ name = NETDATA.registry.hostname;
++ url = NETDATA.serverDefault;
+
+ console.log("ACCESS", name, url);
+
+diff --git a/web/gui/dashboard_info.js b/web/gui/dashboard_info.js
+index 1f289ba0..889b6827 100644
+--- a/web/gui/dashboard_info.js
++++ b/web/gui/dashboard_info.js
+@@ -196,11 +196,6 @@ netdataDashboard.menu = {
+ info: 'Performance metrics for the operation of netdata itself and its plugins.'
+ },
+
+- 'aclk_test': {
+- title: 'ACLK Test Generator',
+- info: 'For internal use to perform integration testing.'
+- },
+-
+ 'example': {
+ title: 'Example Charts',
+ info: 'Example charts, demonstrating the external plugin architecture.'
+@@ -3353,21 +3348,6 @@ netdataDashboard.context = {
+ info: 'Difference between the number of process created and the number of threads created per period(<code>process</code> dimension), it also shows the number of possible zombie process running on system.'
+ },
+
+- // ------------------------------------------------------------------------
+- // ACLK Internal Stats
+- 'netdata.aclk_status': {
+- valueRange: "[0, 1]",
+- info: 'This chart shows if ACLK was online during entirety of the sample duration.'
+- },
+-
+- 'netdata.aclk_query_per_second': {
+- info: 'This chart shows how many queries were added for ACLK_query thread to process and how many it was actually able to process.'
+- },
+-
+- 'netdata.aclk_latency_mqtt': {
+- info: 'Measures latency between MQTT publish of the message and it\'s PUB_ACK being received'
+- },
+-
+ // ------------------------------------------------------------------------
+ // VerneMQ
+
+diff --git a/web/gui/demo.html b/web/gui/demo.html
+deleted file mode 100644
+index b096bef3..00000000
+--- a/web/gui/demo.html
++++ /dev/null
+@@ -1,51 +0,0 @@
+-<!DOCTYPE html>
+-<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
+-<html lang="en">
+-<head>
+- <title>NetData Dashboard</title>
+- <meta name="application-name" content="netdata">
+-
+- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+- <meta charset="utf-8">
+- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+- <meta name="viewport" content="width=device-width, initial-scale=1">
+- <meta name="apple-mobile-web-app-capable" content="yes">
+- <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+- <meta name="author" content="costa@tsaousis.gr">
+-
+- <meta property="og:locale" content="en_US" />
+- <meta property="og:image" content="https://cloud.githubusercontent.com/assets/2662304/22945737/e98cd0c6-f2fd-11e6-96f1-5501934b0955.png"/>
+- <meta property="og:url" content="http://my-netdata.io/"/>
+- <meta property="og:type" content="website"/>
+- <meta property="og:site_name" content="netdata"/>
+- <meta property="og:title" content="netdata - real-time performance monitoring, done right!"/>
+- <meta property="og:description" content="Stunning real-time dashboards, blazingly fast and extremely interactive. Zero configuration, zero dependencies, zero maintenance." />
+-</head>
+-<script type="text/javascript" src="dashboard.js?v20190902-0"></script>
+-<body>
+-
+-<div style="width: 100%; text-align: center;">
+- <div data-netdata="netdata.server_cpu"
+- data-dimensions="user"
+- data-chart-library="gauge"
+- data-width="150px"
+- data-after="-60"
+- data-points="60"
+- data-title="Yes! Realtime!"
+- data-units="I am alive!"
+- data-colors="#FF5555"
+- ></div>
+- <br/>
+- <div data-netdata="netdata.server_cpu"
+- data-dimensions="user"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-width="200px"
+- data-height="30px"
+- data-after="-60"
+- data-points="60"
+- data-colors="#FF5555"
+- ></div>
+-</div>
+-</body>
+-</html>
+diff --git a/web/gui/demo2.html b/web/gui/demo2.html
+deleted file mode 100644
+index 650acfe0..00000000
+--- a/web/gui/demo2.html
++++ /dev/null
+@@ -1,143 +0,0 @@
+-<!DOCTYPE html>
+-<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
+-<html lang="en">
+-<head>
+- <title>NetData Dashboard</title>
+- <meta name="application-name" content="netdata">
+-
+- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+- <meta charset="utf-8">
+- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+- <meta name="viewport" content="width=device-width, initial-scale=1">
+- <meta name="apple-mobile-web-app-capable" content="yes">
+- <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+- <meta name="author" content="costa@tsaousis.gr">
+-
+- <meta property="og:locale" content="en_US" />
+- <meta property="og:image" content="https://cloud.githubusercontent.com/assets/2662304/22945737/e98cd0c6-f2fd-11e6-96f1-5501934b0955.png"/>
+- <meta property="og:url" content="https://my-netdata.io/"/>
+- <meta property="og:type" content="website"/>
+- <meta property="og:site_name" content="netdata"/>
+- <meta property="og:title" content="netdata - real-time performance monitoring, done right!"/>
+- <meta property="og:description" content="Stunning real-time dashboards, blazingly fast and extremely interactive. Zero configuration, zero dependencies, zero maintenance." />
+-</head>
+-<script>var netdataTheme = 'slate';</script>
+-<script type="text/javascript" src="https://my-netdata.io/dashboard.js?v20190902-0"></script>
+-<body>
+-
+-<div class="container" style="width: 90%; padding-top: 10px; text-align: center; color: #AAA">
+- <div style="font-size: 7vw;">why netdata?</div>
+- <br/>
+- <div style="font-size: 2vw; color: white;">These charts visualize the same data...</div>
+-
+-
+- <!-- Nav tabs -->
+- <ul class="nav nav-tabs" role="tablist">
+- <li role="presentation" class="active"><a href="#gauge" aria-controls="gauge" role="tab" data-toggle="tab">Gauge.js</a></li>
+- <li role="presentation"><a href="#easypiechart" aria-controls="easypiechart" role="tab" data-toggle="tab">Easy Pie Chart</a></li>
+- </ul>
+-
+- <!-- Tab panes -->
+- <div class="tab-content">
+- <div role="tabpanel" class="tab-pane active" id="gauge">
+-
+- <div style="display: inline-block; width: 35.8%">
+- <div style="font-size: 1.2vw; color: #666; padding-top: 10px;"><i class="fa fa-comment"></i> I can trace an issue like this</div>
+- <br/>
+- <div data-netdata="example.random2"
+- data-dimensions="random"
+- data-chart-library="gauge"
+- data-gauge-max-value="32767"
+- data-width="100%"
+- data-after="-600"
+- data-points="600"
+- data-title="1/second (netdata default)"
+- data-units="important metric"
+- data-colors="#5A5"
+- ></div>
+- </div>
+- <div style="display: inline-block; width: 50%">
+- <div style="font-size: 1.2vw; color: #666;"><i class="fa fa-comment"></i> Can you trace an issue like these?<br/> <br/></div>
+- <div data-netdata="example.random2"
+- data-dimensions="random"
+- data-chart-library="gauge"
+- data-gauge-max-value="32767"
+- data-width="45%"
+- data-after="-600"
+- data-points="60"
+- data-title="Updates Every 10 Sec"
+- data-units="important metric"
+- data-colors="#C55"
+- ></div>
+- <div data-netdata="example.random2"
+- data-dimensions="random"
+- data-chart-library="gauge"
+- data-gauge-max-value="32767"
+- data-width="45%"
+- data-after="-600"
+- data-points="2"
+- data-title="Updates Every 5 Mins"
+- data-units="important metric"
+- data-colors="#C55"
+- ></div>
+- </div>
+- </div>
+- <div role="tabpanel" class="tab-pane" id="easypiechart">
+-
+- <div style="display: inline-block; width: 25%">
+- <div style="font-size: 1.2vw; color: #666; padding-top: 10px;"><i class="fa fa-comment"></i> I can trace an issue like this</div>
+- <br/>
+- <div data-netdata="example.random2"
+- data-dimensions="random"
+- data-chart-library="easypiechart"
+- data-easypiechart-max-value="32767"
+- data-width="100%"
+- data-after="-600"
+- data-points="600"
+- data-title="1/second (netdata default)"
+- data-units="important metric"
+- data-colors="#5A5"
+- ></div>
+- </div>
+- <div style="display: inline-block; width: 40%">
+- <div style="font-size: 1.2vw; color: #666;"><i class="fa fa-comment"></i> Can you trace an issue like these?<br/> <br/></div>
+- <div data-netdata="example.random2"
+- data-dimensions="random"
+- data-chart-library="easypiechart"
+- data-easypiechart-max-value="32767"
+- data-width="45%"
+- data-after="-600"
+- data-points="60"
+- data-title="Updates Every 10 Sec"
+- data-units="important metric"
+- data-colors="#C55"
+- ></div>
+- <div data-netdata="example.random2"
+- data-dimensions="random"
+- data-chart-library="easypiechart"
+- data-easypiechart-max-value="32767"
+- data-width="45%"
+- data-after="-600"
+- data-points="2"
+- data-title="Updates Every 5 Mins"
+- data-units="important metric"
+- data-colors="#C55"
+- ></div>
+- </div>
+- </div>
+- </div>
+- <div style="font-size: 1.5vw;">Hover on the chart below, to see the selected value on the charts above!</div>
+- <div data-netdata="example.random2"
+- data-dimensions="random"
+- data-dygraph-theme="sparkline"
+- data-width="100%"
+- data-height="20vh"
+- data-after="-600"
+- data-points="600"
+- data-title="1/second (netdata default)"
+- data-units="something"
+- data-colors="#888"
+- ></div>
+-</div>
+-</body>
+-</html>
+diff --git a/web/gui/demosites.html b/web/gui/demosites.html
+deleted file mode 100644
+index e8a310a1..00000000
+--- a/web/gui/demosites.html
++++ /dev/null
+@@ -1,1469 +0,0 @@
+-<!doctype html>
+-<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
+-<html lang=en-us xmlns="http://www.w3.org/1999/html">
+-<head>
+- <meta http-equiv="Refresh" content="0; url=https://www.netdata.cloud">
+- <meta charset=utf-8>
+- <title>NetData: Get control of your Linux Servers. Simple. Effective. Awesome.</title>
+- <meta name=author content="Costa Tsaousis">
+- <meta name=description content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms.">
+-
+- <meta name=viewport content="width=device-width,initial-scale=1">
+- <link rel=apple-touch-icon href=apple-touch-icon.png>
+- <link rel="icon" href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP9JREFUeNpiYBgFo+A/w34gpiZ8DzWzAYgNiHGAA5UdgA73g+2gcyhgg/0DGQoweB6IBQYyFCCOGOBQwBMd/xnW09ERDtgcoEBHB+zHFQrz6egIBUasocDAcJ9OxWAhE4YQI8MDILmATg7wZ8QRDfQKhQf4Cie6pAVGPA4AhQKo0BCgZRAw4ZSBpIWJNI6CD4wEKikBaFqgVSgcYMIrzcjwgcahcIGRiPYCLUPBkNhWUwP9akVcoQBpatG4MsLviAIqWj6f3Absfdq2igg7IIEKDVQKEzN5ofAenJCp1I8gJRTug5tfkGIdR1FDniMI+QZUjF8Amn5htOdHCAAEGACE6B0cS6mrEwAAAABJRU5ErkJggg==" />
+-
+- <meta property="og:url" content="https://my-netdata.io" />
+- <meta property="og:type" content="website" />
+- <meta property="og:title" content="Get control of your Linux Servers. Simple. Effective. Awesome." />
+- <meta property="og:description" content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms." />
+- <meta property="og:image" content="https://cloud.githubusercontent.com/assets/2662304/22945737/e98cd0c6-f2fd-11e6-96f1-5501934b0955.png" />
+- <meta property="og:image:type" content="image/png" />
+- <meta property="fb:app_id" content="1200089276712916" />
+-
+- <meta name="twitter:card" content="summary" />
+- <meta name="twitter:site" content="@linuxnetdata" />
+- <meta name="twitter:title" content="Get control of your Linux Servers. Simple. Effective. Awesome." />
+- <meta name="twitter:description" content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms." />
+- <meta name="twitter:image" content="https://cloud.githubusercontent.com/assets/2662304/14092712/93b039ea-f551-11e5-822c-beadbf2b2a2e.gif" />
+-
+- <meta name="google-site-verification" content="3Xmk2kyCvai8p9HEnYHoQ9RBW20-b1NvPAgu07Fkkds" />
+- <meta name="msvalidate.01" content="896DCA31C9A664CE359FCF1A645DD476" />
+-
+- <style>/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */
+-html {
+- line-height: 1.15;
+- -ms-text-size-adjust: 100%;
+- -webkit-text-size-adjust: 100%;
+- color: #fff;
+- font: 17px/1.4 'Open Sans', sans-serif;
+- text-align: center
+-}
+-
+-body {
+- margin: 0;
+- background-color: #2f3135;
+- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA9BAMAAAAOkGejAAAAGFBMVEUKCgoUFBQAAAAPDw8ZGRkeHh4jIyMFBQUUJmucAAAACHRSTlMzMzMzMzMzM85JBgUAAAV1SURBVDjLBQC3tkMA9OqrbtWtCKwErLoVhDUP5PffAUvqhtJFWytU/UqOWbf0nG8ZSVyyfSPwrjqzxYailPJtJu/uihN7np+51RrBgYosPTzBElTZCg8JieV4W/HJciqhFwhQLBmkX5JnNzzMlOGvQChGCKbanFWBgVeRCr9L6BZCgZxB/0wN7zTO2QuP80SIL3F5Ydbnhz12iE/nSOMrqwK/OMfbAYHkioJlnlj9CKUbeomN61U5LQ6nWRmg+tfrDusm2LHGDnRDdHUp5CLTvoHrwgtZlIr/+FyoPz2tz/HiQzc8x1TWqAZp99yto4qGuAs20qucNqPyUAyqHuAp2Hhv0OR1LC+g2voMngjB2uvyVvf0aFhD1Mi/f5Q6MER7SzJWu2AW3my9l8mB4W3WfCqwf+ikfc7pudFVvOMy0ikuSoF47zw6UYPxdqWRRSRo91RZtWYa/sQeri7tMPKcCao0vs9QTQC+8CuoReAkHuKRZCi2qtv9zJLAHfSoRltH/+sj9rlgdBTsfUbTEb7oTbTJ8acxbjMQnaftBkRVVerOeKhKr3jkRzTzqS6RpJNvF0MhOBQm/BRXor/MU/YjObdYIu1/iaQ+IviYnlsG6r3cbQoB7cj4SPgMSkLzgIM24+LSjb2sYxWDtIhCdzBfS5Kh768XgH5jkSLjrvRX/nQnv+SXQMvagpPVScAZwWhVbvPdPqcr3X/u8z558ddIdjmVMH9CIVvrW+8rPVq6M54Pf+tebGkIXwPevaCgdQ59wWbULrPB4dPT8suLWr13YKUuDNTpGBspJ9fPGSNOEjp2TYXTIgF8QgEtzX0gIbXRP8JGMbxh1uHA/CwE4a/KHUc8KzV868fO4o+8GNcNvdPaKfzprkunXIthFS9MqpEG1p7ozWTJTcnAlvUnjixEaGn5ll1yuZbtIgS/r2ISBSDE2nsksYx7YFwH2ytB0rXzqh52qJowchJSI3RJmxHeJGZFDq37LWVmzvkgA7zjT2iOsHsdb9viBQLPx3gUmys1cQG6HOEsopo6glj0VXdyli/FJsnSbg5FQLpDO1xiy0ozQy0InDVNZTuXbhENG9gu28ZoHg/de53YTAVqCwl966V7VX/g+AW3ysMyMjXNhOuaLFmBJ2Z1x9LfG55m/34snAnOgXbMqZIbaop8Zjk5P3fAw9h8vkwHKZAC7yqW6+85ZdpAFD8iAjbVRj8BI3PMYJ2oiKNrZHKSnfNJ2UZwtcT9IryvNrGxdqtCx4vc74z39odPA/h5f/MJu46HKUOcbURZd/E2QH6Kgv8Aa2PSevG2gMfoYHWdN38kadbiFHonAjv50PjgyFZwannFGebUjVmxFnokoTbwWBNVd7qx9KG1joZ69npEk0jRr7/aBYQ5ipNcGRvqjeT+kFjTgv7n33L0zlBIH6CoeaPm9eQN6uKmSwE/LAtDPgMNAOQ5X1Vr8Zd0BQlLTV88U6LzD+6iwQp9NSHD5uCcqml/N0NgRmDN9vNS6A/QJBm2jvBbFTLvly/mtLX1rg5kwgPvA4rA+LIdN3bkVvhrqk8OUYZpuYxaXW/gPVlDxtru6+3Z0KY5DMac3pQzo8y7hO2qxdd6lnvUSdXfFRduigV0YuZv9peBHwHix+d4M7fL/Y44jX6S5ZdOzBoEC2fEohdSE7PTjRBUT3T+jclLxWbKdEOoiuB81dV0xo2pFPOXZmpEMueTDrAjAr8k6y15pMsoCHOyT5qlyWn85HLLuyyAWMlmmjYSNKnv9nRsTib5DSbWLPkJjoVihW/eRQqy/dja151zycTHTBmuroDeXRvVzJ3VFWB65e+L6xu+D5fa+D0BESL4VjlKSKrvs9W69lhj2345pBjIr3+RSJFuS0A/sQAAAABJRU5ErkJggg==)
+-}
+-
+-a {
+- background-color: transparent;
+- -webkit-text-decoration-skip: objects;
+- color: #069;
+- text-decoration: none
+-}
+-
+-a:active, a:hover {
+- outline-width: 0
+-}
+-
+-strong {
+- font-weight: bolder
+-}
+-
+-h1 {
+- font-size: 2.9em;
+- line-height: 1.2em;
+- margin: 0 .5em .75em
+-}
+-
+-img {
+- border-style: none;
+- vertical-align: middle
+-}
+-
+-[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {
+- border-style: none;
+- padding: 0
+-}
+-
+-[type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring, button:-moz-focusring {
+- outline: 1px dotted ButtonText
+-}
+-
+-a:active, a:focus, a:hover {
+- text-decoration: underline;
+-}
+-
+-::-moz-selection {
+- background-color: #b3d4fc;
+- text-shadow: none;
+-}
+-
+-::selection {
+- background-color: #b3d4fc;
+- text-shadow: none;
+-}
+-
+-h2 {
+- font-size: 2em;
+- margin: 1.5em 0;
+-}
+-
+-h3 {
+- color: #555;
+- font-size: 1.5em;
+- margin: 0 0 .5em;
+-}
+-
+-p {
+- margin: 0 0 2em;
+-}
+-
+-.quote {
+- font-size: 1.15em;
+- margin: 0 0 .5em;
+- text-align: center;
+-}
+-
+-.title {
+- /* opacity: 0; */
+- /* transition: opacity 500ms; */
+-}
+-
+-.titlefadein {
+- opacity: 1;
+- transition: opacity 500ms;
+-}
+-
+-.grid {
+- margin: 0 -15px;
+- letter-spacing: -.31em;
+- word-spacing: -.43em;
+- text-rendering: optimizespeed
+-}
+-
+-.grid-title {
+- text-align: left;
+-}
+-
+-.grid-cell {
+- display: inline-block;
+- letter-spacing: normal;
+- text-align: left;
+- text-rendering: auto;
+- vertical-align: top;
+- width: 50%;
+- word-spacing: normal
+-}
+-
+-.grid-cell > * {
+- padding: 0 15px
+-}
+-
+-.inline-block-list {
+- list-style-type: none;
+- margin: 0;
+- padding: 0
+-}
+-
+-.inline-block-list li {
+- display: inline-block;
+- margin: 0 0 0 1.5em;
+- padding: 0;
+- vertical-align: top
+-}
+-
+-.inline-block-list li:first-child {
+- margin-left: 0
+-}
+-
+-.flex-embed {
+- background-color: #000;
+- box-shadow: 0 0 10px #000;
+- height: 0;
+- overflow: hidden;
+- padding-bottom: 56.25%;
+- position: relative
+-}
+-
+-.flex-embed a, .flex-embed img {
+- bottom: 0;
+- height: 100%;
+- left: 0;
+- position: absolute;
+- top: 0;
+- width: 100%
+-}
+-
+-.flex-embed .play-btn {
+- background: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBkPSJNMjU2LDkyLjQ4MWM0NC40MzMsMCw4Ni4xOCwxNy4wNjgsMTE3LjU1Myw0OC4wNjRDNDA0Ljc5NCwxNzEuNDExLDQyMiwyMTIuNDEzLDQyMiwyNTUuOTk5cy0xNy4yMDYsODQuNTg4LTQ4LjQ0OCwxMTUuNDU1Yy0zMS4zNzIsMzAuOTk0LTczLjEyLDQ4LjA2NC0xMTcuNTUyLDQ4LjA2NHMtODYuMTc5LTE3LjA3LTExNy41NTItNDguMDY0QzEwNy4yMDYsMzQwLjU4Nyw5MCwyOTkuNTg1LDkwLDI1NS45OTlzMTcuMjA2LTg0LjU4OCw0OC40NDgtMTE1LjQ1M0MxNjkuODIxLDEwOS41NSwyMTEuNTY4LDkyLjQ4MSwyNTYsOTIuNDgxIE0yNTYsNTIuNDgxIGMtMTEzLjc3MSwwLTIwNiw5MS4xMTctMjA2LDIwMy41MThjMCwxMTIuMzk4LDkyLjIyOSwyMDMuNTIsMjA2LDIwMy41MmMxMTMuNzcyLDAsMjA2LTkxLjEyMSwyMDYtMjAzLjUyQzQ2MiwxNDMuNTk5LDM2OS43NzIsNTIuNDgxLDI1Niw1Mi40ODFMMjU2LDUyLjQ4MXogTTIwNi41NDQsMzU3LjE2MVYxNTkuODMzbDE2MC45MTksOTguNjY2TDIwNi41NDQsMzU3LjE2MXoiPjwvcGF0aD48L3N2Zz4K);
+- height: 150px;
+- left: 50%;
+- margin-left: -75px;
+- margin-top: -75px;
+- position: absolute;
+- top: 50%;
+- -webkit-transition: 1s;
+- transition: 1s;
+- width: 150px
+-}
+-
+-.flex-embed:hover .play-btn {
+- opacity: .5
+-}
+-
+-.clearfix:after, .clearfix:before {
+- content: ' ';
+- display: table
+-}
+-
+-.clearfix:after {
+- clear: both
+-}
+-
+-.clearfix {
+- *zoom: 1
+-}
+-
+-.container {
+- margin: 0 auto;
+- max-width: 760px;
+- padding: 0 10px
+-}
+-
+-.aside {
+- background-color: #eee;
+- border: solid #e3e3e3;
+- border-width: 1px 0;
+- font-size: 1.125em;
+- padding: 1em 0
+-}
+-
+-.btn, .cta-option {
+- display: inline-block;
+- position: relative
+-}
+-
+-.cta-option {
+- margin: 2.5em .5em 0;
+- vertical-align: top
+-}
+-
+-.btn {
+- color: #fff;
+- font-size: 1.5em;
+- padding: .6em 1em;
+- text-decoration: none;
+- text-shadow: 0 -1px 0 rgba(0, 0, 0, .5);
+- vertical-align: middle;
+- border-radius: 4px;
+- border: 1px solid #333
+-}
+-
+-.btn:active, .btn:focus, .btn:hover {
+- text-decoration: none
+-}
+-
+-.btn-download {
+- background-color: #d9750b;
+- background-image: -webkit-linear-gradient(#f90 10%, #e76a00 100%);
+- background-image: linear-gradient(#f90 10%, #e76a00 100%);
+- box-shadow: 0 1px 0 rgba(255, 255, 255, .5) inset, 0 1px 3px rgba(0, 0, 0, .2);
+- border: 1px solid #995309
+-}
+-
+-.btn-download:active, .btn-download:focus, .btn-download:hover {
+- background-color: #e0811b;
+- background-image: -webkit-linear-gradient(#f0a100 10%, #f70 100%);
+- background-image: linear-gradient(#f0a100 10%, #f70 100%)
+-}
+-
+-.btn-download:active {
+- background-color: #cf6a00;
+- box-shadow: 0 2px 3px 0 rgba(0, 0, 0, .2) inset
+-}
+-
+-.btn-alt {
+- background-color: #444;
+- border-color: #222;
+- box-shadow: none;
+- font-size: 1.25em;
+- margin-top: .25em
+-}
+-
+-.btn-alt:active, .btn-alt:focus, .btn-alt:hover {
+- background-color: #555
+-}
+-
+-.star {
+- color: #e08524
+-}
+-
+-.Icon {
+- display: inline-block;
+- height: 16px;
+- margin: -3px 1px 0 0;
+- vertical-align: middle;
+- width: 16px
+-}
+-
+-.Icon--github {
+- background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjEgMTIxIj48ZyBmaWxsPSIjMTkxNzE3Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTYwLjUgMS42Yy0zMy4zIDAtNjAuNCAyNy02MC40IDYwLjQgMCAyNi43IDE3LjMgNDkuMyA0MS4zIDU3LjMgMyAuNiA0LjEtMS4zIDQuMS0yLjkgMC0xLjQtLjEtNi4yLS4xLTExLjItMTYuNyAzLjYtMjAuMy03LjItMjAuMy03LjItMi43LTctNi43LTguOC02LjctOC44LTUuNS0zLjcuNC0zLjcuNC0zLjcgNi4xLjQgOS4zIDYuMiA5LjMgNi4yIDUuNCA5LjIgMTQuMSA2LjYgMTcuNiA1IC41LTMuOSAyLjEtNi42IDMuOC04LjEtMTMuNC0xLjQtMjcuNS02LjYtMjcuNS0yOS44IDAtNi42IDIuNC0xMiA2LjItMTYuMi0uNi0xLjUtMi43LTcuNy42LTE2IDAgMCA1LjEtMS42IDE2LjYgNi4yIDQuOC0xLjMgMTAtMiAxNS4xLTJzMTAuMy43IDE1LjEgMmMxMS41LTcuOCAxNi42LTYuMiAxNi42LTYuMiAzLjMgOC4zIDEuMiAxNC41LjYgMTYgMy45IDQuMiA2LjIgOS42IDYuMiAxNi4yIDAgMjMuMi0xNC4xIDI4LjMtMjcuNSAyOS44IDIuMiAxLjkgNC4xIDUuNSA0LjEgMTEuMiAwIDguMS0uMSAxNC42LS4xIDE2LjYgMCAxLjYgMS4xIDMuNSA0LjEgMi45IDI0LTggNDEuMy0zMC42IDQxLjMtNTcuMyAwLTMzLjQtMjctNjAuNC02MC40LTYwLjR6Ii8+PHBhdGggZD0iTTIzIDg4LjNjLS4xLjMtLjYuNC0xIC4ycy0uNy0uNi0uNS0uOWMuMS0uMy42LS40IDEtLjJzLjYuNi41Ljl6bS0uOC0uNU0yNS40IDkxYy0uMy4zLS45LjEtMS4yLS4zLS40LS40LS41LTEtLjItMS4zLjMtLjMuOC0uMSAxLjIuMy41LjUuNSAxLjEuMiAxLjN6bS0uNS0uNk0yNy44IDk0LjVjLS40LjMtMSAwLTEuMy0uNS0uNC0uNS0uNC0xLjIgMC0xLjQuNC0uMyAxIDAgMS4zLjUuNC41LjQgMS4xIDAgMS40em0wIDBNMzEuMSA5Ny45Yy0uMy40LTEgLjMtMS42LS4yLS41LS41LS43LTEuMi0uMy0xLjUuMy0uNCAxLS4zIDEuNi4yLjUuNC42IDEuMS4zIDEuNXptMCAwTTM1LjYgOTkuOGMtLjEuNS0uOC43LTEuNS41LS43LS4yLTEuMS0uOC0xLTEuMi4xLS41LjgtLjcgMS41LS41LjcuMiAxLjEuNyAxIDEuMnptMCAwTTQwLjUgMTAwLjJjMCAuNS0uNi45LTEuMy45LS43IDAtMS4zLS40LTEuMy0uOXMuNi0uOSAxLjMtLjljLjcgMCAxLjMuNCAxLjMuOXptMCAwTTQ1LjEgOTkuNGMuMS41LS40IDEtMS4xIDEuMS0uNy4xLTEuMy0uMi0xLjQtLjctLjEtLjUuNC0xIDEuMS0xLjEuNy0uMSAxLjMuMiAxLjQuN3ptMCAwIi8+PC9nPjwvc3ZnPgo=)
+-}
+-
+-.Icon--html5 {
+- background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjUwIDEwMSA0MTIgNDEyIj48cGF0aCBmaWxsPSIjRTQ0RDI2IiBkPSJNMTA3LjY0NCA0NzAuODc3bC0zMy4wMTEtMzcwLjI1N2gzNjIuNzM0bC0zMy4wNDYgMzcwLjE5OS0xNDguNTQzIDQxLjE4MXoiLz48cGF0aCBmaWxsPSIjRjE2NTI5IiBkPSJNMjU2IDQ4MC41MjNsMTIwLjAzLTMzLjI3NyAyOC4yNC0zMTYuMzUyaC0xNDguMjd6Ii8+PHBhdGggZmlsbD0iI0VCRUJFQiIgZD0iTTI1NiAyNjguMjE3aC02MC4wOWwtNC4xNS00Ni41MDFoNjQuMjR2LTQ1LjQxMWgtMTEzLjg2OGwxLjA4NyAxMi4xODMgMTEuMTYxIDEyNS4xMzloMTAxLjYyem0wIDExNy45MzZsLS4xOTkuMDUzLTUwLjU3NC0xMy42NTYtMy4yMzMtMzYuMjE3aC00NS41ODVsNi4zNjIgNzEuMzAxIDkzLjAyIDI1LjgyMy4yMDktLjA1OHoiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMjU1Ljg0MyAyNjguMjE3djQ1LjQxaDU1LjkxOGwtNS4yNzEgNTguODk0LTUwLjY0NyAxMy42N3Y0Ny4yNDRsOTMuMDk0LTI1LjgwMS42ODMtNy42NzIgMTAuNjcxLTExOS41NTEgMS4xMDgtMTIuMTk0aC0xMi4yMzd6bTAtOTEuOTEydjQ1LjQxMWgxMDkuNjg4bC45MTEtMTAuMjA3IDIuMDY5LTIzLjAyMSAxLjA4Ni0xMi4xODN6Ii8+PC9zdmc+Cg==)
+-}
+-
+-.Icon--stackoverflow {
+- background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjMgMi44IDU4LjIgNTgiPjxwYXRoIGQ9Ik05LjMwNSAzNi44NDhsNC40MDEuMDQzLS4xNTMgMTkuNTk4aDI5LjI5MXYtMTkuNTI4aDQuNjM4djI0LjI4N2gtMzguMjAxbC4wMjQtMjQuNDAxem03LjE3NyAxMS41ODZoMjIuOTQ1djQuODgyaC0yMi45NDV6IiBmaWxsPSIjOTE5MTkxIi8+PHBhdGggZmlsbD0iI2E3OGI2OCIgZD0iTTE3LjAyIDM5LjY0OGwyMi45NiAyLjIxNi0uNDgxIDQuOTgxLTIyLjk2LTIuMjE2eiIvPjxwYXRoIGZpbGw9IiNjMTk2NTMiIGQ9Ik0xOS4xMjEgMjkuNzEzbDIyLjIgNi4yNjYtMS4zNTkgNC44MTYtMjIuMi02LjI2NnoiLz48cGF0aCBmaWxsPSIjZDQ4YzI4IiBkPSJNMjQuNTAxIDE4LjQ4NGwxOS43NDUgMTEuOTI2LTIuNTg3IDQuMjgzLTE5Ljc0NS0xMS45MjZ6Ii8+PHBhdGggZmlsbD0iI2ZlODkwOCIgZD0iTTM1LjczMyA3Ljg0OWwxMy40MzUgMTguNzUxLTQuMDY4IDIuOTE0LTEzLjQzNS0xOC43NTF6Ii8+PHBhdGggZmlsbD0iI2ZmN2ExNSIgZD0iTTUxLjM0IDIuNzUxbDMuODAyIDIyLjc1Mi00LjkzNi44MjUtMy44MDItMjIuNzUyeiIvPjwvc3ZnPgo=)
+-}
+-
+-.site-header {
+- padding-top: 50px
+-}
+-
+-.site-logo {
+- color: #fff;
+- float: left;
+- font-size: 25px;
+- font-weight: 700;
+- line-height: 32px;
+- text-decoration: none;
+- text-shadow: 2px 2px 0 #000;
+- text-transform: uppercase
+-}
+-
+-.site-nav {
+- float: right;
+- list-style-type: none;
+- margin: 7px 0 0;
+- padding: 0
+-}
+-
+-.site-nav a {
+- color: #ffa000;
+- display: block;
+- text-decoration: none;
+- text-transform: uppercase
+-}
+-
+-.site-nav a:active, .site-nav a:focus, .site-nav a:hover {
+- color: #fff
+-}
+-
+-.site-promo {
+- padding: 4em 0 6em;
+- color: white;
+-}
+-
+-.site-promo .description {
+- color: #ddd;
+- font-size: 1.2em;
+- margin: 1em 2em 0
+-}
+-
+-.last-update {
+- color: #999;
+- display: block;
+- font-size: .75em;
+- margin-top: 10px
+-}
+-
+-.site-section {
+- background-color: #f9f9f9;
+- color: #333;
+- overflow: hidden;
+- padding: 2em 0 2em
+-}
+-
+-.site-section-gray {
+- background-color: #f5f5f5;
+- color: #333;
+- overflow: hidden;
+- padding: 2em 0 2em
+-}
+-
+-.site-section-dark {
+- background-color: transparent;
+- color: #fff;
+- text-align: center;
+- padding: 2em 0 3em
+-}
+-
+-.site-section-dark .content {
+- max-width: 720px;
+- margin: auto;
+- padding: 10px
+-}
+-
+-.site-section-dark h2 {
+- margin: 1em 0
+-}
+-.site-section-dark h3 {
+- color: white;
+-}
+-
+-.in-the-wild {
+- font-size: 1.25em;
+- margin: 0 auto;
+- max-width: 720px
+-}
+-
+-.site-footer {
+- font-size: .875em;
+- padding: 2em
+-}
+-
+-.site-footer a {
+- color: #ffa000
+-}
+-
+-@media only screen and (max-width: 800px) {
+- .site-logo, .site-nav {
+- float: none
+- }
+-
+- .site-nav li {
+- margin: 0 .5em
+- }
+-
+- .site-header {
+- padding-top: 40px
+- }
+-
+- .site-promo {
+- padding: 3em 0;
+- color: white;
+- }
+-
+- .site-section {
+- padding: 0 1em 4em
+- }
+-}
+-
+-@media only screen and (max-width: 600px) {
+- html {
+- font-size: 14px
+- }
+-
+- .last-update, .site-footer {
+- font-size: 1em
+- }
+-}
+-
+-@media only screen and (max-width: 460px) {
+- .grid-cell {
+- width: 100%
+- }
+-}
+-
+-@media only screen and (max-width: 420px) {
+- h1 {
+- font-size: 2.5em
+- }
+-
+- html {
+- font-size: 13px
+- }
+-}
+-
+-@media print {
+- * {
+- background-color: transparent !important;
+- box-shadow: none !important;
+- color: #000 !important;
+- text-shadow: none !important
+- }
+-
+- a, a:visited {
+- text-decoration: underline
+- }
+-
+- img {
+- page-break-inside: avoid;
+- max-width: 100% !important
+- }
+-
+- h1 {
+- padding: 1em 0 0
+- }
+-
+- .site-promo {
+- margin: 1em;
+- padding: 0;
+- color: white;
+- }
+-
+- .site-section {
+- padding: 0;
+- margin: 2em 1em
+- }
+-
+- .site-section-dark {
+- display: none
+- }
+-
+- h2, h3, p {
+- orphans: 3;
+- widows: 3
+- }
+-
+- h2, h3 {
+- page-break-after: avoid
+- }
+-}
+-</style>
+-
+-<script>
+- // --- OPTIONS FOR THE DASHBOARD --
+-
+- // this section has to appear before loading dashboard.js
+-
+- // Select a theme.
+- // uncomment on of the two themes:
+-
+- // var netdataTheme = 'default'; // this is white
+- var netdataTheme = 'slate'; // this is dark
+-
+- var netdataNoBootstrap = true;
+-
+- // Set the default netdata server.
+- // on charts without a 'data-host', this one will be used.
+- // the default is the server that dashboard.js is downloaded from.
+-
+- // var netdataServer = 'http://my.server:19999/';
+-</script>
+-
+-<!--
+- --- LOAD dashboard.js ---
+-
+- to host this HTML file on your web server,
+- you have to load dashboard.js from the netdata server.
+-
+- So, pick one the two below
+- If you pick the first, set the server name/IP.
+-
+- The second assumes you host this file on /usr/share/netdata/web
+- and that you have chown it to be owned by netdata:netdata
+--->
+-<!-- <script type="text/javascript" src="http://my.server:19999/dashboard.js"></script> -->
+-<script type="text/javascript" src="dashboard.js?v20190902-0"></script>
+-
+-<script>
+- // --- OPTIONS FOR THE CHARTS --
+-
+- // destroy charts not shown (lowers memory on the browsers)
+- // set this to 'true' to destroy, 'false' to hide the charts
+- NETDATA.options.current.destroy_on_hide = false;
+-
+- // set this to false, to always show all dimensions
+- NETDATA.options.current.eliminate_zero_dimensions = true;
+-
+- // set this to false, to lower the pressure on the browser
+- NETDATA.options.current.concurrent_refreshes = true;
+-
+- // if you need to support slow mobile phones, set this to false
+- NETDATA.options.current.parallel_refresher = true;
+-
+- // set this to false, to always update the charts, even if focus is lost
+- NETDATA.options.current.stop_updates_when_focus_is_lost = true;
+-
+- // since we have many servers and limited sockets,
+- // abort ajax calls when we scroll
+- NETDATA.options.current.abort_ajax_on_scroll = true;
+-
+- // do not to give errors on netdata demo servers for 60 seconds
+- NETDATA.options.current.retries_on_data_failures = 60;
+-</script>
+-
+-<style>
+- .mygauge-combo {
+- display: inline-block;
+- }
+-
+- .mygauge-combo20 {
+- display: inline-block;
+- min-width: 150px;
+- width: 49%;
+- padding-top: 40px;
+- text-align: center;
+- }
+-
+- .mygauge-combo30 {
+- display: inline-block;
+- min-width: 150px;
+- width: 32%;
+- padding-top: 40px;
+- text-align: center;
+- }
+-
+- .mygauge {
+- position: relative;
+- display: block;
+- width: 171px;
+- /* height: 150px; */
+- }
+-
+- .mygauge-button {
+- display: block;
+- }
+-
+- .mygauge-legend-button {
+- font-size: 13px;
+- }
+-
+- .mygause-donation {
+- font-size: 9px;
+- color: #999;
+- }
+-
+- .mysparkline {
+- position: relative;
+- display: inline-block;
+- width: 100%;
+- height: 50px;
+- text-align: left;
+- }
+-
+- .mysparkline-overchart-label {
+- position: absolute;
+- display: block;
+- top: -15px;
+- left: 10px;
+- bottom: 0;
+- right: 0;
+- font-size: 14px;
+- z-index: 1;
+- pointer-events: none;
+- }
+-
+- .mysparkline-overchart-label2 {
+- position: absolute;
+- display: block;
+- top: -15px;
+- left: 10px;
+- bottom: 0;
+- right: 0;
+- font-size: 8px;
+- color: #676b70;
+- z-index: 1;
+- pointer-events: none;
+- }
+-
+- .mysparkline-overchart-value {
+- position: absolute;
+- display: block;
+- top: 0px;
+- left: 10px;
+- bottom: 0;
+- right: 0;
+- font-size: 40px;
+- z-index: 2;
+- text-shadow: #333 0px 0px 2px;
+- pointer-events: none;
+- }
+-
+- .mysparkline-overchart-value-center {
+- position: absolute;
+- display: block;
+- top: 5px;
+- left: 0px;
+- bottom: 0;
+- right: 0;
+- font-size: 35px;
+- font-weight: bold;
+- text-align: center;
+- z-index: 2;
+- text-shadow: #333 0px 0px 2px;
+- pointer-events: none;
+- }
+-
+- .fb-share-button span {
+- top: 0px;
+- }
+- .fb-like span {
+- top: 0px;
+- }
+- .fb-follow span {
+- top: 0px;
+- }
+-
+-</style>
+-</head>
+-<body>
+-<div class=container>
+- <div class="site-header clearfix" role=banner>
+- <div class=site-logo>my-netdata.io</div>
+- <ul class="site-nav inline-block-list">
+- <li><a href=https://github.com/netdata/netdata data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label="Source code" target="_blank">Source code</a>
+- <li><a href=https://docs.netdata.cloud data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Docs target="_blank">Docs</a>
+- </ul>
+- </div>
+- <div class=site-promo><h1><span class="title">Monitor your systems and applications, the right way!</span></h1>
+- <p class=description>
+- <strong>Unparalleled</strong> insights, in <strong>real-time</strong>,
+- of <strong>everything</strong> happening on your systems and applications,
+- with stunning, <strong>interactive</strong> web dashboards
+- and powerful <strong>performance</strong> and <strong>health</strong> alarms.
+- <div class=cta-option>
+- <a class="btn btn-download" href="https://docs.netdata.cloud/packaging/installer/" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Install><strong>Install netdata now</strong></a>
+- <a class=last-update href="https://github.com/netdata/netdata/releases" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Releases>See netdata releases</a></div>
+- <div class=cta-option>
+- <a class="btn btn-alt" href="#demosites" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Demo>netdata live demo</a>
+- </div>
+- </div>
+-</div>
+-<div class=site-section>
+- <div class=container><h2>Enter the world of Netdata!</h2>
+- <div class="grid-title">
+- <h3><span class=star>★</span> 1s granularity</h3>
+- </div>
+- <div class=grid>
+- <div class=grid-cell>
+- <p>
+- <b>Per second</b> data collection and visualization, for all metrics!
+- </p>
+- <p>
+- Netdata <b>zooms into the problems</b> by providing higher resolution information, compared to any other monitoring solution.
+- </p>
+- </div>
+- <div class=grid-cell>
+- <p class="quote"><i>
+- The world goes real-time.
+- <br/> <br/>
+- High resolution metrics are required to effectively monitor and troubleshoot systems and applications, especially on virtual environments.
+- </i></p>
+- </div>
+- </div>
+- </div>
+- <div>
+- <a href="https://docs.netdata.cloud/docs/why-netdata/1s-granularity/">Learn more about high resolution metrics</a>
+- </div>
+-</div>
+-
+-<div class="site-section site-section-gray">
+- <div class=container>
+- <div class="grid-title">
+- <h3><span class=star>★</span> Unlimited metrics</h3>
+- </div>
+- <div class=grid>
+- <div class=grid-cell>
+- <p>
+- Use all the metrics, from all available sources!
+- </p>
+- <p>
+- Netdata collects all the metrics native console tools do. It has been <b>designed to kill the console</b> for troubleshooting infrastructure slowdowns and outages.
+- </p>
+- </div>
+- <div class=grid-cell>
+- <p class="quote"><i>
+- All metrics are important and all should be available when you need them.
+- <br/> <br/>
+- Filtering out most metrics is like reading a book by skipping most of its pages.
+- </i></p>
+- </div>
+- </div>
+- </div>
+- <div>
+- <a href="https://docs.netdata.cloud/docs/why-netdata/unlimited-metrics/">Learn more about unlimited metrics</a>
+- </div>
+-</div>
+-<div class="site-section">
+- <div class=container>
+- <div class="grid-title">
+- <h3><span class=star>★</span> Meaningful presentation</h3>
+- </div>
+- <div class=grid>
+- <div class=grid-cell>
+- <p>
+- Explore all metrics in a meaningful, easy to understand way!
+- </p>
+- <p>
+- Netdata engineers and experts on our community organize metrics in a meaningful way, so that you can learn and understand them right on the job, while troubleshooting issues of your infrastructure.
+- </p>
+- </div>
+- <div class=grid-cell>
+- <p class="quote"><i>
+- Metrics are a lot more than name-value pairs over time.
+- <br/> <br/>
+- It is just not practical to require from all users to have a deep understanding of all metrics for monitoring their systems and applications.
+- </i></p>
+- </div>
+- </div>
+- </div>
+- <div>
+- <a href="https://docs.netdata.cloud/docs/why-netdata/meaningful-presentation/">Learn more about meaningful presentation</a>
+- </div>
+-</div>
+-
+-<div class="site-section site-section-gray">
+- <div class=container>
+- <div class="grid-title">
+- <h3><span class=star>★</span> Immediate results</h3>
+- </div>
+- <div class=grid>
+- <div class=grid-cell>
+- <p>
+- Install and use immediately! Get fully functional visualization and alarms, in just a couple of seconds after installation!
+- </p>
+- <p>
+- Netdata <b>decouples your skills from your monitoring infrastructure</b>.
+- No matter how skillful or novice you are, Netdata will apply all the community knowledge and expertise to your monitoring infrastructure.
+- </p>
+- </div>
+- <div class=grid-cell>
+- <p class="quote"><i>
+- Most of our infrastructure is based on standardized systems and applications.
+- <br/> <br/>
+- It is a tremendous waste of time and effort, in a global scale, to require from all users to configure their infrastructure dashboards and alarms metric by metric.
+- </i></p>
+- </div>
+- </div>
+- </div>
+- <div>
+- <a href="https://docs.netdata.cloud/docs/why-netdata/immediate-results/">Learn more about immediate results</a>
+- </div>
+-</div>
+-
+-<div class="site-section site-section-dark">
+- <div class=container><h2>How it works</h2>
+- <div style="padding-bottom: 1em">
+- <p>
+- Netdata is a monitoring agent you install on all your systems:
+- <br/>
+- <b>physical servers</b>, <b>virtual servers</b>, <b>containers</b>, <b>IoT</b>.
+- </p>
+- <p>
+- Netdata is lightweight, designed to permanently run on all systems without disrupting their core function.
+- By default, it needs just 1% CPU of a single core, a few MB or RAM and no disk I/O at all.
+- </p>
+- <p>
+- Each Netdata is (by default) autonomous, taking care of all the following.
+- <br/>But all your Netdata are integrated into one large distributed application.
+- </p>
+- </div>
+- <div class=grid>
+- <div class=grid-cell><h3><span class=star>★</span> Collect</h3>
+- <p>
+- Netdata automatically detects data collection sources on the host it runs.
+- It comes with hundreds of plugins for collecting system and application metrics,
+- including databases, web servers, and commonly used application servers.
+- <br/> <br/>
+- Netdata is also a high performance, distributed <b>statsd server</b>, allowing custom
+- application metrics to be collected and visualized.
+- </p>
+- </div>
+- <div class=grid-cell><h3><span class=star>★</span> Check (alarms)</h3>
+- <p>
+- Each Netdata spawns a thread that examines the metrics as they get collected,
+- evaluates pre-configured alarm expressions and triggers alarm notifications.
+- <br/> <br/>
+- Netdata comes with hundreds of alarms to detect common system and application issues,
+- that are automatically attached to the collected metrics,
+- supporting dozens of alarm notification integrations.
+- </p>
+- </div>
+- <div class=grid-cell><h3><span class=star>★</span> Stream</h3>
+- <p>
+- Each Netdata can stream its metrics, in real-time, to any other Netdata.
+- Streaming allows Netdata to be used in ephemeral nodes and containers in auto-scaled environments,
+- but it also allows building Netdata hierarchies for aggregating the metrics of multiple Netdata nodes.
+- </p>
+- </div>
+- <div class=grid-cell><h3><span class=star>★</span> Store</h3>
+- <p>
+- Each Netdata has its own internal metrics database. This database is optimized
+- for minimal memory footprint, and due to its lockless design allows one writer
+- and multiple readers per metric, concurrently, contributing significantly to
+- the performance of Netdata.
+- </p>
+- </div>
+- <div class=grid-cell><h3><span class=star>★</span> Archive</h3>
+- <p>
+- Netdata can archive its metrics to time-series databases (prometheus, graphite, opentsdb, json document dbs, etc)
+- so that Netdata can be integrated to existing monitoring tool-chains.
+- </p>
+- </div>
+- <div class=grid-cell><h3><span class=star>★</span> Visualize</h3>
+- <p>
+- The best part of Netdata is its visualization. Low latency, speedy and snazzy.
+- <br/> <br/>
+- Netdata dashboards are optimized for visual anomaly detection, a powerful tool to troubleshoot
+- performance issues.
+- </p>
+- </div>
+- </div>
+- </div>
+-</div>
+-
+-<div class="site-section">
+-
+-</div>
+-
+-
+-<div id="demosites" class="site-section site-section-dark"><h2>netdata live demo sites</h2>
+- <div class="content">
+- <div class="container" style="text-align: center;">
+-
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//london.my-netdata.io"
+- data-title="EU - London"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#558855"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//london.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoLondon><strong>Enter London!</strong></a>
+- <div class="mygause-donation">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//atlanta.my-netdata.io"
+- data-title="US - Atlanta"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#AA5555"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//atlanta.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoAtlanta><strong>Enter Atlanta!</strong></a>
+- <div class="mygause-donation">
+- Donated by CDN77.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//sanfrancisco.my-netdata.io"
+- data-title="US - California"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#5555AA"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//sanfrancisco.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoSanfrancisco><strong>Enter California!</strong></a>
+- <div class="mygause-donation">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//toronto.my-netdata.io"
+- data-title="Canada"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#885588"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//toronto.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoToronto><strong>Enter Canada!</strong></a>
+- <div class="mygause-donation">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <br/> <br/>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//frankfurt.my-netdata.io"
+- data-title="EU - Germany"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#AAAA55"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//frankfurt.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoFrankfurt><strong>Enter Germany!</strong></a>
+- <div class="mygause-donation">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//newyork.my-netdata.io"
+- data-title="US - New York"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#BB5533"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//newyork.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoNewYork><strong>Enter New York!</strong></a>
+- <div class="mygause-donation">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//singapore.my-netdata.io"
+- data-title="Singapore"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#5588BB"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//singapore.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoSingapore><strong>Enter Singapore!</strong></a>
+- <div class="mygause-donation">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//bangalore.my-netdata.io"
+- data-title="India"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#BB55BB"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//bangalore.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoBangalore><strong>Enter India!</strong></a>
+- <div class="mygause-donation">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div style="padding-top: 20px;">
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div style="padding-bottom: 20px; font-size: 10px; color: #676b70;">
+- <b>Israel</b>
+- </div>
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label2">
+- requests/s
+- </div>
+- <div class="mysparkline-overchart-value" id="octopuscs.requests.netdata" >
+- </div>
+- <div data-netdata="netdata.requests"
+- data-dimensions="requests"
+- data-host="//octopuscs.my-netdata.io"
+- data-common-max="top-gauges"
+- data-decimal-digits="0"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#4BFF91"
+- data-show-value-of-requests-at="octopuscs.requests.netdata"
+- ></div>
+- </div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//octopuscs.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoOctopuscs><strong>Enter Israel!</strong></a>
+- <div class="mygause-donation">
+- Donated by octopuscs.com
+- </div>
+- </div>
+- </div>
+-
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div style="padding-bottom: 20px; font-size: 10px; color: #676b70;">
+- <b>EU - Spain</b>
+- </div>
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label2">
+- requests/s
+- </div>
+- <div class="mysparkline-overchart-value" id="stackscale.requests.netdata" >
+- </div>
+- <div data-netdata="netdata.requests"
+- data-dimensions="requests"
+- data-host="//stackscale.my-netdata.io"
+- data-common-max="top-gauges"
+- data-decimal-digits="0"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#4B91FF"
+- data-show-value-of-requests-at="stackscale.requests.netdata"
+- ></div>
+- </div>
+- </div>
+- <div class="mygauge-button">
+- <a class="btn btn-alt mygauge-legend-button" href=//stackscale.my-netdata.io/default.html data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=DemoStackScale><strong>Enter Madrid!</strong></a>
+- <div class="mygause-donation">
+- Donated by stackscale.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- </div>
+- </div>
+- </div>
+- </div>
+-
+- <div class="container" style="padding-top: 40px; text-align: center;">
+- Charts are coming from all servers, <b>in parallel</b>.
+- <br/>
+- The servers are <b>not aware</b> of this multi-server dashboard.
+- </div>
+-
+- <div class="container" style="padding-top: 40px; padding-bottom: 40px; text-align: center;">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>EU - London</b> connected clients
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.connections.netdata" >
+- </div>
+- <div data-netdata="nginx_local.connections"
+- data-dimensions="active"
+- data-host="//london.my-netdata.io"
+- data-decimal-digits="0"
+- data-common-max="web-connections"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855"
+- data-show-value-of-active-at="nginx_local.connections.netdata"
+- ></div>
+- </div>
+- </div>
+-
+- <div class="container" style="padding-top: 0px; text-align: center;">
+- Each server is <b>not aware</b> of the other servers.
+- <br/>
+- But on this dashboard <b>they are one</b>! (hover on the chart above)
+- </div>
+-
+-
+- <!--
+- <div style="padding-top: 40px; color: #999;">
+- <small>We would love to show demos of IoT devices running netdata.<br/>
+- If you can host at your DC an RPi or a Linux IoT, <a href="mailto:costa@tsaousis.gr?subject=I can host IoT for netdata&body=Hi Costa,%0D%0A%0D%0AI would love to host an IoT device to demo netdata on it.%0D%0A%0D%0A-- please tell me who you are and what infrastructure you have --%0D%0A-- Take into account I would need SSH access to it --%0D%0A-- You have to have a DC - a home is not good enough - sorry. --%0D%0A%0D%0AThanks!">contact me</a>.</small>
+- </div>
+- -->
+- </div>
+-</div>
+-
+-<div class=site-section><h2>Who uses netdata?</h2>
+- <div class="content">
+- <div class="container" style="text-align: center;">
+- <p>
+- Netdata is used by hundreds of thousands of users all over the world.
+- <br/> <br/>
+- Check our <a href="https://github.com/netdata/netdata/watchers">GitHub watchers</a> list.
+- <br/>
+- You will find people working for <b>Amazon</b>, <b>Atos</b>, <b>Baidu</b>, <b>Cisco Systems</b>, <b>Citrix</b>,
+- <b>Deutsche Telekom</b>, <b>DigitalOcean</b>, <b>Elastic</b>, <b>EPAM Systems</b>, <b>Ericsson</b>, <b>Google</b>,
+- <b>Groupon</b>, <b>Hortonworks</b>, <b>HP</b>, <b>Huawei</b>, <b>IBM</b>, <b>Microsoft</b>, <b>NewRelic</b>,
+- <b>Nvidia</b>, <b>Red Hat</b>, <b>SAP</b>, <b>Selectel</b>, <b>TicketMaster</b>, <b>Vimeo</b>, and many more!
+- </p>
+- <small>
+- The following figures come from users using the <a href="https://github.com/netdata/netdata/tree/master/registry" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=GlobalRegistry>netdata public global registry</a>.<br/>Counting since May 16th 2016. Actual figures may be a lot higher.<br/></small>
+- <div class="container" style="padding-top: 40px; text-align: center; width: 30%; min-width: 220px; display: inline-block;">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- netdata <b>unique users</b>
+- </div>
+- <div class="mysparkline-overchart-value-center" id="netdata.registry_entries.persons.netdata" >
+- </div>
+- <div data-netdata="netdata.registry_entries"
+- data-dimensions="persons"
+- data-host="//london.my-netdata.io"
+- data-decimal-digits="0"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855"
+- data-show-value-of-persons-at="netdata.registry_entries.persons.netdata"
+- ></div>
+- </div>
+- </div>
+- <div class="container" style="padding-top: 40px; text-align: center; width: 30%; min-width: 220px; display: inline-block;">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- netdata <b>monitored servers</b>
+- </div>
+- <div class="mysparkline-overchart-value-center" id="netdata.registry_entries.machines.netdata" >
+- </div>
+- <div data-netdata="netdata.registry_entries"
+- data-dimensions="machines"
+- data-host="//london.my-netdata.io"
+- data-decimal-digits="0"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855 #558855 #558855"
+- data-show-value-of-machines-at="netdata.registry_entries.machines.netdata"
+- ></div>
+- </div>
+- </div>
+- <div class="container" style="padding-top: 40px; text-align: center; width: 30%; min-width: 220px; display: inline-block;">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- netdata <b>sessions served</b>
+- </div>
+- <div class="mysparkline-overchart-value-center" id="netdata.registry_sessions.sessions.netdata" >
+- </div>
+- <div data-netdata="netdata.registry_sessions"
+- data-dimensions="sessions"
+- data-host="//london.my-netdata.io"
+- data-decimal-digits="0"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855 #558855 #558855"
+- data-show-value-of-sessions-at="netdata.registry_sessions.sessions.netdata"
+- ></div>
+- </div>
+- </div>
+- <p>
+-
+- <!--
+- <embed src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_entries&dimensions=persons&label=user%20base&units=null&value_color=blue&precision=0&refresh=30&v42" type="image/svg+xml" height="20" />
+- <embed src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_entries&dimensions=machines&label=servers%20monitored&units=null&value_color=orange&precision=0&refresh=30&v42" type="image/svg+xml" height="20" />
+- <embed src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_sessions&label=sessions%20served&units=null&value_color=yellowgreen&precision=0&refresh=30&v42" type="image/svg+xml" height="20" />
+- <br/><i>(figures come from <a href="https://github.com/netdata/netdata/tree/master/registry" target="_blank">the public netdata registry</a> data, showing only installations that use this registry, counting since May 16th 2016)</i>
+- <br/>
+- -->
+- </p>
+- <p>
+- <small>
+- netdata can generate auto-refreshing <strong><a href="https://github.com/netdata/netdata/tree/master/web/api/badges#netdata-badges" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Badges>badges</a></strong>, like these:
+- </small>
+- <br/>
+- <embed style="padding-top: 10px; padding-bottom: 25px;" src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_entries&dimensions=persons&after=-86400&options=unaligned&group=incremental-sum&label=new%20users%20today&units=null&value_color=blue&precision=0&refresh=60&v42" type="image/svg+xml" height="20" />
+- <embed style="padding-top: 10px; padding-bottom: 25px;" src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_entries&dimensions=machines&group=incremental-sum&after=-86400&options=unaligned&label=servers%20added%20today&units=null&value_color=orange&precision=0&refresh=60&v42" type="image/svg+xml" height="20" />
+- <embed style="padding-top: 10px; padding-bottom: 25px;" src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_sessions&after=-86400&group=incremental-sum&options=unaligned&label=sessions%20served%20today&units=null&value_color=yellowgreen&precision=0&refresh=60&v42" type="image/svg+xml" height="20" />
+- <br/>
+- <small>These badges auto-refresh every minute.</small>
+- </p>
+- </div>
+- <div class="container" style="text-align: center;">
+- <strong>netdata</strong> is featured at the <a href="https://octoverse.github.com/2016/" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Octoverse>GitHub's state of the Octoverse 2016</a>
+- <div style="padding-top: 10px;">
+- <a href="https://octoverse.github.com/2016/" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=OctoverseImage>
+- <img src="https://cloud.githubusercontent.com/assets/2662304/21743260/23ebe62c-d507-11e6-80c0-76b95f53e464.png" width="90%" style="border-radius: 4px; border: 1px solid #fff;"/>
+- </a>
+- </div>
+- </div>
+- <div class=cta-option>
+- <a class="btn btn-download" href="https://docs.netdata.cloud/packaging/installer/" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=InstallAfterDemo><strong>Install netdata now</strong></a>
+- </div>
+- </div>
+-</div>
+-<div class=aside>
+- <div class=container>
+- <!-- Place this tag where you want the button to render. -->
+- <a class="github-button" href="https://github.com/netdata/netdata/subscription" data-style="mega" data-show-count="true" aria-label="Watch netdata/netdata on GitHub"><img src="https://img.shields.io/github/watchers/netdata/netdata.svg?style=flat&label=Github%20Watchers"></a>
+- <!-- Place this tag where you want the button to render. -->
+- <a class="github-button" href="https://github.com/netdata/netdata" data-style="mega" data-show-count="true" aria-label="Star netdata/netdata on GitHub"><img src="https://img.shields.io/github/stars/netdata/netdata.svg?style=flat&label=Github%20Stars"></a>
+- <!-- Place this tag where you want the button to render. -->
+- <a class="github-button" href="https://github.com/netdata/netdata/fork" data-style="mega" data-show-count="true" aria-label="Fork netdata/netdata on GitHub"><img src="https://img.shields.io/github/forks/netdata/netdata.svg?style=flat&label=Github%20Repo%20Forks"></a>
+- </div>
+-</div>
+-
+-<!-- the footer -->
+-<div class=site-footer role=contentinfo>
+- <p>
+- <div style="display: inline-block;">
+- <div style="vertical-align:top;display:inline-block; height: 34px;">twitter:</div>
+- <div style="vertical-align:top;display:inline-block; height: 34px;"><a class=twitter-share-button href=https://twitter.com/share data-count=none data-lang=en data-via=linuxnetdata data-size=small data-text="Get control of your Linux servers. Simple. Effective. Awesome." data-url=https://my-netdata.io/ >Tweet</a></div>
+- <div style="vertical-align:top;display:inline-block; height: 34px;"><a class=twitter-follow-button href=https://twitter.com/linuxnetdata data-show-count=false data-lang=en data-size=small>Follow @linuxnetdata</a></div>
+- </div>
+- <div style="display: inline-block;">
+- <div style="vertical-align:top;display:inline-block; height: 34px; padding-left: 10px;">facebook:</div>
+- <div class="fb-like" data-href="https://my-netdata.io/" data-layout="button" data-action="like" data-show-faces="false" data-share="false" style="vertical-align:top;display:inline-block; height: 34px;"></div>
+- <div class="fb-share-button" data-href="https://my-netdata.io/" data-layout="button" data-size="small" data-mobile-iframe="true"><a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fmy-netdata.io%2F&src=sdkpreparse" style="vertical-align:top;display:inline-block; height: 34px;">Share</a></div>
+- <div class="fb-follow" data-href="https://www.facebook.com/linuxnetdata/" data-layout="standard" data-size="small" data-show-faces="false" data-colorscheme="dark" width="225" style="vertical-align:top;display:inline-block; height: 34px;"></div>
+- </div>
+- </p>
+- <p>
+- <strong>netdata</strong><br/>
+- © Copyright 2018-2019, <a href="https://github.com/netdata" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=NetdataInc>Netdata</a><br/>
+- © Copyright 2016-2018, <a href="https://github.com/ktsaou" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=CostaTsaousis>Costa Tsaousis</a><br/>
+- Released under <a href="https://github.com/netdata/netdata/blob/master/LICENSE.md" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=License>GPL v3+</a><br/>
+- </p>
+- </p>
+- <p style="padding-top: 20px;">
+- netdata has received significant contributions from:<br/> <br/>
+- <a href="https://github.com/philwhineray" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Phil>Phil Whineray</a> (release management),<br/>
+- <a href="https://github.com/alonbl" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Alon>Alon Bar-Lev</a> (autoconf and automake),<br/>
+- <a href="https://github.com/titpetric" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=titpetric>Tit Petric</a> (docker image maintainer),<br/>
+- <a href="https://github.com/paulfantom" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Pawel>Paweł Krupa</a> (python.d.plugin and modules),<br/>
+- <a href="https://github.com/simonnagl" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=simonnagl>simonnagl</a> (disk plugin and more),<br/>
+- <a href="https://github.com/fredericopissarra" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=Frederico>Frederico Lamberti Pissarra</a> (performance improvements)<br/>
+- <a href="https://github.com/vlvkobal" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=VladimirKobal>Vladimir Kobal</a> (FreeBSD port)<br/>
+- <a href="https://github.com/l2isbad" target="_blank" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label=l2isbad>Ilya Mashchenko</a> (python plugin modules)<br/>
+- <br/>
+- and dozens more enthusiasts, engineers and professionals.<br/> <br/>
+- </p>
+- </p>
+- Thank you! You are awesome!
+- <p>
+-</div>
+-</body>
+-
+-<script>
+- if(window.location.hostname != 'my-netdata.io' || window.location.protocol != 'https:') {
+- var canonical = document.createElement('link');
+- canonical.rel = 'canonical';
+- canonical.href = 'https://my-netdata.io/';
+- document.head.appendChild(canonical);
+- }
+-</script>
+-
+-<script>!function (t, e) {
+- "use strict";
+- function a(t, n) {
+- return t.hasAttribute(n) === !0 ? t : t.parentNode !== r.body ? a(t.parentNode, n) : e
+- }
+-
+- function n(n) {
+- var o, i, r, c, g, u = a(n.target, "data-ga-action"), l = !1;
+- u !== e && (o = u.getAttribute("data-ga-action") || e, i = u.getAttribute("data-ga-category") || e, r = u.getAttribute("data-ga-label") || e, c = u.getAttribute("href"), g = parseInt(u.getAttribute("data-ga-value"), 10) || e, ga !== e && i !== e && o !== e && (n.preventDefault(), "Download" !== i && n.ctrlKey !== !0 && n.metaKey !== !0 && 2 !== n.which || (l = !0, t.open(c)), function (a) {
+- var n;
+- ga("send", "event", i, o, r, g, {
+- hitCallback: function () {
+- l === !1 && (n !== e && clearTimeout(n), t.location = a)
+- }
+- }), n = setTimeout(function () {
+- l === !1 && (t.location.href = a)
+- }, 1e3)
+- }(c)))
+- }
+-
+- function o() {
+- !function (t, e, a, n, o, i) {
+- t.GoogleAnalyticsObject = n, t[n] || (t[n] = function () {
+- (t[n].q = t[n].q || []).push(arguments)
+- }), t[n].l = +new Date, o = e.createElement(a), i = e.getElementsByTagName(a)[0], o.src = "//www.google-analytics.com/analytics.js", i.parentNode.insertBefore(o, i)
+- }(t, r, "script", "ga"), ga("create", "UA-64295674-3", "auto"), ga("send", "pageview", "/site"+window.location.pathname), t.document.addEventListener("click", n)
+- }
+-
+- function i() {
+- !function (t, e, a) {
+- var n, o = t.getElementsByTagName(e)[0];
+- t.getElementById(a) || (n = t.createElement(e), n.id = a, n.src = "//platform.twitter.com/widgets.js", o.parentNode.insertBefore(n, o))
+- }(r, "script", "twitter-wjs")
+- }
+-
+- var r = t.document;
+- o(), t.onload = i
+-}(window)</script>
+-
+-<!-- facebook sdk -->
+-<div id="fb-root"></div>
+-<script>
+- window.fbAsyncInit = function() {
+- FB.init({
+- appId : '1200089276712916',
+- xfbml : true,
+- version : 'v2.8'
+- });
+- };
+-
+- (function(d, s, id){
+- var js, fjs = d.getElementsByTagName(s)[0];
+- if (d.getElementById(id)) {return;}
+- js = d.createElement(s); js.id = id;
+- js.src = "//connect.facebook.net/en_US/sdk.js";
+- fjs.parentNode.insertBefore(js, fjs);
+- }(document, 'script', 'facebook-jssdk'));
+-</script>
+-
+-<script>
+- var allTitles = [
+- 'Get control<br/>of your Linux servers'
+- , 'Get control<br/>of your FreeBSD servers'
+- , 'Monitor<br/>your containers'
+- , 'Monitor<br/>your virtual machines'
+- , 'Monitor<br/>your web servers'
+- , 'Monitor<br/>your databases'
+- , 'Monitor<br/>your applications'
+- , 'Monitor<br/>your SNMP devices'
+- , 'Monitor<br/>your IoT devices'
+- , 'Monitor<br/>your MacOS systems'
+- ];
+- var lastTitle = -1;
+-
+- function updateTitle(){
+- lastTitle++;
+- if(lastTitle >= allTitles.length)
+- lastTitle = 0;
+-
+- var os = document.getElementsByClassName('title');
+- var len = os.length;
+- while (len--) {
+- var el = os[len];
+- el.innerHTML = allTitles[lastTitle];
+- el.classList.add('titlefadein');
+- }
+-
+- setTimeout(function() {
+- var os = document.getElementsByClassName('title');
+- var len = os.length;
+- while (len--)
+- os[len].classList.remove('titlefadein');
+-
+- }, 5750);
+- setTimeout(updateTitle, 6000);
+- }
+- //updateTitle();
+-</script>
+-
+-<!-- Start of HubSpot Embed Code -->
+-<script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/4567453.js"></script>
+-<!-- End of HubSpot Embed Code -->
+diff --git a/web/gui/demosites2.html b/web/gui/demosites2.html
+deleted file mode 100644
+index fe35cfb6..00000000
+--- a/web/gui/demosites2.html
++++ /dev/null
+@@ -1,1112 +0,0 @@
+-<!DOCTYPE html>
+-<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
+-<html lang="en">
+-<head>
+- <title>NetData - Real-time performance monitoring, done right!</title>
+- <meta name="application-name" content="netdata">
+-
+- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+- <meta charset="utf-8">
+- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+- <meta name="viewport" content="width=device-width, initial-scale=1">
+- <meta name="apple-mobile-web-app-capable" content="yes">
+- <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+-
+- <meta property="og:locale" content="en_US" />
+- <meta property="og:image" content="https://cloud.githubusercontent.com/assets/2662304/22945737/e98cd0c6-f2fd-11e6-96f1-5501934b0955.png"/>
+- <meta property="og:url" content="http://my-netdata.io/"/>
+- <meta property="og:type" content="website"/>
+- <meta property="og:site_name" content="netdata"/>
+- <meta property="og:title" content="netdata - real-time performance monitoring, done right!"/>
+- <meta property="og:description" content="Stunning real-time dashboards, blazingly fast and extremely interactive. Zero configuration, zero dependencies, zero maintenance." />
+-</head>
+-
+-<script>
+- // --- OPTIONS FOR THE DASHBOARD --
+-
+- // this section has to appear before loading dashboard.js
+-
+- // Select a theme.
+- // uncomment on of the two themes:
+-
+- // var netdataTheme = 'default'; // this is white
+- var netdataTheme = 'slate'; // this is dark
+-
+-
+- // Set the default netdata server.
+- // on charts without a 'data-host', this one will be used.
+- // the default is the server that dashboard.js is downloaded from.
+-
+- // var netdataServer = 'http://my.server:19999/';
+- </script>
+-
+- <!--
+- --- LOAD dashboard.js ---
+-
+- to host this HTML file on your web server,
+- you have to load dashboard.js from the netdata server.
+-
+- So, pick one the two below
+- If you pick the first, set the server name/IP.
+-
+- The second assumes you host this file on /usr/share/netdata/web
+- and that you have chown it to be owned by netdata:netdata
+- -->
+- <!-- <script type="text/javascript" src="http://my.server:19999/dashboard.js"></script> -->
+- <script type="text/javascript" src="dashboard.js?v20190902-0"></script>
+-
+- <script>
+- // --- OPTIONS FOR THE CHARTS --
+-
+- // destroy charts not shown (lowers memory on the browsers)
+- // set this to 'true' to destroy, 'false' to hide the charts
+- NETDATA.options.current.destroy_on_hide = false;
+-
+- // set this to false, to always show all dimensions
+- NETDATA.options.current.eliminate_zero_dimensions = true;
+-
+- // set this to false, to lower the pressure on the browser
+- NETDATA.options.current.concurrent_refreshes = true;
+-
+- // if you need to support slow mobile phones, set this to false
+- NETDATA.options.current.parallel_refresher = true;
+-
+- // set this to false, to always update the charts, even if focus is lost
+- NETDATA.options.current.stop_updates_when_focus_is_lost = true;
+-
+- // since we have many servers and limited sockets,
+- // abort ajax calls when we scroll
+- NETDATA.options.current.abort_ajax_on_scroll = true;
+-</script>
+-<style>
+- body {
+- font-size: 1vw;
+- }
+-
+- .mysparkline {
+- position: relative;
+- display: inline-block;
+- min-height: 50px;
+- width: 100%;
+- height: 7vmax;
+- text-align: left;
+- }
+-
+- .mysparkline-overchart-label {
+- position: absolute;
+- display: block;
+- top: 0;
+- left: 10px;
+- bottom: 0;
+- right: 0;
+- font-size: 1vmax;
+- z-index: 1;
+- }
+-
+- .mysparkline-overchart-value {
+- position: absolute;
+- display: block;
+- top: 1.1vmax;
+- left: 10px;
+- bottom: 0;
+- right: 0;
+- font-size: 5vmax;
+- z-index: 2;
+- text-shadow: #333 0px 0px 2px;
+- }
+-
+- .myfullchart {
+- position: relative;
+- display: inline-block;
+- width: 100%;
+- height: 12vmax;
+- min-height: 150px;
+- text-align: left;
+- }
+-
+- .mygauge-combo {
+- display: inline-block;
+- }
+-
+- .mygauge {
+- position: relative;
+- display: block;
+- width: 18vw;
+- height: 11vw;
+- }
+-
+- .mygauge-button {
+- display: block;
+- }
+-
+- .mytitle {
+- padding-top: 6vw;
+- padding-bottom: 1vw;
+- text-align: center;
+- font-size: 2.4vw;
+- }
+-
+- .mysubtitle {
+- padding-top: 2vw;
+- padding-bottom: 1vw;
+- text-align: center;
+- font-size: 1.8vw;
+- }
+-
+- .mycontent {
+- text-align: center;
+- font-size: 1.5vw;
+- }
+-
+- @media only screen and (min-width : 992px) {
+- .container {
+- width: 80%;
+- }
+- }
+- @media only screen and (max-width : 992px) {
+- .container {
+- width: 100%;
+- }
+- }
+-</style>
+-
+-<body style="text-align: center; background-color: #272b30;">
+-
+-<div class="container">
+-
+- <div style="text-align: center; font-size: 13vw; height: 14vw;">
+- <b>netdata</b>
+- </div>
+- <div style="text-align: center; font-size: 2vw; height: 2.5vw;">
+- real-time performance monitoring
+- </div>
+- <div style="width:80%; text-align: right; font-size: 2.7vw;">
+- <strong>scaled out</strong>!
+- </div>
+- <div class="mytitle">
+- pick a <b>netdata</b> demo server
+- </div>
+- <div class="mycontent">
+- these demo servers show what you will get by installing <b>netdata</b>
+- </div>
+-
+- <div style="width: 100%; text-align: center; padding-top: 2vw;">
+- <div style="width: 100%; text-align: center;">
+-
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//london.my-netdata.io"
+- data-title="EU - London"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#558855"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//london.my-netdata.io/default.html'" style="font-size: 1.0vw;">Enter London!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//atlanta.my-netdata.io"
+- data-title="US - Atlanta"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#AA5555"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//atlanta.my-netdata.io/default.html'" style="font-size: 1.0vw;">Enter Atlanta!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by CDN77.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-title="US - California"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#5555AA"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//sanfrancisco.netdata.rocks/default.html'" style="font-size: 1.0vw;">Enter California!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//toronto.netdata.rocks"
+- data-title="Canada"
+- data-chart-library="gauge"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="100%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#885588"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//toronto.netdata.rocks/default.html'" style="font-size: 1.0vw;">Enter Canada!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <br/> <br/>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//frankfurt.netdata.rocks"
+- data-title="EU - Germany"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#AAAA55"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//frankfurt.netdata.rocks/default.html'" style="font-size: 1.0vw;">Enter Germany!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//newyork.netdata.rocks"
+- data-title="US - New York"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#BB5533"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//newyork.netdata.rocks/default.html'" style="font-size: 1.0vw;">Enter New York!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//singapore.netdata.rocks"
+- data-title="Singapore"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#5588BB"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//singapore.netdata.rocks/default.html'" style="font-size: 1.0vw;">Enter Singapore!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- <div class="mygauge-combo">
+- <div class="mygauge">
+- <div data-netdata="netdata.requests"
+- data-host="//bangalore.netdata.rocks"
+- data-title="India"
+- data-chart-library="easypiechart"
+- data-decimal-digits="0"
+- data-common-max="top-gauges"
+- data-width="75%"
+- data-after="-300"
+- data-points="300"
+- data-colors="#BB55BB"
+- ></div>
+- </div>
+- <div class="mygauge-button">
+- <br/> <br/>
+- <button type="button" class="btn btn-default" data-toggle="button" aria-pressed="false" autocomplete="off" onclick="window.location='//bangalore.netdata.rocks/default.html'" style="font-size: 1.0vw;">Enter India!</button>
+- <div style="font-size: 0.8vw;">
+- Donated by DigitalOcean.com
+- </div>
+- </div>
+- </div>
+- </div>
+- </div>
+-
+- <div class="mytitle">
+- this page is a custom <b>netdata</b> dashboard
+- </div>
+- <div class="mycontent">
+- charts are coming from 8 servers, in parallel
+- <br/>
+- the servers are not aware of this multi-server dashboard,
+- <br/>
+- each server is not aware of the other servers,
+- <br/>
+- but on this dashboard <b>they are one</b>!
+- </div>
+- <div style="padding-top: 1vw; width: 100%; text-align: center; font-size: 1.5vw;">
+- <i class="fa fa-comment" aria-hidden="true"></i>
+- hover on a chart below, or drag it to show the past - <b>the others will follow</b>!
+- <br/>
+- double click on a chart to reset them all
+- </div>
+-
+- <div class="mytitle">
+- our <code>nginx</code> performance
+- </div>
+- <div class="mycontent">
+- (we proxy netdata through nginx, on the demo sites)
+- </div>
+-
+- <!-- Nav tabs -->
+- <ul class="nav nav-tabs" role="tablist" style="padding-top: 1vw;">
+- <li role="presentation" class="active"><a href="#nginx_requests" aria-controls="nginx_requests" role="tab" data-toggle="tab">Requests</a></li>
+- <li role="presentation"><a href="#nginx_connections" aria-controls="nginx_connections" role="tab" data-toggle="tab">Connections</a></li>
+- </ul>
+-
+- <!-- Tab panes -->
+- <div class="tab-content">
+- <div role="tabpanel" class="tab-pane active" id="nginx_requests">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>EU - London</b> web requests/s
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.requests.netdata" >
+- </div>
+- <div data-netdata="nginx_local.requests"
+- data-dimensions="requests"
+- data-host="//london.my-netdata.io"
+- data-decimal-digits="0"
+- data-common-max="web-requests"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855"
+- data-show-value-of-requests-at="nginx_local.requests.netdata"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - Atlanta</b> web requests/s
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.requests.netdata2" >
+- </div>
+- <div data-netdata="nginx_local.requests"
+- data-dimensions="requests"
+- data-host="//atlanta.my-netdata.io"
+- data-decimal-digits="0"
+- data-common-max="web-requests"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#AA5555"
+- data-show-value-of-requests-at="nginx_local.requests.netdata2"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - California</b> web requests/s
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.requests.netdata3" >
+- </div>
+- <div data-netdata="nginx_local.requests"
+- data-dimensions="requests"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-decimal-digits="0"
+- data-common-max="web-requests"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#5555AA"
+- data-show-value-of-requests-at="nginx_local.requests.netdata3"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>Canada</b> web requests/s
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.requests.netdata4" >
+- </div>
+- <div data-netdata="nginx_local.requests"
+- data-dimensions="requests"
+- data-host="//toronto.netdata.rocks"
+- data-decimal-digits="0"
+- data-common-max="web-requests"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885588"
+- data-show-value-of-requests-at="nginx_local.requests.netdata4"
+- ></div>
+- </div>
+- </div>
+-
+- <div role="tabpanel" class="tab-pane" id="nginx_connections">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>EU - London</b> active connections
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.connections.netdata1" >
+- </div>
+- <div data-netdata="nginx_local.connections"
+- data-dimensions="active"
+- data-host="//london.my-netdata.io"
+- data-decimal-digits="0"
+- data-common-max="web-connections"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855"
+- data-show-value-of-active-at="nginx_local.connections.netdata1"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - Atlanta</b> active connections
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.connections.netdata2" >
+- </div>
+- <div data-netdata="nginx_local.connections"
+- data-dimensions="active"
+- data-host="//atlanta.my-netdata.io"
+- data-decimal-digits="0"
+- data-common-max="web-connections"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#AA5555"
+- data-show-value-of-active-at="nginx_local.connections.netdata2"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - California</b> active connections
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.connections.netdata3" >
+- </div>
+- <div data-netdata="nginx_local.connections"
+- data-dimensions="active"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-decimal-digits="0"
+- data-common-max="web-connections"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#5555AA"
+- data-show-value-of-active-at="nginx_local.connections.netdata3"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>Canada</b> active connections
+- </div>
+- <div class="mysparkline-overchart-value" id="nginx_local.connections.netdata4" >
+- </div>
+- <div data-netdata="nginx_local.connections"
+- data-dimensions="active"
+- data-host="//toronto.netdata.rocks"
+- data-decimal-digits="0"
+- data-common-max="web-connections"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885588"
+- data-show-value-of-active-at="nginx_local.connections.netdata4"
+- ></div>
+- </div>
+- </div>
+- </div>
+-
+- <div style="width: 100%; text-align: right; font-size: 1vw;">
+- <i class="fa fa-comment" aria-hidden="true"></i> these charts are draggable and touchable, double click them to reset them
+- </div>
+-
+-
+- <div class="mytitle">
+- bandwidth consumption on the demo sites
+- </div>
+- <div class="mycontent">
+- Linux QoS is configured by <a href="https://github.com/netdata/netdata/tree/master/collectors/tc.plugin#tcplugin">FireQOS</a>
+- </div>
+-
+- <!-- Nav tabs -->
+- <ul class="nav nav-tabs" role="tablist" style="padding-top: 1vw;">
+- <li role="presentation" class="active"><a href="#outbout" aria-controls="outbout" role="tab" data-toggle="tab">Outbound</a></li>
+- <li role="presentation"><a href="#inbound" aria-controls="inbound" role="tab" data-toggle="tab">Inbound</a></li>
+- </ul>
+-
+- <!-- Tab panes -->
+- <div class="tab-content">
+- <div role="tabpanel" class="tab-pane active" id="outbout">
+- <div class="myfullchart">
+- <div data-netdata="tc.world_out"
+- data-host="//london.my-netdata.io"
+- data-common-max="tc-world-out"
+- data-chart-library="dygraph"
+- data-title="EU - London, traffic we send per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="tc.world_out"
+- data-host="//atlanta.my-netdata.io"
+- data-chart-library="dygraph"
+- data-common-max="tc-world-out"
+- data-title="US - Atlanta, traffic we send per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+-
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="tc.world_out"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-chart-library="dygraph"
+- data-common-max="tc-world-out"
+- data-title="US - California, traffic we send per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="tc.world_out"
+- data-host="//toronto.netdata.rocks"
+- data-chart-library="dygraph"
+- data-common-max="tc-world-out"
+- data-title="Canada, traffic we send per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+- </div>
+- </div>
+-
+- <div role="tabpanel" class="tab-pane" id="inbound">
+- <div class="myfullchart">
+- <div data-netdata="tc.world_in"
+- data-host="//london.my-netdata.io"
+- data-common-max="tc-world-in"
+- data-chart-library="dygraph"
+- data-title="EU - London, traffic we receive per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+-
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="tc.world_in"
+- data-host="//atlanta.my-netdata.io"
+- data-common-max="tc-world-in"
+- data-chart-library="dygraph"
+- data-title="US - Atlanta, traffic we receive per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+-
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="tc.world_in"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-common-max="tc-world-in"
+- data-chart-library="dygraph"
+- data-title="US - California, traffic we receive per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="tc.world_in"
+- data-host="//toronto.netdata.rocks"
+- data-common-max="tc-world-in"
+- data-chart-library="dygraph"
+- data-title="Canada, traffic we receive per service"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- ></div>
+- </div>
+- </div>
+- </div>
+- <div style="width: 100%; text-align: right; font-size: 1vw;">
+- <i class="fa fa-comment" aria-hidden="true"></i> <i>these legends are interactive and the charts are resizable here ^^^</i>
+- </div>
+-
+- <div class="mytitle">
+- DDoS protection performance on the demo sites
+- </div>
+- <div class="mycontent">
+- iptables SYNPROXY configured by <a href="https://github.com/netdata/netdata/blob/master/collectors/proc.plugin/README.md#linux-anti-ddos">FireHOL</a>
+- </div>
+-
+- <div style="padding-top: 4vw; width: 100%; text-align: center; font-size: 1.5vw;">
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>EU - London</b>, TCP SYN packets/s received
+- </div>
+- <div class="mysparkline-overchart-value" id="netfilter.synproxy_syn_received.netdata1" >
+- </div>
+- <div data-netdata="netfilter.synproxy_syn_received"
+- data-dimensions="received"
+- data-host="//london.my-netdata.io"
+- data-decimal-digits="0"
+- data-common-max="synproxy-in"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855"
+- data-show-value-of-received-at="netfilter.synproxy_syn_received.netdata1"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - Atlanta</b>, TCP SYN packets/s received
+- </div>
+- <div class="mysparkline-overchart-value" id="netfilter.synproxy_syn_received.netdata2" >
+- </div>
+- <div data-netdata="netfilter.synproxy_syn_received"
+- data-dimensions="received"
+- data-host="//atlanta.my-netdata.io"
+- data-decimal-digits="0"
+- data-common-max="synproxy-in"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885555"
+- data-show-value-of-received-at="netfilter.synproxy_syn_received.netdata2"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - California</b>, TCP SYN packets/s received
+- </div>
+- <div class="mysparkline-overchart-value" id="netfilter.synproxy_syn_received.netdata3" >
+- </div>
+- <div data-netdata="netfilter.synproxy_syn_received"
+- data-dimensions="received"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-decimal-digits="0"
+- data-common-max="synproxy-in"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#555588"
+- data-show-value-of-received-at="netfilter.synproxy_syn_received.netdata3"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>Canada</b>, TCP SYN packets/s received
+- </div>
+- <div class="mysparkline-overchart-value" id="netfilter.synproxy_syn_received.netdata4" >
+- </div>
+- <div data-netdata="netfilter.synproxy_syn_received"
+- data-dimensions="received"
+- data-host="//toronto.netdata.rocks"
+- data-decimal-digits="0"
+- data-common-max="synproxy-in"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885588"
+- data-show-value-of-received-at="netfilter.synproxy_syn_received.netdata4"
+- ></div>
+- </div>
+- </div>
+- <div style="width: 100%; text-align: right; font-size: 1vw;">
+- <i class="fa fa-comment" aria-hidden="true"></i> <i>did you notice the decimal numbers?
+- <br/>netdata interpolates collected values at second boundaries, with nanosecond detail!</i>
+- </div>
+-
+-
+- <div class="mytitle">
+- CPU Utilization of the demo sites
+- </div>
+-
+- <div style="padding-top: 1vw;">
+- <div class="myfullchart">
+- <div data-netdata="system.cpu"
+- data-host="//london.my-netdata.io"
+- data-chart-library="dygraph"
+- data-title="EU - London, CPU Usage"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-dygraph-valuerange="[0, 100]"
+- ></div>
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="system.cpu"
+- data-host="//atlanta.my-netdata.io"
+- data-chart-library="dygraph"
+- data-title="US - Atlanta, CPU Usage"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-dygraph-valuerange="[0, 100]"
+- ></div>
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="system.cpu"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-chart-library="dygraph"
+- data-title="US - California, CPU Usage"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-dygraph-valuerange="[0, 100]"
+- ></div>
+- </div>
+-
+- <div class="myfullchart">
+- <div data-netdata="system.cpu"
+- data-host="//toronto.netdata.rocks"
+- data-chart-library="dygraph"
+- data-title="Canada, CPU Usage"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-dygraph-valuerange="[0, 100]"
+- ></div>
+- </div>
+- </div>
+- <div style="width: 100%; text-align: right; font-size: 1vw;">
+- <i class="fa fa-comment" aria-hidden="true"></i> <i>what is using so much CPU?
+- <br/>The site <a href="//iplists.firehol.org/">iplists.firehol.org</a> is maintained by FireHOL - the CPU is used for comparing security IP Lists.</i>
+- </div>
+-
+- <div class="mytitle">
+- Netdata performance
+- </div>
+- <div class="mycontent">
+- netdata monitors <b>users</b>, <b>user groups</b>, <b>applications (process trees)</b>
+- <br/>
+- <b>containers</b> (<code>lxc</code>, <code>docker</code>, etc.) and SNMP devices.
+- </div>
+-
+- <!-- Nav tabs -->
+- <ul class="nav nav-tabs" role="tablist" style="padding-top: 1vw;">
+- <li role="presentation" class="active"><a href="#netdata_cpu" aria-controls="netdata_cpu" role="tab" data-toggle="tab">CPU</a></li>
+- <li role="presentation"><a href="#netdata_avgtime" aria-controls="netdata_avgtime" role="tab" data-toggle="tab">Average Response Time</a></li>
+- </ul>
+-
+- <!-- Tab panes -->
+- <div class="tab-content">
+- <div role="tabpanel" class="tab-pane active" id="netdata_cpu">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>EU - London</b>, CPU % of a single core
+- </div>
+- <div class="mysparkline-overchart-value" id="users.cpu.netdata1" >
+- </div>
+- <div data-netdata="apps.cpu"
+- data-dimensions="netdata"
+- data-common-max="users-cpu"
+- data-decimal-digits="1"
+- data-host="//london.my-netdata.io"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855"
+- data-show-value-of-netdata-at="users.cpu.netdata1"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - Atlanta</b>, CPU % of a single core
+- </div>
+- <div class="mysparkline-overchart-value" id="users.cpu.netdata2" >
+- </div>
+- <div data-netdata="apps.cpu"
+- data-dimensions="netdata"
+- data-common-max="users-cpu"
+- data-decimal-digits="1"
+- data-host="//atlanta.my-netdata.io"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885555"
+- data-show-value-of-netdata-at="users.cpu.netdata2"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - California</b>, CPU % of a single core
+- </div>
+- <div class="mysparkline-overchart-value" id="users.cpu.netdata3" >
+- </div>
+- <div data-netdata="apps.cpu"
+- data-dimensions="netdata"
+- data-common-max="users-cpu"
+- data-decimal-digits="1"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#555588"
+- data-show-value-of-netdata-at="users.cpu.netdata3"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>Toronto</b>, CPU % of a single core
+- </div>
+- <div class="mysparkline-overchart-value" id="users.cpu.netdata4" >
+- </div>
+- <div data-netdata="apps.cpu"
+- data-dimensions="netdata"
+- data-common-max="users-cpu"
+- data-decimal-digits="1"
+- data-host="//toronto.netdata.rocks"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885588"
+- data-show-value-of-netdata-at="users.cpu.netdata4"
+- ></div>
+- </div>
+-
+- <div style="width: 100%; text-align: right; font-size: 1vw;">
+- <i class="fa fa-comment" aria-hidden="true"></i> <i>this utilization is about the whole netdata process tree and the percentage is of <b>a single core</b>!
+- <br/>including <b>BASH</b> plugins (it monitors <code>mysql</code> on the demo sites), <b>node.js</b> plugins (it monitors <code>bind9</code> on the demo sites), etc.
+- <br/>and including the chart refreshes for the dashboards of all viewers.</i>
+- </div>
+- </div>
+-
+- <div role="tabpanel" class="tab-pane" id="netdata_avgtime">
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>EU - London</b>, API average response time in milliseconds
+- </div>
+- <div class="mysparkline-overchart-value" id="netdata.response_time1" >
+- </div>
+- <div data-netdata="netdata.response_time"
+- data-host="//london.my-netdata.io"
+- data-common-max="netdata-response-time"
+- data-decimal-digits="1"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#558855 #356835"
+- data-show-value-of-average-at="netdata.response_time1"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - Atlanta</b>, API average response time in milliseconds
+- </div>
+- <div class="mysparkline-overchart-value" id="netdata.response_time2" >
+- </div>
+- <div data-netdata="netdata.response_time"
+- data-host="//atlanta.my-netdata.io"
+- data-common-max="netdata-response-time"
+- data-decimal-digits="1"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885555 #683535"
+- data-show-value-of-average-at="netdata.response_time2"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>US - California</b>, API average response time in milliseconds
+- </div>
+- <div class="mysparkline-overchart-value" id="netdata.response_time3" >
+- </div>
+- <div data-netdata="netdata.response_time"
+- data-host="//sanfrancisco.netdata.rocks"
+- data-common-max="netdata-response-time"
+- data-decimal-digits="1"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#555588 #353568"
+- data-show-value-of-average-at="netdata.response_time3"
+- ></div>
+- </div>
+-
+- <div class="mysparkline">
+- <div class="mysparkline-overchart-label">
+- <b>Canada</b>, API average response time in milliseconds
+- </div>
+- <div class="mysparkline-overchart-value" id="netdata.response_time4" >
+- </div>
+- <div data-netdata="netdata.response_time"
+- data-host="//toronto.netdata.rocks"
+- data-decimal-digits="1"
+- data-common-max="netdata-response-time"
+- data-chart-library="dygraph"
+- data-dygraph-theme="sparkline"
+- data-dygraph-type="area"
+- data-width="100%"
+- data-height="100%"
+- data-after="-300"
+- data-colors="#885588 #683568"
+- data-show-value-of-average-at="netdata.response_time4"
+- ></div>
+- </div>
+-
+- <div style="width: 100%; text-align: right; font-size: 1vw;">
+- <i class="fa fa-comment" aria-hidden="true"></i> <i>netdata is really <b>fast</b> (the values are milliseconds!)
+- <br/>
+- These values include everything, from the reception of the first byte to the dispatch of the last, including gzip compression.
+- <br/>
+- Values above 2-3ms are usually chart refreshes of charts with several dimensions, charts with very long durations (zoomed out), or file transfers.
+- </i>
+- </div>
+- </div>
+- </div>
+-
+- <div style="padding-top: 6vw; width: 100%; text-align: center; font-size: 2vw;">
+- want to know more?
+- <br/>
+- jump to <a href="https://github.com/netdata/netdata/">the netdata page at github</a>
+- <br/>
+- it needs just 3 mins to be installed on your servers!
+- <br/>
+-
+- </div>
+-</div>
+-</body>
+-<script>
+- // google analytics when this is used for the home page of the demo sites
+- // you don't need this if you customize this dashboard for your needs
+- setTimeout(function() {
+- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+- })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+-
+- ga('create', 'UA-64295674-3', 'auto');
+- ga('send', 'pageview');
+- }, 2000);
+-</script>
+-</html>
+diff --git a/web/gui/goto-host-from-alarm.html b/web/gui/goto-host-from-alarm.html
+index 7d12f848..af9db7ea 100644
+--- a/web/gui/goto-host-from-alarm.html
++++ b/web/gui/goto-host-from-alarm.html
+@@ -2,13 +2,6 @@
+ <!-- SPDX-License-Identifier: GPL-3.0-or-later -->
+ <html lang="en">
+ <head>
+- <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+- })(window,document,'script','dataLayer','GTM-N6CBMJD');
+- dataLayer.push({"anonymous_statistics" : "false"});
+- </script>
+ <title>Goto a host you know...</title>
+ <meta name="application-name" content="netdata">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+diff --git a/web/gui/index.html b/web/gui/index.html
+index d3099101..47baa548 100644
+--- a/web/gui/index.html
++++ b/web/gui/index.html
+@@ -17,22 +17,6 @@
+
+ <link rel="icon" href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP9JREFUeNpiYBgFo+A/w34gpiZ8DzWzAYgNiHGAA5UdgA73g+2gcyhgg/0DGQoweB6IBQYyFCCOGOBQwBMd/xnW09ERDtgcoEBHB+zHFQrz6egIBUasocDAcJ9OxWAhE4YQI8MDILmATg7wZ8QRDfQKhQf4Cie6pAVGPA4AhQKo0BCgZRAw4ZSBpIWJNI6CD4wEKikBaFqgVSgcYMIrzcjwgcahcIGRiPYCLUPBkNhWUwP9akVcoQBpatG4MsLviAIqWj6f3Absfdq2igg7IIEKDVQKEzN5ofAenJCp1I8gJRTug5tfkGIdR1FDniMI+QZUjF8Amn5htOdHCAAEGACE6B0cS6mrEwAAAABJRU5ErkJggg==" />
+
+- <meta property="og:locale" content="en_US" />
+- <meta property="og:url" content="https://my-netdata.io" />
+- <meta property="og:type" content="website" />
+- <meta property="og:site_name" content="netdata"/>
+- <meta property="og:title" content="Get control of your Linux Servers. Simple. Effective. Awesome." />
+- <meta property="og:description" content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms." />
+- <meta property="og:image" content="https://cloud.githubusercontent.com/assets/2662304/22945737/e98cd0c6-f2fd-11e6-96f1-5501934b0955.png" />
+- <meta property="og:image:type" content="image/png" />
+- <meta property="fb:app_id" content="1200089276712916" />
+-
+- <meta name="twitter:card" content="summary" />
+- <meta name="twitter:site" content="@linuxnetdata" />
+- <meta name="twitter:title" content="Get control of your Linux Servers. Simple. Effective. Awesome." />
+- <meta name="twitter:description" content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms." />
+- <meta name="twitter:image" content="https://cloud.githubusercontent.com/assets/2662304/14092712/93b039ea-f551-11e5-822c-beadbf2b2a2e.gif" />
+-
+ <script src="main.js?v20190905-0"></script>
+ </head>
+
+@@ -90,13 +74,9 @@
+ </div>
+ <nav class="collapse navbar-collapse navbar-right" role="navigation">
+ <ul class="nav navbar-nav">
+- <li title="Nodes view" data-toggle="tooltip" data-placement="bottom"><a onclick="openAuthenticatedUrl('console.html');" class="btn" target="_blank"><i class="fas fa-tv"></i> <span class="hidden-sm hidden-md">Nodes<sup class="beta"> beta</sup></span></a></li>
+ <li id="alarmsButton" title="check the health monitoring alarms and their log" data-toggle="tooltip" data-placement="bottom"><a href="#" class="btn" data-toggle="modal" data-target="#alarmsModal"><i class="fas fa-bell"></i> <span class="hidden-sm hidden-md">Alarms </span><span id="alarms_count_badge" class="badge"></span></a></li>
+ <li title="change dashboard settings" data-toggle="tooltip" data-placement="bottom"><a href="#" class="btn" data-toggle="modal" data-target="#optionsModal"><i class="fas fa-cog"></i> <span class="hidden-sm hidden-md">Settings</span></a></li>
+- <li title="check for netdata updates<br/>you should keep your netdata updated" data-toggle="tooltip" data-placement="bottom" class="hidden-sm" id="updateButton"><a href="#" class="btn" data-toggle="modal" data-target="#updateModal"><i class="fas fa-cloud-download-alt"></i> <span class="hidden-sm hidden-md">Update </span><span id="update_badge" class="badge"></span></a></li>
+ <li title="the netdata wiki home at github<br/>remember to <b>give netdata a <i class="fas fa-star"></i></b> !" data-toggle="tooltip" data-placement="bottom" class="hidden-xs hidden-sm hidden-md"><a href="https://github.com/netdata/netdata" class="btn" target="_blank"><i class="fab fa-github"></i></a></li>
+- <li title="follow netdata on twitter" data-toggle="tooltip" data-placement="bottom" class="hidden-xs hidden-sm hidden-md"><a href="https://twitter.com/linuxnetdata" class="btn" target="_blank"><i class="fab fa-twitter"></i></a></li>
+- <li title="like netdata on facebook" data-toggle="tooltip" data-placement="bottom" class="hidden-xs hidden-sm hidden-md"><a href="https://www.facebook.com/linuxnetdata/" class="btn" target="_blank"><i class="fab fa-facebook"></i></a></li>
+ <li title="import / load a netdata snapshot" data-toggle="tooltip" data-placement="bottom" id="loadButton"><a href="#" class="btn" data-toggle="modal" data-target="#loadSnapshotModal"><i class="fas fa-download"></i> <span class="hidden-sm hidden-md hidden-lg">Import</span></a></li>
+ <li title="export / save a netdata snapshot" data-toggle="tooltip" data-placement="bottom" id="saveButton"><a href="#" class="btn" data-toggle="modal" data-target="#saveSnapshotModal"><i class="fas fa-upload"></i> <span class="hidden-sm hidden-md hidden-lg">Export</span></a></li>
+ <li title="print this dashboard to PDF" data-toggle="tooltip" data-placement="bottom" id="printButton"><a href="#" class="btn" data-toggle="modal" data-target="#printPreflightModal"><i class="fas fa-print"></i> <span class="hidden-sm hidden-md hidden-lg">Print</span></a></li>
+@@ -109,17 +89,6 @@
+ <div class="navbar-highlight">
+ <div id="navbar-highlight-content" class="navbar-highlight-content"></div>
+ </div>
+-
+- <div id="sign-in-banner" style="display: none">
+- <div class="container">
+- Like what you see?
+- <strong><a href="#" class="__link" onclick="signInDidClick(event); return false">Sign in</a>
+- to experience the full-range of netdata capabilities!</strong>
+- <div class="__close" onclick="closeSignInBannerDidClick(event)">
+- Close <i class="fas fa-times"></i>
+- </div>
+- </div>
+- </div>
+
+ <div id="masthead" style="display: none;">
+ <div class="container">
+@@ -1140,92 +1109,6 @@
+ </div>
+ </div>
+
+-
+- <div class="modal fade" id="updateModal" tabindex="-1" role="dialog" aria-labelledby="updateModalLabel">
+- <div class="modal-dialog" role="document">
+- <div class="modal-content">
+- <div class="modal-header">
+- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
+- <h4 class="modal-title" id="updateModalLabel">Update Check</h4>
+- </div>
+- <div class="modal-body">
+- Your netdata version: <b><code><span id="netdataVersion">Unknown</span></code></b><br/>
+- <br/>
+- <div style="padding: 10px;"></div>
+- <div id="versionCheckLog">Not checked yet. Please press the Check Now button.</div>
+- <div>
+- <hr/>
+- </div>
+- <div>
+- For progress reports and key netdata updates: <strong><a href="https://twitter.com/linuxnetdata" target="_blank">follow netdata on <i class="fab fa-twitter"></i> twitter</a></strong>.
+- <br/>
+- You can also <a href="https://www.facebook.com/linuxnetdata/" target="_blank">follow netdata on <i class="fab fa-facebook"></i> facebook</a>,
+- or <a href="https://github.com/netdata/netdata" target="_blank">watch netdata on <i class="fab fa-github"></i> github</a>.
+- </div>
+- </div>
+- <div class="modal-footer">
+- <a href="#" onclick="notifyForUpdate(true); return false;" type="button" class="btn btn-default">Check Now</a>
+- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+- </div>
+- </div>
+- </div>
+- </div>
+-
+- <div class="modal fade" id="signInModal" tabindex="-1" role="dialog" aria-labelledby="signInModalLabel">
+- <div class="modal-dialog" role="document">
+- <div class="modal-content">
+- <div class="modal-header">
+- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
+- <h4 class="modal-title" id="signInModalLabel">Sign In</h4>
+- </div>
+- <div class="modal-body">
+- <p>
+- Signing-in to netdata.cloud will synchronize the list of
+- your netdata monitored nodes known at registry
+- <strong><span id="sim-registry"></span></strong>. This
+- may include server hostnames, urls and identification
+- GUIDs.
+- </p>
+- <p>
+- After you upgrade all your netdata servers, your private
+- registry will not be needed any more.
+- </p>
+- <p>
+- Are you sure you want to proceed?
+- </p>
+- </div>
+- <div class="modal-footer">
+- <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+- <a href="#" onclick="explicitlySignIn(); return false;" type="button" class="btn btn-success">Sign In</a>
+- </div>
+- </div>
+- </div>
+- </div>
+-
+- <div class="modal fade" id="syncRegistryModal" tabindex="-1" role="dialog" aria-labelledby="syncRegistryModalLabel">
+- <div class="modal-dialog" role="document">
+- <div class="modal-content">
+- <div class="modal-header">
+- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
+- <h4 class="modal-title" id="syncRegistryModalLabel">Synchronize netdata.cloud with registry?</h4>
+- </div>
+- <div class="modal-body">
+- <p>
+- You are about to synchronize your netdata.cloud account with data from the registry at <strong><span id="sync-registry-modal-registry"></span></strong>.
+- This may include server hostnames, urls and identification GUIDs.
+- </p>
+- <p>
+- Are you sure you want to proceed?
+- </p>
+- </div>
+- <div class="modal-footer">
+- <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+- <a href="#" onclick="explicitlySyncAgents(); return false;" type="button" class="btn btn-success">Synchronize</a>
+- </div>
+- </div>
+- </div>
+- </div>
+-
+ <div class="modal fade" id="deleteRegistryModal" tabindex="-1" role="dialog" aria-labelledby="deleteRegistryModalLabel">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+diff --git a/web/gui/infographic.html b/web/gui/infographic.html
+deleted file mode 100644
+index 24ff8f4e..00000000
+--- a/web/gui/infographic.html
++++ /dev/null
+@@ -1,171 +0,0 @@
+-<!doctype html>
+-<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
+-<html lang=en-us>
+-<head>
+- <meta charset=utf-8>
+- <title>NetData: Get control of your Linux Servers. Simple. Effective. Awesome.</title>
+- <meta name=author content="Costa Tsaousis">
+- <meta name=description content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms.">
+-
+- <meta name=viewport content="width=device-width,initial-scale=1">
+- <link rel=apple-touch-icon href=apple-touch-icon.png>
+- <link rel="icon" href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP9JREFUeNpiYBgFo+A/w34gpiZ8DzWzAYgNiHGAA5UdgA73g+2gcyhgg/0DGQoweB6IBQYyFCCOGOBQwBMd/xnW09ERDtgcoEBHB+zHFQrz6egIBUasocDAcJ9OxWAhE4YQI8MDILmATg7wZ8QRDfQKhQf4Cie6pAVGPA4AhQKo0BCgZRAw4ZSBpIWJNI6CD4wEKikBaFqgVSgcYMIrzcjwgcahcIGRiPYCLUPBkNhWUwP9akVcoQBpatG4MsLviAIqWj6f3Absfdq2igg7IIEKDVQKEzN5ofAenJCp1I8gJRTug5tfkGIdR1FDniMI+QZUjF8Amn5htOdHCAAEGACE6B0cS6mrEwAAAABJRU5ErkJggg==" />
+-
+- <meta property="og:url" content="https://my-netdata.io/infographic.html" />
+- <meta property="og:type" content="website" />
+- <meta property="og:title" content="netdata infographic" />
+- <meta property="og:description" content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms." />
+- <meta property="og:image" content="https://user-images.githubusercontent.com/43294513/60951037-8ba5d180-a2f8-11e9-906e-e27356f168bc.png" />
+- <meta property="og:image:type" content="image/png" />
+- <meta property="fb:app_id" content="1200089276712916" />
+-
+- <meta name="twitter:card" content="summary" />
+- <meta name="twitter:site" content="@linuxnetdata" />
+- <meta name="twitter:title" content="netdata infographic" />
+- <meta name="twitter:description" content="Unparalleled insights, in real-time, of everything happening on your Linux systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms." />
+- <meta name="twitter:image" content="https://cloud.githubusercontent.com/assets/2662304/25580009/bf7016a4-2e85-11e7-9a7a-b36c57db7b91.png" />
+-
+- <meta name="google-site-verification" content="3Xmk2kyCvai8p9HEnYHoQ9RBW20-b1NvPAgu07Fkkds" />
+- <meta name="msvalidate.01" content="896DCA31C9A664CE359FCF1A645DD476" />
+-
+- <style>/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */
+- html {
+- line-height: 1.15;
+- -ms-text-size-adjust: 100%;
+- -webkit-text-size-adjust: 100%;
+- font: 17px/1.4 'Open Sans', sans-serif;
+- text-align: center
+- }
+- </style>
+-</head>
+-<body>
+-<div style="width: 100%;text-align:center;">
+- <div>
+- <p style="font-size: 16pt">
+- <b>Interactive infographic of netdata features and functions</b>
+- </p>
+- <p>
+- Hover and click on the infographic, to open the related wiki page.
+- <br/>
+- <small>
+- The links and the docs are still a work in progress.
+- The interactive infographic is a feature of <b>draw.io</b>.
+- </small>
+- </p>
+- </div>
+- <div class=site-footer role=contentinfo>
+- <p>
+- <div style="display: inline-block;">
+- <div style="vertical-align:top;display:inline-block; height: 34px;margin-top:3px;"><a class=twitter-share-button href=https://twitter.com/share data-count=none data-lang=en data-via=linuxnetdata data-size=small data-text="Get control of your Linux servers. Simple. Effective. Awesome." data-url=https://my-netdata.io/infographic.html >Tweet</a></div>
+- <div style="vertical-align:top;display:inline-block; height: 34px;margin-top:3px;"><a class=twitter-follow-button href=https://twitter.com/linuxnetdata data-show-count=false data-lang=en data-size=small>Follow @linuxnetdata</a></div>
+- </div>
+- <div style="display: inline-block;">
+- <div class="fb-like" data-href="https://my-netdata.io/" data-layout="button" data-action="like" data-show-faces="false" data-share="false" style="vertical-align:top;display:inline-block; height: 34px;"></div>
+- <div class="fb-share-button" data-href="https://my-netdata.io/" data-layout="button" data-size="small" data-mobile-iframe="true"><a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fmy-netdata.io%2Finfographic.html&src=sdkpreparse" style="vertical-align:top;display:inline-block; height: 34px;">Share</a></div>
+- </div>
+- </div>
+- <div>
+- <p style="font-size: 14pt">
+- <b>New to netdata?</b> <a href="//my-netdata.io" target="_blank">Have a look at a netdata demo</a>. You will love it!
+- </p>
+- <p>
+- <embed style="padding-top: 10px; padding-botton: 25px;" src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_entries&dimensions=persons&label=user%20base&units=null&value_color=blue&precision=0&v42" type="image/svg+xml" height="20" />
+- <embed style="padding-top: 10px; padding-botton: 25px;" src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_entries&dimensions=machines&label=servers%20monitored&units=null&value_color=orange&precision=0&v42" type="image/svg+xml" height="20" />
+- <embed style="padding-top: 10px; padding-botton: 25px;" src="//registry.my-netdata.io/api/v1/badge.svg?chart=netdata.registry_sessions&label=sessions%20served&units=null&value_color=yellowgreen&precision=0&v42" type="image/svg+xml" height="20" />
+- </p>
+- <hr/>
+- </div>
+- <div style="width:90%;display:inline-block;max-width:1300px;text-align:left;">
+- <div id="drawing" class="mxgraph" style="max-width:100%;border:1px solid transparent;"></div>
+- </div>
+-</div>
+-</body>
+-
+-<script>
+- var opts = {
+- "highlight":"#0000ff",
+- "target":"blank",
+- "lightbox":false,
+- "nav":false,
+- "resize":true,
+- "toolbar":"",
+- "auto-fit":true,
+- "check-visible-state":false,
+- "edit":"https://raw.githubusercontent.com/netdata/netdata/master/diagrams/netdata-overview.xml",
+- "url":"https://raw.githubusercontent.com/netdata/netdata/master/diagrams/netdata-overview.xml"
+- };
+- document.getElementById("drawing").dataset.mxgraph = JSON.stringify(opts);
+-</script>
+-
+-<script>
+- if(window.location.hostname != 'my-netdata.io' || window.location.protocol != 'https:') {
+- var canonical = document.createElement('link');
+- canonical.rel = 'canonical';
+- canonical.href = 'https://my-netdata.io/infographic.html';
+- document.head.appendChild(canonical);
+- }
+-</script>
+-
+-<script>!function (t, e) {
+- "use strict";
+- function a(t, n) {
+- return t.hasAttribute(n) === !0 ? t : t.parentNode !== r.body ? a(t.parentNode, n) : e
+- }
+-
+- function n(n) {
+- var o, i, r, c, g, u = a(n.target, "data-ga-action"), l = !1;
+- u !== e && (o = u.getAttribute("data-ga-action") || e, i = u.getAttribute("data-ga-category") || e, r = u.getAttribute("data-ga-label") || e, c = u.getAttribute("href"), g = parseInt(u.getAttribute("data-ga-value"), 10) || e, ga !== e && i !== e && o !== e && (n.preventDefault(), "Download" !== i && n.ctrlKey !== !0 && n.metaKey !== !0 && 2 !== n.which || (l = !0, t.open(c)), function (a) {
+- var n;
+- ga("send", "event", i, o, r, g, {
+- hitCallback: function () {
+- l === !1 && (n !== e && clearTimeout(n), t.location = a)
+- }
+- }), n = setTimeout(function () {
+- l === !1 && (t.location.href = a)
+- }, 1e3)
+- }(c)))
+- }
+-
+- function o() {
+- !function (t, e, a, n, o, i) {
+- t.GoogleAnalyticsObject = n, t[n] || (t[n] = function () {
+- (t[n].q = t[n].q || []).push(arguments)
+- }), t[n].l = +new Date, o = e.createElement(a), i = e.getElementsByTagName(a)[0], o.src = "//www.google-analytics.com/analytics.js", i.parentNode.insertBefore(o, i)
+- }(t, r, "script", "ga"), ga("create", "UA-64295674-3", "auto"), ga("send", "pageview"), t.document.addEventListener("click", n)
+- }
+-
+- function i() {
+- !function (t, e, a) {
+- var n, o = t.getElementsByTagName(e)[0];
+- t.getElementById(a) || (n = t.createElement(e), n.id = a, n.src = "//platform.twitter.com/widgets.js", o.parentNode.insertBefore(n, o))
+- }(r, "script", "twitter-wjs")
+- }
+-
+- var r = t.document;
+- o(), t.onload = i
+-}(window)</script>
+-
+-<!-- facebook sdk -->
+-<div id="fb-root"></div>
+-<script>
+- window.fbAsyncInit = function() {
+- FB.init({
+- appId : '1200089276712916',
+- xfbml : true,
+- version : 'v2.8'
+- });
+- };
+-
+- (function(d, s, id){
+- var js, fjs = d.getElementsByTagName(s)[0];
+- if (d.getElementById(id)) {return;}
+- js = d.createElement(s); js.id = id;
+- js.src = "//connect.facebook.net/en_US/sdk.js";
+- fjs.parentNode.insertBefore(js, fjs);
+- }(document, 'script', 'facebook-jssdk'));
+-</script>
+-
+-<script type="text/javascript" src="https://www.draw.io/embed2.js?s=arrows2;mscae/cloud;azure;office/users;office/servers&fetch=https%3A%2F%2Fraw.githubusercontent.com%2Fnetdata%2Fnetdata%2Fmaster%2Fdiagrams%2Fnetdata-overview.xml"></script>
+-
+-</html>
+-
+diff --git a/web/gui/main.js b/web/gui/main.js
+index 5bf11e5f..d30192b4 100644
+--- a/web/gui/main.js
++++ b/web/gui/main.js
+@@ -17,9 +17,6 @@ var netdataServer = undefined;
+ var netdataServerStatic = undefined;
+ var netdataCheckXSS = undefined;
+
+-// control the welcome modal and analytics
+-var this_is_demo = null;
+-
+ function escapeUserInputHTML(s) {
+ return s.toString()
+ .replace(/&/g, '&')
+@@ -206,7 +203,6 @@ var urlOptions = {
+
+ netdataShowAlarms = false;
+ netdataRegistry = false;
+- this_is_demo = false;
+ break;
+
+ case 'live':
+@@ -678,32 +674,6 @@ function renderMachines(machinesArray) {
+ </div>`
+ )
+ }
+-
+- html += `<hr />`;
+- html += `<div class="info-item">Demo netdata nodes</div>`;
+-
+- const demoServers = [
+- { url: "//london.netdata.rocks/default.html", title: "UK - London (DigitalOcean.com)" },
+- { url: "//newyork.netdata.rocks/default.html", title: "US - New York (DigitalOcean.com)" },
+- { url: "//sanfrancisco.netdata.rocks/default.html", title: "US - San Francisco (DigitalOcean.com)" },
+- { url: "//atlanta.netdata.rocks/default.html", title: "US - Atlanta (CDN77.com)" },
+- { url: "//frankfurt.netdata.rocks/default.html", title: "Germany - Frankfurt (DigitalOcean.com)" },
+- { url: "//toronto.netdata.rocks/default.html", title: "Canada - Toronto (DigitalOcean.com)" },
+- { url: "//singapore.netdata.rocks/default.html", title: "Japan - Singapore (DigitalOcean.com)" },
+- { url: "//bangalore.netdata.rocks/default.html", title: "India - Bangalore (DigitalOcean.com)" },
+-
+- ]
+-
+- for (var server of demoServers) {
+- html += (
+- `<div class="agent-item">
+- <i class="fas fa-chart-bar" style="color: #fff"></i>
+- <a href="${server.url}">${server.title}</a>
+- <div></div>
+- </div>
+- `
+- );
+- }
+ }
+
+ return html;
+@@ -723,25 +693,9 @@ function clearMyNetdataMenu() {
+ }
+
+ function errorMyNetdataMenu() {
+- setMyNetdataMenu(`<div class="agent-item" style="padding: 0 8px">
+- <i class="fas fa-exclamation-triangle" style="color: red"></i>
+- Cannot load known Netdata agents from Netdata Cloud! Please make sure you have the latest version of Netdata.
+- </div>`);
+ }
+
+ function restrictMyNetdataMenu() {
+- setMyNetdataMenu(`<div class="info-item" style="white-space: nowrap">
+- <span>Please <a href="#" onclick="signInDidClick(event); return false">sign in to netdata.cloud</a> to view your nodes!</span>
+- <div></div>
+- </div>`);
+-}
+-
+-function openAuthenticatedUrl(url) {
+- if (isSignedIn()) {
+- window.open(url);
+- } else {
+- window.open(`${NETDATA.registry.cloudBaseURL}/account/sign-in-agent?id=${NETDATA.registry.machine_guid}&name=${encodeURIComponent(NETDATA.registry.hostname)}&origin=${encodeURIComponent(window.location.origin + "/")}&redirect_uri=${encodeURIComponent(window.location.origin + "/" + url)}`);
+- }
+ }
+
+ function renderMyNetdataMenu(machinesArray) {
+@@ -750,42 +704,10 @@ function renderMyNetdataMenu(machinesArray) {
+
+ if (machinesArray == registryAgents) {
+ console.log("Rendering my-netdata menu from registry");
+- } else {
+- console.log("Rendering my-netdata menu from netdata.cloud", machinesArray);
+ }
+
+ let html = '';
+
+- if (!isSignedIn()) {
+- if (!NETDATA.registry.isRegistryEnabled()) {
+- html += (
+- `<div class="info-item" style="white-space: nowrap">
+- <span>Please <a href="#" onclick="signInDidClick(event); return false">sign in to netdata.cloud</a> to view your nodes!</span>
+- <div></div>
+- </div>
+- <hr />`
+- );
+- }
+- }
+-
+- if (isSignedIn()) {
+- html += (
+- `<div class="filter-control">
+- <input
+- id="my-netdata-menu-filter-input"
+- type="text"
+- placeholder="filter nodes..."
+- autofocus
+- autocomplete="off"
+- value="${myNetdataMenuFilterValue}"
+- onkeydown="myNetdataFilterDidChange(event)"
+- />
+- <span class="filter-control__clear" onclick="myNetdataFilterClearDidClick(event)"><i class="fas fa-times"></i><span>
+- </div>
+- <hr />`
+- );
+- }
+-
+ // options.hosts = [
+ // {
+ // hostname: "streamed1",
+@@ -799,73 +721,15 @@ function renderMyNetdataMenu(machinesArray) {
+ html += `<div id="my-netdata-menu-streamed">${renderStreamedHosts(options)}</div><hr />`;
+ }
+
+- if (isSignedIn() || NETDATA.registry.isRegistryEnabled()) {
++ if (NETDATA.registry.isRegistryEnabled()) {
+ html += `<div id="my-netdata-menu-machines">${renderMachines(machinesArray)}</div><hr />`;
+ }
+
+- if (!isSignedIn()) {
+- html += (
+- `<div class="agent-item">
+- <i class="fas fa-cog""></i>
+- <a href="#" onclick="switchRegistryModalHandler(); return false;">Switch Identity</a>
+- <div></div>
+- </div>
+- <div class="agent-item">
+- <i class="fas fa-question-circle""></i>
+- <a href="https://github.com/netdata/netdata/tree/master/registry#netdata-registry" target="_blank">What is this?</a>
+- <div></div>
+- </div>`
+- )
+- } else {
+- html += (
+- `<div class="agent-item">
+- <i class="fas fa-tv"></i>
+- <a onclick="openAuthenticatedUrl('console.html');" target="_blank">Nodes<sup class="beta"> beta</sup></a>
+- <div></div>
+- </div>
+- <div class="agent-item">
+- <i class="fas fa-sync"></i>
+- <a href="#" onclick="showSyncModal(); return false">Synchronize with netdata.cloud</a>
+- <div></div>
+- </div>
+- <div class="agent-item">
+- <i class="fas fa-question-circle""></i>
+- <a href="https://netdata.cloud/about" target="_blank">What is this?</a>
+- <div></div>
+- </div>`
+- )
+- }
+-
+ el.innerHTML = html;
+
+ gotoServerInit();
+ }
+
+-function isdemo() {
+- if (this_is_demo !== null) {
+- return this_is_demo;
+- }
+- this_is_demo = false;
+-
+- try {
+- if (typeof document.location.hostname === 'string') {
+- if (document.location.hostname.endsWith('.my-netdata.io') ||
+- document.location.hostname.endsWith('.mynetdata.io') ||
+- document.location.hostname.endsWith('.netdata.rocks') ||
+- document.location.hostname.endsWith('.netdata.ai') ||
+- document.location.hostname.endsWith('.netdata.live') ||
+- document.location.hostname.endsWith('.firehol.org') ||
+- document.location.hostname.endsWith('.netdata.online') ||
+- document.location.hostname.endsWith('.netdata.cloud')) {
+- this_is_demo = true;
+- }
+- }
+- }
+- catch (error) {
+- }
+- return this_is_demo;
+-}
+-
+ function netdataURL(url, forReload) {
+ if (typeof url === 'undefined')
+ // url = document.location.toString();
+@@ -973,28 +837,26 @@ function gotoServerModalHandler(guid) {
+ gotoServerValidateUrl(count++, guid, url);
+ }
+
+- if (!isSignedIn()) {
+- // When the registry is enabled, if the user's known URLs are not working
+- // we consult the registry to get additional URLs.
+- setTimeout(function () {
+- if (gotoServerStop === false) {
+- document.getElementById('gotoServerResponse').innerHTML = '<b>Added all the known URLs for this machine.</b>';
+- NETDATA.registry.search(guid, function (data) {
+- // console.log(data);
+- len = data.urls.length;
+- while (len--) {
+- var url = data.urls[len][1];
+- // console.log(url);
+- if (typeof checked[url] === 'undefined') {
+- gotoServerValidateRemaining++;
+- checked[url] = true;
+- gotoServerValidateUrl(count++, guid, url);
+- }
++ // When the registry is enabled, if the user's known URLs are not working
++ // we consult the registry to get additional URLs.
++ setTimeout(function () {
++ if (gotoServerStop === false) {
++ document.getElementById('gotoServerResponse').innerHTML = '<b>Added all the known URLs for this machine.</b>';
++ NETDATA.registry.search(guid, function (data) {
++ // console.log(data);
++ len = data.urls.length;
++ while (len--) {
++ var url = data.urls[len][1];
++ // console.log(url);
++ if (typeof checked[url] === 'undefined') {
++ gotoServerValidateRemaining++;
++ checked[url] = true;
++ gotoServerValidateUrl(count++, guid, url);
+ }
+- });
+- }
+- }, 2000);
+- }
++ }
++ });
++ }
++ }, 2000);
+
+ return false;
+ }
+@@ -1057,34 +919,15 @@ function notifyForDeleteRegistry() {
+ const responseEl = document.getElementById('deleteRegistryResponse');
+
+ if (deleteRegistryUrl) {
+- if (isSignedIn()) {
+- deleteCloudAgentURL(deleteRegistryGuid, deleteRegistryUrl)
+- .then((count) => {
+- if (!count) {
+- responseEl.innerHTML = "<b>Sorry, this command was rejected by netdata.cloud!</b>";
+- return;
+- }
+- NETDATA.registry.delete(deleteRegistryUrl, function (result) {
+- if (result === null) {
+- console.log("Received error from registry", result);
+- }
+-
+- deleteRegistryUrl = null;
+- $('#deleteRegistryModal').modal('hide');
+- NETDATA.registry.init();
+- });
+- });
+- } else {
+- NETDATA.registry.delete(deleteRegistryUrl, function (result) {
+- if (result !== null) {
+- deleteRegistryUrl = null;
+- $('#deleteRegistryModal').modal('hide');
+- NETDATA.registry.init();
+- } else {
+- responseEl.innerHTML = "<b>Sorry, this command was rejected by the registry server!</b>";
+- }
+- });
+- }
++ NETDATA.registry.delete(deleteRegistryUrl, function (result) {
++ if (result !== null) {
++ deleteRegistryUrl = null;
++ $('#deleteRegistryModal').modal('hide');
++ NETDATA.registry.init();
++ } else {
++ responseEl.innerHTML = "<b>Sorry, this command was rejected by the registry server!</b>";
++ }
++ });
+ }
+ }
+
+@@ -2367,11 +2210,7 @@ function alarmsUpdateModal() {
+ void ($element);
+ let main_url;
+ let common_url = "&host=" + encodeURIComponent(row['hostname']) + "&chart=" + encodeURIComponent(row['chart']) + "&family=" + encodeURIComponent(row['family']) + "&alarm=" + encodeURIComponent(row['name']) + "&alarm_unique_id=" + row['unique_id'] + "&alarm_id=" + row['alarm_id'] + "&alarm_event_id=" + row['alarm_event_id'] + "&alarm_when=" + row['when'];
+- if (NETDATA.registry.isUsingGlobalRegistry() && NETDATA.registry.machine_guid != null) {
+- main_url = "https://netdata.cloud/alarms/redirect?agentID=" + NETDATA.registry.machine_guid + common_url;
+- } else {
+- main_url = NETDATA.registry.server + "/goto-host-from-alarm.html?" + common_url ;
+- }
++ main_url = NETDATA.registry.server + "/goto-host-from-alarm.html?" + common_url ;
+ window.open(main_url,"_blank");
+ },
+ rowStyle: function (row, index) {
+@@ -2803,7 +2642,6 @@ function initializeDynamicDashboardWithData(data) {
+ // update the dashboard hostname
+ document.getElementById('hostname').innerHTML = '<span id="hostnametext">' + options.hostname + ((netdataSnapshotData !== null) ? ' (snap)' : '').toString() + '</span> <strong class="caret">';
+ document.getElementById('hostname').href = NETDATA.serverDefault;
+- document.getElementById('netdataVersion').innerHTML = options.version;
+
+ if (netdataSnapshotData !== null) {
+ $('#alarmsButton').hide();
+@@ -2836,7 +2674,7 @@ function initializeDynamicDashboardWithData(data) {
+ renderChartsAndMenu(data);
+
+ // Ensure MyNetdata menu is rendered with latest host info #5370
+- renderMyNetdataMenu(isSignedIn() ? cloudAgents : registryAgents);
++ renderMyNetdataMenu(registryAgents);
+ }
+ }
+
+@@ -4136,18 +3974,10 @@ function runOnceOnDashboardWithjQuery() {
+ // ------------------------------------------------------------------------
+ // sidebar / affix
+
+- if (shouldShowSignInBanner()) {
+- const el = document.getElementById("sign-in-banner");
+- if (el) {
+- el.style.display = "initial";
+- el.classList.add(`theme-${netdataTheme}`);
+- }
+- }
+-
+ $('#sidebar')
+ .affix({
+ offset: {
+- top: (isdemo()) ? 150 : 0,
++ top: 0,
+ bottom: 0
+ }
+ })
+@@ -4457,32 +4287,6 @@ function finalizePage() {
+ $(".shorten").shorten();
+ enableTooltipsAndPopovers();
+
+- if (isdemo()) {
+- // do not to give errors on netdata demo servers for 60 seconds
+- NETDATA.options.current.retries_on_data_failures = 60;
+-
+- // google analytics when this is used for the home page of the demo sites
+- // this does not run on user's installations
+- setTimeout(function () {
+- (function (i, s, o, g, r, a, m) {
+- i['GoogleAnalyticsObject'] = r;
+- i[r] = i[r] || function () {
+- (i[r].q = i[r].q || []).push(arguments)
+- }, i[r].l = 1 * new Date();
+- a = s.createElement(o),
+- m = s.getElementsByTagName(o)[0];
+- a.async = 1;
+- a.src = g;
+- m.parentNode.insertBefore(a, m)
+- })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
+-
+- ga('create', 'UA-64295674-3', 'auto');
+- ga('send', 'pageview', '/demosite/' + window.location.host);
+- }, 2000);
+- } else {
+- notifyForUpdate();
+- }
+-
+ if (urlOptions.show_alarms === true) {
+ setTimeout(function () {
+ $('#alarmsModal').modal('show');
+@@ -4547,12 +4351,9 @@ var netdataPrepCallback = function () {
+ }
+ });
+
+- if (isdemo()) {
+- document.getElementById('masthead').style.display = 'block';
+- } else {
+- if (urlOptions.update_always === true) {
+- NETDATA.setOption('stop_updates_when_focus_is_lost', !urlOptions.update_always);
+- }
++
++ if (urlOptions.update_always === true) {
++ NETDATA.setOption('stop_updates_when_focus_is_lost', !urlOptions.update_always);
+ }
+ };
+
+@@ -4614,542 +4415,4 @@ var selected_server_timezone = function (timezone, status) {
+ // our entry point
+ // var netdataStarted = performance.now();
+
+-var netdataCallback = initializeDynamicDashboard;
+-
+-// =================================================================================================
+-// netdata.cloud
+-
+-let registryAgents = [];
+-
+-let cloudAgents = [];
+-
+-let myNetdataMenuFilterValue = "";
+-
+-let cloudAccountID = null;
+-
+-let cloudAccountName = null;
+-
+-let cloudToken = null;
+-
+-/// Enforces a maximum string length while retaining the prefix and the postfix of
+-/// the string.
+-function truncateString(str, maxLength) {
+- if (str.length <= maxLength) {
+- return str;
+- }
+-
+- const spanLength = Math.floor((maxLength - 3) / 2);
+- return `${str.substring(0, spanLength)}...${str.substring(str.length - spanLength)}`;
+-}
+-
+-// -------------------------------------------------------------------------------------------------
+-// netdata.cloud API Client
+-// -------------------------------------------------------------------------------------------------
+-
+-function isValidAgent(a) {
+- return a.urls != null && a.urls.length > 0;
+-}
+-
+-// https://github.com/netdata/hub/issues/146
+-function getCloudAccountAgents() {
+- if (!isSignedIn()) {
+- return [];
+- }
+-
+- return fetch(
+- `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents`,
+- {
+- method: "GET",
+- mode: "cors",
+- headers: {
+- "Authorization": `Bearer ${cloudToken}`
+- }
+- }
+- ).then((response) => {
+- if (!response.ok) {
+- throw Error("Cannot fetch known accounts");
+- }
+- return response.json();
+- }).then((payload) => {
+- const agents = payload.result ? payload.result.agents : null;
+-
+- if (!agents) {
+- return [];
+- }
+-
+- return agents.filter((a) => isValidAgent(a)).map((a) => {
+- return {
+- "guid": a.id,
+- "name": a.name,
+- "url": a.urls[0],
+- "alternate_urls": a.urls
+- }
+- })
+- }).catch(function (error) {
+- console.log(error);
+- return null;
+- });
+-}
+-
+-/** Updates the lastAccessTime and accessCount properties of the agent for the account. */
+-function touchAgent() {
+- if (!isSignedIn()) {
+- return [];
+- }
+-
+- const touchUrl = `${NETDATA.registry.cloudBaseURL}/api/v1/agents/${NETDATA.registry.machine_guid}/touch?account_id=${cloudAccountID}`;
+- return fetch(
+- touchUrl,
+- {
+- method: "post",
+- body: "",
+- mode: "cors",
+- headers: {
+- "Authorization": `Bearer ${cloudToken}`
+- }
+- }
+- ).then((response) => {
+- if (!response.ok) {
+- throw Error("Cannot touch agent" + JSON.stringify(response));
+- }
+- return response.json();
+- }).then((payload) => {
+-
+- }).catch(function (error) {
+- console.log(error);
+- return null;
+- });
+-}
+-
+-// https://github.com/netdata/hub/issues/128
+-function postCloudAccountAgents(agentsToSync) {
+- if (!isSignedIn()) {
+- return [];
+- }
+-
+- const maskedURL = NETDATA.registry.MASKED_DATA;
+-
+- const agents = agentsToSync.map((a) => {
+- const urls = a.alternate_urls.filter((url) => url != maskedURL);
+-
+- return {
+- "id": a.guid,
+- "name": a.name,
+- "urls": urls
+- }
+- }).filter((a) => isValidAgent(a))
+-
+- const payload = {
+- "accountID": cloudAccountID,
+- "agents": agents,
+- "merge": false,
+- };
+-
+- return fetch(
+- `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents`,
+- {
+- method: "POST",
+- mode: "cors",
+- headers: {
+- "Content-Type": "application/json; charset=utf-8",
+- "Authorization": `Bearer ${cloudToken}`
+- },
+- body: JSON.stringify(payload)
+- }
+- ).then((response) => {
+- return response.json();
+- }).then((payload) => {
+- const agents = payload.result ? payload.result.agents : null;
+-
+- if (!agents) {
+- return [];
+- }
+-
+- return agents.filter((a) => isValidAgent(a)).map((a) => {
+- return {
+- "guid": a.id,
+- "name": a.name,
+- "url": a.urls[0],
+- "alternate_urls": a.urls
+- }
+- })
+- });
+-}
+-
+-function deleteCloudAgentURL(agentID, url) {
+- if (!isSignedIn()) {
+- return [];
+- }
+-
+- return fetch(
+- `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents/${agentID}/url?value=${encodeURIComponent(url)}`,
+- {
+- method: "DELETE",
+- mode: "cors",
+- headers: {
+- "Content-Type": "application/json; charset=utf-8",
+- "Authorization": `Bearer ${cloudToken}`
+- },
+- }
+- ).then((response) => {
+- return response.json();
+- }).then((payload) => {
+- const count = payload.result ? payload.result.count : 0;
+- return count;
+- });
+-}
+-
+-// -------------------------------------------------------------------------------------------------
+-
+-function signInDidClick(e) {
+- e.preventDefault();
+- e.stopPropagation();
+-
+- if (!NETDATA.registry.isUsingGlobalRegistry()) {
+- // If user is using a private registry, request his consent for
+- // synchronizing with cloud.
+- showSignInModal();
+- return;
+- }
+-
+- signIn();
+-}
+-
+-function shouldShowSignInBanner() {
+- return false;
+-}
+-
+-function closeSignInBanner() {
+- localStorage.setItem("signInBannerClosed", "true");
+- const el = document.getElementById("sign-in-banner");
+- if (el) {
+- el.style.display = "none";
+- }
+-}
+-
+-function closeSignInBannerDidClick(e) {
+- closeSignInBanner();
+-}
+-
+-function signOutDidClick(e) {
+- e.preventDefault();
+- e.stopPropagation();
+- signOut();
+-}
+-
+-// -------------------------------------------------------------------------------------------------
+-
+-function updateMyNetdataAfterFilterChange() {
+- const machinesEl = document.getElementById("my-netdata-menu-machines")
+- machinesEl.innerHTML = renderMachines(cloudAgents);
+-
+- if (options.hosts.length > 1) {
+- const streamedEl = document.getElementById("my-netdata-menu-streamed")
+- streamedEl.innerHTML = renderStreamedHosts(options);
+- }
+-}
+-
+-function myNetdataMenuDidShow() {
+- const filterEl = document.getElementById("my-netdata-menu-filter-input");
+- if (filterEl) {
+- filterEl.focus();
+- }
+-}
+-
+-function myNetdataFilterDidChange(e) {
+- const inputEl = e.target;
+- setTimeout(() => {
+- myNetdataMenuFilterValue = inputEl.value;
+- updateMyNetdataAfterFilterChange();
+- }, 1);
+-}
+-
+-function myNetdataFilterClearDidClick(e) {
+- e.preventDefault();
+- e.stopPropagation();
+-
+- const inputEl = document.getElementById("my-netdata-menu-filter-input");
+- inputEl.value = "";
+- myNetdataMenuFilterValue = "";
+-
+- updateMyNetdataAfterFilterChange();
+-
+- inputEl.focus();
+-}
+-
+-// -------------------------------------------------------------------------------------------------
+-
+-function clearCloudVariables() {
+- cloudAccountID = null;
+- cloudAccountName = null;
+- cloudToken = null;
+-}
+-
+-function clearCloudLocalStorageItems() {
+- localStorage.removeItem("cloud.baseURL");
+- localStorage.removeItem("cloud.agentID");
+- localStorage.removeItem("cloud.sync");
+-}
+-
+-function signIn() {
+- const url = `${NETDATA.registry.cloudBaseURL}/account/sign-in-agent?id=${NETDATA.registry.machine_guid}&name=${encodeURIComponent(NETDATA.registry.hostname)}&origin=${encodeURIComponent(window.location.origin + "/")}`;
+- window.open(url);
+-}
+-
+-function signOut() {
+- cloudSSOSignOut();
+-}
+-
+-function handleMessage(e) {
+- switch (e.data.type) {
+- case "sign-in":
+- handleSignInMessage(e);
+- break;
+-
+- case "sign-out":
+- handleSignOutMessage(e);
+- break;
+-
+- default:
+- return;
+- }
+-}
+-
+-function handleSignInMessage(e) {
+- closeSignInBanner();
+- localStorage.setItem("cloud.baseURL", NETDATA.registry.cloudBaseURL);
+-
+- cloudAccountID = e.data.accountID;
+- cloudAccountName = e.data.accountName;
+- cloudToken = e.data.token;
+-
+- netdataRegistryCallback(registryAgents);
+- if (e.data.redirectURI && !window.location.href.includes(e.data.redirectURI)) {
+- // lgtm false-positive - redirectURI does not come from user input, but from iframe callback
+- window.location.replace(e.data.redirectURI); // lgtm[js/client-side-unvalidated-url-redirection]
+- }
+-}
+-
+-function handleSignOutMessage(e) {
+- clearCloudVariables();
+- renderMyNetdataMenu(registryAgents);
+-}
+-
+-function isSignedIn() {
+- return cloudToken != null && cloudAccountID != null;
+-}
+-
+-function sortedArraysEqual(a, b) {
+- if (a.length != b.length) return false;
+-
+- for (var i = 0; i < a.length; ++i) {
+- if (a[i] !== b[i]) return false;
+- }
+-
+- return true;
+-}
+-
+-// If merging is needed returns the merged agents set, otherwise returns null.
+-function mergeAgents(cloud, local) {
+- let dirty = false;
+-
+- const union = new Map();
+-
+- for (const cagent of cloud) {
+- union.set(cagent.guid, cagent);
+- }
+-
+- for (const lagent of local) {
+- const cagent = union.get(lagent.guid);
+- if (cagent) {
+- for (const u of lagent.alternate_urls) {
+- if (u === NETDATA.registry.MASKED_DATA) { // TODO: temp until registry is updated.
+- continue;
+- }
+-
+- if (!cagent.alternate_urls.includes(u)) {
+- dirty = true;
+- cagent.alternate_urls.push(u);
+- }
+- }
+- } else {
+- dirty = true;
+- union.set(lagent.guid, lagent);
+- }
+- }
+-
+- if (dirty) {
+- return Array.from(union.values());
+- }
+-
+- return null;
+-}
+-
+-function showSignInModal() {
+- document.getElementById("sim-registry").innerHTML = NETDATA.registry.server;
+- $("#signInModal").modal("show");
+-}
+-
+-function explicitlySignIn() {
+- $("#signInModal").modal("hide");
+- signIn();
+-}
+-
+-function showSyncModal() {
+- document.getElementById("sync-registry-modal-registry").innerHTML = NETDATA.registry.server;
+- $("#syncRegistryModal").modal("show");
+-}
+-
+-function explicitlySyncAgents() {
+- $("#syncRegistryModal").modal("hide");
+-
+- const json = localStorage.getItem("cloud.sync");
+- const sync = json ? JSON.parse(json) : {};
+- delete sync[cloudAccountID];
+- localStorage.setItem("cloud.sync", JSON.stringify(sync));
+-
+- NETDATA.registry.init();
+-}
+-
+-function syncAgents(callback) {
+- const json = localStorage.getItem("cloud.sync");
+- const sync = json ? JSON.parse(json) : {};
+-
+- const currentAgent = {
+- guid: NETDATA.registry.machine_guid,
+- name: NETDATA.registry.hostname,
+- url: NETDATA.serverDefault,
+- alternate_urls: [NETDATA.serverDefault],
+- }
+-
+- const localAgents = sync[cloudAccountID]
+- ? [currentAgent]
+- : registryAgents.concat([currentAgent]);
+-
+- console.log("Checking if sync is needed.", localAgents);
+-
+- const agentsToSync = mergeAgents(cloudAgents, localAgents);
+-
+- if ((!sync[cloudAccountID]) || agentsToSync) {
+- sync[cloudAccountID] = new Date().getTime();
+- localStorage.setItem("cloud.sync", JSON.stringify(sync));
+- }
+-
+- if (agentsToSync) {
+- console.log("Synchronizing with netdata.cloud.");
+-
+- postCloudAccountAgents(agentsToSync).then((agents) => {
+- // TODO: clear syncTime on error!
+- cloudAgents = agents;
+- callback(cloudAgents);
+- });
+-
+- return
+- }
+-
+- callback(cloudAgents);
+-}
+-
+-let isCloudSSOInitialized = false;
+-
+-function cloudSSOInit() {
+- const iframeEl = document.getElementById("ssoifrm");
+- const url = `${NETDATA.registry.cloudBaseURL}/account/sso-agent?id=${NETDATA.registry.machine_guid}`;
+- iframeEl.src = url;
+- isCloudSSOInitialized = true;
+-}
+-
+-function cloudSSOSignOut() {
+- const iframe = document.getElementById("ssoifrm");
+- const url = `${NETDATA.registry.cloudBaseURL}/account/sign-out-agent`;
+- iframe.src = url;
+-}
+-
+-function initCloud() {
+- if (!NETDATA.registry.isCloudEnabled) {
+- clearCloudVariables();
+- clearCloudLocalStorageItems();
+- return;
+- }
+-
+- if (NETDATA.registry.cloudBaseURL != localStorage.getItem("cloud.baseURL")) {
+- clearCloudVariables();
+- clearCloudLocalStorageItems();
+- if (NETDATA.registry.cloudBaseURL) {
+- localStorage.setItem("cloud.baseURL", NETDATA.registry.cloudBaseURL);
+- }
+- }
+-
+- if (!isCloudSSOInitialized) {
+- cloudSSOInit();
+- }
+-
+- touchAgent();
+-}
+-
+-// This callback is called after NETDATA.registry is initialized.
+-function netdataRegistryCallback(machinesArray) {
+- localStorage.setItem("cloud.agentID", NETDATA.registry.machine_guid);
+-
+- initCloud();
+-
+- registryAgents = machinesArray;
+-
+- if (isSignedIn()) {
+- // We call getCloudAccountAgents() here because it requires that
+- // NETDATA.registry is initialized.
+- clearMyNetdataMenu();
+- getCloudAccountAgents().then((agents) => {
+- if (!agents) {
+- errorMyNetdataMenu();
+- return;
+- }
+- cloudAgents = agents;
+- syncAgents((agents) => {
+- const agentsMap = {}
+- for (const agent of agents) {
+- agentsMap[agent.guid] = agent;
+- }
+-
+- NETDATA.registry.machines = agentsMap;
+- NETDATA.registry.machines_array = agents;
+-
+- renderMyNetdataMenu(agents);
+- });
+- });
+- } else {
+- renderMyNetdataMenu(machinesArray)
+- }
+-};
+-
+-// If we know the cloudBaseURL and agentID from local storage render (eagerly)
+-// the account ui before receiving the definitive response from the web server.
+-// This improves the perceived performance.
+-function tryFastInitCloud() {
+- const baseURL = localStorage.getItem("cloud.baseURL");
+- const agentID = localStorage.getItem("cloud.agentID");
+-
+- if (baseURL && agentID) {
+- NETDATA.registry.cloudBaseURL = baseURL;
+- NETDATA.registry.machine_guid = agentID;
+- NETDATA.registry.isCloudEnabled = true;
+-
+- initCloud();
+- }
+-}
+-
+-function initializeApp() {
+- window.addEventListener("message", handleMessage, false);
+-
+- // tryFastInitCloud();
+-}
+-
+-if (document.readyState === "complete") {
+- initializeApp();
+-} else {
+- document.addEventListener("readystatechange", () => {
+- if (document.readyState === "complete") {
+- initializeApp();
+- }
+- });
+-}
++var netdataCallback = initializeDynamicDashboard;
+\ No newline at end of file
+diff --git a/web/gui/old/index.html b/web/gui/old/index.html
+index 94ec12b7..cffa335e 100644
+--- a/web/gui/old/index.html
++++ b/web/gui/old/index.html
+@@ -108,17 +108,6 @@
+ <div class="navbar-highlight">
+ <div id="navbar-highlight-content" class="navbar-highlight-content"></div>
+ </div>
+-
+- <div id="sign-in-banner" style="display: none">
+- <div class="container">
+- Like what you see?
+- <strong><a href="#" class="__link" onclick="signInDidClick(event); return false">Sign in</a>
+- to experience the full-range of netdata capabilities!</strong>
+- <div class="__close" onclick="closeSignInBannerDidClick(event)">
+- Close <i class="fas fa-times"></i>
+- </div>
+- </div>
+- </div>
+
+ <div id="masthead" style="display: none;">
+ <div class="container">
+@@ -1139,92 +1128,6 @@
+ </div>
+ </div>
+
+-
+- <div class="modal fade" id="updateModal" tabindex="-1" role="dialog" aria-labelledby="updateModalLabel">
+- <div class="modal-dialog" role="document">
+- <div class="modal-content">
+- <div class="modal-header">
+- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
+- <h4 class="modal-title" id="updateModalLabel">Update Check</h4>
+- </div>
+- <div class="modal-body">
+- Your netdata version: <b><code><span id="netdataVersion">Unknown</span></code></b><br/>
+- <br/>
+- <div style="padding: 10px;"></div>
+- <div id="versionCheckLog">Not checked yet. Please press the Check Now button.</div>
+- <div>
+- <hr/>
+- </div>
+- <div>
+- For progress reports and key netdata updates: <strong><a href="https://twitter.com/linuxnetdata" target="_blank">follow netdata on <i class="fab fa-twitter"></i> twitter</a></strong>.
+- <br/>
+- You can also <a href="https://www.facebook.com/linuxnetdata/" target="_blank">follow netdata on <i class="fab fa-facebook"></i> facebook</a>,
+- or <a href="https://github.com/netdata/netdata" target="_blank">watch netdata on <i class="fab fa-github"></i> github</a>.
+- </div>
+- </div>
+- <div class="modal-footer">
+- <a href="#" onclick="notifyForUpdate(true); return false;" type="button" class="btn btn-default">Check Now</a>
+- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+- </div>
+- </div>
+- </div>
+- </div>
+-
+- <div class="modal fade" id="signInModal" tabindex="-1" role="dialog" aria-labelledby="signInModalLabel">
+- <div class="modal-dialog" role="document">
+- <div class="modal-content">
+- <div class="modal-header">
+- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
+- <h4 class="modal-title" id="signInModalLabel">Sign In</h4>
+- </div>
+- <div class="modal-body">
+- <p>
+- Signing-in to netdata.cloud will synchronize the list of
+- your netdata monitored nodes known at registry
+- <strong><span id="sim-registry"></span></strong>. This
+- may include server hostnames, urls and identification
+- GUIDs.
+- </p>
+- <p>
+- After you upgrade all your netdata servers, your private
+- registry will not be needed any more.
+- </p>
+- <p>
+- Are you sure you want to proceed?
+- </p>
+- </div>
+- <div class="modal-footer">
+- <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+- <a href="#" onclick="explicitlySignIn(); return false;" type="button" class="btn btn-success">Sign In</a>
+- </div>
+- </div>
+- </div>
+- </div>
+-
+- <div class="modal fade" id="syncRegistryModal" tabindex="-1" role="dialog" aria-labelledby="syncRegistryModalLabel">
+- <div class="modal-dialog" role="document">
+- <div class="modal-content">
+- <div class="modal-header">
+- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
+- <h4 class="modal-title" id="syncRegistryModalLabel">Synchronize netdata.cloud with registry?</h4>
+- </div>
+- <div class="modal-body">
+- <p>
+- You are about to synchronize your netdata.cloud account with data from the registry at <strong><span id="sync-registry-modal-registry"></span></strong>.
+- This may include server hostnames, urls and identification GUIDs.
+- </p>
+- <p>
+- Are you sure you want to proceed?
+- </p>
+- </div>
+- <div class="modal-footer">
+- <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
+- <a href="#" onclick="explicitlySyncAgents(); return false;" type="button" class="btn btn-success">Synchronize</a>
+- </div>
+- </div>
+- </div>
+- </div>
+-
+ <div class="modal fade" id="deleteRegistryModal" tabindex="-1" role="dialog" aria-labelledby="deleteRegistryModalLabel">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+diff --git a/web/gui/src/dashboard.js/registry.js b/web/gui/src/dashboard.js/registry.js
+index 090ef52f..a2322fb7 100644
+--- a/web/gui/src/dashboard.js/registry.js
++++ b/web/gui/src/dashboard.js/registry.js
+@@ -3,25 +3,14 @@
+
+ NETDATA.registry = {
+ server: null, // the netdata registry server
+- isCloudEnabled: false,// is netdata.cloud functionality enabled?
+- cloudBaseURL: null, // the netdata cloud base url
+ person_guid: null, // the unique ID of this browser / user
+ machine_guid: null, // the unique ID the netdata server that served dashboard.js
+ hostname: 'unknown', // the hostname of the netdata server that served dashboard.js
+ machines: null, // the user's other URLs
+ machines_array: null, // the user's other URLs in an array
+ person_urls: null,
+- anonymous_statistics_checked: false,
+ MASKED_DATA: "***",
+
+- isUsingGlobalRegistry: function() {
+- return NETDATA.registry.server == "https://registry.my-netdata.io";
+- },
+-
+- isRegistryEnabled: function() {
+- return !(NETDATA.registry.isUsingGlobalRegistry() || isSignedIn())
+- },
+-
+ parsePersonUrls: function (person_urls) {
+ NETDATA.registry.person_urls = person_urls;
+
+@@ -75,26 +64,8 @@ NETDATA.registry = {
+ NETDATA.registry.hello(NETDATA.serverDefault, function (data) {
+ if (data) {
+ NETDATA.registry.server = data.registry;
+- if (data.cloud_base_url !== "") {
+- NETDATA.registry.isCloudEnabled = true;
+- NETDATA.registry.cloudBaseURL = data.cloud_base_url;
+- } else {
+- NETDATA.registry.isCloudEnabled = false;
+- NETDATA.registry.cloudBaseURL = "";
+- }
+ NETDATA.registry.machine_guid = data.machine_guid;
+ NETDATA.registry.hostname = data.hostname;
+- if (!NETDATA.registry.anonymous_statistics_checked) {
+- NETDATA.registry.anonymous_statistics_checked=true;
+- if (data.anonymous_statistics) {
+- (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+- j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=false;j.src=
+- 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+- })(window,document,'script','dataLayer','GTM-N6CBMJD');
+- dataLayer.push({"anonymous_statistics" : "true", "machine_guid" : data.machine_guid});
+- }
+- }
+ NETDATA.registry.access(2, function (person_urls) {
+ NETDATA.registry.parsePersonUrls(person_urls);
+ });
+@@ -143,12 +114,8 @@ NETDATA.registry = {
+ let name = NETDATA.registry.MASKED_DATA;
+ let url = NETDATA.registry.MASKED_DATA;
+
+- if (!NETDATA.registry.isUsingGlobalRegistry()) {
+- // If the user is using a private registry keep sending identifiable
+- // data.
+- name = NETDATA.registry.hostname;
+- url = NETDATA.serverDefault;
+- }
++ name = NETDATA.registry.hostname;
++ url = NETDATA.serverDefault;
+
+ console.log("ACCESS", name, url);
+
--
2.30.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [bug#46435] [PATCH] gnu: Add netdata.
2021-02-11 8:09 [bug#46435] [PATCH] gnu: Add netdata Léo Le Bouter via Guix-patches via
@ 2021-02-11 8:14 ` Léo Le Bouter via Guix-patches via
0 siblings, 0 replies; 2+ messages in thread
From: Léo Le Bouter via Guix-patches via @ 2021-02-11 8:14 UTC (permalink / raw)
To: 46435
[-- Attachment #1: Type: text/plain, Size: 178 bytes --]
I would need help to write a service for it.
Here's the systemd service for it:
https://salsa.debian.org/debian/netdata/-/raw/master/system/netdata.service.in
Thank you
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-02-11 8:38 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-02-11 8:09 [bug#46435] [PATCH] gnu: Add netdata Léo Le Bouter via Guix-patches via
2021-02-11 8:14 ` Léo Le Bouter via Guix-patches via
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).