summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml5
-rw-r--r--CONTRIBUTORS.md2
-rw-r--r--conf.d/health.d/mysql.conf15
-rw-r--r--configs.signatures2
-rw-r--r--packaging/README.md3
-rwxr-xr-xpackaging/gpg-recv-key65
-rw-r--r--packaging/gpg.keys65
-rw-r--r--python.d/mysql.chart.py22
-rw-r--r--src/proc_interrupts.c8
-rw-r--r--src/proc_softirqs.c6
10 files changed, 111 insertions, 82 deletions
diff --git a/.travis.yml b/.travis.yml
index 5424c65bc6..0f8d6f412a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -31,10 +31,13 @@ before_install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install fakeroot; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ossp-uuid; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install xz; fi
+ - export KEYSERVER=ipv4.pool.sks-keyservers.net
#
# Run
before_script:
- - gpg --import packaging/gpg.keys
+ # Download keys - builds of tags check for a recognised signature
+ - ./packaging/gpg-recv-key phil@firehol.org "0762 9FF7 89EA 6156 012F 9F50 C406 9602 1359 9237"
+ - ./packaging/gpg-recv-key costa@tsaousis.gr "4DFF 624A E564 3B51 2872 1F40 29CA 3358 89B9 A863"
# Run the commit hooks in case the developer didn't
- git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 | ./packaging/check-files -
script:
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index e23143d0a6..194b55117c 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -105,3 +105,5 @@ username|name|email (optional)
@alibo|Ali Borhani|aliborhani1@gmail.com
@Nani-o|Sofiane Medjkoune|sofiane@medjkoune.fr
@n0guest|Evgeniy K.|ask@osshelp.ru
+@amichelic|Adalbert Michelic|
+@abalabahaha|abalabahaha|hi@abal.moe
diff --git a/conf.d/health.d/mysql.conf b/conf.d/health.d/mysql.conf
index 1eeb993f03..39c401915f 100644
--- a/conf.d/health.d/mysql.conf
+++ b/conf.d/health.d/mysql.conf
@@ -60,6 +60,21 @@ template: mysql_10s_waited_locks_ratio
# -----------------------------------------------------------------------------
+# connections
+
+template: mysql_connections
+ on: mysql.connections_active
+ calc: $active * 100 / $limit
+ units: %
+ every: 10s
+ warn: $this > (($status >= $WARNING) ? (60) : (70))
+ crit: $this > (($status == $CRITICAL) ? (80) : (90))
+ delay: down 15m multiplier 1.5 max 1h
+ info: the ratio of current active connections vs the maximum possible number of connections
+ to: dba
+
+
+# -----------------------------------------------------------------------------
# replication
template: mysql_replication
diff --git a/configs.signatures b/configs.signatures
index f2eb9f17d2..2bb4c1357f 100644
--- a/configs.signatures
+++ b/configs.signatures
@@ -142,6 +142,7 @@ declare -A configs_signatures=(
['3161290af7c1909768253e714ea2c3de']='python.d/ceph.conf'
['318bb45755726a25120bb33413d4b582']='health.d/net.conf'
['318db50a701442890c269ab547041e97']='health.d/tcp_orphans.conf'
+ ['31e4058cfe0a01dd9ce4ae425fd7b4f1']='python.d/web_log.conf'
['322ec5e7095912221110623c9d7130cf']='health_alarm_notify.conf'
['325617412a628e3bc776e3fbb777a2a6']='health.d/redis.conf'
['326e1477131e0f73304711135f70a2a5']='health.d/memcached.conf'
@@ -446,6 +447,7 @@ declare -A configs_signatures=(
['9a8a459a3841b78d4c6ef07428ad2fe1']='health.d/entropy.conf'
['9b6eee7f2febb29efac2b7ea9fcab9be']='charts.d/nut.conf'
['9c0185ceff15415bc59b2ce2c1f04367']='apps_groups.conf'
+ ['9c457056c9ee0d50f9717da647bbd444']='health_alarm_notify.conf'
['9c8ddfa810d83ae58c8614ee5229e66b']='health.d/disks.conf'
['9c981c75bdf4b1637f7113e7e45eb2bf']='health.d/memcached.conf'
['9d304e41e32721224a743f25534263d9']='python.d/retroshare.conf'
diff --git a/packaging/README.md b/packaging/README.md
index e07853a859..664f588e0e 100644
--- a/packaging/README.md
+++ b/packaging/README.md
@@ -18,9 +18,6 @@ and post-release update.
Programs and packages with specific needs should create extra
`whatever.functions` and supporting scripts in a subdirectory.
-The `gpg.keys` file is a list of keys that can be expected to sign
-tags and packages.
-
Making a release
----------------
`
diff --git a/packaging/gpg-recv-key b/packaging/gpg-recv-key
new file mode 100755
index 0000000000..77874cda73
--- /dev/null
+++ b/packaging/gpg-recv-key
@@ -0,0 +1,65 @@
+#!/bin/sh
+
+if [ ! "$KEYSERVER" ]
+then
+ echo "No KEYSERVER environment set, e.g.:"
+ echo " export KEYSERVER=hkps://hkps.pool.sks-keyservers.net"
+ exit 1
+fi
+
+debug=""
+if [ "$debug" ]
+then
+ if [ ! "$GNUPGHOME" ]
+ then
+ echo "No GNUPGHOME environment set, e.g.:"
+ echo " export GNUPGHOME=$HOME/.gnupg"
+ exit 1
+ fi
+
+ if [ ! -d "$GNUPGHOME" ]
+ then
+ mkdir -p "$GNUPGHOME"
+ chmod 700 "$GNUPGHOME"
+ fi
+fi
+
+keyuid="$1"
+fingerprint="$2"
+
+# Modern GPG can import key by fingerprint but the version available
+# within travis currently does not, so we extract the short version and
+# check it matches manually
+key=`echo $fingerprint | cut -f7-10 -d' ' | tr -d ' '`
+
+gpg --keyserver "$KEYSERVER" --recv-key "$key" || exit 1
+gpg --fingerprint "$key" > /tmp/keystatus.$$
+status=$?
+
+cat /tmp/keystatus.$$
+if [ $status -ne 0 ]
+then
+ rm -f /tmp/keystatus.$$
+ exit 2
+fi
+
+if ! grep -q "^uid.*<$keyuid>" /tmp/keystatus.$$
+then
+ rm -f /tmp/keystatus.$$
+ echo "Did not find expected uid $keyuid"
+ exit 3
+fi
+
+echo "uid looks good"
+
+if ! grep -q " $fingerprint$" /tmp/keystatus.$$
+then
+ rm -f /tmp/keystatus.$$
+ echo "Did not find expected fingerprint $fingerprint"
+ exit 3
+fi
+
+echo "Fingerprint looks good"
+
+rm -f /tmp/keystatus.$$
+exit 0
diff --git a/packaging/gpg.keys b/packaging/gpg.keys
deleted file mode 100644
index 25455d9b15..0000000000
--- a/packaging/gpg.keys
+++ /dev/null
@@ -1,65 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-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
-=fY8a
------END PGP PUBLIC KEY BLOCK-----
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-mQENBFbxoXsBCADm7C+gJkjU10vpMkmB9LP2HuJrzzvCuOLeaFKB0wM0y3seNvKJ
-VSeNg76Db4gCZ0Fw8eBk3V49cnjPqtHqB6fBlx3zyu9jcN6RQLO+sLZy7xrqwZkx
-Lox+D/iBU97wXDudVE3Li4J04goBH8NsQ/bf41H6ZEhLWO3xM4mrwb1BNhyC7+Hm
-O0wkCNHe2P+Vf7Vss3FZ6ZPAynLOvFHHE2W0mAV0fA79Pe/nbA7kP6CueyxKLsFR
-xGavRir+19WSFq19xzMg1S4pDGOqm4PBnJvwlwjFz/4yIn0uSoaFtuJIfDvYTgFh
-XZJFR8sV/0AbZLybKsCv9pEgYlm1oeiQSk77ABEBAAG0IkNvc3RhIFRzYW91c2lz
-IDxjb3N0YUB0c2FvdXNpcy5ncj6JATkEEwEIACMFAlbxoXsCGwMHCwkIBwMCAQYV
-CAIJCgsEFgIDAQIeAQIXgAAKCRApyjNYibmoY1RPB/9o8azh6siD7VsHWjaMStBU
-alSa9nyGIinZzmb2u94VzdPUF0ZW08HI++I37HoAIQmXEa1oUtNK4D6pUYhrJpL6
-NnOVVhfFbJH1Siwl1v0dqpNqKmcJ0oUvHEHsKfGWBGqqQCFE4bnDmyayedunzoUV
-aXnUt+3dTD8hwOcicKQ1CID2rT8QvEoSv4jIGqks8t+Dnvp0Gx8bKvxF2CYfEQlr
-LxZbXrjloXQR4IaAjv/Wxpghl0RXslXIx6yRiHYu4QavBDYvL9iZ2168eIUiRiUD
-xkT38N6Itj/YfhBjW+ZXHF73UeGwFlYjagJM7YG3dKrB31OsUdch9leBcw2satmA
-uQENBFbxoXsBCADC+y/ZuxxKn742DYoXX6BvedjNwdrs5swEWrg4JnzdXRAW8g5D
-6YkPlfQ56ov7yXuOAjTgU4vMA0OjI0JN1DrR9ZmsyvmOtQq9+mZMZLFeFSPYXDRa
-0EuBFs6m2V0kq5sfFqcsItC6RSQu0mTu+1HmOmrat2o4XZXhT5Jr/QXQ6ShHkWmm
-823y4XBOxHzDRD6NfZKJbiWfLkmS5Ojza2pOp6otxlLmsknQrEe8V2mHNjiJntMv
-cSv9tJO6EnN613eo/IDejz9mrGJURbu/hTWHX00ONYmwfOmCtF4nPMyh85B3NSTF
-JhORjziEGt4lnOPV6G0vK1hlD2kwmZ48tLy3ABEBAAGJAR8EGAEIAAkFAlbxoXsC
-GwwACgkQKcozWIm5qGPD7Af+Pg398YBVnYW/ze5pGDd/IEPhmUp/mSRu2nU9pZXa
-k30eItf3Cd5JfYIKBFgeOlEx8hb0bXU2OReb1bUpT9aAW7h7YW2F9tjm1gBPdtD4
-iO9jBiNbI6wvUwPsW95f7BMKlh9tO71MmFpghKD5Dougl9X8LmXUa35PDrJxcXAi
-BaLXcrdqjxB/6r+0RFHYzr/JgMCgenu7DQMHUi0P7P+uMbhZwMuVvAtUIgbb8Vw3
-WQ6cJBbrwiAWwVjF1JauFdB8Oy/fm7k1TTein9nWXF1tZ/OTdUDriqktHbkSVjvN
-SKW3nD2RpZ4F5Pa3uNcK9lcbBfM126HCzybjZHZntcyvSA==
-=7nny
------END PGP PUBLIC KEY BLOCK-----
diff --git a/python.d/mysql.chart.py b/python.d/mysql.chart.py
index df2932aaa6..c81ea4c77d 100644
--- a/python.d/mysql.chart.py
+++ b/python.d/mysql.chart.py
@@ -13,6 +13,7 @@ retries = 60
# query executed on MySQL server
QUERY_GLOBAL = 'SHOW GLOBAL STATUS;'
QUERY_SLAVE = 'SHOW SLAVE STATUS;'
+QUERY_VARIABLES = 'SHOW GLOBAL VARIABLES LIKE \'max_connections\';'
GLOBAL_STATS = [
'Bytes_received',
@@ -49,6 +50,7 @@ GLOBAL_STATS = [
'Created_tmp_tables',
'Connections',
'Aborted_connects',
+ 'Max_used_connections',
'Binlog_cache_disk_use',
'Binlog_cache_use',
'Threads_connected',
@@ -143,13 +145,16 @@ SLAVE_STATS = [
('Slave_IO_Running', slave_running)
]
+VARIABLES = [
+ 'max_connections']
+
ORDER = ['net',
'queries',
'handlers',
'table_locks',
'join_issues', 'sort_issues',
'tmp',
- 'connections', 'connection_errors',
+ 'connections', 'connections_active', 'connection_errors',
'binlog_cache', 'binlog_stmt_cache',
'threads', 'thread_cache_misses',
'innodb_io', 'innodb_io_ops', 'innodb_io_pending_ops', 'innodb_log', 'innodb_os_log', 'innodb_os_log_io',
@@ -227,6 +232,13 @@ CHARTS = {
['Connections', 'all', 'incremental'],
['Aborted_connects', 'aborted', 'incremental']
]},
+ 'connections_active': {
+ 'options': [None, 'mysql Connections Active', 'connections', 'connections', 'mysql.connections_active', 'line'],
+ 'lines': [
+ ['Threads_connected', 'active', 'absolute'],
+ ['max_connections', 'limit', 'absolute'],
+ ['Max_used_connections', 'max_active', 'absolute']
+ ]},
'binlog_cache': {
'options': [None, 'mysql Binlog Cache', 'transactions/s', 'binlog', 'mysql.binlog_cache', 'line'],
'lines': [
@@ -459,7 +471,7 @@ class Service(MySQLService):
MySQLService.__init__(self, configuration=configuration, name=name)
self.order = ORDER
self.definitions = CHARTS
- self.queries = dict(global_status=QUERY_GLOBAL, slave_status=QUERY_SLAVE)
+ self.queries = dict(global_status=QUERY_GLOBAL, slave_status=QUERY_SLAVE, variables=QUERY_VARIABLES)
def _get_data(self):
@@ -488,5 +500,11 @@ class Service(MySQLService):
else:
self.queries.pop('slave_status')
+ if 'variables' in raw_data:
+ variables = dict(raw_data['variables'][0])
+ for key in VARIABLES:
+ if key in variables:
+ to_netdata[key] = variables[key]
+
return to_netdata or None
diff --git a/src/proc_interrupts.c b/src/proc_interrupts.c
index 7bd49907af..bfd95043e5 100644
--- a/src/proc_interrupts.c
+++ b/src/proc_interrupts.c
@@ -61,7 +61,7 @@ int do_proc_interrupts(int update_every, usec_t dt) {
if(unlikely(!ff)) {
char filename[FILENAME_MAX + 1];
snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/interrupts");
- ff = procfile_open(config_get("plugin:proc:/proc/interrupts", "filename to monitor", filename), " \t", PROCFILE_FLAG_DEFAULT);
+ ff = procfile_open(config_get("plugin:proc:/proc/interrupts", "filename to monitor", filename), " \t:", PROCFILE_FLAG_DEFAULT);
}
if(unlikely(!ff))
return 1;
@@ -109,10 +109,6 @@ int do_proc_interrupts(int update_every, usec_t dt) {
irr->id = procfile_lineword(ff, l, 0);
if(unlikely(!irr->id || !irr->id[0])) continue;
- size_t idlen = strlen(irr->id);
- if(unlikely(idlen && irr->id[idlen - 1] == ':'))
- irr->id[idlen - 1] = '\0';
-
int c;
for(c = 0; c < cpus ;c++) {
if(likely((c + 1) < (int)words))
@@ -126,7 +122,7 @@ int do_proc_interrupts(int update_every, usec_t dt) {
if(unlikely(isdigit(irr->id[0]) && (uint32_t)(cpus + 2) < words)) {
strncpyz(irr->name, procfile_lineword(ff, l, words - 1), MAX_INTERRUPT_NAME);
size_t nlen = strlen(irr->name);
- idlen = strlen(irr->id);
+ size_t idlen = strlen(irr->id);
if(likely(nlen + 1 + idlen <= MAX_INTERRUPT_NAME)) {
irr->name[nlen] = '_';
strncpyz(&irr->name[nlen + 1], irr->id, MAX_INTERRUPT_NAME - nlen - 1);
diff --git a/src/proc_softirqs.c b/src/proc_softirqs.c
index eb69260a79..58a504be9a 100644
--- a/src/proc_softirqs.c
+++ b/src/proc_softirqs.c
@@ -60,7 +60,7 @@ int do_proc_softirqs(int update_every, usec_t dt) {
if(unlikely(!ff)) {
char filename[FILENAME_MAX + 1];
snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/softirqs");
- ff = procfile_open(config_get("plugin:proc:/proc/softirqs", "filename to monitor", filename), " \t", PROCFILE_FLAG_DEFAULT);
+ ff = procfile_open(config_get("plugin:proc:/proc/softirqs", "filename to monitor", filename), " \t:", PROCFILE_FLAG_DEFAULT);
if(unlikely(!ff)) return 1;
}
@@ -106,10 +106,6 @@ int do_proc_softirqs(int update_every, usec_t dt) {
irr->id = procfile_lineword(ff, l, 0);
if(unlikely(!irr->id || !irr->id[0])) continue;
- size_t idlen = strlen(irr->id);
- if(unlikely(idlen && irr->id[idlen - 1] == ':'))
- irr->id[idlen - 1] = '\0';
-
int c;
for(c = 0; c < cpus ;c++) {
if(likely((c + 1) < (int)words))