@cryptotaxi247 / netdata-1 / commits / e71732487

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