feat(go.d.plugin): add RequireCloud for database functions (#21629)
Ilya Mashchenko committed
Jan 24, 2026 at 11:43 UTC
e7173248792e031d33fd00ed08e3359583f377e0
30 files changed
+110
-65
integrations/schemas/collector.json
+4
@@ -581,6 +581,10 @@
581
"availability": {
582
"type": "string",
583
"description": "Availability and enablement notes."
584
+ },
585
+ "require_cloud": {
586
+ "type": "boolean",
587
+ "description": "Whether the function requires cloud connection."
588
}
589
},
590
"required": [
integrations/templates/functions.md
+1
@@ -11,6 +11,7 @@
11
| Aspect | Description |
12
|:-------|:------------|
13
| Name | `[[ strfy(entry.meta.module_name)|capitalize ]]:[[ strfy(func.id) ]]` |
14
+| Require Cloud | [[ 'yes' if func.require_cloud else 'no' ]] |
15
| Performance | [[ strfy(func.performance) ]] |
16
| Security | [[ strfy(func.security) ]] |
17
| Availability | [[ strfy(func.availability) ]] |
src/go/plugin/go.d/agent/jobmgr/manager.go
+8
-1
@@ -139,12 +139,19 @@ func (m *Manager) Run(ctx context.Context, in chan []*confgroup.Group) {
139
if help == "" {
140
help = fmt.Sprintf("%s %s data function", name, method.ID)
141
}
142
+
143
+ // https://github.com/netdata/netdata/blob/1bc1775a17590b3c0fe3a4fe547dc6146d07be89/src/libnetdata/user-auth/http-access.h#L21
144
+ const cloudAccess = "0x0013" // SIGNED_ID | SAME_SPACE | SENSITIVE_DATA
145
+ access := "0x0000"
146
+ if method.RequireCloud {
147
+ access = cloudAccess
148
+ }
149
m.dyncfgApi.FunctionGlobal(netdataapi.FunctionGlobalOpts{
150
Name: funcName,
151
Timeout: 60,
152
Help: help,
153
Tags: "top",
147
- Access: "0x0000",
154
+ Access: access,
155
Priority: 100,
156
Version: 3,
157
})
src/go/plugin/go.d/agent/module/registry.go
+1
@@ -29,6 +29,7 @@ type MethodConfig struct {
29
Name string // Display name (e.g., "Top Queries")
30
UpdateEvery int // Default UI refresh interval
31
Help string // Description for UI
32
+ RequireCloud bool // Indicates whether the method requires cloud connection
33
RequiredParams []funcapi.ParamConfig // Required parameters for this method (including __sort if used)
34
}
35
src/go/plugin/go.d/collector/clickhouse/functions.go
+5
-4
@@ -99,10 +99,11 @@ func clickhouseMethods() []module.MethodConfig {
99
sortOptions := buildClickHouseSortOptions(clickhouseAllColumns)
100
return []module.MethodConfig{
101
{
102
- UpdateEvery: 10,
103
- ID: "top-queries",
104
- Name: "Top Queries",
105
- Help: "Top SQL queries from ClickHouse system.query_log",
102
+ UpdateEvery: 10,
103
+ ID: "top-queries",
104
+ Name: "Top Queries",
105
+ Help: "Top SQL queries from ClickHouse system.query_log",
106
+ RequireCloud: true,
107
RequiredParams: []funcapi.ParamConfig{{
108
ID: paramSort,
109
Name: "Filter By",
src/go/plugin/go.d/collector/clickhouse/metadata.yaml
+1
@@ -382,6 +382,7 @@ modules:
382
:::
383
availability: |
384
Available when:<br/>• The collector has successfully connected to ClickHouse<br/>• `system.query_log` table is accessible<br/>• Returns HTTP 503 if `system.query_log` is not accessible<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
385
+ require_cloud: true
386
metrics:
387
folding:
388
title: Metrics
src/go/plugin/go.d/collector/cockroachdb/functions.go
+10
-8
@@ -118,19 +118,21 @@ var crdbRunningColumns = []crdbColumnMeta{
118
func cockroachMethods() []module.MethodConfig {
119
return []module.MethodConfig{
120
{
121
- UpdateEvery: 10,
122
- ID: "top-queries",
123
- Name: "Top Queries",
124
- Help: "Top SQL statements from crdb_internal.cluster_statement_statistics. WARNING: Query text may contain unmasked literals (potential PII).",
121
+ UpdateEvery: 10,
122
+ ID: "top-queries",
123
+ Name: "Top Queries",
124
+ Help: "Top SQL statements from crdb_internal.cluster_statement_statistics. WARNING: Query text may contain unmasked literals (potential PII).",
125
+ RequireCloud: true,
126
RequiredParams: []funcapi.ParamConfig{
127
buildCrdbSortParam(crdbTopColumns),
128
},
129
},
130
{
130
- UpdateEvery: 10,
131
- ID: "running-queries",
132
- Name: "Running Queries",
133
- Help: "Currently running SQL statements from SHOW CLUSTER STATEMENTS. WARNING: Query text may contain unmasked literals (potential PII).",
131
+ UpdateEvery: 10,
132
+ ID: "running-queries",
133
+ Name: "Running Queries",
134
+ Help: "Currently running SQL statements from SHOW CLUSTER STATEMENTS. WARNING: Query text may contain unmasked literals (potential PII).",
135
+ RequireCloud: true,
136
RequiredParams: []funcapi.ParamConfig{
137
buildCrdbSortParam(crdbRunningColumns),
138
},
src/go/plugin/go.d/collector/cockroachdb/metadata.yaml
+2
@@ -399,6 +399,7 @@ modules:
399
:::
400
availability: |
401
Available when:<br/>• The collector has successfully connected to CockroachDB<br/>• The SQL user has `VIEWACTIVITY` or `VIEWACTIVITYREDACTED` privileges<br/>• Returns HTTP 503 if the SQL connection cannot be established<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
402
+ require_cloud: true
403
- id: running-queries
404
name: Running Queries
405
description: |
@@ -500,6 +501,7 @@ modules:
501
:::
502
availability: |
503
Available when:<br/>• The collector has successfully connected to CockroachDB<br/>• The SQL user has `VIEWACTIVITY` or `VIEWACTIVITYREDACTED` privileges<br/>• Returns HTTP 503 if the SQL connection cannot be established<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
504
+ require_cloud: true
505
metrics:
506
folding:
507
title: Metrics
src/go/plugin/go.d/collector/couchbase/functions.go
+5
-4
@@ -132,10 +132,11 @@ func couchbaseMethods() []module.MethodConfig {
132
sortOptions := buildCouchbaseSortOptions(couchbaseAllColumns)
133
return []module.MethodConfig{
134
{
135
- UpdateEvery: 10,
136
- ID: "top-queries",
137
- Name: "Top Queries",
138
- Help: "Top N1QL requests from system:completed_requests",
135
+ UpdateEvery: 10,
136
+ ID: "top-queries",
137
+ Name: "Top Queries",
138
+ Help: "Top N1QL requests from system:completed_requests",
139
+ RequireCloud: true,
140
RequiredParams: []funcapi.ParamConfig{{
141
ID: paramSort,
142
Name: "Filter By",
src/go/plugin/go.d/collector/couchbase/metadata.yaml
+1
@@ -301,6 +301,7 @@ modules:
301
:::
302
availability: |
303
Available when:<br/>• The collector has successfully connected to Couchbase<br/>• The N1QL (Query) service is running<br/>• Returns HTTP 503 if collector is still initializing<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
304
+ require_cloud: true
305
metrics:
306
folding:
307
title: Metrics
src/go/plugin/go.d/collector/elasticsearch/functions.go
+5
-4
@@ -119,10 +119,11 @@ func elasticsearchMethods() []module.MethodConfig {
119
sortOptions := buildElasticsearchSortOptions(esAllColumns)
120
return []module.MethodConfig{
121
{
122
- UpdateEvery: 10,
123
- ID: "top-queries",
124
- Name: "Top Queries",
125
- Help: "Running queries from Elasticsearch Tasks API",
122
+ UpdateEvery: 10,
123
+ ID: "top-queries",
124
+ Name: "Top Queries",
125
+ Help: "Running queries from Elasticsearch Tasks API",
126
+ RequireCloud: true,
127
RequiredParams: []funcapi.ParamConfig{
128
{
129
ID: paramSort,
src/go/plugin/go.d/collector/elasticsearch/metadata.yaml
+1
@@ -379,6 +379,7 @@ modules:
379
:::
380
availability: |
381
Available when:<br/>• The collector has successfully connected to Elasticsearch/OpenSearch<br/>• The user has `monitor` or `manage` cluster privileges<br/>• Returns HTTP 503 if collector is still initializing<br/>• Returns HTTP 500 if the Tasks API query fails<br/>• Returns HTTP 504 if the query times out
382
+ require_cloud: true
383
metrics:
384
folding:
385
title: Metrics
src/go/plugin/go.d/collector/mongodb/functions.go
+5
-4
@@ -275,10 +275,11 @@ func mongoMethods() []module.MethodConfig {
275
}
276
277
return []module.MethodConfig{{
278
- UpdateEvery: 10,
279
- ID: "top-queries",
280
- Name: "Top Queries",
281
- Help: topQueriesHelpText,
278
+ UpdateEvery: 10,
279
+ ID: "top-queries",
280
+ Name: "Top Queries",
281
+ Help: topQueriesHelpText,
282
+ RequireCloud: true,
283
RequiredParams: []funcapi.ParamConfig{
284
{
285
ID: paramSort,
src/go/plugin/go.d/collector/mongodb/metadata.yaml
+1
@@ -369,6 +369,7 @@ modules:
369
:::
370
availability: |
371
Available when:<br/>• The collector has successfully connected to MongoDB<br/>• Profiling is enabled on at least one user database<br/>• Returns HTTP 503 if collector is still initializing or profiling is disabled on all databases<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
372
+ require_cloud: true
373
metrics:
374
folding:
375
title: Metrics
src/go/plugin/go.d/collector/mssql/functions.go
+5
-4
@@ -208,10 +208,11 @@ func mssqlMethods() []module.MethodConfig {
208
209
return []module.MethodConfig{
210
{
211
- UpdateEvery: 10,
212
- ID: "top-queries",
213
- Name: "Top Queries",
214
- Help: "Top SQL queries from Query Store",
211
+ UpdateEvery: 10,
212
+ ID: "top-queries",
213
+ Name: "Top Queries",
214
+ Help: "Top SQL queries from Query Store",
215
+ RequireCloud: true,
216
RequiredParams: []funcapi.ParamConfig{
217
{
218
ID: paramSort,
src/go/plugin/go.d/collector/mssql/metadata.yaml
+1
@@ -581,6 +581,7 @@ modules:
581
:::
582
availability: |
583
Available when:<br/>• The collector has successfully connected to SQL Server<br/>• Query Store is enabled on at least one user database<br/>• Returns HTTP 503 if collector is still initializing<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
584
+ require_cloud: true
585
metrics:
586
folding:
587
title: Metrics
src/go/plugin/go.d/collector/mysql/functions.go
+5
-4
@@ -187,10 +187,11 @@ func mysqlMethods() []module.MethodConfig {
187
188
return []module.MethodConfig{
189
{
190
- UpdateEvery: 10,
191
- ID: "top-queries",
192
- Name: "Top Queries",
193
- Help: "Top SQL queries from performance_schema",
190
+ UpdateEvery: 10,
191
+ ID: "top-queries",
192
+ Name: "Top Queries",
193
+ Help: "Top SQL queries from performance_schema",
194
+ RequireCloud: true,
195
RequiredParams: []funcapi.ParamConfig{
196
{
197
ID: paramSort,
src/go/plugin/go.d/collector/mysql/metadata.yaml
+1
@@ -499,6 +499,7 @@ modules:
499
```
500
availability: |
501
Available when:<br/>• The collector has successfully connected to MySQL<br/>• Performance Schema is enabled with statement digest collection<br/>• Returns HTTP 503 if collector is still initializing<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
502
+ require_cloud: true
503
metrics:
504
folding:
505
title: Metrics
src/go/plugin/go.d/collector/oracledb/functions.go
+10
-8
@@ -115,19 +115,21 @@ var oracleRunningColumns = []oracleColumnMeta{
115
func oracleMethods() []module.MethodConfig {
116
return []module.MethodConfig{
117
{
118
- UpdateEvery: 10,
119
- ID: "top-queries",
120
- Name: "Top Queries",
121
- Help: "Top SQL statements from V$SQLSTATS. WARNING: Query text may contain unmasked literals (potential PII).",
118
+ UpdateEvery: 10,
119
+ ID: "top-queries",
120
+ Name: "Top Queries",
121
+ Help: "Top SQL statements from V$SQLSTATS. WARNING: Query text may contain unmasked literals (potential PII).",
122
+ RequireCloud: true,
123
RequiredParams: []funcapi.ParamConfig{
124
buildOracleSortParam(oracleTopColumns),
125
},
126
},
127
{
127
- UpdateEvery: 10,
128
- ID: "running-queries",
129
- Name: "Running Queries",
130
- Help: "Currently running SQL statements from V$SESSION. WARNING: Query text may contain unmasked literals (potential PII).",
128
+ UpdateEvery: 10,
129
+ ID: "running-queries",
130
+ Name: "Running Queries",
131
+ Help: "Currently running SQL statements from V$SESSION. WARNING: Query text may contain unmasked literals (potential PII).",
132
+ RequireCloud: true,
133
RequiredParams: []funcapi.ParamConfig{
134
buildOracleSortParam(oracleRunningColumns),
135
},
src/go/plugin/go.d/collector/oracledb/metadata.yaml
+2
@@ -274,6 +274,7 @@ modules:
274
:::
275
availability: |
276
Available when:<br/>• The collector has successfully connected to Oracle DB<br/>• The user has SELECT privilege on `V$SQLSTATS`<br/>• Returns HTTP 503 if the connection cannot be established<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
277
+ require_cloud: true
278
- id: running-queries
279
name: Running Queries
280
description: |
@@ -389,6 +390,7 @@ modules:
390
:::
391
availability: |
392
Available when:<br/>• The collector has successfully connected to Oracle DB<br/>• The user has SELECT privilege on `V$SESSION` and `V$SQL`<br/>• Returns HTTP 503 if the connection cannot be established<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
393
+ require_cloud: true
394
metrics:
395
folding:
396
title: Metrics
src/go/plugin/go.d/collector/postgres/functions.go
+5
-4
@@ -214,10 +214,11 @@ func pgMethods() []module.MethodConfig {
214
215
return []module.MethodConfig{
216
{
217
- UpdateEvery: 10,
218
- ID: "top-queries",
219
- Name: "Top Queries",
220
- Help: "Top SQL queries from pg_stat_statements",
217
+ UpdateEvery: 10,
218
+ ID: "top-queries",
219
+ Name: "Top Queries",
220
+ Help: "Top SQL queries from pg_stat_statements",
221
+ RequireCloud: true,
222
RequiredParams: []funcapi.ParamConfig{
223
{
224
ID: paramSort,
src/go/plugin/go.d/collector/postgres/metadata.yaml
+1
@@ -485,6 +485,7 @@ modules:
485
:::
486
availability: |
487
Available when:<br/>• The `pg_stat_statements` extension is installed in the database<br/>• The collector has successfully connected to PostgreSQL<br/>• Returns HTTP 503 if extension is not installed (with instructions to install)<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
488
+ require_cloud: true
489
metrics:
490
folding:
491
title: Metrics
src/go/plugin/go.d/collector/proxysql/functions.go
+5
-4
@@ -93,10 +93,11 @@ func proxysqlMethods() []module.MethodConfig {
93
sortOptions := buildProxySQLSortOptions(proxysqlAllColumns)
94
return []module.MethodConfig{
95
{
96
- UpdateEvery: 10,
97
- ID: "top-queries",
98
- Name: "Top Queries",
99
- Help: "Top SQL queries from ProxySQL query digest stats",
96
+ UpdateEvery: 10,
97
+ ID: "top-queries",
98
+ Name: "Top Queries",
99
+ Help: "Top SQL queries from ProxySQL query digest stats",
100
+ RequireCloud: true,
101
RequiredParams: []funcapi.ParamConfig{{
102
ID: paramSort,
103
Name: "Filter By",
src/go/plugin/go.d/collector/proxysql/metadata.yaml
+1
@@ -228,6 +228,7 @@ modules:
228
Query text may contain unmasked literal values including potentially sensitive data:<br/>• Personal information in WHERE clauses or INSERT values<br/>• Business data embedded in queries<br/>• Access should be restricted to authorized personnel only
229
availability: |
230
Available when:<br/>• The collector has successfully connected to ProxySQL admin interface<br/>• Returns HTTP 503 if the connection cannot be established<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
231
+ require_cloud: true
232
metrics:
233
folding:
234
title: Metrics
src/go/plugin/go.d/collector/redis/functions.go
+5
-4
@@ -84,10 +84,11 @@ func redisMethods() []module.MethodConfig {
84
sortOptions := buildRedisSortOptions(redisAllColumns)
85
return []module.MethodConfig{
86
{
87
- UpdateEvery: 10,
88
- ID: "top-queries",
89
- Name: "Top Queries",
90
- Help: "Slow commands from Redis SLOWLOG. WARNING: Command arguments may contain unmasked literals (potential PII).",
87
+ UpdateEvery: 10,
88
+ ID: "top-queries",
89
+ Name: "Top Queries",
90
+ Help: "Slow commands from Redis SLOWLOG. WARNING: Command arguments may contain unmasked literals (potential PII).",
91
+ RequireCloud: true,
92
RequiredParams: []funcapi.ParamConfig{{
93
ID: paramSort,
94
Name: "Filter By",
src/go/plugin/go.d/collector/redis/metadata.yaml
+1
@@ -249,6 +249,7 @@ modules:
249
Command arguments may contain unmasked literal values including potentially sensitive data:<br/>• Redis keys and values in command arguments<br/>• Application-specific identifiers or session tokens<br/>• Access should be restricted to authorized personnel only
250
availability: |
251
Available when:<br/>• The collector has successfully connected to Redis<br/>• SLOWLOG is enabled (`slowlog-log-slower-than` > 0)<br/>• Returns HTTP 503 if collector is still initializing<br/>• Returns HTTP 500 if the command fails<br/>• Returns HTTP 504 if the command times out
252
+ require_cloud: true
253
metrics:
254
folding:
255
title: Metrics
src/go/plugin/go.d/collector/rethinkdb/functions.go
+5
-4
@@ -77,10 +77,11 @@ func rethinkdbMethods() []module.MethodConfig {
77
sortOptions := buildRethinkSortOptions(rethinkRunningColumns)
78
return []module.MethodConfig{
79
{
80
- UpdateEvery: 10,
81
- ID: "running-queries",
82
- Name: "Running Queries",
83
- Help: "Currently running queries from rethinkdb.jobs. WARNING: Query text may contain unmasked literals (potential PII).",
80
+ UpdateEvery: 10,
81
+ ID: "running-queries",
82
+ Name: "Running Queries",
83
+ Help: "Currently running queries from rethinkdb.jobs. WARNING: Query text may contain unmasked literals (potential PII).",
84
+ RequireCloud: true,
85
RequiredParams: []funcapi.ParamConfig{
86
{
87
ID: paramSort,
src/go/plugin/go.d/collector/rethinkdb/metadata.yaml
+1
@@ -224,6 +224,7 @@ modules:
224
:::
225
availability: |
226
Available when:<br/>• The collector has successfully connected to RethinkDB<br/>• The user has admin access to `rethinkdb.jobs` table<br/>• Returns HTTP 503 if collector is still initializing<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
227
+ require_cloud: true
228
metrics:
229
folding:
230
title: Metrics
src/go/plugin/go.d/collector/yugabytedb/functions.go
+10
-8
@@ -109,19 +109,21 @@ var ybRunningColumns = []ybColumnMeta{
109
func yugabyteMethods() []module.MethodConfig {
110
return []module.MethodConfig{
111
{
112
- UpdateEvery: 10,
113
- ID: "top-queries",
114
- Name: "Top Queries",
115
- Help: "Top SQL queries from pg_stat_statements. WARNING: Query text may contain unmasked literals (potential PII).",
112
+ UpdateEvery: 10,
113
+ ID: "top-queries",
114
+ Name: "Top Queries",
115
+ Help: "Top SQL queries from pg_stat_statements. WARNING: Query text may contain unmasked literals (potential PII).",
116
+ RequireCloud: true,
117
RequiredParams: []funcapi.ParamConfig{
118
buildYBSortParam(ybTopColumns),
119
},
120
},
121
{
121
- UpdateEvery: 10,
122
- ID: "running-queries",
123
- Name: "Running Queries",
124
- Help: "Currently running SQL statements from pg_stat_activity. WARNING: Query text may contain unmasked literals (potential PII).",
122
+ UpdateEvery: 10,
123
+ ID: "running-queries",
124
+ Name: "Running Queries",
125
+ Help: "Currently running SQL statements from pg_stat_activity. WARNING: Query text may contain unmasked literals (potential PII).",
126
+ RequireCloud: true,
127
RequiredParams: []funcapi.ParamConfig{
128
buildYBSortParam(ybRunningColumns),
129
},
src/go/plugin/go.d/collector/yugabytedb/metadata.yaml
+2
@@ -348,6 +348,7 @@ modules:
348
:::
349
availability: |
350
Available when:<br/>• The collector has successfully connected to YSQL<br/>• The `pg_stat_statements` extension is installed<br/>• Returns HTTP 503 if the SQL connection cannot be established or extension is not installed<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
351
+ require_cloud: true
352
- id: running-queries
353
name: Running Queries
354
description: |
@@ -445,6 +446,7 @@ modules:
446
:::
447
availability: |
448
Available when:<br/>• The collector has successfully connected to YSQL<br/>• Returns HTTP 503 if the SQL connection cannot be established<br/>• Returns HTTP 500 if the query fails<br/>• Returns HTTP 504 if the query times out
449
+ require_cloud: true
450
metrics:
451
folding:
452
title: Metrics