From 9c6aa8a727b8acd361aea0ae8b93e6de5cffd4f3 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Sun, 17 Mar 2024 22:43:20 +0100 Subject: [PATCH 1/4] Add test case --- serverinfo/parse_test.go | 1 + serverinfo/testdata/large-freespace.json | 135 +++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 serverinfo/testdata/large-freespace.json diff --git a/serverinfo/parse_test.go b/serverinfo/parse_test.go index d5b7f7c..f663aa7 100644 --- a/serverinfo/parse_test.go +++ b/serverinfo/parse_test.go @@ -11,6 +11,7 @@ func TestParseJSON(t *testing.T) { "negative-space.json", "na-values.json", "nc22.json", + "large-freespace.json", } for _, inputFile := range inputFiles { diff --git a/serverinfo/testdata/large-freespace.json b/serverinfo/testdata/large-freespace.json new file mode 100644 index 0000000..f603fa0 --- /dev/null +++ b/serverinfo/testdata/large-freespace.json @@ -0,0 +1,135 @@ +{ + "ocs": { + "meta": { + "status": "ok", + "statuscode": 200, + "message": "OK" + }, + "data": { + "nextcloud": { + "system": { + "version": "21.0.3.1", + "theme": "", + "enable_avatars": "yes", + "enable_previews": "yes", + "memcache.local": "\\OC\\Memcache\\APCu", + "memcache.distributed": "none", + "filelocking.enabled": "yes", + "memcache.locking": "\\OC\\Memcache\\Redis", + "debug": "no", + "freespace": 9.2233720360673E+18, + "cpuload": [ + 0.08, + 0.05, + 0.06 + ], + "mem_total": 1986232, + "mem_free": 1285532, + "swap_total": 0, + "swap_free": 0, + "apps": { + "num_installed": 42, + "num_updates_available": 0, + "app_updates": [] + } + }, + "storage": { + "num_users": 4, + "num_files": 148948, + "num_storages": 32, + "num_storages_local": 3, + "num_storages_home": 4, + "num_storages_other": 25 + }, + "shares": { + "num_shares": 10, + "num_shares_user": 0, + "num_shares_groups": 2, + "num_shares_link": 4, + "num_shares_mail": 1, + "num_shares_room": 0, + "num_shares_link_no_password": 4, + "num_fed_shares_sent": 0, + "num_fed_shares_received": 0, + "permissions_3_1": "2", + "permissions_3_17": "1", + "permissions_4_17": "1", + "permissions_1_31": "2", + "permissions_2_31": "3", + "permissions_3_31": "1" + } + }, + "server": { + "webserver": "Apache\/2.4.41 (Ubuntu)", + "php": { + "version": "7.4.3", + "memory_limit": 536870912, + "max_execution_time": 3600, + "upload_max_filesize": 2097152, + "opcache": { + "opcache_enabled": true, + "cache_full": false, + "restart_pending": false, + "restart_in_progress": false, + "memory_usage": { + "used_memory": 35866872, + "free_memory": 98334320, + "wasted_memory": 16536, + "current_wasted_percentage": 0.012320280075073242 + }, + "interned_strings_usage": { + "buffer_size": 6291008, + "used_memory": 4225688, + "free_memory": 2065320, + "number_of_strings": 68439 + }, + "opcache_statistics": { + "num_cached_scripts": 1818, + "num_cached_keys": 3489, + "max_cached_keys": 16229, + "hits": 2725757, + "start_time": 1627817478, + "last_restart_time": 0, + "oom_restarts": 0, + "hash_restarts": 0, + "manual_restarts": 0, + "misses": 1830, + "blacklist_misses": 0, + "blacklist_miss_ratio": 0, + "opcache_hit_rate": 99.93290773126576 + } + }, + "apcu": { + "cache": { + "num_slots": 4099, + "ttl": 0, + "num_hits": 175992, + "num_misses": 1948, + "num_inserts": 2009, + "num_entries": 599, + "expunges": 0, + "start_time": 1627817478, + "mem_size": 295024, + "memory_type": "mmap" + }, + "sma": { + "num_seg": 1, + "seg_size": 33554312, + "avail_mem": 33206176 + } + } + }, + "database": { + "type": "mysql", + "version": "10.5.11", + "size": 59457536 + } + }, + "activeUsers": { + "last5minutes": 1, + "last1hour": 1, + "last24hours": 2 + } + } + } +} From 1bcab5aed51e6e02363492f5b58874869c1423df Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Tue, 19 Mar 2024 23:21:19 +0100 Subject: [PATCH 2/4] Change type of free space to avoid parse errors for large values --- serverinfo/serverinfo.go | 66 ++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/serverinfo/serverinfo.go b/serverinfo/serverinfo.go index bcf0578..fe15e0f 100644 --- a/serverinfo/serverinfo.go +++ b/serverinfo/serverinfo.go @@ -36,34 +36,34 @@ type Nextcloud struct { // System contains nextcloud configuration and system information. type System struct { - Version string `json:"version"` - Theme string `json:"theme"` - EnableAvatars bool `json:"enable_avatars"` - EnablePreviews bool `json:"enable_previews"` - MemcacheLocal string `json:"memcache.local"` - MemcacheDistributed string `json:"memcache.distributed"` - MemcacheLocking string `json:"memcache.locking"` - FilelockingEnabled bool `json:"filelocking.enabled"` - Debug bool `json:"debug"` - FreeSpace int64 `json:"freespace"` - Apps Apps `json:"apps"` + Version string `json:"version"` + Theme string `json:"theme"` + EnableAvatars bool `json:"enable_avatars"` + EnablePreviews bool `json:"enable_previews"` + MemcacheLocal string `json:"memcache.local"` + MemcacheDistributed string `json:"memcache.distributed"` + MemcacheLocking string `json:"memcache.locking"` + FilelockingEnabled bool `json:"filelocking.enabled"` + Debug bool `json:"debug"` + FreeSpace float64 `json:"freespace"` + Apps Apps `json:"apps"` } const boolYes = "yes" func (s *System) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { var raw struct { - Version string `xml:"version"` - Theme string `xml:"theme"` - EnableAvatars string `xml:"enable_avatars"` - EnablePreviews string `xml:"enable_previews"` - MemcacheLocal string `xml:"memcache.local"` - MemcacheDistributed string `xml:"memcache.distributed"` - MemcacheLocking string `xml:"memcache.locking"` - FilelockingEnabled string `xml:"filelocking.enabled"` - Debug string `xml:"debug"` - FreeSpace int64 `xml:"freespace"` - Apps Apps `xml:"apps"` + Version string `xml:"version"` + Theme string `xml:"theme"` + EnableAvatars string `xml:"enable_avatars"` + EnablePreviews string `xml:"enable_previews"` + MemcacheLocal string `xml:"memcache.local"` + MemcacheDistributed string `xml:"memcache.distributed"` + MemcacheLocking string `xml:"memcache.locking"` + FilelockingEnabled string `xml:"filelocking.enabled"` + Debug string `xml:"debug"` + FreeSpace float64 `xml:"freespace"` + Apps Apps `xml:"apps"` } if err := d.DecodeElement(&raw, &start); err != nil { return err @@ -84,17 +84,17 @@ func (s *System) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { func (s *System) UnmarshalJSON(data []byte) error { var raw struct { - Version string `json:"version"` - Theme string `json:"theme"` - EnableAvatars string `json:"enable_avatars"` - EnablePreviews string `json:"enable_previews"` - MemcacheLocal string `json:"memcache.local"` - MemcacheDistributed string `json:"memcache.distributed"` - MemcacheLocking string `json:"memcache.locking"` - FilelockingEnabled string `json:"filelocking.enabled"` - Debug string `json:"debug"` - FreeSpace int64 `json:"freespace"` - Apps Apps `json:"apps"` + Version string `json:"version"` + Theme string `json:"theme"` + EnableAvatars string `json:"enable_avatars"` + EnablePreviews string `json:"enable_previews"` + MemcacheLocal string `json:"memcache.local"` + MemcacheDistributed string `json:"memcache.distributed"` + MemcacheLocking string `json:"memcache.locking"` + FilelockingEnabled string `json:"filelocking.enabled"` + Debug string `json:"debug"` + FreeSpace float64 `json:"freespace"` + Apps Apps `json:"apps"` } if err := json.Unmarshal(data, &raw); err != nil { return err From a6080b57c32a48f1e866a0a80389c25253fbcdd0 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Tue, 19 Mar 2024 23:25:09 +0100 Subject: [PATCH 3/4] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21ba543..0ad406a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - App-related metrics (installed, available updates) are opt-in now, mirroring the change in Nextcloud 28 +### Fixed + +- Error parsing "free space" reported by Nextcloud when number is very large + ## [0.6.2] - 2023-10-15 ### Changed From 343e2dbbb171729ec87fc570f4d319c530a5528e Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Tue, 19 Mar 2024 23:47:50 +0100 Subject: [PATCH 4/4] Remove unnecessary conversion --- internal/metrics/collector.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/metrics/collector.go b/internal/metrics/collector.go index b076d33..68f3441 100644 --- a/internal/metrics/collector.go +++ b/internal/metrics/collector.go @@ -209,7 +209,7 @@ func collectSimpleMetrics(ch chan<- prometheus.Metric, status *serverinfo.Server }, { desc: freeSpaceDesc, - value: float64(status.Data.Nextcloud.System.FreeSpace), + value: status.Data.Nextcloud.System.FreeSpace, }, { desc: activeUsersDesc,