diff --git a/zabbix-agent-scripts/get_teamfolders_metrics.py b/zabbix-agent-scripts/get_teamfolders_metrics.py new file mode 100644 index 0000000..941ab97 --- /dev/null +++ b/zabbix-agent-scripts/get_teamfolders_metrics.py @@ -0,0 +1,122 @@ +# +# @copyright Copyright (c) 2025, Pietro Marini (pmarini@rcasys.com) +# +# @license GNU AGPL version 3 or any later version +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import subprocess + +import pandas as pd + +import io + +import json + +cmd = "sudo -u www-data /usr/bin/php /var/www/nextcloud/occ groupfolders:list --output json".split() + +teamfolders_output = subprocess.check_output(cmd) + +teamfolders = json.loads(teamfolders_output.decode()) + +gb_conversion_factor = 1./(1024.*1024.*1024.) + +cmd = "sudo -u www-data /usr/bin/php /var/www/nextcloud/occ config:system:get datadirectory".split() + +datadir = subprocess.check_output(cmd).strip(b"\n").decode() + +#################### +# Metrics +#################### + +# Number of team folders +teamfolder_nr = len(teamfolders) + +# Total quota assigned to team folders +teamfolders_quota = [teamfolder['quota'] for teamfolder in teamfolders] + +teamfolder_total_quota_gb = sum(teamfolders_quota)*gb_conversion_factor + +# Number of files and folders in team folders (excluding versions and trash) +cmd = "find /{datadir}/__groupfolders/ -not -path */versions/* -not -path */trash/*".format(datadir=datadir).split() + +teamfolder_nr_files_find = subprocess.Popen(cmd, + stdout=subprocess.PIPE) + +teamfolder_nr_files = subprocess.check_output(('wc', '-l'), + stdin=teamfolder_nr_files_find.stdout) + +teamfolder_nr_files_find.wait() + +teamfolder_nr_files = int(teamfolder_nr_files.decode().strip()) + +# Number of files in team folders versions +cmd = 'find /{datadir}/__groupfolders/versions/'.format(datadir=datadir).split() + +teamfolder_nr_files_versions_find = subprocess.Popen(cmd, stdout=subprocess.PIPE) + +teamfolder_nr_files_versions = subprocess.check_output(('wc', '-l'), + stdin=teamfolder_nr_files_versions_find.stdout) + +teamfolder_nr_files_versions_find.wait() + +teamfolder_nr_files_versions = int(teamfolder_nr_files_versions.decode().strip())-teamfolder_nr-1 + +# Number of files in team folders trash +cmd = 'find /ncdata/__groupfolders/trash/'.split() + +teamfolder_nr_files_trash_find = subprocess.Popen(cmd, stdout=subprocess.PIPE) + +teamfolder_nr_files_trash = subprocess.check_output(('wc', '-l'), + stdin=teamfolder_nr_files_trash_find.stdout) + +teamfolder_nr_files_trash_find.wait() + +teamfolder_nr_files_trash = int(teamfolder_nr_files_trash.decode().strip())-teamfolder_nr-1 + +# Storage used by team folders (excluding versions and trash) +cmd = "du -b -d1 {datadir}/__groupfolders/".format(datadir=datadir).split() + +teamfolder_total_size_output = subprocess.check_output(cmd) + +df_teamfolder_total_size = pd.read_table(io.StringIO(teamfolder_total_size_output.decode()),names=["folder_size", "folder"]) + +df_teamfolder_total_size["folder"] = df_teamfolder_total_size.folder.str.removeprefix("{datadir}/__groupfolders/".format(datadir=datadir)) + +df_teamfolder_total_size["folder_size_gb"] = df_teamfolder_total_size["folder_size"]*gb_conversion_factor + +# Storage used by team folders (excluding versions and trash) +teamfolder_total_size_gb = float(df_teamfolder_total_size.query("folder not in ('trash', 'versions') and folder != ''").folder_size_gb.sum()) + +# Storage used by team folders versions +teamfolder_total_versions_size_gb = float(df_teamfolder_total_size.query("folder == 'versions'").folder_size_gb.sum()) + +# Storage used by team folders trash +teamfolder_total_trash_size_gb = float(df_teamfolder_total_size.query("folder == 'trash'").folder_size_gb.sum()) + +results = { + "teamfolder_nr": teamfolder_nr, + "teamfolder_total_quota_gb": teamfolder_total_quota_gb, + "teamfolder_nr_files_trash": teamfolder_nr_files_trash, + "teamfolder_nr_files_versions":teamfolder_nr_files_versions, + "teamfolder_nr_files":teamfolder_nr_files, + "teamfolder_total_trash_size_gb": teamfolder_total_trash_size_gb, + "teamfolder_total_size_gb": teamfolder_total_size_gb, + "teamfolder_total_versions_size_gb": teamfolder_total_versions_size_gb, +} + +json.dump(results, + open("/var/lib/zabbix/output/nc_teamfolders_metrics.json","w") + ) diff --git a/zabbix-templates/7.0/nextcloud-zabbix-template.json b/zabbix-templates/7.0/nextcloud-zabbix-template.json index 0898730..67f0837 100644 --- a/zabbix-templates/7.0/nextcloud-zabbix-template.json +++ b/zabbix-templates/7.0/nextcloud-zabbix-template.json @@ -19,7 +19,7 @@ "description": "Nextcloud by RCA Systems", "vendor": { "name": "RCA Systems", - "version": "7.0-0.1" + "version": "7.0-1.0" }, "groups": [ { @@ -48,6 +48,22 @@ "description": "Active users in the last hour" }, { + "uuid": "bdebd3157d234d01b0cc61ad5f92211e", + "name": "Number of Users - Active in Last Month", + "key": "nc_metric[ocs.data.activeUsers.last1month]", + "delay": "1d", + "history": "90d", + "description": "Active users in the last month" + }, + { + "uuid": "a63082be7dd847f6a12bdcf046ed63be", + "name": "Number of Users - Active in Last 3 Months", + "key": "nc_metric[ocs.data.activeUsers.last3months]", + "delay": "1d", + "history": "90d", + "description": "Active users in the last 3 months" + }, + { "uuid": "280c9c2ea30f4f97b1167e7d07cb7c0f", "name": "Number of Users - Active in Last 5 Minutes", "key": "nc_metric[ocs.data.activeUsers.last5minutes]", @@ -56,6 +72,22 @@ "description": "Active users in the last 5 minutes" }, { + "uuid": "dcf854b5482743f99afaa7627ef2780b", + "name": "Number of Users - Active in Last 6 Months", + "key": "nc_metric[ocs.data.activeUsers.last6months]", + "delay": "1d", + "history": "90d", + "description": "Active users in the last 6 months" + }, + { + "uuid": "f18e2039c5a84eaf941d974cc7e8cd11", + "name": "Number of Users - Active in Last 7 Days", + "key": "nc_metric[ocs.data.activeUsers.last7days]", + "delay": "1d", + "history": "90d", + "description": "Active users in the last 7 days" + }, + { "uuid": "cae212b94b404cb1b816825839a6643e", "name": "Number of Users - Active in Last 24 Hours", "key": "nc_metric[ocs.data.activeUsers.last24hours]", @@ -64,6 +96,14 @@ "description": "Active users in the last 24 hours" }, { + "uuid": "472020fb79e54991adc6649aea2735cc", + "name": "Number of Users - Active in Last Year", + "key": "nc_metric[ocs.data.activeUsers.lastyear]", + "delay": "1d", + "history": "90d", + "description": "Active users in the last year" + }, + { "uuid": "dd6ca0d93db54819811a7d07d5c06981", "name": "Number of Shares", "key": "nc_metric[ocs.data.nextcloud.shares.num_shares]", @@ -266,6 +306,136 @@ ] }, { + "uuid": "62b4c86ae0cd420daadd5109e0126cf8", + "name": "Number of Team Folders", + "key": "nc_teamfolders_metric[teamfolder_nr]", + "delay": "1h", + "history": "90d", + "description": "Number of Team Folders", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_nr" + ] + } + ] + }, + { + "uuid": "0bdbb5537f4140ed9f39ffa975bd8b8b", + "name": "Number of Files & Folders in Team Folders", + "key": "nc_teamfolders_metric[teamfolder_nr_files]", + "delay": "1h", + "history": "90d", + "description": "Number of files and folders in Team Folders excluding trash and versions", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_nr_files" + ] + } + ] + }, + { + "uuid": "7e99acfb532642c0ac1e9d19cd51a9c6", + "name": "Number of Trashed Files & Folders in Team Folders", + "key": "nc_teamfolders_metric[teamfolder_nr_files_trash]", + "delay": "1h", + "history": "90d", + "description": "Number of trashed files & folders in Team Folders", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_nr_files_trash" + ] + } + ] + }, + { + "uuid": "cb24be92786a4221b34316770485954c", + "name": "Number of Files Versions in Team Folders", + "key": "nc_teamfolders_metric[teamfolder_nr_files_versions]", + "delay": "1h", + "history": "90d", + "description": "Number of files versions for files in Team Folders", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_nr_files_versions" + ] + } + ] + }, + { + "uuid": "f2b65c2b20d74238bf515610df4a330f", + "name": "Storage Quota (GB) - Assigned Total for Team Folders", + "key": "nc_teamfolders_metric[teamfolder_total_quota_gb]", + "delay": "1h", + "history": "90d", + "value_type": "FLOAT", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_total_quota_gb" + ] + } + ] + }, + { + "uuid": "2204753f665c4bbb8df945197831e414", + "name": "Storage Quota Used (GB) - Team Folders", + "key": "nc_teamfolders_metric[teamfolder_total_size_gb]", + "delay": "1h", + "history": "90d", + "value_type": "FLOAT", + "description": "Storage quota used by Team Folders, excluding versions and trash", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_total_size_gb" + ] + } + ] + }, + { + "uuid": "a3ba0fae437d46e58c7baba3016e2fa6", + "name": "Storage Quota Used by Trash (GB) - Team Folders", + "key": "nc_teamfolders_metric[teamfolder_total_trash_size_gb]", + "delay": "1h", + "history": "90d", + "value_type": "FLOAT", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_total_trash_size_gb" + ] + } + ] + }, + { + "uuid": "77523c9d531248d48ccc0d7b2bdf94de", + "name": "Storage Quota Used by Versions (GB) - Team Folders", + "key": "nc_teamfolders_metric[teamfolder_total_versions_size_gb]", + "delay": "1h", + "history": "90d", + "value_type": "FLOAT", + "description": "Storage quota used for files versions by Team Folders", + "preprocessing": [ + { + "type": "JSONPATH", + "parameters": [ + "$.teamfolder_total_versions_size_gb" + ] + } + ] + }, + { "uuid": "2cc43d1dbefd4a109ec8406e2899654b", "name": "Data Directory Size (GB)", "key": "storage_metric[datadirectory_total_size_gb]", @@ -1897,6 +2067,51 @@ "host": "Nextcloud", "key": "nc_metric[ocs.data.nextcloud.storage.num_users]" } + }, + { + "sortorder": "4", + "color": "A54F10", + "calc_fnc": "ALL", + "item": { + "host": "Nextcloud", + "key": "nc_metric[ocs.data.activeUsers.last3months]" + } + }, + { + "sortorder": "5", + "color": "FC6EA3", + "calc_fnc": "ALL", + "item": { + "host": "Nextcloud", + "key": "nc_metric[ocs.data.activeUsers.last6months]" + } + }, + { + "sortorder": "6", + "color": "6C59DC", + "calc_fnc": "ALL", + "item": { + "host": "Nextcloud", + "key": "nc_metric[ocs.data.activeUsers.last7days]" + } + }, + { + "sortorder": "7", + "color": "AC8C14", + "calc_fnc": "ALL", + "item": { + "host": "Nextcloud", + "key": "nc_metric[ocs.data.activeUsers.last1month]" + } + }, + { + "sortorder": "8", + "color": "611F27", + "calc_fnc": "ALL", + "item": { + "host": "Nextcloud", + "key": "nc_metric[ocs.data.activeUsers.lastyear]" + } } ] } diff --git a/zabbix_agentd.conf.d/zabbix-agent-nextcloud.conf b/zabbix_agentd.conf.d/zabbix-agent-nextcloud.conf index e1616c1..5a6e608 100644 --- a/zabbix_agentd.conf.d/zabbix-agent-nextcloud.conf +++ b/zabbix_agentd.conf.d/zabbix-agent-nextcloud.conf @@ -1,5 +1,6 @@ UserParameter=nc_metric[*],/opt/pyvenv/ncmonitor/bin/python /var/lib/zabbix/scripts/read_nc_metrics.py $1 UserParameter=nc_quota_metric[*],cat /var/lib/zabbix/output/nc_quota_metrics.json +UserParameter=nc_teamfolders_metric[*],cat /var/lib/zabbix/output/nc_teamfolders_metrics.json UserParameter=storage_metric[*],/opt/pyvenv/ncmonitor/bin/python /var/lib/zabbix/scripts/read_storage_metrics.py $1 UserParameter=db_full_version[*],mysql --version UserParameter=db_metric[*],/opt/pyvenv/ncmonitor/bin/python /var/lib/zabbix/scripts/read_db_metrics.py $1 $2