diff options
-rw-r--r-- | .travis.yml | 5 | ||||
-rw-r--r-- | CONTRIBUTORS.md | 2 | ||||
-rw-r--r-- | conf.d/health.d/mysql.conf | 15 | ||||
-rw-r--r-- | configs.signatures | 2 | ||||
-rw-r--r-- | packaging/README.md | 3 | ||||
-rwxr-xr-x | packaging/gpg-recv-key | 65 | ||||
-rw-r--r-- | packaging/gpg.keys | 65 | ||||
-rw-r--r-- | python.d/mysql.chart.py | 22 | ||||
-rw-r--r-- | src/proc_interrupts.c | 8 | ||||
-rw-r--r-- | src/proc_softirqs.c | 6 |
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)) |