From ea19ec64bf13d6bd7697da28e4cfff73f1e10e3d Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 15 Sep 2025 20:35:59 +0000 Subject: [PATCH] fix(ur): properly skip zero/empty fields in report (#10394) Signed-off-by: Jakob Borg --- lib/ur/contract/contract.go | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/ur/contract/contract.go b/lib/ur/contract/contract.go index 45e972c88..7a9b1bb60 100644 --- a/lib/ur/contract/contract.go +++ b/lib/ur/contract/contract.go @@ -52,7 +52,7 @@ type Report struct { ExternalVersioning int `json:"externalVersioning,omitempty" metric:"folder_feature{feature=VersioningExternal},summary" since:"2"` StaggeredVersioning int `json:"staggeredVersioning,omitempty" metric:"folder_feature{feature=VersioningStaggered},summary" since:"2"` TrashcanVersioning int `json:"trashcanVersioning,omitempty" metric:"folder_feature{feature=VersioningTrashcan},summary" since:"2"` - } `json:"folderUses,omitempty" since:"2"` + } `json:"folderUses,omitzero" since:"2"` DeviceUses struct { Introducer int `json:"introducer,omitempty" metric:"device_feature{feature=Introducer},summary" since:"2"` @@ -62,20 +62,20 @@ type Report struct { CompressNever int `json:"compressNever,omitempty" metric:"device_feature{feature=CompressNever},summary" since:"2"` DynamicAddr int `json:"dynamicAddr,omitempty" metric:"device_feature{feature=AddressDynamic},summary" since:"2"` StaticAddr int `json:"staticAddr,omitempty" metric:"device_feature{feature=AddressStatic},summary" since:"2"` - } `json:"deviceUses,omitempty" since:"2"` + } `json:"deviceUses,omitzero" since:"2"` Announce struct { GlobalEnabled bool `json:"globalEnabled,omitempty" metric:"discovery_feature_count{feature=GlobalEnabled},gauge" since:"2"` LocalEnabled bool `json:"localEnabled,omitempty" metric:"discovery_feature_count{feature=LocalEnabled},gauge" since:"2"` DefaultServersDNS int `json:"defaultServersDNS,omitempty" metric:"discovery_default_servers,summary" since:"2"` OtherServers int `json:"otherServers,omitempty" metric:"discovery_other_servers,summary" since:"2"` - } `json:"announce,omitempty" since:"2"` + } `json:"announce,omitzero" since:"2"` Relays struct { Enabled bool `json:"enabled,omitempty" metric:"relay_feature_enabled,gauge" since:"2"` DefaultServers int `json:"defaultServers,omitempty" metric:"relay_feature_count{feature=DefaultServers},summary" since:"2"` OtherServers int `json:"otherServers,omitempty" metric:"relay_feature_count{feature=OtherServers},summary" since:"2"` - } `json:"relays,omitempty" since:"2"` + } `json:"relays,omitzero" since:"2"` UsesRateLimit bool `json:"usesRateLimit,omitempty" metric:"feature_count{feature=RateLimitsEnabled},gauge" since:"2"` UpgradeAllowedManual bool `json:"upgradeAllowedManual,omitempty" metric:"feature_count{feature=UpgradeAllowedManual},gauge" since:"2"` @@ -127,13 +127,13 @@ type Report struct { SyncXattrs int `json:"syncXattrs,omitempty" metric:"folder_feature{feature=SyncXattrs},summary" since:"3"` SendOwnership int `json:"sendOwnership,omitempty" metric:"folder_feature{feature=SendOwnership},summary" since:"3"` SyncOwnership int `json:"syncOwnership,omitempty" metric:"folder_feature{feature=SyncOwnership},summary" since:"3"` - } `json:"folderUsesV3,omitempty" since:"3"` + } `json:"folderUsesV3,omitzero" since:"3"` DeviceUsesV3 struct { Untrusted int `json:"untrusted,omitempty" metric:"device_feature{feature=Untrusted},summary" since:"3"` UsesRateLimit int `json:"usesRateLimit,omitempty" metric:"device_feature{feature=RateLimitsEnabled},summary" since:"3"` MultipleConnections int `json:"multipleConnections,omitempty" metric:"device_feature{feature=MultipleConnections},summary" since:"3"` - } `json:"deviceUsesV3,omitempty" since:"3"` + } `json:"deviceUsesV3,omitzero" since:"3"` GUIStats struct { Enabled int `json:"enabled,omitempty" metric:"gui_feature_count{feature=Enabled},summary" since:"3"` @@ -146,7 +146,7 @@ type Report struct { ListenLocal int `json:"listenLocal,omitempty" metric:"gui_feature_count{feature=ListenLocal},summary" since:"3"` ListenUnspecified int `json:"listenUnspecified,omitempty" metric:"gui_feature_count{feature=ListenUnspecified},summary" since:"3"` Theme map[string]int `json:"theme,omitempty" metric:"gui_theme,summaryVec:theme" since:"3"` - } `json:"guiStats,omitempty" since:"3"` + } `json:"guiStats,omitzero" since:"3"` BlockStats struct { Total int `json:"total,omitempty" metric:"blocks_processed_total,gauge" since:"3"` @@ -155,7 +155,7 @@ type Report struct { Pulled int `json:"pulled,omitempty" metric:"blocks_processed{source=pulled},gauge" since:"3"` CopyOrigin int `json:"copyOrigin,omitempty" metric:"blocks_processed{source=copy_origin},gauge" since:"3"` CopyElsewhere int `json:"copyElsewhere,omitempty" metric:"blocks_processed{source=copy_elsewhere},gauge" since:"3"` - } `json:"blockStats,omitempty" since:"3"` + } `json:"blockStats,omitzero" since:"3"` TransportStats map[string]int `json:"transportStats,omitempty" since:"3"` @@ -169,32 +169,32 @@ type Report struct { EscapedIncludes int `json:"escapedIncludes,omitempty" metric:"folder_ignore_lines{kind=escapedIncludes},summary" since:"3"` DoubleStars int `json:"doubleStars,omitempty" metric:"folder_ignore_lines{kind=doubleStars},summary" since:"3"` Stars int `json:"stars,omitempty" metric:"folder_ignore_lines{kind=stars},summary" since:"3"` - } `json:"ignoreStats,omitempty" since:"3"` + } `json:"ignoreStats,omitzero" since:"3"` // Added in post processing - Received time.Time `json:"received,omitempty"` + Received time.Time `json:"received,omitzero"` Date string `json:"date,omitempty"` Address string `json:"address,omitempty"` - OS string `json:"os" metric:"reports_total,gaugeVec:os"` - Arch string `json:"arch" metric:"reports_total,gaugeVec:arch"` - Compiler string `json:"compiler" metric:"builder,gaugeVec:compiler"` - Builder string `json:"builder" metric:"builder,gaugeVec:builder"` - Distribution string `json:"distribution" metric:"builder,gaugeVec:distribution"` - Country string `json:"country" metric:"location,gaugeVec:country"` - CountryCode string `json:"countryCode" metric:"location,gaugeVec:countryCode"` - MajorVersion string `json:"majorVersion" metric:"reports_by_major_total,gaugeVec:version"` + OS string `json:"os,omitempty" metric:"reports_total,gaugeVec:os"` + Arch string `json:"arch,omitempty" metric:"reports_total,gaugeVec:arch"` + Compiler string `json:"compiler,omitempty" metric:"builder,gaugeVec:compiler"` + Builder string `json:"builder,omitempty" metric:"builder,gaugeVec:builder"` + Distribution string `json:"distribution,omitempty" metric:"builder,gaugeVec:distribution"` + Country string `json:"country,omitempty" metric:"location,gaugeVec:country"` + CountryCode string `json:"countryCode,omitempty" metric:"location,gaugeVec:countryCode"` + MajorVersion string `json:"majorVersion,omitempty" metric:"reports_by_major_total,gaugeVec:version"` // Once more to create a metric on OS, arch, distribution - DistDist string `json:"distDist" metric:"distribution,gaugeVec:distribution"` - DistOS string `json:"distOS" metric:"distribution,gaugeVec:os"` - DistArch string `json:"distArch" metric:"distribution,gaugeVec:arch"` + DistDist string `json:"distDist,omitempty" metric:"distribution,gaugeVec:distribution"` + DistOS string `json:"distOS,omitempty" metric:"distribution,gaugeVec:os"` + DistArch string `json:"distArch,omitempty" metric:"distribution,gaugeVec:arch"` // Database counts Database struct { - ModernCSQLite bool `json:"modernCSQLite" metric:"database_engine{engine=modernc-sqlite},gauge"` - MattnSQLite bool `json:"mattnSQLite" metric:"database_engine{engine=mattn-sqlite},gauge"` - LevelDB bool `json:"levelDB" metric:"database_engine{engine=leveldb},gauge"` - } `json:"database"` + ModernCSQLite bool `json:"modernCSQLite,omitempty" metric:"database_engine{engine=modernc-sqlite},gauge"` + MattnSQLite bool `json:"mattnSQLite,omitempty" metric:"database_engine{engine=mattn-sqlite},gauge"` + LevelDB bool `json:"levelDB,omitempty" metric:"database_engine{engine=leveldb},gauge"` + } `json:"database,omitzero"` } func New() *Report {