@cryptotaxi247 / netdata-1 / commits / facaad15a

Regenerate integrations docs (#22135)

Co-authored-by: ilyam8 <22274335+ilyam8@users.noreply.github.com>

Netdata bot committed Apr 4, 2026 at 06:05 UTC facaad15a01754eae6238dfc6f57a9c50b3281ac
40 files changed +4760 -560
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_api_management.md
+119 -14
@@ -62,7 +62,7 @@ The collector has two discovery phases:
62 **Bootstrap (first run)**
63
64 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
65 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
65 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
66 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
67 - A single job can monitor multiple subscriptions.
68
@@ -164,7 +164,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
164 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
165 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
166
167 -User profile files with the same `id` as a stock profile override it.
167 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
168 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
169
170
@@ -192,8 +192,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
192 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
193 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
194 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
195 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
196 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
195 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
196 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
197 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
198 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
199 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
200 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -239,6 +240,7 @@ Controls how the collector finds candidate Azure resources.
240 ##### discovery.mode_query.kql
241
242 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
243 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
244
245 The query **must** project these five columns:
246
@@ -250,6 +252,14 @@ The query **must** project these five columns:
252 | `resourceGroup` | Resource group name |
253 | `location` | Azure region |
254
255 +:::info
256 +
257 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
258 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
259 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
260 +
261 +:::
262 +
263 Example:
264
265 ```
@@ -266,11 +276,67 @@ Controls how the collector decides which metric profiles to activate.
276
277 | Mode | Behavior |
278 |:-----|:---------|
269 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
270 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
271 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
279 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
280 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
281 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
282 +
283 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
284 +
285 +Filter layering:
286 +
287 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
288 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
289 +- The effective resource set for a profile is the intersection of both filter sets.
290 +- Per-profile filters never widen or bypass the global discovery scope.
291 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
292 +
293 +
294 +<a id="option-profiles-profiles-mode-auto-entries"></a>
295 +##### profiles.mode_auto.entries
296 +
297 +Each entry has:
298 +
299 +| Field | Description |
300 +|:------|:------------|
301 +| `name` | Canonical profile basename. |
302 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
303 +| `filters.regions` | Optional region narrowing for this profile. |
304 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
305 +
306 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
307 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
308 +
309 +
310 +<a id="option-profiles-profiles-mode-exact-entries"></a>
311 +##### profiles.mode_exact.entries
312 +
313 +Each entry has:
314 +
315 +| Field | Description |
316 +|:------|:------------|
317 +| `name` | Canonical profile basename. |
318 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
319 +| `filters.regions` | Optional region narrowing for this profile. |
320 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
321 +
322 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
323 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
324 +
325 +
326 +<a id="option-profiles-profiles-mode-combined-entries"></a>
327 +##### profiles.mode_combined.entries
328 +
329 +Each entry has:
330 +
331 +| Field | Description |
332 +|:------|:------------|
333 +| `name` | Canonical profile basename. |
334 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
335 +| `filters.regions` | Optional region narrowing for this profile. |
336 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
337
273 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
338 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
339 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
340
341
342
@@ -358,9 +424,48 @@ jobs:
424 profiles:
425 mode: exact
426 mode_exact:
361 - names:
362 - - sql_database
363 - - postgres_flexible
427 + entries:
428 + - name: sql_database
429 + - name: postgres_flexible
430 + auth:
431 + mode: managed_identity
432 +
433 +```
434 +</details>
435 +
436 +###### Global and per-profile filters together
437 +
438 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
439 +
440 +<details open><summary>Config</summary>
441 +
442 +```yaml
443 +jobs:
444 + - name: prod-databases
445 + subscription_ids:
446 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
447 + discovery:
448 + mode: filters
449 + mode_filters:
450 + resource_groups:
451 + - production-rg
452 + regions:
453 + - eastus
454 + profiles:
455 + mode: combined
456 + mode_combined:
457 + entries:
458 + - name: sql_database
459 + filters:
460 + tags:
461 + env:
462 + - prod
463 + # Effective scope:
464 + # 1. Discovery first keeps only resources in production-rg and eastus.
465 + # 2. Auto-selected profiles use that global scope as-is.
466 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
467 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
468 + # because per-profile filters only narrow the globally discovered set.
469 auth:
470 mode: managed_identity
471
@@ -457,7 +562,7 @@ Labels:
562 | resource_group | The Azure resource group. |
563 | region | The Azure region where the resource is deployed. |
564 | resource_type | The Azure resource type identifier. |
460 -| profile | The Azure Monitor profile id. |
565 +| profile | The Azure Monitor profile basename. |
566 | subscription_id | The Azure subscription identifier. |
567 | resource_uid | The unique Azure resource identifier. |
568
@@ -565,8 +670,8 @@ Check the following:
670
671 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
672
568 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
569 -- **Verify a built-in profile exists** -- List available profiles:
673 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
674 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
675 ```bash
676 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
677 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_app_service.md
+119 -14
@@ -64,7 +64,7 @@ The collector has two discovery phases:
64 **Bootstrap (first run)**
65
66 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
67 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
67 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
68 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
69 - A single job can monitor multiple subscriptions.
70
@@ -166,7 +166,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
166 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
167 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
168
169 -User profile files with the same `id` as a stock profile override it.
169 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
170 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
171
172
@@ -194,8 +194,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
194 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
195 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
196 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
197 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
198 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
197 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
198 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
199 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
200 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
201 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
202 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -241,6 +242,7 @@ Controls how the collector finds candidate Azure resources.
242 ##### discovery.mode_query.kql
243
244 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
245 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
246
247 The query **must** project these five columns:
248
@@ -252,6 +254,14 @@ The query **must** project these five columns:
254 | `resourceGroup` | Resource group name |
255 | `location` | Azure region |
256
257 +:::info
258 +
259 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
260 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
261 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
262 +
263 +:::
264 +
265 Example:
266
267 ```
@@ -268,11 +278,67 @@ Controls how the collector decides which metric profiles to activate.
278
279 | Mode | Behavior |
280 |:-----|:---------|
271 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
272 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
273 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
281 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
282 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
283 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
284 +
285 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
286 +
287 +Filter layering:
288 +
289 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
290 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
291 +- The effective resource set for a profile is the intersection of both filter sets.
292 +- Per-profile filters never widen or bypass the global discovery scope.
293 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
294 +
295 +
296 +<a id="option-profiles-profiles-mode-auto-entries"></a>
297 +##### profiles.mode_auto.entries
298 +
299 +Each entry has:
300 +
301 +| Field | Description |
302 +|:------|:------------|
303 +| `name` | Canonical profile basename. |
304 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
305 +| `filters.regions` | Optional region narrowing for this profile. |
306 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
307 +
308 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
309 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
310 +
311 +
312 +<a id="option-profiles-profiles-mode-exact-entries"></a>
313 +##### profiles.mode_exact.entries
314 +
315 +Each entry has:
316 +
317 +| Field | Description |
318 +|:------|:------------|
319 +| `name` | Canonical profile basename. |
320 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
321 +| `filters.regions` | Optional region narrowing for this profile. |
322 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
323 +
324 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
325 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
326 +
327 +
328 +<a id="option-profiles-profiles-mode-combined-entries"></a>
329 +##### profiles.mode_combined.entries
330 +
331 +Each entry has:
332 +
333 +| Field | Description |
334 +|:------|:------------|
335 +| `name` | Canonical profile basename. |
336 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
337 +| `filters.regions` | Optional region narrowing for this profile. |
338 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
339
275 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
340 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
341 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
342
343
344
@@ -360,9 +426,48 @@ jobs:
426 profiles:
427 mode: exact
428 mode_exact:
363 - names:
364 - - sql_database
365 - - postgres_flexible
429 + entries:
430 + - name: sql_database
431 + - name: postgres_flexible
432 + auth:
433 + mode: managed_identity
434 +
435 +```
436 +</details>
437 +
438 +###### Global and per-profile filters together
439 +
440 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
441 +
442 +<details open><summary>Config</summary>
443 +
444 +```yaml
445 +jobs:
446 + - name: prod-databases
447 + subscription_ids:
448 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
449 + discovery:
450 + mode: filters
451 + mode_filters:
452 + resource_groups:
453 + - production-rg
454 + regions:
455 + - eastus
456 + profiles:
457 + mode: combined
458 + mode_combined:
459 + entries:
460 + - name: sql_database
461 + filters:
462 + tags:
463 + env:
464 + - prod
465 + # Effective scope:
466 + # 1. Discovery first keeps only resources in production-rg and eastus.
467 + # 2. Auto-selected profiles use that global scope as-is.
468 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
469 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
470 + # because per-profile filters only narrow the globally discovered set.
471 auth:
472 mode: managed_identity
473
@@ -456,7 +561,7 @@ Labels:
561 | resource_group | The Azure resource group. |
562 | region | The Azure region where the resource is deployed. |
563 | resource_type | The Azure resource type identifier. |
459 -| profile | The Azure Monitor profile id. |
564 +| profile | The Azure Monitor profile basename. |
565 | subscription_id | The Azure subscription identifier. |
566 | resource_uid | The unique Azure resource identifier. |
567
@@ -580,8 +685,8 @@ Check the following:
685
686 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
687
583 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
584 -- **Verify a built-in profile exists** -- List available profiles:
688 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
689 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
690 ```bash
691 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
692 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_application_gateway.md
+119 -14
@@ -62,7 +62,7 @@ The collector has two discovery phases:
62 **Bootstrap (first run)**
63
64 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
65 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
65 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
66 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
67 - A single job can monitor multiple subscriptions.
68
@@ -164,7 +164,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
164 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
165 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
166
167 -User profile files with the same `id` as a stock profile override it.
167 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
168 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
169
170
@@ -192,8 +192,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
192 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
193 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
194 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
195 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
196 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
195 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
196 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
197 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
198 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
199 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
200 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -239,6 +240,7 @@ Controls how the collector finds candidate Azure resources.
240 ##### discovery.mode_query.kql
241
242 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
243 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
244
245 The query **must** project these five columns:
246
@@ -250,6 +252,14 @@ The query **must** project these five columns:
252 | `resourceGroup` | Resource group name |
253 | `location` | Azure region |
254
255 +:::info
256 +
257 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
258 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
259 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
260 +
261 +:::
262 +
263 Example:
264
265 ```
@@ -266,11 +276,67 @@ Controls how the collector decides which metric profiles to activate.
276
277 | Mode | Behavior |
278 |:-----|:---------|
269 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
270 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
271 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
279 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
280 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
281 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
282 +
283 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
284 +
285 +Filter layering:
286 +
287 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
288 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
289 +- The effective resource set for a profile is the intersection of both filter sets.
290 +- Per-profile filters never widen or bypass the global discovery scope.
291 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
292 +
293 +
294 +<a id="option-profiles-profiles-mode-auto-entries"></a>
295 +##### profiles.mode_auto.entries
296 +
297 +Each entry has:
298 +
299 +| Field | Description |
300 +|:------|:------------|
301 +| `name` | Canonical profile basename. |
302 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
303 +| `filters.regions` | Optional region narrowing for this profile. |
304 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
305 +
306 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
307 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
308 +
309 +
310 +<a id="option-profiles-profiles-mode-exact-entries"></a>
311 +##### profiles.mode_exact.entries
312 +
313 +Each entry has:
314 +
315 +| Field | Description |
316 +|:------|:------------|
317 +| `name` | Canonical profile basename. |
318 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
319 +| `filters.regions` | Optional region narrowing for this profile. |
320 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
321 +
322 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
323 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
324 +
325 +
326 +<a id="option-profiles-profiles-mode-combined-entries"></a>
327 +##### profiles.mode_combined.entries
328 +
329 +Each entry has:
330 +
331 +| Field | Description |
332 +|:------|:------------|
333 +| `name` | Canonical profile basename. |
334 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
335 +| `filters.regions` | Optional region narrowing for this profile. |
336 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
337
273 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
338 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
339 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
340
341
342
@@ -358,9 +424,48 @@ jobs:
424 profiles:
425 mode: exact
426 mode_exact:
361 - names:
362 - - sql_database
363 - - postgres_flexible
427 + entries:
428 + - name: sql_database
429 + - name: postgres_flexible
430 + auth:
431 + mode: managed_identity
432 +
433 +```
434 +</details>
435 +
436 +###### Global and per-profile filters together
437 +
438 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
439 +
440 +<details open><summary>Config</summary>
441 +
442 +```yaml
443 +jobs:
444 + - name: prod-databases
445 + subscription_ids:
446 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
447 + discovery:
448 + mode: filters
449 + mode_filters:
450 + resource_groups:
451 + - production-rg
452 + regions:
453 + - eastus
454 + profiles:
455 + mode: combined
456 + mode_combined:
457 + entries:
458 + - name: sql_database
459 + filters:
460 + tags:
461 + env:
462 + - prod
463 + # Effective scope:
464 + # 1. Discovery first keeps only resources in production-rg and eastus.
465 + # 2. Auto-selected profiles use that global scope as-is.
466 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
467 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
468 + # because per-profile filters only narrow the globally discovered set.
469 auth:
470 mode: managed_identity
471
@@ -453,7 +558,7 @@ Labels:
558 | resource_group | The Azure resource group. |
559 | region | The Azure region where the resource is deployed. |
560 | resource_type | The Azure resource type identifier. |
456 -| profile | The Azure Monitor profile id. |
561 +| profile | The Azure Monitor profile basename. |
562 | subscription_id | The Azure subscription identifier. |
563 | resource_uid | The unique Azure resource identifier. |
564
@@ -571,8 +676,8 @@ Check the following:
676
677 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
678
574 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
575 -- **Verify a built-in profile exists** -- List available profiles:
679 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
680 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
681 ```bash
682 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
683 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_application_insights.md
+119 -14
@@ -63,7 +63,7 @@ The collector has two discovery phases:
63 **Bootstrap (first run)**
64
65 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
66 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
66 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
67 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
68 - A single job can monitor multiple subscriptions.
69
@@ -165,7 +165,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
165 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
166 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
167
168 -User profile files with the same `id` as a stock profile override it.
168 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
169 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
170
171
@@ -193,8 +193,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
193 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
194 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
195 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
196 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
197 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
196 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
197 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
198 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
199 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
200 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
201 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -240,6 +241,7 @@ Controls how the collector finds candidate Azure resources.
241 ##### discovery.mode_query.kql
242
243 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
244 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
245
246 The query **must** project these five columns:
247
@@ -251,6 +253,14 @@ The query **must** project these five columns:
253 | `resourceGroup` | Resource group name |
254 | `location` | Azure region |
255
256 +:::info
257 +
258 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
259 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
260 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
261 +
262 +:::
263 +
264 Example:
265
266 ```
@@ -267,11 +277,67 @@ Controls how the collector decides which metric profiles to activate.
277
278 | Mode | Behavior |
279 |:-----|:---------|
270 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
271 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
272 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
280 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
281 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
282 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
283 +
284 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
285 +
286 +Filter layering:
287 +
288 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
289 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
290 +- The effective resource set for a profile is the intersection of both filter sets.
291 +- Per-profile filters never widen or bypass the global discovery scope.
292 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
293 +
294 +
295 +<a id="option-profiles-profiles-mode-auto-entries"></a>
296 +##### profiles.mode_auto.entries
297 +
298 +Each entry has:
299 +
300 +| Field | Description |
301 +|:------|:------------|
302 +| `name` | Canonical profile basename. |
303 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
304 +| `filters.regions` | Optional region narrowing for this profile. |
305 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
306 +
307 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
308 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
309 +
310 +
311 +<a id="option-profiles-profiles-mode-exact-entries"></a>
312 +##### profiles.mode_exact.entries
313 +
314 +Each entry has:
315 +
316 +| Field | Description |
317 +|:------|:------------|
318 +| `name` | Canonical profile basename. |
319 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
320 +| `filters.regions` | Optional region narrowing for this profile. |
321 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
322 +
323 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
324 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
325 +
326 +
327 +<a id="option-profiles-profiles-mode-combined-entries"></a>
328 +##### profiles.mode_combined.entries
329 +
330 +Each entry has:
331 +
332 +| Field | Description |
333 +|:------|:------------|
334 +| `name` | Canonical profile basename. |
335 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
336 +| `filters.regions` | Optional region narrowing for this profile. |
337 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
338
274 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
339 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
340 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
341
342
343
@@ -359,9 +425,48 @@ jobs:
425 profiles:
426 mode: exact
427 mode_exact:
362 - names:
363 - - sql_database
364 - - postgres_flexible
428 + entries:
429 + - name: sql_database
430 + - name: postgres_flexible
431 + auth:
432 + mode: managed_identity
433 +
434 +```
435 +</details>
436 +
437 +###### Global and per-profile filters together
438 +
439 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
440 +
441 +<details open><summary>Config</summary>
442 +
443 +```yaml
444 +jobs:
445 + - name: prod-databases
446 + subscription_ids:
447 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
448 + discovery:
449 + mode: filters
450 + mode_filters:
451 + resource_groups:
452 + - production-rg
453 + regions:
454 + - eastus
455 + profiles:
456 + mode: combined
457 + mode_combined:
458 + entries:
459 + - name: sql_database
460 + filters:
461 + tags:
462 + env:
463 + - prod
464 + # Effective scope:
465 + # 1. Discovery first keeps only resources in production-rg and eastus.
466 + # 2. Auto-selected profiles use that global scope as-is.
467 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
468 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
469 + # because per-profile filters only narrow the globally discovered set.
470 auth:
471 mode: managed_identity
472
@@ -461,7 +566,7 @@ Labels:
566 | resource_group | The Azure resource group. |
567 | region | The Azure region where the resource is deployed. |
568 | resource_type | The Azure resource type identifier. |
464 -| profile | The Azure Monitor profile id. |
569 +| profile | The Azure Monitor profile basename. |
570 | subscription_id | The Azure subscription identifier. |
571 | resource_uid | The unique Azure resource identifier. |
572
@@ -580,8 +685,8 @@ Check the following:
685
686 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
687
583 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
584 -- **Verify a built-in profile exists** -- List available profiles:
688 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
689 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
690 ```bash
691 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
692 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_cache_for_redis.md
+119 -14
@@ -64,7 +64,7 @@ The collector has two discovery phases:
64 **Bootstrap (first run)**
65
66 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
67 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
67 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
68 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
69 - A single job can monitor multiple subscriptions.
70
@@ -166,7 +166,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
166 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
167 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
168
169 -User profile files with the same `id` as a stock profile override it.
169 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
170 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
171
172
@@ -194,8 +194,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
194 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
195 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
196 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
197 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
198 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
197 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
198 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
199 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
200 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
201 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
202 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -241,6 +242,7 @@ Controls how the collector finds candidate Azure resources.
242 ##### discovery.mode_query.kql
243
244 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
245 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
246
247 The query **must** project these five columns:
248
@@ -252,6 +254,14 @@ The query **must** project these five columns:
254 | `resourceGroup` | Resource group name |
255 | `location` | Azure region |
256
257 +:::info
258 +
259 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
260 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
261 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
262 +
263 +:::
264 +
265 Example:
266
267 ```
@@ -268,11 +278,67 @@ Controls how the collector decides which metric profiles to activate.
278
279 | Mode | Behavior |
280 |:-----|:---------|
271 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
272 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
273 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
281 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
282 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
283 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
284 +
285 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
286 +
287 +Filter layering:
288 +
289 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
290 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
291 +- The effective resource set for a profile is the intersection of both filter sets.
292 +- Per-profile filters never widen or bypass the global discovery scope.
293 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
294 +
295 +
296 +<a id="option-profiles-profiles-mode-auto-entries"></a>
297 +##### profiles.mode_auto.entries
298 +
299 +Each entry has:
300 +
301 +| Field | Description |
302 +|:------|:------------|
303 +| `name` | Canonical profile basename. |
304 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
305 +| `filters.regions` | Optional region narrowing for this profile. |
306 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
307 +
308 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
309 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
310 +
311 +
312 +<a id="option-profiles-profiles-mode-exact-entries"></a>
313 +##### profiles.mode_exact.entries
314 +
315 +Each entry has:
316 +
317 +| Field | Description |
318 +|:------|:------------|
319 +| `name` | Canonical profile basename. |
320 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
321 +| `filters.regions` | Optional region narrowing for this profile. |
322 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
323 +
324 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
325 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
326 +
327 +
328 +<a id="option-profiles-profiles-mode-combined-entries"></a>
329 +##### profiles.mode_combined.entries
330 +
331 +Each entry has:
332 +
333 +| Field | Description |
334 +|:------|:------------|
335 +| `name` | Canonical profile basename. |
336 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
337 +| `filters.regions` | Optional region narrowing for this profile. |
338 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
339
275 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
340 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
341 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
342
343
344
@@ -360,9 +426,48 @@ jobs:
426 profiles:
427 mode: exact
428 mode_exact:
363 - names:
364 - - sql_database
365 - - postgres_flexible
429 + entries:
430 + - name: sql_database
431 + - name: postgres_flexible
432 + auth:
433 + mode: managed_identity
434 +
435 +```
436 +</details>
437 +
438 +###### Global and per-profile filters together
439 +
440 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
441 +
442 +<details open><summary>Config</summary>
443 +
444 +```yaml
445 +jobs:
446 + - name: prod-databases
447 + subscription_ids:
448 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
449 + discovery:
450 + mode: filters
451 + mode_filters:
452 + resource_groups:
453 + - production-rg
454 + regions:
455 + - eastus
456 + profiles:
457 + mode: combined
458 + mode_combined:
459 + entries:
460 + - name: sql_database
461 + filters:
462 + tags:
463 + env:
464 + - prod
465 + # Effective scope:
466 + # 1. Discovery first keeps only resources in production-rg and eastus.
467 + # 2. Auto-selected profiles use that global scope as-is.
468 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
469 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
470 + # because per-profile filters only narrow the globally discovered set.
471 auth:
472 mode: managed_identity
473
@@ -459,7 +564,7 @@ Labels:
564 | resource_group | The Azure resource group. |
565 | region | The Azure region where the resource is deployed. |
566 | resource_type | The Azure resource type identifier. |
462 -| profile | The Azure Monitor profile id. |
567 +| profile | The Azure Monitor profile basename. |
568 | subscription_id | The Azure subscription identifier. |
569 | resource_uid | The unique Azure resource identifier. |
570
@@ -589,8 +694,8 @@ Check the following:
694
695 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
696
592 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
593 -- **Verify a built-in profile exists** -- List available profiles:
697 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
698 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
699 ```bash
700 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
701 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_cognitive_services.md
+119 -14
@@ -67,7 +67,7 @@ The collector has two discovery phases:
67 **Bootstrap (first run)**
68
69 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
70 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
70 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
71 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
72 - A single job can monitor multiple subscriptions.
73
@@ -169,7 +169,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
169 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
170 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
171
172 -User profile files with the same `id` as a stock profile override it.
172 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
173 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
174
175
@@ -197,8 +197,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
197 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
198 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
199 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
200 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
201 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
200 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
201 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
202 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
203 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
204 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
205 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -244,6 +245,7 @@ Controls how the collector finds candidate Azure resources.
245 ##### discovery.mode_query.kql
246
247 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
248 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
249
250 The query **must** project these five columns:
251
@@ -255,6 +257,14 @@ The query **must** project these five columns:
257 | `resourceGroup` | Resource group name |
258 | `location` | Azure region |
259
260 +:::info
261 +
262 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
263 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
264 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
265 +
266 +:::
267 +
268 Example:
269
270 ```
@@ -271,11 +281,67 @@ Controls how the collector decides which metric profiles to activate.
281
282 | Mode | Behavior |
283 |:-----|:---------|
274 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
275 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
276 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
284 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
285 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
286 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
287 +
288 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
289 +
290 +Filter layering:
291 +
292 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
293 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
294 +- The effective resource set for a profile is the intersection of both filter sets.
295 +- Per-profile filters never widen or bypass the global discovery scope.
296 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
297 +
298 +
299 +<a id="option-profiles-profiles-mode-auto-entries"></a>
300 +##### profiles.mode_auto.entries
301 +
302 +Each entry has:
303 +
304 +| Field | Description |
305 +|:------|:------------|
306 +| `name` | Canonical profile basename. |
307 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
308 +| `filters.regions` | Optional region narrowing for this profile. |
309 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
310 +
311 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
312 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
313 +
314 +
315 +<a id="option-profiles-profiles-mode-exact-entries"></a>
316 +##### profiles.mode_exact.entries
317 +
318 +Each entry has:
319 +
320 +| Field | Description |
321 +|:------|:------------|
322 +| `name` | Canonical profile basename. |
323 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
324 +| `filters.regions` | Optional region narrowing for this profile. |
325 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
326 +
327 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
328 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
329 +
330 +
331 +<a id="option-profiles-profiles-mode-combined-entries"></a>
332 +##### profiles.mode_combined.entries
333 +
334 +Each entry has:
335 +
336 +| Field | Description |
337 +|:------|:------------|
338 +| `name` | Canonical profile basename. |
339 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
340 +| `filters.regions` | Optional region narrowing for this profile. |
341 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
342
278 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
343 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
344 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
345
346
347
@@ -363,9 +429,48 @@ jobs:
429 profiles:
430 mode: exact
431 mode_exact:
366 - names:
367 - - sql_database
368 - - postgres_flexible
432 + entries:
433 + - name: sql_database
434 + - name: postgres_flexible
435 + auth:
436 + mode: managed_identity
437 +
438 +```
439 +</details>
440 +
441 +###### Global and per-profile filters together
442 +
443 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
444 +
445 +<details open><summary>Config</summary>
446 +
447 +```yaml
448 +jobs:
449 + - name: prod-databases
450 + subscription_ids:
451 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
452 + discovery:
453 + mode: filters
454 + mode_filters:
455 + resource_groups:
456 + - production-rg
457 + regions:
458 + - eastus
459 + profiles:
460 + mode: combined
461 + mode_combined:
462 + entries:
463 + - name: sql_database
464 + filters:
465 + tags:
466 + env:
467 + - prod
468 + # Effective scope:
469 + # 1. Discovery first keeps only resources in production-rg and eastus.
470 + # 2. Auto-selected profiles use that global scope as-is.
471 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
472 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
473 + # because per-profile filters only narrow the globally discovered set.
474 auth:
475 mode: managed_identity
476
@@ -468,7 +573,7 @@ Labels:
573 | resource_group | The Azure resource group. |
574 | region | The Azure region where the resource is deployed. |
575 | resource_type | The Azure resource type identifier. |
471 -| profile | The Azure Monitor profile id. |
576 +| profile | The Azure Monitor profile basename. |
577 | subscription_id | The Azure subscription identifier. |
578 | resource_uid | The unique Azure resource identifier. |
579
@@ -639,8 +744,8 @@ Check the following:
744
745 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
746
642 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
643 -- **Verify a built-in profile exists** -- List available profiles:
747 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
748 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
749 ```bash
750 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
751 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_container_apps.md
+119 -14
@@ -62,7 +62,7 @@ The collector has two discovery phases:
62 **Bootstrap (first run)**
63
64 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
65 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
65 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
66 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
67 - A single job can monitor multiple subscriptions.
68
@@ -164,7 +164,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
164 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
165 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
166
167 -User profile files with the same `id` as a stock profile override it.
167 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
168 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
169
170
@@ -192,8 +192,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
192 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
193 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
194 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
195 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
196 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
195 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
196 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
197 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
198 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
199 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
200 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -239,6 +240,7 @@ Controls how the collector finds candidate Azure resources.
240 ##### discovery.mode_query.kql
241
242 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
243 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
244
245 The query **must** project these five columns:
246
@@ -250,6 +252,14 @@ The query **must** project these five columns:
252 | `resourceGroup` | Resource group name |
253 | `location` | Azure region |
254
255 +:::info
256 +
257 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
258 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
259 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
260 +
261 +:::
262 +
263 Example:
264
265 ```
@@ -266,11 +276,67 @@ Controls how the collector decides which metric profiles to activate.
276
277 | Mode | Behavior |
278 |:-----|:---------|
269 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
270 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
271 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
279 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
280 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
281 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
282 +
283 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
284 +
285 +Filter layering:
286 +
287 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
288 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
289 +- The effective resource set for a profile is the intersection of both filter sets.
290 +- Per-profile filters never widen or bypass the global discovery scope.
291 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
292 +
293 +
294 +<a id="option-profiles-profiles-mode-auto-entries"></a>
295 +##### profiles.mode_auto.entries
296 +
297 +Each entry has:
298 +
299 +| Field | Description |
300 +|:------|:------------|
301 +| `name` | Canonical profile basename. |
302 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
303 +| `filters.regions` | Optional region narrowing for this profile. |
304 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
305 +
306 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
307 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
308 +
309 +
310 +<a id="option-profiles-profiles-mode-exact-entries"></a>
311 +##### profiles.mode_exact.entries
312 +
313 +Each entry has:
314 +
315 +| Field | Description |
316 +|:------|:------------|
317 +| `name` | Canonical profile basename. |
318 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
319 +| `filters.regions` | Optional region narrowing for this profile. |
320 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
321 +
322 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
323 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
324 +
325 +
326 +<a id="option-profiles-profiles-mode-combined-entries"></a>
327 +##### profiles.mode_combined.entries
328 +
329 +Each entry has:
330 +
331 +| Field | Description |
332 +|:------|:------------|
333 +| `name` | Canonical profile basename. |
334 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
335 +| `filters.regions` | Optional region narrowing for this profile. |
336 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
337
273 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
338 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
339 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
340
341
342
@@ -358,9 +424,48 @@ jobs:
424 profiles:
425 mode: exact
426 mode_exact:
361 - names:
362 - - sql_database
363 - - postgres_flexible
427 + entries:
428 + - name: sql_database
429 + - name: postgres_flexible
430 + auth:
431 + mode: managed_identity
432 +
433 +```
434 +</details>
435 +
436 +###### Global and per-profile filters together
437 +
438 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
439 +
440 +<details open><summary>Config</summary>
441 +
442 +```yaml
443 +jobs:
444 + - name: prod-databases
445 + subscription_ids:
446 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
447 + discovery:
448 + mode: filters
449 + mode_filters:
450 + resource_groups:
451 + - production-rg
452 + regions:
453 + - eastus
454 + profiles:
455 + mode: combined
456 + mode_combined:
457 + entries:
458 + - name: sql_database
459 + filters:
460 + tags:
461 + env:
462 + - prod
463 + # Effective scope:
464 + # 1. Discovery first keeps only resources in production-rg and eastus.
465 + # 2. Auto-selected profiles use that global scope as-is.
466 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
467 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
468 + # because per-profile filters only narrow the globally discovered set.
469 auth:
470 mode: managed_identity
471
@@ -457,7 +562,7 @@ Labels:
562 | resource_group | The Azure resource group. |
563 | region | The Azure region where the resource is deployed. |
564 | resource_type | The Azure resource type identifier. |
460 -| profile | The Azure Monitor profile id. |
565 +| profile | The Azure Monitor profile basename. |
566 | subscription_id | The Azure subscription identifier. |
567 | resource_uid | The unique Azure resource identifier. |
568
@@ -577,8 +682,8 @@ Check the following:
682
683 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
684
580 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
581 -- **Verify a built-in profile exists** -- List available profiles:
685 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
686 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
687 ```bash
688 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
689 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_container_instances.md
+119 -14
@@ -58,7 +58,7 @@ The collector has two discovery phases:
58 **Bootstrap (first run)**
59
60 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
61 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
61 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
62 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
63 - A single job can monitor multiple subscriptions.
64
@@ -160,7 +160,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
160 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
161 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
162
163 -User profile files with the same `id` as a stock profile override it.
163 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
164 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
165
166
@@ -188,8 +188,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
188 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
189 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
190 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
191 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
192 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
191 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
192 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
193 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
194 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
195 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
196 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -235,6 +236,7 @@ Controls how the collector finds candidate Azure resources.
236 ##### discovery.mode_query.kql
237
238 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
239 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
240
241 The query **must** project these five columns:
242
@@ -246,6 +248,14 @@ The query **must** project these five columns:
248 | `resourceGroup` | Resource group name |
249 | `location` | Azure region |
250
251 +:::info
252 +
253 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
254 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
255 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
256 +
257 +:::
258 +
259 Example:
260
261 ```
@@ -262,11 +272,67 @@ Controls how the collector decides which metric profiles to activate.
272
273 | Mode | Behavior |
274 |:-----|:---------|
265 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
266 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
267 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
275 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
276 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
277 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
278 +
279 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
280 +
281 +Filter layering:
282 +
283 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
284 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
285 +- The effective resource set for a profile is the intersection of both filter sets.
286 +- Per-profile filters never widen or bypass the global discovery scope.
287 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
288 +
289 +
290 +<a id="option-profiles-profiles-mode-auto-entries"></a>
291 +##### profiles.mode_auto.entries
292 +
293 +Each entry has:
294 +
295 +| Field | Description |
296 +|:------|:------------|
297 +| `name` | Canonical profile basename. |
298 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
299 +| `filters.regions` | Optional region narrowing for this profile. |
300 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
301 +
302 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
303 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
304 +
305 +
306 +<a id="option-profiles-profiles-mode-exact-entries"></a>
307 +##### profiles.mode_exact.entries
308 +
309 +Each entry has:
310 +
311 +| Field | Description |
312 +|:------|:------------|
313 +| `name` | Canonical profile basename. |
314 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
315 +| `filters.regions` | Optional region narrowing for this profile. |
316 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
317 +
318 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
319 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
320 +
321 +
322 +<a id="option-profiles-profiles-mode-combined-entries"></a>
323 +##### profiles.mode_combined.entries
324 +
325 +Each entry has:
326 +
327 +| Field | Description |
328 +|:------|:------------|
329 +| `name` | Canonical profile basename. |
330 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
331 +| `filters.regions` | Optional region narrowing for this profile. |
332 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
333
269 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
334 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
335 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
336
337
338
@@ -354,9 +420,48 @@ jobs:
420 profiles:
421 mode: exact
422 mode_exact:
357 - names:
358 - - sql_database
359 - - postgres_flexible
423 + entries:
424 + - name: sql_database
425 + - name: postgres_flexible
426 + auth:
427 + mode: managed_identity
428 +
429 +```
430 +</details>
431 +
432 +###### Global and per-profile filters together
433 +
434 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
435 +
436 +<details open><summary>Config</summary>
437 +
438 +```yaml
439 +jobs:
440 + - name: prod-databases
441 + subscription_ids:
442 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
443 + discovery:
444 + mode: filters
445 + mode_filters:
446 + resource_groups:
447 + - production-rg
448 + regions:
449 + - eastus
450 + profiles:
451 + mode: combined
452 + mode_combined:
453 + entries:
454 + - name: sql_database
455 + filters:
456 + tags:
457 + env:
458 + - prod
459 + # Effective scope:
460 + # 1. Discovery first keeps only resources in production-rg and eastus.
461 + # 2. Auto-selected profiles use that global scope as-is.
462 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
463 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
464 + # because per-profile filters only narrow the globally discovered set.
465 auth:
466 mode: managed_identity
467
@@ -446,7 +551,7 @@ Labels:
551 | resource_group | The Azure resource group. |
552 | region | The Azure region where the resource is deployed. |
553 | resource_type | The Azure resource type identifier. |
449 -| profile | The Azure Monitor profile id. |
554 +| profile | The Azure Monitor profile basename. |
555 | subscription_id | The Azure subscription identifier. |
556 | resource_uid | The unique Azure resource identifier. |
557
@@ -547,8 +652,8 @@ Check the following:
652
653 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
654
550 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
551 -- **Verify a built-in profile exists** -- List available profiles:
655 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
656 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
657 ```bash
658 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
659 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_container_registry.md
+119 -14
@@ -58,7 +58,7 @@ The collector has two discovery phases:
58 **Bootstrap (first run)**
59
60 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
61 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
61 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
62 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
63 - A single job can monitor multiple subscriptions.
64
@@ -160,7 +160,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
160 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
161 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
162
163 -User profile files with the same `id` as a stock profile override it.
163 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
164 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
165
166
@@ -188,8 +188,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
188 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
189 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
190 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
191 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
192 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
191 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
192 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
193 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
194 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
195 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
196 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -235,6 +236,7 @@ Controls how the collector finds candidate Azure resources.
236 ##### discovery.mode_query.kql
237
238 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
239 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
240
241 The query **must** project these five columns:
242
@@ -246,6 +248,14 @@ The query **must** project these five columns:
248 | `resourceGroup` | Resource group name |
249 | `location` | Azure region |
250
251 +:::info
252 +
253 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
254 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
255 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
256 +
257 +:::
258 +
259 Example:
260
261 ```
@@ -262,11 +272,67 @@ Controls how the collector decides which metric profiles to activate.
272
273 | Mode | Behavior |
274 |:-----|:---------|
265 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
266 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
267 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
275 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
276 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
277 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
278 +
279 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
280 +
281 +Filter layering:
282 +
283 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
284 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
285 +- The effective resource set for a profile is the intersection of both filter sets.
286 +- Per-profile filters never widen or bypass the global discovery scope.
287 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
288 +
289 +
290 +<a id="option-profiles-profiles-mode-auto-entries"></a>
291 +##### profiles.mode_auto.entries
292 +
293 +Each entry has:
294 +
295 +| Field | Description |
296 +|:------|:------------|
297 +| `name` | Canonical profile basename. |
298 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
299 +| `filters.regions` | Optional region narrowing for this profile. |
300 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
301 +
302 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
303 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
304 +
305 +
306 +<a id="option-profiles-profiles-mode-exact-entries"></a>
307 +##### profiles.mode_exact.entries
308 +
309 +Each entry has:
310 +
311 +| Field | Description |
312 +|:------|:------------|
313 +| `name` | Canonical profile basename. |
314 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
315 +| `filters.regions` | Optional region narrowing for this profile. |
316 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
317 +
318 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
319 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
320 +
321 +
322 +<a id="option-profiles-profiles-mode-combined-entries"></a>
323 +##### profiles.mode_combined.entries
324 +
325 +Each entry has:
326 +
327 +| Field | Description |
328 +|:------|:------------|
329 +| `name` | Canonical profile basename. |
330 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
331 +| `filters.regions` | Optional region narrowing for this profile. |
332 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
333
269 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
334 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
335 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
336
337
338
@@ -354,9 +420,48 @@ jobs:
420 profiles:
421 mode: exact
422 mode_exact:
357 - names:
358 - - sql_database
359 - - postgres_flexible
423 + entries:
424 + - name: sql_database
425 + - name: postgres_flexible
426 + auth:
427 + mode: managed_identity
428 +
429 +```
430 +</details>
431 +
432 +###### Global and per-profile filters together
433 +
434 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
435 +
436 +<details open><summary>Config</summary>
437 +
438 +```yaml
439 +jobs:
440 + - name: prod-databases
441 + subscription_ids:
442 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
443 + discovery:
444 + mode: filters
445 + mode_filters:
446 + resource_groups:
447 + - production-rg
448 + regions:
449 + - eastus
450 + profiles:
451 + mode: combined
452 + mode_combined:
453 + entries:
454 + - name: sql_database
455 + filters:
456 + tags:
457 + env:
458 + - prod
459 + # Effective scope:
460 + # 1. Discovery first keeps only resources in production-rg and eastus.
461 + # 2. Auto-selected profiles use that global scope as-is.
462 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
463 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
464 + # because per-profile filters only narrow the globally discovered set.
465 auth:
466 mode: managed_identity
467
@@ -444,7 +549,7 @@ Labels:
549 | resource_group | The Azure resource group. |
550 | region | The Azure region where the resource is deployed. |
551 | resource_type | The Azure resource type identifier. |
447 -| profile | The Azure Monitor profile id. |
552 +| profile | The Azure Monitor profile basename. |
553 | subscription_id | The Azure subscription identifier. |
554 | resource_uid | The unique Azure resource identifier. |
555
@@ -547,8 +652,8 @@ Check the following:
652
653 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
654
550 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
551 -- **Verify a built-in profile exists** -- List available profiles:
655 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
656 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
657 ```bash
658 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
659 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_cosmos_db_account.md
+119 -14
@@ -61,7 +61,7 @@ The collector has two discovery phases:
61 **Bootstrap (first run)**
62
63 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
64 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
64 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
65 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
66 - A single job can monitor multiple subscriptions.
67
@@ -163,7 +163,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
163 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
164 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
165
166 -User profile files with the same `id` as a stock profile override it.
166 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
167 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
168
169
@@ -191,8 +191,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
191 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
192 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
193 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
194 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
195 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
194 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
195 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
196 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
197 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
198 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
199 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -238,6 +239,7 @@ Controls how the collector finds candidate Azure resources.
239 ##### discovery.mode_query.kql
240
241 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
242 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
243
244 The query **must** project these five columns:
245
@@ -249,6 +251,14 @@ The query **must** project these five columns:
251 | `resourceGroup` | Resource group name |
252 | `location` | Azure region |
253
254 +:::info
255 +
256 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
257 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
258 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
259 +
260 +:::
261 +
262 Example:
263
264 ```
@@ -265,11 +275,67 @@ Controls how the collector decides which metric profiles to activate.
275
276 | Mode | Behavior |
277 |:-----|:---------|
268 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
269 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
270 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
278 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
279 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
280 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
281 +
282 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
283 +
284 +Filter layering:
285 +
286 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
287 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
288 +- The effective resource set for a profile is the intersection of both filter sets.
289 +- Per-profile filters never widen or bypass the global discovery scope.
290 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
291 +
292 +
293 +<a id="option-profiles-profiles-mode-auto-entries"></a>
294 +##### profiles.mode_auto.entries
295 +
296 +Each entry has:
297 +
298 +| Field | Description |
299 +|:------|:------------|
300 +| `name` | Canonical profile basename. |
301 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
302 +| `filters.regions` | Optional region narrowing for this profile. |
303 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
304 +
305 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
306 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
307 +
308 +
309 +<a id="option-profiles-profiles-mode-exact-entries"></a>
310 +##### profiles.mode_exact.entries
311 +
312 +Each entry has:
313 +
314 +| Field | Description |
315 +|:------|:------------|
316 +| `name` | Canonical profile basename. |
317 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
318 +| `filters.regions` | Optional region narrowing for this profile. |
319 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
320 +
321 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
322 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
323 +
324 +
325 +<a id="option-profiles-profiles-mode-combined-entries"></a>
326 +##### profiles.mode_combined.entries
327 +
328 +Each entry has:
329 +
330 +| Field | Description |
331 +|:------|:------------|
332 +| `name` | Canonical profile basename. |
333 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
334 +| `filters.regions` | Optional region narrowing for this profile. |
335 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
336
272 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
337 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
338 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
339
340
341
@@ -357,9 +423,48 @@ jobs:
423 profiles:
424 mode: exact
425 mode_exact:
360 - names:
361 - - sql_database
362 - - postgres_flexible
426 + entries:
427 + - name: sql_database
428 + - name: postgres_flexible
429 + auth:
430 + mode: managed_identity
431 +
432 +```
433 +</details>
434 +
435 +###### Global and per-profile filters together
436 +
437 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
438 +
439 +<details open><summary>Config</summary>
440 +
441 +```yaml
442 +jobs:
443 + - name: prod-databases
444 + subscription_ids:
445 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
446 + discovery:
447 + mode: filters
448 + mode_filters:
449 + resource_groups:
450 + - production-rg
451 + regions:
452 + - eastus
453 + profiles:
454 + mode: combined
455 + mode_combined:
456 + entries:
457 + - name: sql_database
458 + filters:
459 + tags:
460 + env:
461 + - prod
462 + # Effective scope:
463 + # 1. Discovery first keeps only resources in production-rg and eastus.
464 + # 2. Auto-selected profiles use that global scope as-is.
465 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
466 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
467 + # because per-profile filters only narrow the globally discovered set.
468 auth:
469 mode: managed_identity
470
@@ -455,7 +560,7 @@ Labels:
560 | resource_group | The Azure resource group. |
561 | region | The Azure region where the resource is deployed. |
562 | resource_type | The Azure resource type identifier. |
458 -| profile | The Azure Monitor profile id. |
563 +| profile | The Azure Monitor profile basename. |
564 | subscription_id | The Azure subscription identifier. |
565 | resource_uid | The unique Azure resource identifier. |
566
@@ -573,8 +678,8 @@ Check the following:
678
679 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
680
576 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
577 -- **Verify a built-in profile exists** -- List available profiles:
681 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
682 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
683 ```bash
684 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
685 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_data_explorer_cluster.md
+119 -14
@@ -65,7 +65,7 @@ The collector has two discovery phases:
65 **Bootstrap (first run)**
66
67 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
68 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
68 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
69 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
70 - A single job can monitor multiple subscriptions.
71
@@ -167,7 +167,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
167 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
168 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
169
170 -User profile files with the same `id` as a stock profile override it.
170 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
171 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
172
173
@@ -195,8 +195,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
195 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
196 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
197 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
198 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
199 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
198 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
199 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
200 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
201 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
202 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
203 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -242,6 +243,7 @@ Controls how the collector finds candidate Azure resources.
243 ##### discovery.mode_query.kql
244
245 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
246 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
247
248 The query **must** project these five columns:
249
@@ -253,6 +255,14 @@ The query **must** project these five columns:
255 | `resourceGroup` | Resource group name |
256 | `location` | Azure region |
257
258 +:::info
259 +
260 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
261 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
262 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
263 +
264 +:::
265 +
266 Example:
267
268 ```
@@ -269,11 +279,67 @@ Controls how the collector decides which metric profiles to activate.
279
280 | Mode | Behavior |
281 |:-----|:---------|
272 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
273 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
274 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
282 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
283 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
284 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
285 +
286 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
287 +
288 +Filter layering:
289 +
290 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
291 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
292 +- The effective resource set for a profile is the intersection of both filter sets.
293 +- Per-profile filters never widen or bypass the global discovery scope.
294 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
295 +
296 +
297 +<a id="option-profiles-profiles-mode-auto-entries"></a>
298 +##### profiles.mode_auto.entries
299 +
300 +Each entry has:
301 +
302 +| Field | Description |
303 +|:------|:------------|
304 +| `name` | Canonical profile basename. |
305 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
306 +| `filters.regions` | Optional region narrowing for this profile. |
307 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
308 +
309 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
310 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
311 +
312 +
313 +<a id="option-profiles-profiles-mode-exact-entries"></a>
314 +##### profiles.mode_exact.entries
315 +
316 +Each entry has:
317 +
318 +| Field | Description |
319 +|:------|:------------|
320 +| `name` | Canonical profile basename. |
321 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
322 +| `filters.regions` | Optional region narrowing for this profile. |
323 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
324 +
325 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
326 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
327 +
328 +
329 +<a id="option-profiles-profiles-mode-combined-entries"></a>
330 +##### profiles.mode_combined.entries
331 +
332 +Each entry has:
333 +
334 +| Field | Description |
335 +|:------|:------------|
336 +| `name` | Canonical profile basename. |
337 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
338 +| `filters.regions` | Optional region narrowing for this profile. |
339 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
340
276 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
341 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
342 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
343
344
345
@@ -361,9 +427,48 @@ jobs:
427 profiles:
428 mode: exact
429 mode_exact:
364 - names:
365 - - sql_database
366 - - postgres_flexible
430 + entries:
431 + - name: sql_database
432 + - name: postgres_flexible
433 + auth:
434 + mode: managed_identity
435 +
436 +```
437 +</details>
438 +
439 +###### Global and per-profile filters together
440 +
441 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
442 +
443 +<details open><summary>Config</summary>
444 +
445 +```yaml
446 +jobs:
447 + - name: prod-databases
448 + subscription_ids:
449 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
450 + discovery:
451 + mode: filters
452 + mode_filters:
453 + resource_groups:
454 + - production-rg
455 + regions:
456 + - eastus
457 + profiles:
458 + mode: combined
459 + mode_combined:
460 + entries:
461 + - name: sql_database
462 + filters:
463 + tags:
464 + env:
465 + - prod
466 + # Effective scope:
467 + # 1. Discovery first keeps only resources in production-rg and eastus.
468 + # 2. Auto-selected profiles use that global scope as-is.
469 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
470 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
471 + # because per-profile filters only narrow the globally discovered set.
472 auth:
473 mode: managed_identity
474
@@ -470,7 +575,7 @@ Labels:
575 | resource_group | The Azure resource group. |
576 | region | The Azure region where the resource is deployed. |
577 | resource_type | The Azure resource type identifier. |
473 -| profile | The Azure Monitor profile id. |
578 +| profile | The Azure Monitor profile basename. |
579 | subscription_id | The Azure subscription identifier. |
580 | resource_uid | The unique Azure resource identifier. |
581
@@ -612,8 +717,8 @@ Check the following:
717
718 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
719
615 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
616 -- **Verify a built-in profile exists** -- List available profiles:
720 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
721 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
722 ```bash
723 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
724 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_data_factory.md
+119 -14
@@ -63,7 +63,7 @@ The collector has two discovery phases:
63 **Bootstrap (first run)**
64
65 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
66 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
66 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
67 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
68 - A single job can monitor multiple subscriptions.
69
@@ -165,7 +165,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
165 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
166 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
167
168 -User profile files with the same `id` as a stock profile override it.
168 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
169 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
170
171
@@ -193,8 +193,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
193 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
194 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
195 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
196 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
197 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
196 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
197 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
198 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
199 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
200 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
201 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -240,6 +241,7 @@ Controls how the collector finds candidate Azure resources.
241 ##### discovery.mode_query.kql
242
243 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
244 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
245
246 The query **must** project these five columns:
247
@@ -251,6 +253,14 @@ The query **must** project these five columns:
253 | `resourceGroup` | Resource group name |
254 | `location` | Azure region |
255
256 +:::info
257 +
258 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
259 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
260 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
261 +
262 +:::
263 +
264 Example:
265
266 ```
@@ -267,11 +277,67 @@ Controls how the collector decides which metric profiles to activate.
277
278 | Mode | Behavior |
279 |:-----|:---------|
270 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
271 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
272 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
280 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
281 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
282 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
283 +
284 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
285 +
286 +Filter layering:
287 +
288 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
289 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
290 +- The effective resource set for a profile is the intersection of both filter sets.
291 +- Per-profile filters never widen or bypass the global discovery scope.
292 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
293 +
294 +
295 +<a id="option-profiles-profiles-mode-auto-entries"></a>
296 +##### profiles.mode_auto.entries
297 +
298 +Each entry has:
299 +
300 +| Field | Description |
301 +|:------|:------------|
302 +| `name` | Canonical profile basename. |
303 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
304 +| `filters.regions` | Optional region narrowing for this profile. |
305 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
306 +
307 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
308 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
309 +
310 +
311 +<a id="option-profiles-profiles-mode-exact-entries"></a>
312 +##### profiles.mode_exact.entries
313 +
314 +Each entry has:
315 +
316 +| Field | Description |
317 +|:------|:------------|
318 +| `name` | Canonical profile basename. |
319 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
320 +| `filters.regions` | Optional region narrowing for this profile. |
321 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
322 +
323 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
324 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
325 +
326 +
327 +<a id="option-profiles-profiles-mode-combined-entries"></a>
328 +##### profiles.mode_combined.entries
329 +
330 +Each entry has:
331 +
332 +| Field | Description |
333 +|:------|:------------|
334 +| `name` | Canonical profile basename. |
335 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
336 +| `filters.regions` | Optional region narrowing for this profile. |
337 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
338
274 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
339 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
340 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
341
342
343
@@ -359,9 +425,48 @@ jobs:
425 profiles:
426 mode: exact
427 mode_exact:
362 - names:
363 - - sql_database
364 - - postgres_flexible
428 + entries:
429 + - name: sql_database
430 + - name: postgres_flexible
431 + auth:
432 + mode: managed_identity
433 +
434 +```
435 +</details>
436 +
437 +###### Global and per-profile filters together
438 +
439 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
440 +
441 +<details open><summary>Config</summary>
442 +
443 +```yaml
444 +jobs:
445 + - name: prod-databases
446 + subscription_ids:
447 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
448 + discovery:
449 + mode: filters
450 + mode_filters:
451 + resource_groups:
452 + - production-rg
453 + regions:
454 + - eastus
455 + profiles:
456 + mode: combined
457 + mode_combined:
458 + entries:
459 + - name: sql_database
460 + filters:
461 + tags:
462 + env:
463 + - prod
464 + # Effective scope:
465 + # 1. Discovery first keeps only resources in production-rg and eastus.
466 + # 2. Auto-selected profiles use that global scope as-is.
467 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
468 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
469 + # because per-profile filters only narrow the globally discovered set.
470 auth:
471 mode: managed_identity
472
@@ -473,7 +578,7 @@ Labels:
578 | resource_group | The Azure resource group. |
579 | region | The Azure region where the resource is deployed. |
580 | resource_type | The Azure resource type identifier. |
476 -| profile | The Azure Monitor profile id. |
581 +| profile | The Azure Monitor profile basename. |
582 | subscription_id | The Azure subscription identifier. |
583 | resource_uid | The unique Azure resource identifier. |
584
@@ -619,8 +724,8 @@ Check the following:
724
725 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
726
622 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
623 -- **Verify a built-in profile exists** -- List available profiles:
727 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
728 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
729 ```bash
730 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
731 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_event_grid_topic.md
+119 -14
@@ -59,7 +59,7 @@ The collector has two discovery phases:
59 **Bootstrap (first run)**
60
61 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
62 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
62 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
63 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
64 - A single job can monitor multiple subscriptions.
65
@@ -161,7 +161,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
161 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
162 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
163
164 -User profile files with the same `id` as a stock profile override it.
164 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
165 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
166
167
@@ -189,8 +189,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
189 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
190 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
191 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
192 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
193 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
192 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
193 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
194 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
195 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
196 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
197 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -236,6 +237,7 @@ Controls how the collector finds candidate Azure resources.
237 ##### discovery.mode_query.kql
238
239 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
240 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
241
242 The query **must** project these five columns:
243
@@ -247,6 +249,14 @@ The query **must** project these five columns:
249 | `resourceGroup` | Resource group name |
250 | `location` | Azure region |
251
252 +:::info
253 +
254 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
255 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
256 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
257 +
258 +:::
259 +
260 Example:
261
262 ```
@@ -263,11 +273,67 @@ Controls how the collector decides which metric profiles to activate.
273
274 | Mode | Behavior |
275 |:-----|:---------|
266 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
267 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
268 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
276 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
277 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
278 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
279 +
280 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
281 +
282 +Filter layering:
283 +
284 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
285 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
286 +- The effective resource set for a profile is the intersection of both filter sets.
287 +- Per-profile filters never widen or bypass the global discovery scope.
288 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
289 +
290 +
291 +<a id="option-profiles-profiles-mode-auto-entries"></a>
292 +##### profiles.mode_auto.entries
293 +
294 +Each entry has:
295 +
296 +| Field | Description |
297 +|:------|:------------|
298 +| `name` | Canonical profile basename. |
299 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
300 +| `filters.regions` | Optional region narrowing for this profile. |
301 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
302 +
303 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
304 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
305 +
306 +
307 +<a id="option-profiles-profiles-mode-exact-entries"></a>
308 +##### profiles.mode_exact.entries
309 +
310 +Each entry has:
311 +
312 +| Field | Description |
313 +|:------|:------------|
314 +| `name` | Canonical profile basename. |
315 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
316 +| `filters.regions` | Optional region narrowing for this profile. |
317 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
318 +
319 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
320 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
321 +
322 +
323 +<a id="option-profiles-profiles-mode-combined-entries"></a>
324 +##### profiles.mode_combined.entries
325 +
326 +Each entry has:
327 +
328 +| Field | Description |
329 +|:------|:------------|
330 +| `name` | Canonical profile basename. |
331 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
332 +| `filters.regions` | Optional region narrowing for this profile. |
333 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
334
270 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
335 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
336 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
337
338
339
@@ -355,9 +421,48 @@ jobs:
421 profiles:
422 mode: exact
423 mode_exact:
358 - names:
359 - - sql_database
360 - - postgres_flexible
424 + entries:
425 + - name: sql_database
426 + - name: postgres_flexible
427 + auth:
428 + mode: managed_identity
429 +
430 +```
431 +</details>
432 +
433 +###### Global and per-profile filters together
434 +
435 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
436 +
437 +<details open><summary>Config</summary>
438 +
439 +```yaml
440 +jobs:
441 + - name: prod-databases
442 + subscription_ids:
443 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
444 + discovery:
445 + mode: filters
446 + mode_filters:
447 + resource_groups:
448 + - production-rg
449 + regions:
450 + - eastus
451 + profiles:
452 + mode: combined
453 + mode_combined:
454 + entries:
455 + - name: sql_database
456 + filters:
457 + tags:
458 + env:
459 + - prod
460 + # Effective scope:
461 + # 1. Discovery first keeps only resources in production-rg and eastus.
462 + # 2. Auto-selected profiles use that global scope as-is.
463 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
464 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
465 + # because per-profile filters only narrow the globally discovered set.
466 auth:
467 mode: managed_identity
468
@@ -449,7 +554,7 @@ Labels:
554 | resource_group | The Azure resource group. |
555 | region | The Azure region where the resource is deployed. |
556 | resource_type | The Azure resource type identifier. |
452 -| profile | The Azure Monitor profile id. |
557 +| profile | The Azure Monitor profile basename. |
558 | subscription_id | The Azure subscription identifier. |
559 | resource_uid | The unique Azure resource identifier. |
560
@@ -553,8 +658,8 @@ Check the following:
658
659 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
660
556 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
557 -- **Verify a built-in profile exists** -- List available profiles:
661 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
662 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
663 ```bash
664 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
665 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_event_hubs_namespace.md
+119 -14
@@ -62,7 +62,7 @@ The collector has two discovery phases:
62 **Bootstrap (first run)**
63
64 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
65 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
65 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
66 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
67 - A single job can monitor multiple subscriptions.
68
@@ -164,7 +164,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
164 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
165 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
166
167 -User profile files with the same `id` as a stock profile override it.
167 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
168 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
169
170
@@ -192,8 +192,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
192 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
193 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
194 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
195 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
196 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
195 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
196 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
197 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
198 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
199 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
200 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -239,6 +240,7 @@ Controls how the collector finds candidate Azure resources.
240 ##### discovery.mode_query.kql
241
242 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
243 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
244
245 The query **must** project these five columns:
246
@@ -250,6 +252,14 @@ The query **must** project these five columns:
252 | `resourceGroup` | Resource group name |
253 | `location` | Azure region |
254
255 +:::info
256 +
257 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
258 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
259 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
260 +
261 +:::
262 +
263 Example:
264
265 ```
@@ -266,11 +276,67 @@ Controls how the collector decides which metric profiles to activate.
276
277 | Mode | Behavior |
278 |:-----|:---------|
269 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
270 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
271 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
279 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
280 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
281 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
282 +
283 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
284 +
285 +Filter layering:
286 +
287 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
288 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
289 +- The effective resource set for a profile is the intersection of both filter sets.
290 +- Per-profile filters never widen or bypass the global discovery scope.
291 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
292 +
293 +
294 +<a id="option-profiles-profiles-mode-auto-entries"></a>
295 +##### profiles.mode_auto.entries
296 +
297 +Each entry has:
298 +
299 +| Field | Description |
300 +|:------|:------------|
301 +| `name` | Canonical profile basename. |
302 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
303 +| `filters.regions` | Optional region narrowing for this profile. |
304 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
305 +
306 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
307 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
308 +
309 +
310 +<a id="option-profiles-profiles-mode-exact-entries"></a>
311 +##### profiles.mode_exact.entries
312 +
313 +Each entry has:
314 +
315 +| Field | Description |
316 +|:------|:------------|
317 +| `name` | Canonical profile basename. |
318 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
319 +| `filters.regions` | Optional region narrowing for this profile. |
320 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
321 +
322 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
323 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
324 +
325 +
326 +<a id="option-profiles-profiles-mode-combined-entries"></a>
327 +##### profiles.mode_combined.entries
328 +
329 +Each entry has:
330 +
331 +| Field | Description |
332 +|:------|:------------|
333 +| `name` | Canonical profile basename. |
334 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
335 +| `filters.regions` | Optional region narrowing for this profile. |
336 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
337
273 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
338 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
339 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
340
341
342
@@ -358,9 +424,48 @@ jobs:
424 profiles:
425 mode: exact
426 mode_exact:
361 - names:
362 - - sql_database
363 - - postgres_flexible
427 + entries:
428 + - name: sql_database
429 + - name: postgres_flexible
430 + auth:
431 + mode: managed_identity
432 +
433 +```
434 +</details>
435 +
436 +###### Global and per-profile filters together
437 +
438 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
439 +
440 +<details open><summary>Config</summary>
441 +
442 +```yaml
443 +jobs:
444 + - name: prod-databases
445 + subscription_ids:
446 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
447 + discovery:
448 + mode: filters
449 + mode_filters:
450 + resource_groups:
451 + - production-rg
452 + regions:
453 + - eastus
454 + profiles:
455 + mode: combined
456 + mode_combined:
457 + entries:
458 + - name: sql_database
459 + filters:
460 + tags:
461 + env:
462 + - prod
463 + # Effective scope:
464 + # 1. Discovery first keeps only resources in production-rg and eastus.
465 + # 2. Auto-selected profiles use that global scope as-is.
466 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
467 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
468 + # because per-profile filters only narrow the globally discovered set.
469 auth:
470 mode: managed_identity
471
@@ -456,7 +561,7 @@ Labels:
561 | resource_group | The Azure resource group. |
562 | region | The Azure region where the resource is deployed. |
563 | resource_type | The Azure resource type identifier. |
459 -| profile | The Azure Monitor profile id. |
564 +| profile | The Azure Monitor profile basename. |
565 | subscription_id | The Azure subscription identifier. |
566 | resource_uid | The unique Azure resource identifier. |
567
@@ -567,8 +672,8 @@ Check the following:
672
673 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
674
570 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
571 -- **Verify a built-in profile exists** -- List available profiles:
675 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
676 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
677 ```bash
678 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
679 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_expressroute_circuit.md
+119 -14
@@ -60,7 +60,7 @@ The collector has two discovery phases:
60 **Bootstrap (first run)**
61
62 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
63 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
63 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
64 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
65 - A single job can monitor multiple subscriptions.
66
@@ -162,7 +162,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
162 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
163 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
164
165 -User profile files with the same `id` as a stock profile override it.
165 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
166 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
167
168
@@ -190,8 +190,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
190 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
191 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
192 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
193 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
194 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
193 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
194 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
195 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
196 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
197 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
198 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -237,6 +238,7 @@ Controls how the collector finds candidate Azure resources.
238 ##### discovery.mode_query.kql
239
240 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
241 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
242
243 The query **must** project these five columns:
244
@@ -248,6 +250,14 @@ The query **must** project these five columns:
250 | `resourceGroup` | Resource group name |
251 | `location` | Azure region |
252
253 +:::info
254 +
255 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
256 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
257 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
258 +
259 +:::
260 +
261 Example:
262
263 ```
@@ -264,11 +274,67 @@ Controls how the collector decides which metric profiles to activate.
274
275 | Mode | Behavior |
276 |:-----|:---------|
267 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
268 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
269 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
277 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
278 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
279 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
280 +
281 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
282 +
283 +Filter layering:
284 +
285 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
286 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
287 +- The effective resource set for a profile is the intersection of both filter sets.
288 +- Per-profile filters never widen or bypass the global discovery scope.
289 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
290 +
291 +
292 +<a id="option-profiles-profiles-mode-auto-entries"></a>
293 +##### profiles.mode_auto.entries
294 +
295 +Each entry has:
296 +
297 +| Field | Description |
298 +|:------|:------------|
299 +| `name` | Canonical profile basename. |
300 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
301 +| `filters.regions` | Optional region narrowing for this profile. |
302 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
303 +
304 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
305 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
306 +
307 +
308 +<a id="option-profiles-profiles-mode-exact-entries"></a>
309 +##### profiles.mode_exact.entries
310 +
311 +Each entry has:
312 +
313 +| Field | Description |
314 +|:------|:------------|
315 +| `name` | Canonical profile basename. |
316 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
317 +| `filters.regions` | Optional region narrowing for this profile. |
318 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
319 +
320 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
321 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
322 +
323 +
324 +<a id="option-profiles-profiles-mode-combined-entries"></a>
325 +##### profiles.mode_combined.entries
326 +
327 +Each entry has:
328 +
329 +| Field | Description |
330 +|:------|:------------|
331 +| `name` | Canonical profile basename. |
332 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
333 +| `filters.regions` | Optional region narrowing for this profile. |
334 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
335
271 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
336 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
337 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
338
339
340
@@ -356,9 +422,48 @@ jobs:
422 profiles:
423 mode: exact
424 mode_exact:
359 - names:
360 - - sql_database
361 - - postgres_flexible
425 + entries:
426 + - name: sql_database
427 + - name: postgres_flexible
428 + auth:
429 + mode: managed_identity
430 +
431 +```
432 +</details>
433 +
434 +###### Global and per-profile filters together
435 +
436 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
437 +
438 +<details open><summary>Config</summary>
439 +
440 +```yaml
441 +jobs:
442 + - name: prod-databases
443 + subscription_ids:
444 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
445 + discovery:
446 + mode: filters
447 + mode_filters:
448 + resource_groups:
449 + - production-rg
450 + regions:
451 + - eastus
452 + profiles:
453 + mode: combined
454 + mode_combined:
455 + entries:
456 + - name: sql_database
457 + filters:
458 + tags:
459 + env:
460 + - prod
461 + # Effective scope:
462 + # 1. Discovery first keeps only resources in production-rg and eastus.
463 + # 2. Auto-selected profiles use that global scope as-is.
464 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
465 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
466 + # because per-profile filters only narrow the globally discovered set.
467 auth:
468 mode: managed_identity
469
@@ -450,7 +555,7 @@ Labels:
555 | resource_group | The Azure resource group. |
556 | region | The Azure region where the resource is deployed. |
557 | resource_type | The Azure resource type identifier. |
453 -| profile | The Azure Monitor profile id. |
558 +| profile | The Azure Monitor profile basename. |
559 | subscription_id | The Azure subscription identifier. |
560 | resource_uid | The unique Azure resource identifier. |
561
@@ -555,8 +660,8 @@ Check the following:
660
661 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
662
558 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
559 -- **Verify a built-in profile exists** -- List available profiles:
663 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
664 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
665 ```bash
666 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
667 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_expressroute_gateway.md
+119 -14
@@ -60,7 +60,7 @@ The collector has two discovery phases:
60 **Bootstrap (first run)**
61
62 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
63 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
63 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
64 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
65 - A single job can monitor multiple subscriptions.
66
@@ -162,7 +162,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
162 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
163 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
164
165 -User profile files with the same `id` as a stock profile override it.
165 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
166 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
167
168
@@ -190,8 +190,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
190 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
191 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
192 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
193 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
194 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
193 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
194 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
195 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
196 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
197 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
198 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -237,6 +238,7 @@ Controls how the collector finds candidate Azure resources.
238 ##### discovery.mode_query.kql
239
240 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
241 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
242
243 The query **must** project these five columns:
244
@@ -248,6 +250,14 @@ The query **must** project these five columns:
250 | `resourceGroup` | Resource group name |
251 | `location` | Azure region |
252
253 +:::info
254 +
255 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
256 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
257 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
258 +
259 +:::
260 +
261 Example:
262
263 ```
@@ -264,11 +274,67 @@ Controls how the collector decides which metric profiles to activate.
274
275 | Mode | Behavior |
276 |:-----|:---------|
267 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
268 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
269 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
277 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
278 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
279 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
280 +
281 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
282 +
283 +Filter layering:
284 +
285 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
286 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
287 +- The effective resource set for a profile is the intersection of both filter sets.
288 +- Per-profile filters never widen or bypass the global discovery scope.
289 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
290 +
291 +
292 +<a id="option-profiles-profiles-mode-auto-entries"></a>
293 +##### profiles.mode_auto.entries
294 +
295 +Each entry has:
296 +
297 +| Field | Description |
298 +|:------|:------------|
299 +| `name` | Canonical profile basename. |
300 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
301 +| `filters.regions` | Optional region narrowing for this profile. |
302 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
303 +
304 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
305 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
306 +
307 +
308 +<a id="option-profiles-profiles-mode-exact-entries"></a>
309 +##### profiles.mode_exact.entries
310 +
311 +Each entry has:
312 +
313 +| Field | Description |
314 +|:------|:------------|
315 +| `name` | Canonical profile basename. |
316 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
317 +| `filters.regions` | Optional region narrowing for this profile. |
318 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
319 +
320 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
321 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
322 +
323 +
324 +<a id="option-profiles-profiles-mode-combined-entries"></a>
325 +##### profiles.mode_combined.entries
326 +
327 +Each entry has:
328 +
329 +| Field | Description |
330 +|:------|:------------|
331 +| `name` | Canonical profile basename. |
332 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
333 +| `filters.regions` | Optional region narrowing for this profile. |
334 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
335
271 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
336 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
337 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
338
339
340
@@ -356,9 +422,48 @@ jobs:
422 profiles:
423 mode: exact
424 mode_exact:
359 - names:
360 - - sql_database
361 - - postgres_flexible
425 + entries:
426 + - name: sql_database
427 + - name: postgres_flexible
428 + auth:
429 + mode: managed_identity
430 +
431 +```
432 +</details>
433 +
434 +###### Global and per-profile filters together
435 +
436 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
437 +
438 +<details open><summary>Config</summary>
439 +
440 +```yaml
441 +jobs:
442 + - name: prod-databases
443 + subscription_ids:
444 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
445 + discovery:
446 + mode: filters
447 + mode_filters:
448 + resource_groups:
449 + - production-rg
450 + regions:
451 + - eastus
452 + profiles:
453 + mode: combined
454 + mode_combined:
455 + entries:
456 + - name: sql_database
457 + filters:
458 + tags:
459 + env:
460 + - prod
461 + # Effective scope:
462 + # 1. Discovery first keeps only resources in production-rg and eastus.
463 + # 2. Auto-selected profiles use that global scope as-is.
464 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
465 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
466 + # because per-profile filters only narrow the globally discovered set.
467 auth:
468 mode: managed_identity
469
@@ -449,7 +554,7 @@ Labels:
554 | resource_group | The Azure resource group. |
555 | region | The Azure region where the resource is deployed. |
556 | resource_type | The Azure resource type identifier. |
452 -| profile | The Azure Monitor profile id. |
557 +| profile | The Azure Monitor profile basename. |
558 | subscription_id | The Azure subscription identifier. |
559 | resource_uid | The unique Azure resource identifier. |
560
@@ -557,8 +662,8 @@ Check the following:
662
663 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
664
560 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
561 -- **Verify a built-in profile exists** -- List available profiles:
665 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
666 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
667 ```bash
668 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
669 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_firewall.md
+119 -14
@@ -61,7 +61,7 @@ The collector has two discovery phases:
61 **Bootstrap (first run)**
62
63 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
64 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
64 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
65 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
66 - A single job can monitor multiple subscriptions.
67
@@ -163,7 +163,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
163 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
164 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
165
166 -User profile files with the same `id` as a stock profile override it.
166 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
167 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
168
169
@@ -191,8 +191,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
191 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
192 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
193 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
194 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
195 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
194 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
195 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
196 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
197 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
198 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
199 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -238,6 +239,7 @@ Controls how the collector finds candidate Azure resources.
239 ##### discovery.mode_query.kql
240
241 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
242 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
243
244 The query **must** project these five columns:
245
@@ -249,6 +251,14 @@ The query **must** project these five columns:
251 | `resourceGroup` | Resource group name |
252 | `location` | Azure region |
253
254 +:::info
255 +
256 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
257 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
258 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
259 +
260 +:::
261 +
262 Example:
263
264 ```
@@ -265,11 +275,67 @@ Controls how the collector decides which metric profiles to activate.
275
276 | Mode | Behavior |
277 |:-----|:---------|
268 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
269 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
270 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
278 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
279 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
280 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
281 +
282 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
283 +
284 +Filter layering:
285 +
286 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
287 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
288 +- The effective resource set for a profile is the intersection of both filter sets.
289 +- Per-profile filters never widen or bypass the global discovery scope.
290 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
291 +
292 +
293 +<a id="option-profiles-profiles-mode-auto-entries"></a>
294 +##### profiles.mode_auto.entries
295 +
296 +Each entry has:
297 +
298 +| Field | Description |
299 +|:------|:------------|
300 +| `name` | Canonical profile basename. |
301 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
302 +| `filters.regions` | Optional region narrowing for this profile. |
303 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
304 +
305 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
306 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
307 +
308 +
309 +<a id="option-profiles-profiles-mode-exact-entries"></a>
310 +##### profiles.mode_exact.entries
311 +
312 +Each entry has:
313 +
314 +| Field | Description |
315 +|:------|:------------|
316 +| `name` | Canonical profile basename. |
317 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
318 +| `filters.regions` | Optional region narrowing for this profile. |
319 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
320 +
321 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
322 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
323 +
324 +
325 +<a id="option-profiles-profiles-mode-combined-entries"></a>
326 +##### profiles.mode_combined.entries
327 +
328 +Each entry has:
329 +
330 +| Field | Description |
331 +|:------|:------------|
332 +| `name` | Canonical profile basename. |
333 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
334 +| `filters.regions` | Optional region narrowing for this profile. |
335 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
336
272 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
337 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
338 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
339
340
341
@@ -357,9 +423,48 @@ jobs:
423 profiles:
424 mode: exact
425 mode_exact:
360 - names:
361 - - sql_database
362 - - postgres_flexible
426 + entries:
427 + - name: sql_database
428 + - name: postgres_flexible
429 + auth:
430 + mode: managed_identity
431 +
432 +```
433 +</details>
434 +
435 +###### Global and per-profile filters together
436 +
437 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
438 +
439 +<details open><summary>Config</summary>
440 +
441 +```yaml
442 +jobs:
443 + - name: prod-databases
444 + subscription_ids:
445 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
446 + discovery:
447 + mode: filters
448 + mode_filters:
449 + resource_groups:
450 + - production-rg
451 + regions:
452 + - eastus
453 + profiles:
454 + mode: combined
455 + mode_combined:
456 + entries:
457 + - name: sql_database
458 + filters:
459 + tags:
460 + env:
461 + - prod
462 + # Effective scope:
463 + # 1. Discovery first keeps only resources in production-rg and eastus.
464 + # 2. Auto-selected profiles use that global scope as-is.
465 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
466 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
467 + # because per-profile filters only narrow the globally discovered set.
468 auth:
469 mode: managed_identity
470
@@ -448,7 +553,7 @@ Labels:
553 | resource_group | The Azure resource group. |
554 | region | The Azure region where the resource is deployed. |
555 | resource_type | The Azure resource type identifier. |
451 -| profile | The Azure Monitor profile id. |
556 +| profile | The Azure Monitor profile basename. |
557 | subscription_id | The Azure subscription identifier. |
558 | resource_uid | The unique Azure resource identifier. |
559
@@ -553,8 +658,8 @@ Check the following:
658
659 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
660
556 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
557 -- **Verify a built-in profile exists** -- List available profiles:
661 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
662 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
663 ```bash
664 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
665 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_front_door.md
+119 -14
@@ -62,7 +62,7 @@ The collector has two discovery phases:
62 **Bootstrap (first run)**
63
64 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
65 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
65 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
66 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
67 - A single job can monitor multiple subscriptions.
68
@@ -164,7 +164,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
164 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
165 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
166
167 -User profile files with the same `id` as a stock profile override it.
167 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
168 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
169
170
@@ -192,8 +192,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
192 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
193 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
194 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
195 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
196 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
195 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
196 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
197 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
198 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
199 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
200 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -239,6 +240,7 @@ Controls how the collector finds candidate Azure resources.
240 ##### discovery.mode_query.kql
241
242 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
243 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
244
245 The query **must** project these five columns:
246
@@ -250,6 +252,14 @@ The query **must** project these five columns:
252 | `resourceGroup` | Resource group name |
253 | `location` | Azure region |
254
255 +:::info
256 +
257 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
258 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
259 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
260 +
261 +:::
262 +
263 Example:
264
265 ```
@@ -266,11 +276,67 @@ Controls how the collector decides which metric profiles to activate.
276
277 | Mode | Behavior |
278 |:-----|:---------|
269 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
270 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
271 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
279 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
280 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
281 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
282 +
283 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
284 +
285 +Filter layering:
286 +
287 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
288 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
289 +- The effective resource set for a profile is the intersection of both filter sets.
290 +- Per-profile filters never widen or bypass the global discovery scope.
291 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
292 +
293 +
294 +<a id="option-profiles-profiles-mode-auto-entries"></a>
295 +##### profiles.mode_auto.entries
296 +
297 +Each entry has:
298 +
299 +| Field | Description |
300 +|:------|:------------|
301 +| `name` | Canonical profile basename. |
302 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
303 +| `filters.regions` | Optional region narrowing for this profile. |
304 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
305 +
306 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
307 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
308 +
309 +
310 +<a id="option-profiles-profiles-mode-exact-entries"></a>
311 +##### profiles.mode_exact.entries
312 +
313 +Each entry has:
314 +
315 +| Field | Description |
316 +|:------|:------------|
317 +| `name` | Canonical profile basename. |
318 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
319 +| `filters.regions` | Optional region narrowing for this profile. |
320 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
321 +
322 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
323 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
324 +
325 +
326 +<a id="option-profiles-profiles-mode-combined-entries"></a>
327 +##### profiles.mode_combined.entries
328 +
329 +Each entry has:
330 +
331 +| Field | Description |
332 +|:------|:------------|
333 +| `name` | Canonical profile basename. |
334 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
335 +| `filters.regions` | Optional region narrowing for this profile. |
336 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
337
273 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
338 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
339 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
340
341
342
@@ -358,9 +424,48 @@ jobs:
424 profiles:
425 mode: exact
426 mode_exact:
361 - names:
362 - - sql_database
363 - - postgres_flexible
427 + entries:
428 + - name: sql_database
429 + - name: postgres_flexible
430 + auth:
431 + mode: managed_identity
432 +
433 +```
434 +</details>
435 +
436 +###### Global and per-profile filters together
437 +
438 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
439 +
440 +<details open><summary>Config</summary>
441 +
442 +```yaml
443 +jobs:
444 + - name: prod-databases
445 + subscription_ids:
446 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
447 + discovery:
448 + mode: filters
449 + mode_filters:
450 + resource_groups:
451 + - production-rg
452 + regions:
453 + - eastus
454 + profiles:
455 + mode: combined
456 + mode_combined:
457 + entries:
458 + - name: sql_database
459 + filters:
460 + tags:
461 + env:
462 + - prod
463 + # Effective scope:
464 + # 1. Discovery first keeps only resources in production-rg and eastus.
465 + # 2. Auto-selected profiles use that global scope as-is.
466 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
467 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
468 + # because per-profile filters only narrow the globally discovered set.
469 auth:
470 mode: managed_identity
471
@@ -453,7 +558,7 @@ Labels:
558 | resource_group | The Azure resource group. |
559 | region | The Azure region where the resource is deployed. |
560 | resource_type | The Azure resource type identifier. |
456 -| profile | The Azure Monitor profile id. |
561 +| profile | The Azure Monitor profile basename. |
562 | subscription_id | The Azure subscription identifier. |
563 | resource_uid | The unique Azure resource identifier. |
564
@@ -563,8 +668,8 @@ Check the following:
668
669 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
670
566 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
567 -- **Verify a built-in profile exists** -- List available profiles:
671 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
672 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
673 ```bash
674 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
675 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_functions.md
+119 -14
@@ -62,7 +62,7 @@ The collector has two discovery phases:
62 **Bootstrap (first run)**
63
64 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
65 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
65 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
66 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
67 - A single job can monitor multiple subscriptions.
68
@@ -164,7 +164,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
164 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
165 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
166
167 -User profile files with the same `id` as a stock profile override it.
167 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
168 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
169
170
@@ -192,8 +192,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
192 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
193 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
194 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
195 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
196 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
195 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
196 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
197 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
198 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
199 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
200 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -239,6 +240,7 @@ Controls how the collector finds candidate Azure resources.
240 ##### discovery.mode_query.kql
241
242 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
243 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
244
245 The query **must** project these five columns:
246
@@ -250,6 +252,14 @@ The query **must** project these five columns:
252 | `resourceGroup` | Resource group name |
253 | `location` | Azure region |
254
255 +:::info
256 +
257 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
258 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
259 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
260 +
261 +:::
262 +
263 Example:
264
265 ```
@@ -266,11 +276,67 @@ Controls how the collector decides which metric profiles to activate.
276
277 | Mode | Behavior |
278 |:-----|:---------|
269 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
270 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
271 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
279 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
280 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
281 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
282 +
283 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
284 +
285 +Filter layering:
286 +
287 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
288 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
289 +- The effective resource set for a profile is the intersection of both filter sets.
290 +- Per-profile filters never widen or bypass the global discovery scope.
291 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
292 +
293 +
294 +<a id="option-profiles-profiles-mode-auto-entries"></a>
295 +##### profiles.mode_auto.entries
296 +
297 +Each entry has:
298 +
299 +| Field | Description |
300 +|:------|:------------|
301 +| `name` | Canonical profile basename. |
302 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
303 +| `filters.regions` | Optional region narrowing for this profile. |
304 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
305 +
306 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
307 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
308 +
309 +
310 +<a id="option-profiles-profiles-mode-exact-entries"></a>
311 +##### profiles.mode_exact.entries
312 +
313 +Each entry has:
314 +
315 +| Field | Description |
316 +|:------|:------------|
317 +| `name` | Canonical profile basename. |
318 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
319 +| `filters.regions` | Optional region narrowing for this profile. |
320 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
321 +
322 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
323 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
324 +
325 +
326 +<a id="option-profiles-profiles-mode-combined-entries"></a>
327 +##### profiles.mode_combined.entries
328 +
329 +Each entry has:
330 +
331 +| Field | Description |
332 +|:------|:------------|
333 +| `name` | Canonical profile basename. |
334 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
335 +| `filters.regions` | Optional region narrowing for this profile. |
336 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
337
273 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
338 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
339 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
340
341
342
@@ -358,9 +424,48 @@ jobs:
424 profiles:
425 mode: exact
426 mode_exact:
361 - names:
362 - - sql_database
363 - - postgres_flexible
427 + entries:
428 + - name: sql_database
429 + - name: postgres_flexible
430 + auth:
431 + mode: managed_identity
432 +
433 +```
434 +</details>
435 +
436 +###### Global and per-profile filters together
437 +
438 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
439 +
440 +<details open><summary>Config</summary>
441 +
442 +```yaml
443 +jobs:
444 + - name: prod-databases
445 + subscription_ids:
446 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
447 + discovery:
448 + mode: filters
449 + mode_filters:
450 + resource_groups:
451 + - production-rg
452 + regions:
453 + - eastus
454 + profiles:
455 + mode: combined
456 + mode_combined:
457 + entries:
458 + - name: sql_database
459 + filters:
460 + tags:
461 + env:
462 + - prod
463 + # Effective scope:
464 + # 1. Discovery first keeps only resources in production-rg and eastus.
465 + # 2. Auto-selected profiles use that global scope as-is.
466 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
467 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
468 + # because per-profile filters only narrow the globally discovered set.
469 auth:
470 mode: managed_identity
471
@@ -442,7 +547,7 @@ Labels:
547 | resource_group | The Azure resource group. |
548 | region | The Azure region where the resource is deployed. |
549 | resource_type | The Azure resource type identifier. |
445 -| profile | The Azure Monitor profile id. |
550 +| profile | The Azure Monitor profile basename. |
551 | subscription_id | The Azure subscription identifier. |
552 | resource_uid | The unique Azure resource identifier. |
553
@@ -566,8 +671,8 @@ Check the following:
671
672 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
673
569 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
570 -- **Verify a built-in profile exists** -- List available profiles:
674 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
675 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
676 ```bash
677 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
678 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_iot_hub.md
+119 -14
@@ -64,7 +64,7 @@ The collector has two discovery phases:
64 **Bootstrap (first run)**
65
66 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
67 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
67 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
68 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
69 - A single job can monitor multiple subscriptions.
70
@@ -166,7 +166,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
166 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
167 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
168
169 -User profile files with the same `id` as a stock profile override it.
169 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
170 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
171
172
@@ -194,8 +194,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
194 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
195 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
196 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
197 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
198 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
197 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
198 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
199 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
200 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
201 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
202 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -241,6 +242,7 @@ Controls how the collector finds candidate Azure resources.
242 ##### discovery.mode_query.kql
243
244 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
245 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
246
247 The query **must** project these five columns:
248
@@ -252,6 +254,14 @@ The query **must** project these five columns:
254 | `resourceGroup` | Resource group name |
255 | `location` | Azure region |
256
257 +:::info
258 +
259 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
260 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
261 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
262 +
263 +:::
264 +
265 Example:
266
267 ```
@@ -268,11 +278,67 @@ Controls how the collector decides which metric profiles to activate.
278
279 | Mode | Behavior |
280 |:-----|:---------|
271 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
272 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
273 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
281 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
282 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
283 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
284 +
285 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
286 +
287 +Filter layering:
288 +
289 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
290 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
291 +- The effective resource set for a profile is the intersection of both filter sets.
292 +- Per-profile filters never widen or bypass the global discovery scope.
293 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
294 +
295 +
296 +<a id="option-profiles-profiles-mode-auto-entries"></a>
297 +##### profiles.mode_auto.entries
298 +
299 +Each entry has:
300 +
301 +| Field | Description |
302 +|:------|:------------|
303 +| `name` | Canonical profile basename. |
304 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
305 +| `filters.regions` | Optional region narrowing for this profile. |
306 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
307 +
308 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
309 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
310 +
311 +
312 +<a id="option-profiles-profiles-mode-exact-entries"></a>
313 +##### profiles.mode_exact.entries
314 +
315 +Each entry has:
316 +
317 +| Field | Description |
318 +|:------|:------------|
319 +| `name` | Canonical profile basename. |
320 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
321 +| `filters.regions` | Optional region narrowing for this profile. |
322 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
323 +
324 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
325 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
326 +
327 +
328 +<a id="option-profiles-profiles-mode-combined-entries"></a>
329 +##### profiles.mode_combined.entries
330 +
331 +Each entry has:
332 +
333 +| Field | Description |
334 +|:------|:------------|
335 +| `name` | Canonical profile basename. |
336 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
337 +| `filters.regions` | Optional region narrowing for this profile. |
338 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
339
275 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
340 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
341 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
342
343
344
@@ -360,9 +426,48 @@ jobs:
426 profiles:
427 mode: exact
428 mode_exact:
363 - names:
364 - - sql_database
365 - - postgres_flexible
429 + entries:
430 + - name: sql_database
431 + - name: postgres_flexible
432 + auth:
433 + mode: managed_identity
434 +
435 +```
436 +</details>
437 +
438 +###### Global and per-profile filters together
439 +
440 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
441 +
442 +<details open><summary>Config</summary>
443 +
444 +```yaml
445 +jobs:
446 + - name: prod-databases
447 + subscription_ids:
448 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
449 + discovery:
450 + mode: filters
451 + mode_filters:
452 + resource_groups:
453 + - production-rg
454 + regions:
455 + - eastus
456 + profiles:
457 + mode: combined
458 + mode_combined:
459 + entries:
460 + - name: sql_database
461 + filters:
462 + tags:
463 + env:
464 + - prod
465 + # Effective scope:
466 + # 1. Discovery first keeps only resources in production-rg and eastus.
467 + # 2. Auto-selected profiles use that global scope as-is.
468 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
469 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
470 + # because per-profile filters only narrow the globally discovered set.
471 auth:
472 mode: managed_identity
473
@@ -465,7 +570,7 @@ Labels:
570 | resource_group | The Azure resource group. |
571 | region | The Azure region where the resource is deployed. |
572 | resource_type | The Azure resource type identifier. |
468 -| profile | The Azure Monitor profile id. |
573 +| profile | The Azure Monitor profile basename. |
574 | subscription_id | The Azure subscription identifier. |
575 | resource_uid | The unique Azure resource identifier. |
576
@@ -602,8 +707,8 @@ Check the following:
707
708 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
709
605 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
606 -- **Verify a built-in profile exists** -- List available profiles:
710 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
711 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
712 ```bash
713 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
714 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_key_vault.md
+119 -14
@@ -58,7 +58,7 @@ The collector has two discovery phases:
58 **Bootstrap (first run)**
59
60 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
61 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
61 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
62 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
63 - A single job can monitor multiple subscriptions.
64
@@ -160,7 +160,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
160 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
161 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
162
163 -User profile files with the same `id` as a stock profile override it.
163 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
164 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
165
166
@@ -188,8 +188,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
188 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
189 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
190 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
191 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
192 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
191 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
192 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
193 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
194 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
195 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
196 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -235,6 +236,7 @@ Controls how the collector finds candidate Azure resources.
236 ##### discovery.mode_query.kql
237
238 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
239 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
240
241 The query **must** project these five columns:
242
@@ -246,6 +248,14 @@ The query **must** project these five columns:
248 | `resourceGroup` | Resource group name |
249 | `location` | Azure region |
250
251 +:::info
252 +
253 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
254 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
255 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
256 +
257 +:::
258 +
259 Example:
260
261 ```
@@ -262,11 +272,67 @@ Controls how the collector decides which metric profiles to activate.
272
273 | Mode | Behavior |
274 |:-----|:---------|
265 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
266 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
267 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
275 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
276 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
277 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
278 +
279 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
280 +
281 +Filter layering:
282 +
283 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
284 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
285 +- The effective resource set for a profile is the intersection of both filter sets.
286 +- Per-profile filters never widen or bypass the global discovery scope.
287 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
288 +
289 +
290 +<a id="option-profiles-profiles-mode-auto-entries"></a>
291 +##### profiles.mode_auto.entries
292 +
293 +Each entry has:
294 +
295 +| Field | Description |
296 +|:------|:------------|
297 +| `name` | Canonical profile basename. |
298 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
299 +| `filters.regions` | Optional region narrowing for this profile. |
300 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
301 +
302 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
303 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
304 +
305 +
306 +<a id="option-profiles-profiles-mode-exact-entries"></a>
307 +##### profiles.mode_exact.entries
308 +
309 +Each entry has:
310 +
311 +| Field | Description |
312 +|:------|:------------|
313 +| `name` | Canonical profile basename. |
314 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
315 +| `filters.regions` | Optional region narrowing for this profile. |
316 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
317 +
318 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
319 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
320 +
321 +
322 +<a id="option-profiles-profiles-mode-combined-entries"></a>
323 +##### profiles.mode_combined.entries
324 +
325 +Each entry has:
326 +
327 +| Field | Description |
328 +|:------|:------------|
329 +| `name` | Canonical profile basename. |
330 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
331 +| `filters.regions` | Optional region narrowing for this profile. |
332 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
333
269 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
334 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
335 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
336
337
338
@@ -354,9 +420,48 @@ jobs:
420 profiles:
421 mode: exact
422 mode_exact:
357 - names:
358 - - sql_database
359 - - postgres_flexible
423 + entries:
424 + - name: sql_database
425 + - name: postgres_flexible
426 + auth:
427 + mode: managed_identity
428 +
429 +```
430 +</details>
431 +
432 +###### Global and per-profile filters together
433 +
434 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
435 +
436 +<details open><summary>Config</summary>
437 +
438 +```yaml
439 +jobs:
440 + - name: prod-databases
441 + subscription_ids:
442 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
443 + discovery:
444 + mode: filters
445 + mode_filters:
446 + resource_groups:
447 + - production-rg
448 + regions:
449 + - eastus
450 + profiles:
451 + mode: combined
452 + mode_combined:
453 + entries:
454 + - name: sql_database
455 + filters:
456 + tags:
457 + env:
458 + - prod
459 + # Effective scope:
460 + # 1. Discovery first keeps only resources in production-rg and eastus.
461 + # 2. Auto-selected profiles use that global scope as-is.
462 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
463 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
464 + # because per-profile filters only narrow the globally discovered set.
465 auth:
466 mode: managed_identity
467
@@ -445,7 +550,7 @@ Labels:
550 | resource_group | The Azure resource group. |
551 | region | The Azure region where the resource is deployed. |
552 | resource_type | The Azure resource type identifier. |
448 -| profile | The Azure Monitor profile id. |
553 +| profile | The Azure Monitor profile basename. |
554 | subscription_id | The Azure subscription identifier. |
555 | resource_uid | The unique Azure resource identifier. |
556
@@ -547,8 +652,8 @@ Check the following:
652
653 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
654
550 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
551 -- **Verify a built-in profile exists** -- List available profiles:
655 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
656 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
657 ```bash
658 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
659 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_kubernetes_service_cluster.md
+119 -14
@@ -59,7 +59,7 @@ The collector has two discovery phases:
59 **Bootstrap (first run)**
60
61 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
62 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
62 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
63 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
64 - A single job can monitor multiple subscriptions.
65
@@ -161,7 +161,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
161 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
162 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
163
164 -User profile files with the same `id` as a stock profile override it.
164 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
165 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
166
167
@@ -189,8 +189,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
189 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
190 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
191 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
192 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
193 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
192 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
193 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
194 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
195 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
196 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
197 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -236,6 +237,7 @@ Controls how the collector finds candidate Azure resources.
237 ##### discovery.mode_query.kql
238
239 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
240 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
241
242 The query **must** project these five columns:
243
@@ -247,6 +249,14 @@ The query **must** project these five columns:
249 | `resourceGroup` | Resource group name |
250 | `location` | Azure region |
251
252 +:::info
253 +
254 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
255 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
256 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
257 +
258 +:::
259 +
260 Example:
261
262 ```
@@ -263,11 +273,67 @@ Controls how the collector decides which metric profiles to activate.
273
274 | Mode | Behavior |
275 |:-----|:---------|
266 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
267 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
268 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
276 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
277 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
278 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
279 +
280 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
281 +
282 +Filter layering:
283 +
284 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
285 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
286 +- The effective resource set for a profile is the intersection of both filter sets.
287 +- Per-profile filters never widen or bypass the global discovery scope.
288 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
289 +
290 +
291 +<a id="option-profiles-profiles-mode-auto-entries"></a>
292 +##### profiles.mode_auto.entries
293 +
294 +Each entry has:
295 +
296 +| Field | Description |
297 +|:------|:------------|
298 +| `name` | Canonical profile basename. |
299 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
300 +| `filters.regions` | Optional region narrowing for this profile. |
301 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
302 +
303 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
304 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
305 +
306 +
307 +<a id="option-profiles-profiles-mode-exact-entries"></a>
308 +##### profiles.mode_exact.entries
309 +
310 +Each entry has:
311 +
312 +| Field | Description |
313 +|:------|:------------|
314 +| `name` | Canonical profile basename. |
315 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
316 +| `filters.regions` | Optional region narrowing for this profile. |
317 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
318 +
319 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
320 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
321 +
322 +
323 +<a id="option-profiles-profiles-mode-combined-entries"></a>
324 +##### profiles.mode_combined.entries
325 +
326 +Each entry has:
327 +
328 +| Field | Description |
329 +|:------|:------------|
330 +| `name` | Canonical profile basename. |
331 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
332 +| `filters.regions` | Optional region narrowing for this profile. |
333 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
334
270 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
335 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
336 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
337
338
339
@@ -355,9 +421,48 @@ jobs:
421 profiles:
422 mode: exact
423 mode_exact:
358 - names:
359 - - sql_database
360 - - postgres_flexible
424 + entries:
425 + - name: sql_database
426 + - name: postgres_flexible
427 + auth:
428 + mode: managed_identity
429 +
430 +```
431 +</details>
432 +
433 +###### Global and per-profile filters together
434 +
435 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
436 +
437 +<details open><summary>Config</summary>
438 +
439 +```yaml
440 +jobs:
441 + - name: prod-databases
442 + subscription_ids:
443 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
444 + discovery:
445 + mode: filters
446 + mode_filters:
447 + resource_groups:
448 + - production-rg
449 + regions:
450 + - eastus
451 + profiles:
452 + mode: combined
453 + mode_combined:
454 + entries:
455 + - name: sql_database
456 + filters:
457 + tags:
458 + env:
459 + - prod
460 + # Effective scope:
461 + # 1. Discovery first keeps only resources in production-rg and eastus.
462 + # 2. Auto-selected profiles use that global scope as-is.
463 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
464 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
465 + # because per-profile filters only narrow the globally discovered set.
466 auth:
467 mode: managed_identity
468
@@ -455,7 +560,7 @@ Labels:
560 | resource_group | The Azure resource group. |
561 | region | The Azure region where the resource is deployed. |
562 | resource_type | The Azure resource type identifier. |
458 -| profile | The Azure Monitor profile id. |
563 +| profile | The Azure Monitor profile basename. |
564 | subscription_id | The Azure subscription identifier. |
565 | resource_uid | The unique Azure resource identifier. |
566
@@ -576,8 +681,8 @@ Check the following:
681
682 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
683
579 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
580 -- **Verify a built-in profile exists** -- List available profiles:
684 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
685 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
686 ```bash
687 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
688 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_load_balancer.md
+119 -14
@@ -59,7 +59,7 @@ The collector has two discovery phases:
59 **Bootstrap (first run)**
60
61 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
62 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
62 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
63 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
64 - A single job can monitor multiple subscriptions.
65
@@ -161,7 +161,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
161 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
162 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
163
164 -User profile files with the same `id` as a stock profile override it.
164 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
165 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
166
167
@@ -189,8 +189,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
189 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
190 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
191 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
192 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
193 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
192 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
193 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
194 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
195 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
196 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
197 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -236,6 +237,7 @@ Controls how the collector finds candidate Azure resources.
237 ##### discovery.mode_query.kql
238
239 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
240 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
241
242 The query **must** project these five columns:
243
@@ -247,6 +249,14 @@ The query **must** project these five columns:
249 | `resourceGroup` | Resource group name |
250 | `location` | Azure region |
251
252 +:::info
253 +
254 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
255 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
256 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
257 +
258 +:::
259 +
260 Example:
261
262 ```
@@ -263,11 +273,67 @@ Controls how the collector decides which metric profiles to activate.
273
274 | Mode | Behavior |
275 |:-----|:---------|
266 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
267 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
268 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
276 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
277 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
278 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
279 +
280 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
281 +
282 +Filter layering:
283 +
284 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
285 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
286 +- The effective resource set for a profile is the intersection of both filter sets.
287 +- Per-profile filters never widen or bypass the global discovery scope.
288 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
289 +
290 +
291 +<a id="option-profiles-profiles-mode-auto-entries"></a>
292 +##### profiles.mode_auto.entries
293 +
294 +Each entry has:
295 +
296 +| Field | Description |
297 +|:------|:------------|
298 +| `name` | Canonical profile basename. |
299 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
300 +| `filters.regions` | Optional region narrowing for this profile. |
301 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
302 +
303 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
304 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
305 +
306 +
307 +<a id="option-profiles-profiles-mode-exact-entries"></a>
308 +##### profiles.mode_exact.entries
309 +
310 +Each entry has:
311 +
312 +| Field | Description |
313 +|:------|:------------|
314 +| `name` | Canonical profile basename. |
315 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
316 +| `filters.regions` | Optional region narrowing for this profile. |
317 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
318 +
319 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
320 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
321 +
322 +
323 +<a id="option-profiles-profiles-mode-combined-entries"></a>
324 +##### profiles.mode_combined.entries
325 +
326 +Each entry has:
327 +
328 +| Field | Description |
329 +|:------|:------------|
330 +| `name` | Canonical profile basename. |
331 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
332 +| `filters.regions` | Optional region narrowing for this profile. |
333 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
334
270 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
335 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
336 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
337
338
339
@@ -355,9 +421,48 @@ jobs:
421 profiles:
422 mode: exact
423 mode_exact:
358 - names:
359 - - sql_database
360 - - postgres_flexible
424 + entries:
425 + - name: sql_database
426 + - name: postgres_flexible
427 + auth:
428 + mode: managed_identity
429 +
430 +```
431 +</details>
432 +
433 +###### Global and per-profile filters together
434 +
435 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
436 +
437 +<details open><summary>Config</summary>
438 +
439 +```yaml
440 +jobs:
441 + - name: prod-databases
442 + subscription_ids:
443 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
444 + discovery:
445 + mode: filters
446 + mode_filters:
447 + resource_groups:
448 + - production-rg
449 + regions:
450 + - eastus
451 + profiles:
452 + mode: combined
453 + mode_combined:
454 + entries:
455 + - name: sql_database
456 + filters:
457 + tags:
458 + env:
459 + - prod
460 + # Effective scope:
461 + # 1. Discovery first keeps only resources in production-rg and eastus.
462 + # 2. Auto-selected profiles use that global scope as-is.
463 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
464 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
465 + # because per-profile filters only narrow the globally discovered set.
466 auth:
467 mode: managed_identity
468
@@ -447,7 +552,7 @@ Labels:
552 | resource_group | The Azure resource group. |
553 | region | The Azure region where the resource is deployed. |
554 | resource_type | The Azure resource type identifier. |
450 -| profile | The Azure Monitor profile id. |
555 +| profile | The Azure Monitor profile basename. |
556 | subscription_id | The Azure subscription identifier. |
557 | resource_uid | The unique Azure resource identifier. |
558
@@ -553,8 +658,8 @@ Check the following:
658
659 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
660
556 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
557 -- **Verify a built-in profile exists** -- List available profiles:
661 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
662 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
663 ```bash
664 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
665 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_log_analytics_workspace.md
+119 -14
@@ -59,7 +59,7 @@ The collector has two discovery phases:
59 **Bootstrap (first run)**
60
61 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
62 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
62 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
63 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
64 - A single job can monitor multiple subscriptions.
65
@@ -161,7 +161,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
161 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
162 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
163
164 -User profile files with the same `id` as a stock profile override it.
164 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
165 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
166
167
@@ -189,8 +189,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
189 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
190 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
191 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
192 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
193 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
192 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
193 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
194 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
195 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
196 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
197 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -236,6 +237,7 @@ Controls how the collector finds candidate Azure resources.
237 ##### discovery.mode_query.kql
238
239 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
240 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
241
242 The query **must** project these five columns:
243
@@ -247,6 +249,14 @@ The query **must** project these five columns:
249 | `resourceGroup` | Resource group name |
250 | `location` | Azure region |
251
252 +:::info
253 +
254 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
255 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
256 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
257 +
258 +:::
259 +
260 Example:
261
262 ```
@@ -263,11 +273,67 @@ Controls how the collector decides which metric profiles to activate.
273
274 | Mode | Behavior |
275 |:-----|:---------|
266 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
267 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
268 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
276 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
277 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
278 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
279 +
280 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
281 +
282 +Filter layering:
283 +
284 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
285 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
286 +- The effective resource set for a profile is the intersection of both filter sets.
287 +- Per-profile filters never widen or bypass the global discovery scope.
288 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
289 +
290 +
291 +<a id="option-profiles-profiles-mode-auto-entries"></a>
292 +##### profiles.mode_auto.entries
293 +
294 +Each entry has:
295 +
296 +| Field | Description |
297 +|:------|:------------|
298 +| `name` | Canonical profile basename. |
299 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
300 +| `filters.regions` | Optional region narrowing for this profile. |
301 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
302 +
303 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
304 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
305 +
306 +
307 +<a id="option-profiles-profiles-mode-exact-entries"></a>
308 +##### profiles.mode_exact.entries
309 +
310 +Each entry has:
311 +
312 +| Field | Description |
313 +|:------|:------------|
314 +| `name` | Canonical profile basename. |
315 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
316 +| `filters.regions` | Optional region narrowing for this profile. |
317 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
318 +
319 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
320 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
321 +
322 +
323 +<a id="option-profiles-profiles-mode-combined-entries"></a>
324 +##### profiles.mode_combined.entries
325 +
326 +Each entry has:
327 +
328 +| Field | Description |
329 +|:------|:------------|
330 +| `name` | Canonical profile basename. |
331 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
332 +| `filters.regions` | Optional region narrowing for this profile. |
333 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
334
270 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
335 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
336 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
337
338
339
@@ -355,9 +421,48 @@ jobs:
421 profiles:
422 mode: exact
423 mode_exact:
358 - names:
359 - - sql_database
360 - - postgres_flexible
424 + entries:
425 + - name: sql_database
426 + - name: postgres_flexible
427 + auth:
428 + mode: managed_identity
429 +
430 +```
431 +</details>
432 +
433 +###### Global and per-profile filters together
434 +
435 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
436 +
437 +<details open><summary>Config</summary>
438 +
439 +```yaml
440 +jobs:
441 + - name: prod-databases
442 + subscription_ids:
443 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
444 + discovery:
445 + mode: filters
446 + mode_filters:
447 + resource_groups:
448 + - production-rg
449 + regions:
450 + - eastus
451 + profiles:
452 + mode: combined
453 + mode_combined:
454 + entries:
455 + - name: sql_database
456 + filters:
457 + tags:
458 + env:
459 + - prod
460 + # Effective scope:
461 + # 1. Discovery first keeps only resources in production-rg and eastus.
462 + # 2. Auto-selected profiles use that global scope as-is.
463 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
464 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
465 + # because per-profile filters only narrow the globally discovered set.
466 auth:
467 mode: managed_identity
468
@@ -457,7 +562,7 @@ Labels:
562 | resource_group | The Azure resource group. |
563 | region | The Azure region where the resource is deployed. |
564 | resource_type | The Azure resource type identifier. |
460 -| profile | The Azure Monitor profile id. |
565 +| profile | The Azure Monitor profile basename. |
566 | subscription_id | The Azure subscription identifier. |
567 | resource_uid | The unique Azure resource identifier. |
568
@@ -592,8 +697,8 @@ Check the following:
697
698 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
699
595 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
596 -- **Verify a built-in profile exists** -- List available profiles:
700 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
701 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
702 ```bash
703 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
704 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_logic_apps_workflow.md
+119 -14
@@ -61,7 +61,7 @@ The collector has two discovery phases:
61 **Bootstrap (first run)**
62
63 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
64 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
64 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
65 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
66 - A single job can monitor multiple subscriptions.
67
@@ -163,7 +163,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
163 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
164 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
165
166 -User profile files with the same `id` as a stock profile override it.
166 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
167 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
168
169
@@ -191,8 +191,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
191 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
192 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
193 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
194 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
195 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
194 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
195 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
196 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
197 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
198 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
199 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -238,6 +239,7 @@ Controls how the collector finds candidate Azure resources.
239 ##### discovery.mode_query.kql
240
241 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
242 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
243
244 The query **must** project these five columns:
245
@@ -249,6 +251,14 @@ The query **must** project these five columns:
251 | `resourceGroup` | Resource group name |
252 | `location` | Azure region |
253
254 +:::info
255 +
256 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
257 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
258 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
259 +
260 +:::
261 +
262 Example:
263
264 ```
@@ -265,11 +275,67 @@ Controls how the collector decides which metric profiles to activate.
275
276 | Mode | Behavior |
277 |:-----|:---------|
268 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
269 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
270 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
278 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
279 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
280 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
281 +
282 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
283 +
284 +Filter layering:
285 +
286 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
287 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
288 +- The effective resource set for a profile is the intersection of both filter sets.
289 +- Per-profile filters never widen or bypass the global discovery scope.
290 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
291 +
292 +
293 +<a id="option-profiles-profiles-mode-auto-entries"></a>
294 +##### profiles.mode_auto.entries
295 +
296 +Each entry has:
297 +
298 +| Field | Description |
299 +|:------|:------------|
300 +| `name` | Canonical profile basename. |
301 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
302 +| `filters.regions` | Optional region narrowing for this profile. |
303 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
304 +
305 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
306 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
307 +
308 +
309 +<a id="option-profiles-profiles-mode-exact-entries"></a>
310 +##### profiles.mode_exact.entries
311 +
312 +Each entry has:
313 +
314 +| Field | Description |
315 +|:------|:------------|
316 +| `name` | Canonical profile basename. |
317 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
318 +| `filters.regions` | Optional region narrowing for this profile. |
319 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
320 +
321 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
322 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
323 +
324 +
325 +<a id="option-profiles-profiles-mode-combined-entries"></a>
326 +##### profiles.mode_combined.entries
327 +
328 +Each entry has:
329 +
330 +| Field | Description |
331 +|:------|:------------|
332 +| `name` | Canonical profile basename. |
333 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
334 +| `filters.regions` | Optional region narrowing for this profile. |
335 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
336
272 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
337 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
338 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
339
340
341
@@ -357,9 +423,48 @@ jobs:
423 profiles:
424 mode: exact
425 mode_exact:
360 - names:
361 - - sql_database
362 - - postgres_flexible
426 + entries:
427 + - name: sql_database
428 + - name: postgres_flexible
429 + auth:
430 + mode: managed_identity
431 +
432 +```
433 +</details>
434 +
435 +###### Global and per-profile filters together
436 +
437 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
438 +
439 +<details open><summary>Config</summary>
440 +
441 +```yaml
442 +jobs:
443 + - name: prod-databases
444 + subscription_ids:
445 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
446 + discovery:
447 + mode: filters
448 + mode_filters:
449 + resource_groups:
450 + - production-rg
451 + regions:
452 + - eastus
453 + profiles:
454 + mode: combined
455 + mode_combined:
456 + entries:
457 + - name: sql_database
458 + filters:
459 + tags:
460 + env:
461 + - prod
462 + # Effective scope:
463 + # 1. Discovery first keeps only resources in production-rg and eastus.
464 + # 2. Auto-selected profiles use that global scope as-is.
465 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
466 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
467 + # because per-profile filters only narrow the globally discovered set.
468 auth:
469 mode: managed_identity
470
@@ -457,7 +562,7 @@ Labels:
562 | resource_group | The Azure resource group. |
563 | region | The Azure region where the resource is deployed. |
564 | resource_type | The Azure resource type identifier. |
460 -| profile | The Azure Monitor profile id. |
565 +| profile | The Azure Monitor profile basename. |
566 | subscription_id | The Azure subscription identifier. |
567 | resource_uid | The unique Azure resource identifier. |
568
@@ -568,8 +673,8 @@ Check the following:
673
674 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
675
571 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
572 -- **Verify a built-in profile exists** -- List available profiles:
676 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
677 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
678 ```bash
679 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
680 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_machine_learning_workspace.md
+119 -14
@@ -64,7 +64,7 @@ The collector has two discovery phases:
64 **Bootstrap (first run)**
65
66 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
67 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
67 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
68 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
69 - A single job can monitor multiple subscriptions.
70
@@ -166,7 +166,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
166 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
167 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
168
169 -User profile files with the same `id` as a stock profile override it.
169 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
170 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
171
172
@@ -194,8 +194,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
194 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
195 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
196 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
197 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
198 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
197 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
198 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
199 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
200 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
201 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
202 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -241,6 +242,7 @@ Controls how the collector finds candidate Azure resources.
242 ##### discovery.mode_query.kql
243
244 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
245 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
246
247 The query **must** project these five columns:
248
@@ -252,6 +254,14 @@ The query **must** project these five columns:
254 | `resourceGroup` | Resource group name |
255 | `location` | Azure region |
256
257 +:::info
258 +
259 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
260 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
261 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
262 +
263 +:::
264 +
265 Example:
266
267 ```
@@ -268,11 +278,67 @@ Controls how the collector decides which metric profiles to activate.
278
279 | Mode | Behavior |
280 |:-----|:---------|
271 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
272 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
273 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
281 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
282 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
283 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
284 +
285 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
286 +
287 +Filter layering:
288 +
289 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
290 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
291 +- The effective resource set for a profile is the intersection of both filter sets.
292 +- Per-profile filters never widen or bypass the global discovery scope.
293 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
294 +
295 +
296 +<a id="option-profiles-profiles-mode-auto-entries"></a>
297 +##### profiles.mode_auto.entries
298 +
299 +Each entry has:
300 +
301 +| Field | Description |
302 +|:------|:------------|
303 +| `name` | Canonical profile basename. |
304 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
305 +| `filters.regions` | Optional region narrowing for this profile. |
306 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
307 +
308 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
309 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
310 +
311 +
312 +<a id="option-profiles-profiles-mode-exact-entries"></a>
313 +##### profiles.mode_exact.entries
314 +
315 +Each entry has:
316 +
317 +| Field | Description |
318 +|:------|:------------|
319 +| `name` | Canonical profile basename. |
320 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
321 +| `filters.regions` | Optional region narrowing for this profile. |
322 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
323 +
324 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
325 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
326 +
327 +
328 +<a id="option-profiles-profiles-mode-combined-entries"></a>
329 +##### profiles.mode_combined.entries
330 +
331 +Each entry has:
332 +
333 +| Field | Description |
334 +|:------|:------------|
335 +| `name` | Canonical profile basename. |
336 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
337 +| `filters.regions` | Optional region narrowing for this profile. |
338 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
339
275 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
340 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
341 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
342
343
344
@@ -360,9 +426,48 @@ jobs:
426 profiles:
427 mode: exact
428 mode_exact:
363 - names:
364 - - sql_database
365 - - postgres_flexible
429 + entries:
430 + - name: sql_database
431 + - name: postgres_flexible
432 + auth:
433 + mode: managed_identity
434 +
435 +```
436 +</details>
437 +
438 +###### Global and per-profile filters together
439 +
440 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
441 +
442 +<details open><summary>Config</summary>
443 +
444 +```yaml
445 +jobs:
446 + - name: prod-databases
447 + subscription_ids:
448 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
449 + discovery:
450 + mode: filters
451 + mode_filters:
452 + resource_groups:
453 + - production-rg
454 + regions:
455 + - eastus
456 + profiles:
457 + mode: combined
458 + mode_combined:
459 + entries:
460 + - name: sql_database
461 + filters:
462 + tags:
463 + env:
464 + - prod
465 + # Effective scope:
466 + # 1. Discovery first keeps only resources in production-rg and eastus.
467 + # 2. Auto-selected profiles use that global scope as-is.
468 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
469 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
470 + # because per-profile filters only narrow the globally discovered set.
471 auth:
472 mode: managed_identity
473
@@ -463,7 +568,7 @@ Labels:
568 | resource_group | The Azure resource group. |
569 | region | The Azure region where the resource is deployed. |
570 | resource_type | The Azure resource type identifier. |
466 -| profile | The Azure Monitor profile id. |
571 +| profile | The Azure Monitor profile basename. |
572 | subscription_id | The Azure subscription identifier. |
573 | resource_uid | The unique Azure resource identifier. |
574
@@ -591,8 +696,8 @@ Check the following:
696
697 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
698
594 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
595 -- **Verify a built-in profile exists** -- List available profiles:
699 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
700 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
701 ```bash
702 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
703 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_monitor.md
+119 -14
@@ -27,7 +27,7 @@ This collector provides real-time visibility into your Azure infrastructure by c
27
28 - **Multi-subscription** -- monitor resources across one or more Azure subscriptions in a single job
29 - **Automatic service detection** -- discovers resources and enables matching metric profiles without manual configuration
30 -- **38 built-in service profiles** -- covers databases, compute, networking, storage, AI, analytics, and more
30 +- **[38 built-in service profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default)** -- covers databases, compute, networking, storage, AI, analytics, and more
31 - **Flexible discovery** -- use structured filters (resource groups, regions, tags) or a custom Azure Resource Graph KQL query
32
33
@@ -55,7 +55,7 @@ The collector has two discovery phases:
55 **Bootstrap (first run)**
56
57 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
58 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
58 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
59 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
60 - A single job can monitor multiple subscriptions.
61
@@ -157,7 +157,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
157 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
158 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
159
160 -User profile files with the same `id` as a stock profile override it.
160 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
161 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
162
163
@@ -185,8 +185,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
185 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
186 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
187 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
188 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
189 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
188 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
189 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
190 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
191 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
192 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
193 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -232,6 +233,7 @@ Controls how the collector finds candidate Azure resources.
233 ##### discovery.mode_query.kql
234
235 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
236 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
237
238 The query **must** project these five columns:
239
@@ -243,6 +245,14 @@ The query **must** project these five columns:
245 | `resourceGroup` | Resource group name |
246 | `location` | Azure region |
247
248 +:::info
249 +
250 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
251 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
252 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
253 +
254 +:::
255 +
256 Example:
257
258 ```
@@ -259,11 +269,67 @@ Controls how the collector decides which metric profiles to activate.
269
270 | Mode | Behavior |
271 |:-----|:---------|
262 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
263 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
264 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
272 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
273 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
274 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
275 +
276 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
277 +
278 +Filter layering:
279 +
280 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
281 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
282 +- The effective resource set for a profile is the intersection of both filter sets.
283 +- Per-profile filters never widen or bypass the global discovery scope.
284 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
285 +
286 +
287 +<a id="option-profiles-profiles-mode-auto-entries"></a>
288 +##### profiles.mode_auto.entries
289 +
290 +Each entry has:
291 +
292 +| Field | Description |
293 +|:------|:------------|
294 +| `name` | Canonical profile basename. |
295 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
296 +| `filters.regions` | Optional region narrowing for this profile. |
297 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
298
266 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
299 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
300 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
301 +
302 +
303 +<a id="option-profiles-profiles-mode-exact-entries"></a>
304 +##### profiles.mode_exact.entries
305 +
306 +Each entry has:
307 +
308 +| Field | Description |
309 +|:------|:------------|
310 +| `name` | Canonical profile basename. |
311 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
312 +| `filters.regions` | Optional region narrowing for this profile. |
313 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
314 +
315 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
316 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
317 +
318 +
319 +<a id="option-profiles-profiles-mode-combined-entries"></a>
320 +##### profiles.mode_combined.entries
321 +
322 +Each entry has:
323 +
324 +| Field | Description |
325 +|:------|:------------|
326 +| `name` | Canonical profile basename. |
327 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
328 +| `filters.regions` | Optional region narrowing for this profile. |
329 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
330 +
331 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
332 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
333
334
335
@@ -351,9 +417,48 @@ jobs:
417 profiles:
418 mode: exact
419 mode_exact:
354 - names:
355 - - sql_database
356 - - postgres_flexible
420 + entries:
421 + - name: sql_database
422 + - name: postgres_flexible
423 + auth:
424 + mode: managed_identity
425 +
426 +```
427 +</details>
428 +
429 +###### Global and per-profile filters together
430 +
431 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
432 +
433 +<details open><summary>Config</summary>
434 +
435 +```yaml
436 +jobs:
437 + - name: prod-databases
438 + subscription_ids:
439 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
440 + discovery:
441 + mode: filters
442 + mode_filters:
443 + resource_groups:
444 + - production-rg
445 + regions:
446 + - eastus
447 + profiles:
448 + mode: combined
449 + mode_combined:
450 + entries:
451 + - name: sql_database
452 + filters:
453 + tags:
454 + env:
455 + - prod
456 + # Effective scope:
457 + # 1. Discovery first keeps only resources in production-rg and eastus.
458 + # 2. Auto-selected profiles use that global scope as-is.
459 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
460 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
461 + # because per-profile filters only narrow the globally discovered set.
462 auth:
463 mode: managed_identity
464
@@ -512,8 +617,8 @@ Check the following:
617
618 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
619
515 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
516 -- **Verify a built-in profile exists** -- List available profiles:
620 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
621 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
622 ```bash
623 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
624 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_mysql_flexible_server.md
+119 -14
@@ -64,7 +64,7 @@ The collector has two discovery phases:
64 **Bootstrap (first run)**
65
66 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
67 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
67 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
68 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
69 - A single job can monitor multiple subscriptions.
70
@@ -166,7 +166,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
166 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
167 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
168
169 -User profile files with the same `id` as a stock profile override it.
169 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
170 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
171
172
@@ -194,8 +194,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
194 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
195 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
196 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
197 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
198 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
197 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
198 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
199 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
200 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
201 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
202 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -241,6 +242,7 @@ Controls how the collector finds candidate Azure resources.
242 ##### discovery.mode_query.kql
243
244 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
245 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
246
247 The query **must** project these five columns:
248
@@ -252,6 +254,14 @@ The query **must** project these five columns:
254 | `resourceGroup` | Resource group name |
255 | `location` | Azure region |
256
257 +:::info
258 +
259 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
260 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
261 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
262 +
263 +:::
264 +
265 Example:
266
267 ```
@@ -268,11 +278,67 @@ Controls how the collector decides which metric profiles to activate.
278
279 | Mode | Behavior |
280 |:-----|:---------|
271 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
272 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
273 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
281 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
282 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
283 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
284 +
285 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
286 +
287 +Filter layering:
288 +
289 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
290 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
291 +- The effective resource set for a profile is the intersection of both filter sets.
292 +- Per-profile filters never widen or bypass the global discovery scope.
293 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
294 +
295 +
296 +<a id="option-profiles-profiles-mode-auto-entries"></a>
297 +##### profiles.mode_auto.entries
298 +
299 +Each entry has:
300 +
301 +| Field | Description |
302 +|:------|:------------|
303 +| `name` | Canonical profile basename. |
304 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
305 +| `filters.regions` | Optional region narrowing for this profile. |
306 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
307 +
308 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
309 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
310 +
311 +
312 +<a id="option-profiles-profiles-mode-exact-entries"></a>
313 +##### profiles.mode_exact.entries
314 +
315 +Each entry has:
316 +
317 +| Field | Description |
318 +|:------|:------------|
319 +| `name` | Canonical profile basename. |
320 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
321 +| `filters.regions` | Optional region narrowing for this profile. |
322 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
323 +
324 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
325 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
326 +
327 +
328 +<a id="option-profiles-profiles-mode-combined-entries"></a>
329 +##### profiles.mode_combined.entries
330 +
331 +Each entry has:
332 +
333 +| Field | Description |
334 +|:------|:------------|
335 +| `name` | Canonical profile basename. |
336 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
337 +| `filters.regions` | Optional region narrowing for this profile. |
338 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
339
275 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
340 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
341 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
342
343
344
@@ -360,9 +426,48 @@ jobs:
426 profiles:
427 mode: exact
428 mode_exact:
363 - names:
364 - - sql_database
365 - - postgres_flexible
429 + entries:
430 + - name: sql_database
431 + - name: postgres_flexible
432 + auth:
433 + mode: managed_identity
434 +
435 +```
436 +</details>
437 +
438 +###### Global and per-profile filters together
439 +
440 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
441 +
442 +<details open><summary>Config</summary>
443 +
444 +```yaml
445 +jobs:
446 + - name: prod-databases
447 + subscription_ids:
448 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
449 + discovery:
450 + mode: filters
451 + mode_filters:
452 + resource_groups:
453 + - production-rg
454 + regions:
455 + - eastus
456 + profiles:
457 + mode: combined
458 + mode_combined:
459 + entries:
460 + - name: sql_database
461 + filters:
462 + tags:
463 + env:
464 + - prod
465 + # Effective scope:
466 + # 1. Discovery first keeps only resources in production-rg and eastus.
467 + # 2. Auto-selected profiles use that global scope as-is.
468 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
469 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
470 + # because per-profile filters only narrow the globally discovered set.
471 auth:
472 mode: managed_identity
473
@@ -467,7 +572,7 @@ Labels:
572 | resource_group | The Azure resource group. |
573 | region | The Azure region where the resource is deployed. |
574 | resource_type | The Azure resource type identifier. |
470 -| profile | The Azure Monitor profile id. |
575 +| profile | The Azure Monitor profile basename. |
576 | subscription_id | The Azure subscription identifier. |
577 | resource_uid | The unique Azure resource identifier. |
578
@@ -598,8 +703,8 @@ Check the following:
703
704 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
705
601 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
602 -- **Verify a built-in profile exists** -- List available profiles:
706 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
707 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
708 ```bash
709 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
710 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_nat_gateway.md
+119 -14
@@ -59,7 +59,7 @@ The collector has two discovery phases:
59 **Bootstrap (first run)**
60
61 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
62 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
62 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
63 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
64 - A single job can monitor multiple subscriptions.
65
@@ -161,7 +161,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
161 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
162 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
163
164 -User profile files with the same `id` as a stock profile override it.
164 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
165 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
166
167
@@ -189,8 +189,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
189 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
190 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
191 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
192 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
193 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
192 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
193 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
194 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
195 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
196 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
197 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -236,6 +237,7 @@ Controls how the collector finds candidate Azure resources.
237 ##### discovery.mode_query.kql
238
239 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
240 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
241
242 The query **must** project these five columns:
243
@@ -247,6 +249,14 @@ The query **must** project these five columns:
249 | `resourceGroup` | Resource group name |
250 | `location` | Azure region |
251
252 +:::info
253 +
254 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
255 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
256 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
257 +
258 +:::
259 +
260 Example:
261
262 ```
@@ -263,11 +273,67 @@ Controls how the collector decides which metric profiles to activate.
273
274 | Mode | Behavior |
275 |:-----|:---------|
266 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
267 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
268 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
276 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
277 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
278 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
279 +
280 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
281 +
282 +Filter layering:
283 +
284 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
285 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
286 +- The effective resource set for a profile is the intersection of both filter sets.
287 +- Per-profile filters never widen or bypass the global discovery scope.
288 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
289 +
290 +
291 +<a id="option-profiles-profiles-mode-auto-entries"></a>
292 +##### profiles.mode_auto.entries
293 +
294 +Each entry has:
295 +
296 +| Field | Description |
297 +|:------|:------------|
298 +| `name` | Canonical profile basename. |
299 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
300 +| `filters.regions` | Optional region narrowing for this profile. |
301 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
302 +
303 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
304 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
305 +
306 +
307 +<a id="option-profiles-profiles-mode-exact-entries"></a>
308 +##### profiles.mode_exact.entries
309 +
310 +Each entry has:
311 +
312 +| Field | Description |
313 +|:------|:------------|
314 +| `name` | Canonical profile basename. |
315 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
316 +| `filters.regions` | Optional region narrowing for this profile. |
317 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
318 +
319 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
320 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
321 +
322 +
323 +<a id="option-profiles-profiles-mode-combined-entries"></a>
324 +##### profiles.mode_combined.entries
325 +
326 +Each entry has:
327 +
328 +| Field | Description |
329 +|:------|:------------|
330 +| `name` | Canonical profile basename. |
331 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
332 +| `filters.regions` | Optional region narrowing for this profile. |
333 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
334
270 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
335 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
336 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
337
338
339
@@ -355,9 +421,48 @@ jobs:
421 profiles:
422 mode: exact
423 mode_exact:
358 - names:
359 - - sql_database
360 - - postgres_flexible
424 + entries:
425 + - name: sql_database
426 + - name: postgres_flexible
427 + auth:
428 + mode: managed_identity
429 +
430 +```
431 +</details>
432 +
433 +###### Global and per-profile filters together
434 +
435 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
436 +
437 +<details open><summary>Config</summary>
438 +
439 +```yaml
440 +jobs:
441 + - name: prod-databases
442 + subscription_ids:
443 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
444 + discovery:
445 + mode: filters
446 + mode_filters:
447 + resource_groups:
448 + - production-rg
449 + regions:
450 + - eastus
451 + profiles:
452 + mode: combined
453 + mode_combined:
454 + entries:
455 + - name: sql_database
456 + filters:
457 + tags:
458 + env:
459 + - prod
460 + # Effective scope:
461 + # 1. Discovery first keeps only resources in production-rg and eastus.
462 + # 2. Auto-selected profiles use that global scope as-is.
463 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
464 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
465 + # because per-profile filters only narrow the globally discovered set.
466 auth:
467 mode: managed_identity
468
@@ -447,7 +552,7 @@ Labels:
552 | resource_group | The Azure resource group. |
553 | region | The Azure region where the resource is deployed. |
554 | resource_type | The Azure resource type identifier. |
450 -| profile | The Azure Monitor profile id. |
555 +| profile | The Azure Monitor profile basename. |
556 | subscription_id | The Azure subscription identifier. |
557 | resource_uid | The unique Azure resource identifier. |
558
@@ -551,8 +656,8 @@ Check the following:
656
657 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
658
554 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
555 -- **Verify a built-in profile exists** -- List available profiles:
659 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
660 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
661 ```bash
662 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
663 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_postgresql_flexible_server.md
+119 -14
@@ -64,7 +64,7 @@ The collector has two discovery phases:
64 **Bootstrap (first run)**
65
66 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
67 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
67 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
68 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
69 - A single job can monitor multiple subscriptions.
70
@@ -166,7 +166,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
166 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
167 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
168
169 -User profile files with the same `id` as a stock profile override it.
169 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
170 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
171
172
@@ -194,8 +194,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
194 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
195 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
196 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
197 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
198 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
197 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
198 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
199 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
200 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
201 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
202 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -241,6 +242,7 @@ Controls how the collector finds candidate Azure resources.
242 ##### discovery.mode_query.kql
243
244 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
245 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
246
247 The query **must** project these five columns:
248
@@ -252,6 +254,14 @@ The query **must** project these five columns:
254 | `resourceGroup` | Resource group name |
255 | `location` | Azure region |
256
257 +:::info
258 +
259 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
260 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
261 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
262 +
263 +:::
264 +
265 Example:
266
267 ```
@@ -268,11 +278,67 @@ Controls how the collector decides which metric profiles to activate.
278
279 | Mode | Behavior |
280 |:-----|:---------|
271 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
272 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
273 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
281 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
282 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
283 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
284 +
285 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
286 +
287 +Filter layering:
288 +
289 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
290 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
291 +- The effective resource set for a profile is the intersection of both filter sets.
292 +- Per-profile filters never widen or bypass the global discovery scope.
293 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
294 +
295 +
296 +<a id="option-profiles-profiles-mode-auto-entries"></a>
297 +##### profiles.mode_auto.entries
298 +
299 +Each entry has:
300 +
301 +| Field | Description |
302 +|:------|:------------|
303 +| `name` | Canonical profile basename. |
304 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
305 +| `filters.regions` | Optional region narrowing for this profile. |
306 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
307 +
308 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
309 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
310 +
311 +
312 +<a id="option-profiles-profiles-mode-exact-entries"></a>
313 +##### profiles.mode_exact.entries
314 +
315 +Each entry has:
316 +
317 +| Field | Description |
318 +|:------|:------------|
319 +| `name` | Canonical profile basename. |
320 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
321 +| `filters.regions` | Optional region narrowing for this profile. |
322 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
323 +
324 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
325 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
326 +
327 +
328 +<a id="option-profiles-profiles-mode-combined-entries"></a>
329 +##### profiles.mode_combined.entries
330 +
331 +Each entry has:
332 +
333 +| Field | Description |
334 +|:------|:------------|
335 +| `name` | Canonical profile basename. |
336 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
337 +| `filters.regions` | Optional region narrowing for this profile. |
338 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
339
275 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
340 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
341 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
342
343
344
@@ -360,9 +426,48 @@ jobs:
426 profiles:
427 mode: exact
428 mode_exact:
363 - names:
364 - - sql_database
365 - - postgres_flexible
429 + entries:
430 + - name: sql_database
431 + - name: postgres_flexible
432 + auth:
433 + mode: managed_identity
434 +
435 +```
436 +</details>
437 +
438 +###### Global and per-profile filters together
439 +
440 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
441 +
442 +<details open><summary>Config</summary>
443 +
444 +```yaml
445 +jobs:
446 + - name: prod-databases
447 + subscription_ids:
448 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
449 + discovery:
450 + mode: filters
451 + mode_filters:
452 + resource_groups:
453 + - production-rg
454 + regions:
455 + - eastus
456 + profiles:
457 + mode: combined
458 + mode_combined:
459 + entries:
460 + - name: sql_database
461 + filters:
462 + tags:
463 + env:
464 + - prod
465 + # Effective scope:
466 + # 1. Discovery first keeps only resources in production-rg and eastus.
467 + # 2. Auto-selected profiles use that global scope as-is.
468 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
469 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
470 + # because per-profile filters only narrow the globally discovered set.
471 auth:
472 mode: managed_identity
473
@@ -467,7 +572,7 @@ Labels:
572 | resource_group | The Azure resource group. |
573 | region | The Azure region where the resource is deployed. |
574 | resource_type | The Azure resource type identifier. |
470 -| profile | The Azure Monitor profile id. |
575 +| profile | The Azure Monitor profile basename. |
576 | subscription_id | The Azure subscription identifier. |
577 | resource_uid | The unique Azure resource identifier. |
578
@@ -608,8 +713,8 @@ Check the following:
713
714 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
715
611 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
612 -- **Verify a built-in profile exists** -- List available profiles:
716 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
717 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
718 ```bash
719 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
720 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_service_bus_namespace.md
+119 -14
@@ -63,7 +63,7 @@ The collector has two discovery phases:
63 **Bootstrap (first run)**
64
65 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
66 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
66 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
67 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
68 - A single job can monitor multiple subscriptions.
69
@@ -165,7 +165,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
165 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
166 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
167
168 -User profile files with the same `id` as a stock profile override it.
168 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
169 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
170
171
@@ -193,8 +193,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
193 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
194 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
195 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
196 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
197 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
196 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
197 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
198 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
199 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
200 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
201 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -240,6 +241,7 @@ Controls how the collector finds candidate Azure resources.
241 ##### discovery.mode_query.kql
242
243 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
244 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
245
246 The query **must** project these five columns:
247
@@ -251,6 +253,14 @@ The query **must** project these five columns:
253 | `resourceGroup` | Resource group name |
254 | `location` | Azure region |
255
256 +:::info
257 +
258 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
259 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
260 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
261 +
262 +:::
263 +
264 Example:
265
266 ```
@@ -267,11 +277,67 @@ Controls how the collector decides which metric profiles to activate.
277
278 | Mode | Behavior |
279 |:-----|:---------|
270 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
271 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
272 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
280 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
281 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
282 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
283 +
284 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
285 +
286 +Filter layering:
287 +
288 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
289 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
290 +- The effective resource set for a profile is the intersection of both filter sets.
291 +- Per-profile filters never widen or bypass the global discovery scope.
292 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
293 +
294 +
295 +<a id="option-profiles-profiles-mode-auto-entries"></a>
296 +##### profiles.mode_auto.entries
297 +
298 +Each entry has:
299 +
300 +| Field | Description |
301 +|:------|:------------|
302 +| `name` | Canonical profile basename. |
303 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
304 +| `filters.regions` | Optional region narrowing for this profile. |
305 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
306 +
307 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
308 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
309 +
310 +
311 +<a id="option-profiles-profiles-mode-exact-entries"></a>
312 +##### profiles.mode_exact.entries
313 +
314 +Each entry has:
315 +
316 +| Field | Description |
317 +|:------|:------------|
318 +| `name` | Canonical profile basename. |
319 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
320 +| `filters.regions` | Optional region narrowing for this profile. |
321 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
322 +
323 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
324 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
325 +
326 +
327 +<a id="option-profiles-profiles-mode-combined-entries"></a>
328 +##### profiles.mode_combined.entries
329 +
330 +Each entry has:
331 +
332 +| Field | Description |
333 +|:------|:------------|
334 +| `name` | Canonical profile basename. |
335 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
336 +| `filters.regions` | Optional region narrowing for this profile. |
337 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
338
274 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
339 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
340 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
341
342
343
@@ -359,9 +425,48 @@ jobs:
425 profiles:
426 mode: exact
427 mode_exact:
362 - names:
363 - - sql_database
364 - - postgres_flexible
428 + entries:
429 + - name: sql_database
430 + - name: postgres_flexible
431 + auth:
432 + mode: managed_identity
433 +
434 +```
435 +</details>
436 +
437 +###### Global and per-profile filters together
438 +
439 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
440 +
441 +<details open><summary>Config</summary>
442 +
443 +```yaml
444 +jobs:
445 + - name: prod-databases
446 + subscription_ids:
447 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
448 + discovery:
449 + mode: filters
450 + mode_filters:
451 + resource_groups:
452 + - production-rg
453 + regions:
454 + - eastus
455 + profiles:
456 + mode: combined
457 + mode_combined:
458 + entries:
459 + - name: sql_database
460 + filters:
461 + tags:
462 + env:
463 + - prod
464 + # Effective scope:
465 + # 1. Discovery first keeps only resources in production-rg and eastus.
466 + # 2. Auto-selected profiles use that global scope as-is.
467 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
468 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
469 + # because per-profile filters only narrow the globally discovered set.
470 auth:
471 mode: managed_identity
472
@@ -459,7 +564,7 @@ Labels:
564 | resource_group | The Azure resource group. |
565 | region | The Azure region where the resource is deployed. |
566 | resource_type | The Azure resource type identifier. |
462 -| profile | The Azure Monitor profile id. |
567 +| profile | The Azure Monitor profile basename. |
568 | subscription_id | The Azure subscription identifier. |
569 | resource_uid | The unique Azure resource identifier. |
570
@@ -573,8 +678,8 @@ Check the following:
678
679 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
680
576 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
577 -- **Verify a built-in profile exists** -- List available profiles:
681 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
682 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
683 ```bash
684 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
685 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_sql_database.md
+119 -14
@@ -62,7 +62,7 @@ The collector has two discovery phases:
62 **Bootstrap (first run)**
63
64 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
65 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
65 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
66 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
67 - A single job can monitor multiple subscriptions.
68
@@ -164,7 +164,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
164 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
165 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
166
167 -User profile files with the same `id` as a stock profile override it.
167 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
168 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
169
170
@@ -192,8 +192,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
192 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
193 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
194 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
195 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
196 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
195 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
196 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
197 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
198 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
199 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
200 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -239,6 +240,7 @@ Controls how the collector finds candidate Azure resources.
240 ##### discovery.mode_query.kql
241
242 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
243 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
244
245 The query **must** project these five columns:
246
@@ -250,6 +252,14 @@ The query **must** project these five columns:
252 | `resourceGroup` | Resource group name |
253 | `location` | Azure region |
254
255 +:::info
256 +
257 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
258 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
259 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
260 +
261 +:::
262 +
263 Example:
264
265 ```
@@ -266,11 +276,67 @@ Controls how the collector decides which metric profiles to activate.
276
277 | Mode | Behavior |
278 |:-----|:---------|
269 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
270 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
271 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
279 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
280 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
281 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
282 +
283 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
284 +
285 +Filter layering:
286 +
287 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
288 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
289 +- The effective resource set for a profile is the intersection of both filter sets.
290 +- Per-profile filters never widen or bypass the global discovery scope.
291 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
292 +
293 +
294 +<a id="option-profiles-profiles-mode-auto-entries"></a>
295 +##### profiles.mode_auto.entries
296 +
297 +Each entry has:
298 +
299 +| Field | Description |
300 +|:------|:------------|
301 +| `name` | Canonical profile basename. |
302 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
303 +| `filters.regions` | Optional region narrowing for this profile. |
304 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
305 +
306 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
307 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
308 +
309 +
310 +<a id="option-profiles-profiles-mode-exact-entries"></a>
311 +##### profiles.mode_exact.entries
312 +
313 +Each entry has:
314 +
315 +| Field | Description |
316 +|:------|:------------|
317 +| `name` | Canonical profile basename. |
318 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
319 +| `filters.regions` | Optional region narrowing for this profile. |
320 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
321 +
322 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
323 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
324 +
325 +
326 +<a id="option-profiles-profiles-mode-combined-entries"></a>
327 +##### profiles.mode_combined.entries
328 +
329 +Each entry has:
330 +
331 +| Field | Description |
332 +|:------|:------------|
333 +| `name` | Canonical profile basename. |
334 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
335 +| `filters.regions` | Optional region narrowing for this profile. |
336 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
337
273 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
338 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
339 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
340
341
342
@@ -358,9 +424,48 @@ jobs:
424 profiles:
425 mode: exact
426 mode_exact:
361 - names:
362 - - sql_database
363 - - postgres_flexible
427 + entries:
428 + - name: sql_database
429 + - name: postgres_flexible
430 + auth:
431 + mode: managed_identity
432 +
433 +```
434 +</details>
435 +
436 +###### Global and per-profile filters together
437 +
438 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
439 +
440 +<details open><summary>Config</summary>
441 +
442 +```yaml
443 +jobs:
444 + - name: prod-databases
445 + subscription_ids:
446 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
447 + discovery:
448 + mode: filters
449 + mode_filters:
450 + resource_groups:
451 + - production-rg
452 + regions:
453 + - eastus
454 + profiles:
455 + mode: combined
456 + mode_combined:
457 + entries:
458 + - name: sql_database
459 + filters:
460 + tags:
461 + env:
462 + - prod
463 + # Effective scope:
464 + # 1. Discovery first keeps only resources in production-rg and eastus.
465 + # 2. Auto-selected profiles use that global scope as-is.
466 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
467 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
468 + # because per-profile filters only narrow the globally discovered set.
469 auth:
470 mode: managed_identity
471
@@ -465,7 +570,7 @@ Labels:
570 | resource_group | The Azure resource group. |
571 | region | The Azure region where the resource is deployed. |
572 | resource_type | The Azure resource type identifier. |
468 -| profile | The Azure Monitor profile id. |
573 +| profile | The Azure Monitor profile basename. |
574 | subscription_id | The Azure subscription identifier. |
575 | resource_uid | The unique Azure resource identifier. |
576
@@ -585,8 +690,8 @@ Check the following:
690
691 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
692
588 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
589 -- **Verify a built-in profile exists** -- List available profiles:
693 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
694 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
695 ```bash
696 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
697 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_sql_elastic_pool.md
+119 -14
@@ -63,7 +63,7 @@ The collector has two discovery phases:
63 **Bootstrap (first run)**
64
65 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
66 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
66 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
67 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
68 - A single job can monitor multiple subscriptions.
69
@@ -165,7 +165,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
165 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
166 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
167
168 -User profile files with the same `id` as a stock profile override it.
168 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
169 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
170
171
@@ -193,8 +193,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
193 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
194 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
195 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
196 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
197 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
196 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
197 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
198 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
199 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
200 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
201 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -240,6 +241,7 @@ Controls how the collector finds candidate Azure resources.
241 ##### discovery.mode_query.kql
242
243 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
244 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
245
246 The query **must** project these five columns:
247
@@ -251,6 +253,14 @@ The query **must** project these five columns:
253 | `resourceGroup` | Resource group name |
254 | `location` | Azure region |
255
256 +:::info
257 +
258 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
259 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
260 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
261 +
262 +:::
263 +
264 Example:
265
266 ```
@@ -267,11 +277,67 @@ Controls how the collector decides which metric profiles to activate.
277
278 | Mode | Behavior |
279 |:-----|:---------|
270 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
271 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
272 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
280 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
281 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
282 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
283 +
284 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
285 +
286 +Filter layering:
287 +
288 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
289 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
290 +- The effective resource set for a profile is the intersection of both filter sets.
291 +- Per-profile filters never widen or bypass the global discovery scope.
292 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
293 +
294 +
295 +<a id="option-profiles-profiles-mode-auto-entries"></a>
296 +##### profiles.mode_auto.entries
297 +
298 +Each entry has:
299 +
300 +| Field | Description |
301 +|:------|:------------|
302 +| `name` | Canonical profile basename. |
303 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
304 +| `filters.regions` | Optional region narrowing for this profile. |
305 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
306 +
307 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
308 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
309 +
310 +
311 +<a id="option-profiles-profiles-mode-exact-entries"></a>
312 +##### profiles.mode_exact.entries
313 +
314 +Each entry has:
315 +
316 +| Field | Description |
317 +|:------|:------------|
318 +| `name` | Canonical profile basename. |
319 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
320 +| `filters.regions` | Optional region narrowing for this profile. |
321 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
322 +
323 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
324 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
325 +
326 +
327 +<a id="option-profiles-profiles-mode-combined-entries"></a>
328 +##### profiles.mode_combined.entries
329 +
330 +Each entry has:
331 +
332 +| Field | Description |
333 +|:------|:------------|
334 +| `name` | Canonical profile basename. |
335 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
336 +| `filters.regions` | Optional region narrowing for this profile. |
337 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
338
274 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
339 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
340 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
341
342
343
@@ -359,9 +425,48 @@ jobs:
425 profiles:
426 mode: exact
427 mode_exact:
362 - names:
363 - - sql_database
364 - - postgres_flexible
428 + entries:
429 + - name: sql_database
430 + - name: postgres_flexible
431 + auth:
432 + mode: managed_identity
433 +
434 +```
435 +</details>
436 +
437 +###### Global and per-profile filters together
438 +
439 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
440 +
441 +<details open><summary>Config</summary>
442 +
443 +```yaml
444 +jobs:
445 + - name: prod-databases
446 + subscription_ids:
447 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
448 + discovery:
449 + mode: filters
450 + mode_filters:
451 + resource_groups:
452 + - production-rg
453 + regions:
454 + - eastus
455 + profiles:
456 + mode: combined
457 + mode_combined:
458 + entries:
459 + - name: sql_database
460 + filters:
461 + tags:
462 + env:
463 + - prod
464 + # Effective scope:
465 + # 1. Discovery first keeps only resources in production-rg and eastus.
466 + # 2. Auto-selected profiles use that global scope as-is.
467 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
468 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
469 + # because per-profile filters only narrow the globally discovered set.
470 auth:
471 mode: managed_identity
472
@@ -461,7 +566,7 @@ Labels:
566 | resource_group | The Azure resource group. |
567 | region | The Azure region where the resource is deployed. |
568 | resource_type | The Azure resource type identifier. |
464 -| profile | The Azure Monitor profile id. |
569 +| profile | The Azure Monitor profile basename. |
570 | subscription_id | The Azure subscription identifier. |
571 | resource_uid | The unique Azure resource identifier. |
572
@@ -575,8 +680,8 @@ Check the following:
680
681 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
682
578 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
579 -- **Verify a built-in profile exists** -- List available profiles:
683 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
684 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
685 ```bash
686 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
687 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_sql_managed_instance.md
+119 -14
@@ -58,7 +58,7 @@ The collector has two discovery phases:
58 **Bootstrap (first run)**
59
60 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
61 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
61 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
62 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
63 - A single job can monitor multiple subscriptions.
64
@@ -160,7 +160,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
160 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
161 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
162
163 -User profile files with the same `id` as a stock profile override it.
163 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
164 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
165
166
@@ -188,8 +188,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
188 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
189 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
190 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
191 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
192 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
191 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
192 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
193 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
194 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
195 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
196 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -235,6 +236,7 @@ Controls how the collector finds candidate Azure resources.
236 ##### discovery.mode_query.kql
237
238 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
239 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
240
241 The query **must** project these five columns:
242
@@ -246,6 +248,14 @@ The query **must** project these five columns:
248 | `resourceGroup` | Resource group name |
249 | `location` | Azure region |
250
251 +:::info
252 +
253 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
254 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
255 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
256 +
257 +:::
258 +
259 Example:
260
261 ```
@@ -262,11 +272,67 @@ Controls how the collector decides which metric profiles to activate.
272
273 | Mode | Behavior |
274 |:-----|:---------|
265 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
266 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
267 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
275 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
276 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
277 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
278 +
279 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
280 +
281 +Filter layering:
282 +
283 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
284 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
285 +- The effective resource set for a profile is the intersection of both filter sets.
286 +- Per-profile filters never widen or bypass the global discovery scope.
287 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
288 +
289 +
290 +<a id="option-profiles-profiles-mode-auto-entries"></a>
291 +##### profiles.mode_auto.entries
292 +
293 +Each entry has:
294 +
295 +| Field | Description |
296 +|:------|:------------|
297 +| `name` | Canonical profile basename. |
298 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
299 +| `filters.regions` | Optional region narrowing for this profile. |
300 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
301 +
302 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
303 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
304 +
305 +
306 +<a id="option-profiles-profiles-mode-exact-entries"></a>
307 +##### profiles.mode_exact.entries
308 +
309 +Each entry has:
310 +
311 +| Field | Description |
312 +|:------|:------------|
313 +| `name` | Canonical profile basename. |
314 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
315 +| `filters.regions` | Optional region narrowing for this profile. |
316 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
317 +
318 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
319 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
320 +
321 +
322 +<a id="option-profiles-profiles-mode-combined-entries"></a>
323 +##### profiles.mode_combined.entries
324 +
325 +Each entry has:
326 +
327 +| Field | Description |
328 +|:------|:------------|
329 +| `name` | Canonical profile basename. |
330 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
331 +| `filters.regions` | Optional region narrowing for this profile. |
332 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
333
269 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
334 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
335 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
336
337
338
@@ -354,9 +420,48 @@ jobs:
420 profiles:
421 mode: exact
422 mode_exact:
357 - names:
358 - - sql_database
359 - - postgres_flexible
423 + entries:
424 + - name: sql_database
425 + - name: postgres_flexible
426 + auth:
427 + mode: managed_identity
428 +
429 +```
430 +</details>
431 +
432 +###### Global and per-profile filters together
433 +
434 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
435 +
436 +<details open><summary>Config</summary>
437 +
438 +```yaml
439 +jobs:
440 + - name: prod-databases
441 + subscription_ids:
442 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
443 + discovery:
444 + mode: filters
445 + mode_filters:
446 + resource_groups:
447 + - production-rg
448 + regions:
449 + - eastus
450 + profiles:
451 + mode: combined
452 + mode_combined:
453 + entries:
454 + - name: sql_database
455 + filters:
456 + tags:
457 + env:
458 + - prod
459 + # Effective scope:
460 + # 1. Discovery first keeps only resources in production-rg and eastus.
461 + # 2. Auto-selected profiles use that global scope as-is.
462 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
463 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
464 + # because per-profile filters only narrow the globally discovered set.
465 auth:
466 mode: managed_identity
467
@@ -445,7 +550,7 @@ Labels:
550 | resource_group | The Azure resource group. |
551 | region | The Azure region where the resource is deployed. |
552 | resource_type | The Azure resource type identifier. |
448 -| profile | The Azure Monitor profile id. |
553 +| profile | The Azure Monitor profile basename. |
554 | subscription_id | The Azure subscription identifier. |
555 | resource_uid | The unique Azure resource identifier. |
556
@@ -548,8 +653,8 @@ Check the following:
653
654 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
655
551 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
552 -- **Verify a built-in profile exists** -- List available profiles:
656 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
657 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
658 ```bash
659 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
660 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_storage_account.md
+119 -14
@@ -60,7 +60,7 @@ The collector has two discovery phases:
60 **Bootstrap (first run)**
61
62 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
63 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
63 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
64 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
65 - A single job can monitor multiple subscriptions.
66
@@ -162,7 +162,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
162 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
163 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
164
165 -User profile files with the same `id` as a stock profile override it.
165 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
166 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
167
168
@@ -190,8 +190,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
190 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
191 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
192 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
193 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
194 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
193 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
194 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
195 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
196 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
197 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
198 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -237,6 +238,7 @@ Controls how the collector finds candidate Azure resources.
238 ##### discovery.mode_query.kql
239
240 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
241 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
242
243 The query **must** project these five columns:
244
@@ -248,6 +250,14 @@ The query **must** project these five columns:
250 | `resourceGroup` | Resource group name |
251 | `location` | Azure region |
252
253 +:::info
254 +
255 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
256 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
257 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
258 +
259 +:::
260 +
261 Example:
262
263 ```
@@ -264,11 +274,67 @@ Controls how the collector decides which metric profiles to activate.
274
275 | Mode | Behavior |
276 |:-----|:---------|
267 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
268 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
269 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
277 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
278 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
279 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
280 +
281 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
282 +
283 +Filter layering:
284 +
285 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
286 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
287 +- The effective resource set for a profile is the intersection of both filter sets.
288 +- Per-profile filters never widen or bypass the global discovery scope.
289 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
290 +
291 +
292 +<a id="option-profiles-profiles-mode-auto-entries"></a>
293 +##### profiles.mode_auto.entries
294 +
295 +Each entry has:
296 +
297 +| Field | Description |
298 +|:------|:------------|
299 +| `name` | Canonical profile basename. |
300 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
301 +| `filters.regions` | Optional region narrowing for this profile. |
302 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
303 +
304 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
305 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
306 +
307 +
308 +<a id="option-profiles-profiles-mode-exact-entries"></a>
309 +##### profiles.mode_exact.entries
310 +
311 +Each entry has:
312 +
313 +| Field | Description |
314 +|:------|:------------|
315 +| `name` | Canonical profile basename. |
316 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
317 +| `filters.regions` | Optional region narrowing for this profile. |
318 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
319 +
320 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
321 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
322 +
323 +
324 +<a id="option-profiles-profiles-mode-combined-entries"></a>
325 +##### profiles.mode_combined.entries
326 +
327 +Each entry has:
328 +
329 +| Field | Description |
330 +|:------|:------------|
331 +| `name` | Canonical profile basename. |
332 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
333 +| `filters.regions` | Optional region narrowing for this profile. |
334 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
335
271 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
336 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
337 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
338
339
340
@@ -356,9 +422,48 @@ jobs:
422 profiles:
423 mode: exact
424 mode_exact:
359 - names:
360 - - sql_database
361 - - postgres_flexible
425 + entries:
426 + - name: sql_database
427 + - name: postgres_flexible
428 + auth:
429 + mode: managed_identity
430 +
431 +```
432 +</details>
433 +
434 +###### Global and per-profile filters together
435 +
436 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
437 +
438 +<details open><summary>Config</summary>
439 +
440 +```yaml
441 +jobs:
442 + - name: prod-databases
443 + subscription_ids:
444 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
445 + discovery:
446 + mode: filters
447 + mode_filters:
448 + resource_groups:
449 + - production-rg
450 + regions:
451 + - eastus
452 + profiles:
453 + mode: combined
454 + mode_combined:
455 + entries:
456 + - name: sql_database
457 + filters:
458 + tags:
459 + env:
460 + - prod
461 + # Effective scope:
462 + # 1. Discovery first keeps only resources in production-rg and eastus.
463 + # 2. Auto-selected profiles use that global scope as-is.
464 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
465 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
466 + # because per-profile filters only narrow the globally discovered set.
467 auth:
468 mode: managed_identity
469
@@ -449,7 +554,7 @@ Labels:
554 | resource_group | The Azure resource group. |
555 | region | The Azure region where the resource is deployed. |
556 | resource_type | The Azure resource type identifier. |
452 -| profile | The Azure Monitor profile id. |
557 +| profile | The Azure Monitor profile basename. |
558 | subscription_id | The Azure subscription identifier. |
559 | resource_uid | The unique Azure resource identifier. |
560
@@ -553,8 +658,8 @@ Check the following:
658
659 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
660
556 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
557 -- **Verify a built-in profile exists** -- List available profiles:
661 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
662 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
663 ```bash
664 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
665 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_stream_analytics_job.md
+119 -14
@@ -61,7 +61,7 @@ The collector has two discovery phases:
61 **Bootstrap (first run)**
62
63 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
64 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
64 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
65 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
66 - A single job can monitor multiple subscriptions.
67
@@ -163,7 +163,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
163 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
164 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
165
166 -User profile files with the same `id` as a stock profile override it.
166 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
167 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
168
169
@@ -191,8 +191,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
191 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
192 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
193 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
194 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
195 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
194 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
195 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
196 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
197 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
198 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
199 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -238,6 +239,7 @@ Controls how the collector finds candidate Azure resources.
239 ##### discovery.mode_query.kql
240
241 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
242 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
243
244 The query **must** project these five columns:
245
@@ -249,6 +251,14 @@ The query **must** project these five columns:
251 | `resourceGroup` | Resource group name |
252 | `location` | Azure region |
253
254 +:::info
255 +
256 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
257 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
258 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
259 +
260 +:::
261 +
262 Example:
263
264 ```
@@ -265,11 +275,67 @@ Controls how the collector decides which metric profiles to activate.
275
276 | Mode | Behavior |
277 |:-----|:---------|
268 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
269 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
270 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
278 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
279 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
280 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
281 +
282 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
283 +
284 +Filter layering:
285 +
286 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
287 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
288 +- The effective resource set for a profile is the intersection of both filter sets.
289 +- Per-profile filters never widen or bypass the global discovery scope.
290 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
291 +
292 +
293 +<a id="option-profiles-profiles-mode-auto-entries"></a>
294 +##### profiles.mode_auto.entries
295 +
296 +Each entry has:
297 +
298 +| Field | Description |
299 +|:------|:------------|
300 +| `name` | Canonical profile basename. |
301 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
302 +| `filters.regions` | Optional region narrowing for this profile. |
303 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
304 +
305 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
306 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
307 +
308 +
309 +<a id="option-profiles-profiles-mode-exact-entries"></a>
310 +##### profiles.mode_exact.entries
311 +
312 +Each entry has:
313 +
314 +| Field | Description |
315 +|:------|:------------|
316 +| `name` | Canonical profile basename. |
317 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
318 +| `filters.regions` | Optional region narrowing for this profile. |
319 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
320 +
321 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
322 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
323 +
324 +
325 +<a id="option-profiles-profiles-mode-combined-entries"></a>
326 +##### profiles.mode_combined.entries
327 +
328 +Each entry has:
329 +
330 +| Field | Description |
331 +|:------|:------------|
332 +| `name` | Canonical profile basename. |
333 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
334 +| `filters.regions` | Optional region narrowing for this profile. |
335 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
336
272 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
337 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
338 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
339
340
341
@@ -357,9 +423,48 @@ jobs:
423 profiles:
424 mode: exact
425 mode_exact:
360 - names:
361 - - sql_database
362 - - postgres_flexible
426 + entries:
427 + - name: sql_database
428 + - name: postgres_flexible
429 + auth:
430 + mode: managed_identity
431 +
432 +```
433 +</details>
434 +
435 +###### Global and per-profile filters together
436 +
437 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
438 +
439 +<details open><summary>Config</summary>
440 +
441 +```yaml
442 +jobs:
443 + - name: prod-databases
444 + subscription_ids:
445 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
446 + discovery:
447 + mode: filters
448 + mode_filters:
449 + resource_groups:
450 + - production-rg
451 + regions:
452 + - eastus
453 + profiles:
454 + mode: combined
455 + mode_combined:
456 + entries:
457 + - name: sql_database
458 + filters:
459 + tags:
460 + env:
461 + - prod
462 + # Effective scope:
463 + # 1. Discovery first keeps only resources in production-rg and eastus.
464 + # 2. Auto-selected profiles use that global scope as-is.
465 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
466 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
467 + # because per-profile filters only narrow the globally discovered set.
468 auth:
469 mode: managed_identity
470
@@ -455,7 +560,7 @@ Labels:
560 | resource_group | The Azure resource group. |
561 | region | The Azure region where the resource is deployed. |
562 | resource_type | The Azure resource type identifier. |
458 -| profile | The Azure Monitor profile id. |
563 +| profile | The Azure Monitor profile basename. |
564 | subscription_id | The Azure subscription identifier. |
565 | resource_uid | The unique Azure resource identifier. |
566
@@ -563,8 +668,8 @@ Check the following:
668
669 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
670
566 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
567 -- **Verify a built-in profile exists** -- List available profiles:
671 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
672 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
673 ```bash
674 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
675 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_synapse_analytics_workspace.md
+119 -14
@@ -60,7 +60,7 @@ The collector has two discovery phases:
60 **Bootstrap (first run)**
61
62 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
63 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
63 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
64 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
65 - A single job can monitor multiple subscriptions.
66
@@ -162,7 +162,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
162 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
163 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
164
165 -User profile files with the same `id` as a stock profile override it.
165 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
166 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
167
168
@@ -190,8 +190,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
190 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
191 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
192 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
193 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
194 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
193 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
194 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
195 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
196 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
197 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
198 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -237,6 +238,7 @@ Controls how the collector finds candidate Azure resources.
238 ##### discovery.mode_query.kql
239
240 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
241 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
242
243 The query **must** project these five columns:
244
@@ -248,6 +250,14 @@ The query **must** project these five columns:
250 | `resourceGroup` | Resource group name |
251 | `location` | Azure region |
252
253 +:::info
254 +
255 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
256 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
257 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
258 +
259 +:::
260 +
261 Example:
262
263 ```
@@ -264,11 +274,67 @@ Controls how the collector decides which metric profiles to activate.
274
275 | Mode | Behavior |
276 |:-----|:---------|
267 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
268 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
269 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
277 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
278 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
279 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
280 +
281 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
282 +
283 +Filter layering:
284 +
285 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
286 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
287 +- The effective resource set for a profile is the intersection of both filter sets.
288 +- Per-profile filters never widen or bypass the global discovery scope.
289 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
290 +
291 +
292 +<a id="option-profiles-profiles-mode-auto-entries"></a>
293 +##### profiles.mode_auto.entries
294 +
295 +Each entry has:
296 +
297 +| Field | Description |
298 +|:------|:------------|
299 +| `name` | Canonical profile basename. |
300 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
301 +| `filters.regions` | Optional region narrowing for this profile. |
302 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
303 +
304 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
305 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
306 +
307 +
308 +<a id="option-profiles-profiles-mode-exact-entries"></a>
309 +##### profiles.mode_exact.entries
310 +
311 +Each entry has:
312 +
313 +| Field | Description |
314 +|:------|:------------|
315 +| `name` | Canonical profile basename. |
316 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
317 +| `filters.regions` | Optional region narrowing for this profile. |
318 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
319 +
320 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
321 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
322 +
323 +
324 +<a id="option-profiles-profiles-mode-combined-entries"></a>
325 +##### profiles.mode_combined.entries
326 +
327 +Each entry has:
328 +
329 +| Field | Description |
330 +|:------|:------------|
331 +| `name` | Canonical profile basename. |
332 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
333 +| `filters.regions` | Optional region narrowing for this profile. |
334 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
335
271 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
336 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
337 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
338
339
340
@@ -356,9 +422,48 @@ jobs:
422 profiles:
423 mode: exact
424 mode_exact:
359 - names:
360 - - sql_database
361 - - postgres_flexible
425 + entries:
426 + - name: sql_database
427 + - name: postgres_flexible
428 + auth:
429 + mode: managed_identity
430 +
431 +```
432 +</details>
433 +
434 +###### Global and per-profile filters together
435 +
436 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
437 +
438 +<details open><summary>Config</summary>
439 +
440 +```yaml
441 +jobs:
442 + - name: prod-databases
443 + subscription_ids:
444 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
445 + discovery:
446 + mode: filters
447 + mode_filters:
448 + resource_groups:
449 + - production-rg
450 + regions:
451 + - eastus
452 + profiles:
453 + mode: combined
454 + mode_combined:
455 + entries:
456 + - name: sql_database
457 + filters:
458 + tags:
459 + env:
460 + - prod
461 + # Effective scope:
462 + # 1. Discovery first keeps only resources in production-rg and eastus.
463 + # 2. Auto-selected profiles use that global scope as-is.
464 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
465 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
466 + # because per-profile filters only narrow the globally discovered set.
467 auth:
468 mode: managed_identity
469
@@ -452,7 +557,7 @@ Labels:
557 | resource_group | The Azure resource group. |
558 | region | The Azure region where the resource is deployed. |
559 | resource_type | The Azure resource type identifier. |
455 -| profile | The Azure Monitor profile id. |
560 +| profile | The Azure Monitor profile basename. |
561 | subscription_id | The Azure subscription identifier. |
562 | resource_uid | The unique Azure resource identifier. |
563
@@ -568,8 +673,8 @@ Check the following:
673
674 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
675
571 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
572 -- **Verify a built-in profile exists** -- List available profiles:
676 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
677 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
678 ```bash
679 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
680 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_virtual_machine.md
+119 -14
@@ -63,7 +63,7 @@ The collector has two discovery phases:
63 **Bootstrap (first run)**
64
65 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
66 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
66 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
67 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
68 - A single job can monitor multiple subscriptions.
69
@@ -165,7 +165,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
165 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
166 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
167
168 -User profile files with the same `id` as a stock profile override it.
168 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
169 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
170
171
@@ -193,8 +193,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
193 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
194 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
195 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
196 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
197 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
196 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
197 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
198 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
199 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
200 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
201 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -240,6 +241,7 @@ Controls how the collector finds candidate Azure resources.
241 ##### discovery.mode_query.kql
242
243 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
244 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
245
246 The query **must** project these five columns:
247
@@ -251,6 +253,14 @@ The query **must** project these five columns:
253 | `resourceGroup` | Resource group name |
254 | `location` | Azure region |
255
256 +:::info
257 +
258 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
259 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
260 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
261 +
262 +:::
263 +
264 Example:
265
266 ```
@@ -267,11 +277,67 @@ Controls how the collector decides which metric profiles to activate.
277
278 | Mode | Behavior |
279 |:-----|:---------|
270 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
271 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
272 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
280 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
281 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
282 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
283 +
284 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
285 +
286 +Filter layering:
287 +
288 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
289 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
290 +- The effective resource set for a profile is the intersection of both filter sets.
291 +- Per-profile filters never widen or bypass the global discovery scope.
292 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
293 +
294 +
295 +<a id="option-profiles-profiles-mode-auto-entries"></a>
296 +##### profiles.mode_auto.entries
297 +
298 +Each entry has:
299 +
300 +| Field | Description |
301 +|:------|:------------|
302 +| `name` | Canonical profile basename. |
303 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
304 +| `filters.regions` | Optional region narrowing for this profile. |
305 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
306 +
307 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
308 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
309 +
310 +
311 +<a id="option-profiles-profiles-mode-exact-entries"></a>
312 +##### profiles.mode_exact.entries
313 +
314 +Each entry has:
315 +
316 +| Field | Description |
317 +|:------|:------------|
318 +| `name` | Canonical profile basename. |
319 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
320 +| `filters.regions` | Optional region narrowing for this profile. |
321 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
322 +
323 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
324 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
325 +
326 +
327 +<a id="option-profiles-profiles-mode-combined-entries"></a>
328 +##### profiles.mode_combined.entries
329 +
330 +Each entry has:
331 +
332 +| Field | Description |
333 +|:------|:------------|
334 +| `name` | Canonical profile basename. |
335 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
336 +| `filters.regions` | Optional region narrowing for this profile. |
337 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
338
274 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
339 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
340 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
341
342
343
@@ -359,9 +425,48 @@ jobs:
425 profiles:
426 mode: exact
427 mode_exact:
362 - names:
363 - - sql_database
364 - - postgres_flexible
428 + entries:
429 + - name: sql_database
430 + - name: postgres_flexible
431 + auth:
432 + mode: managed_identity
433 +
434 +```
435 +</details>
436 +
437 +###### Global and per-profile filters together
438 +
439 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
440 +
441 +<details open><summary>Config</summary>
442 +
443 +```yaml
444 +jobs:
445 + - name: prod-databases
446 + subscription_ids:
447 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
448 + discovery:
449 + mode: filters
450 + mode_filters:
451 + resource_groups:
452 + - production-rg
453 + regions:
454 + - eastus
455 + profiles:
456 + mode: combined
457 + mode_combined:
458 + entries:
459 + - name: sql_database
460 + filters:
461 + tags:
462 + env:
463 + - prod
464 + # Effective scope:
465 + # 1. Discovery first keeps only resources in production-rg and eastus.
466 + # 2. Auto-selected profiles use that global scope as-is.
467 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
468 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
469 + # because per-profile filters only narrow the globally discovered set.
470 auth:
471 mode: managed_identity
472
@@ -471,7 +576,7 @@ Labels:
576 | resource_group | The Azure resource group. |
577 | region | The Azure region where the resource is deployed. |
578 | resource_type | The Azure resource type identifier. |
474 -| profile | The Azure Monitor profile id. |
579 +| profile | The Azure Monitor profile basename. |
580 | subscription_id | The Azure subscription identifier. |
581 | resource_uid | The unique Azure resource identifier. |
582
@@ -605,8 +710,8 @@ Check the following:
710
711 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
712
608 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
609 -- **Verify a built-in profile exists** -- List available profiles:
713 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
714 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
715 ```bash
716 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
717 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_virtual_machine_scale_set.md
+119 -14
@@ -65,7 +65,7 @@ The collector has two discovery phases:
65 **Bootstrap (first run)**
66
67 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
68 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
68 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
69 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
70 - A single job can monitor multiple subscriptions.
71
@@ -167,7 +167,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
167 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
168 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
169
170 -User profile files with the same `id` as a stock profile override it.
170 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
171 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
172
173
@@ -195,8 +195,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
195 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
196 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
197 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
198 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
199 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
198 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
199 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
200 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
201 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
202 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
203 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -242,6 +243,7 @@ Controls how the collector finds candidate Azure resources.
243 ##### discovery.mode_query.kql
244
245 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
246 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
247
248 The query **must** project these five columns:
249
@@ -253,6 +255,14 @@ The query **must** project these five columns:
255 | `resourceGroup` | Resource group name |
256 | `location` | Azure region |
257
258 +:::info
259 +
260 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
261 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
262 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
263 +
264 +:::
265 +
266 Example:
267
268 ```
@@ -269,11 +279,67 @@ Controls how the collector decides which metric profiles to activate.
279
280 | Mode | Behavior |
281 |:-----|:---------|
272 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
273 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
274 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
282 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
283 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
284 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
285 +
286 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
287 +
288 +Filter layering:
289 +
290 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
291 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
292 +- The effective resource set for a profile is the intersection of both filter sets.
293 +- Per-profile filters never widen or bypass the global discovery scope.
294 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
295 +
296 +
297 +<a id="option-profiles-profiles-mode-auto-entries"></a>
298 +##### profiles.mode_auto.entries
299 +
300 +Each entry has:
301 +
302 +| Field | Description |
303 +|:------|:------------|
304 +| `name` | Canonical profile basename. |
305 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
306 +| `filters.regions` | Optional region narrowing for this profile. |
307 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
308 +
309 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
310 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
311 +
312 +
313 +<a id="option-profiles-profiles-mode-exact-entries"></a>
314 +##### profiles.mode_exact.entries
315 +
316 +Each entry has:
317 +
318 +| Field | Description |
319 +|:------|:------------|
320 +| `name` | Canonical profile basename. |
321 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
322 +| `filters.regions` | Optional region narrowing for this profile. |
323 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
324 +
325 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
326 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
327 +
328 +
329 +<a id="option-profiles-profiles-mode-combined-entries"></a>
330 +##### profiles.mode_combined.entries
331 +
332 +Each entry has:
333 +
334 +| Field | Description |
335 +|:------|:------------|
336 +| `name` | Canonical profile basename. |
337 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
338 +| `filters.regions` | Optional region narrowing for this profile. |
339 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
340
276 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
341 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
342 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
343
344
345
@@ -361,9 +427,48 @@ jobs:
427 profiles:
428 mode: exact
429 mode_exact:
364 - names:
365 - - sql_database
366 - - postgres_flexible
430 + entries:
431 + - name: sql_database
432 + - name: postgres_flexible
433 + auth:
434 + mode: managed_identity
435 +
436 +```
437 +</details>
438 +
439 +###### Global and per-profile filters together
440 +
441 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
442 +
443 +<details open><summary>Config</summary>
444 +
445 +```yaml
446 +jobs:
447 + - name: prod-databases
448 + subscription_ids:
449 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
450 + discovery:
451 + mode: filters
452 + mode_filters:
453 + resource_groups:
454 + - production-rg
455 + regions:
456 + - eastus
457 + profiles:
458 + mode: combined
459 + mode_combined:
460 + entries:
461 + - name: sql_database
462 + filters:
463 + tags:
464 + env:
465 + - prod
466 + # Effective scope:
467 + # 1. Discovery first keeps only resources in production-rg and eastus.
468 + # 2. Auto-selected profiles use that global scope as-is.
469 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
470 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
471 + # because per-profile filters only narrow the globally discovered set.
472 auth:
473 mode: managed_identity
474
@@ -475,7 +580,7 @@ Labels:
580 | resource_group | The Azure resource group. |
581 | region | The Azure region where the resource is deployed. |
582 | resource_type | The Azure resource type identifier. |
478 -| profile | The Azure Monitor profile id. |
583 +| profile | The Azure Monitor profile basename. |
584 | subscription_id | The Azure subscription identifier. |
585 | resource_uid | The unique Azure resource identifier. |
586
@@ -609,8 +714,8 @@ Check the following:
714
715 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
716
612 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
613 -- **Verify a built-in profile exists** -- List available profiles:
717 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
718 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
719 ```bash
720 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
721 ```
src/go/plugin/go.d/collector/azure_monitor/integrations/azure_vpn_gateway.md
+119 -14
@@ -63,7 +63,7 @@ The collector has two discovery phases:
63 **Bootstrap (first run)**
64
65 - With the default `profiles.mode: auto`, the collector queries Azure Resource Graph within the configured `subscription_ids` to find candidate resources.
66 -- It matches discovered resource types against built-in profiles and automatically enables the relevant ones.
66 +- It matches discovered resource types against [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) and automatically enables the relevant ones.
67 - Discovery scope can be narrowed using `discovery.mode: filters` (resource groups, regions, tags) or replaced entirely with `discovery.mode: query` for a custom KQL query.
68 - A single job can monitor multiple subscriptions.
69
@@ -165,7 +165,7 @@ The following options can be defined globally: `update_every`, `autodetection_re
165 | Stock profiles | `/usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/` |
166 | User overrides | `/etc/netdata/go.d/azure_monitor.profiles/` |
167
168 -User profile files with the same `id` as a stock profile override it.
168 +User profile files with the same basename as a [stock profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) override it.
169 Custom profiles extend the collector's catalog -- they do not replace the discovery mechanism.
170
171
@@ -193,8 +193,9 @@ Custom profiles extend the collector's catalog -- they do not replace the discov
193 | | discovery.mode_filters.tags | Optional exact-match tag filters for `filters` mode. Keys are matched case-insensitively and values case-sensitively. | {} | no |
194 | | [discovery.mode_query.kql](#option-discovery-discovery-mode-query-kql) | Custom Azure Resource Graph KQL for `query` mode. Must project `id`, `name`, `type`, `resourceGroup`, `location`. | | no |
195 | **Profiles** | [profiles.mode](#option-profiles-profiles-mode) | How profiles are selected: `auto` (discover from resources), `exact` (explicit list), or `combined` (both). | auto | no |
196 -| | profiles.mode_exact.names | Explicit profile file basenames used by `exact` mode. Matching is case-insensitive. | [] | no |
197 -| | profiles.mode_combined.names | Explicit profile file basenames merged with auto-discovered profiles in `combined` mode. Matching is case-insensitive. | [] | no |
196 +| | [profiles.mode_auto.entries](#option-profiles-profiles-mode-auto-entries) | Optional per-profile overrides applied only to profiles that auto-activate at bootstrap. | [] | no |
197 +| | [profiles.mode_exact.entries](#option-profiles-profiles-mode-exact-entries) | Explicit profile entries used by `exact` mode. | [] | no |
198 +| | [profiles.mode_combined.entries](#option-profiles-profiles-mode-combined-entries) | Explicit profile entries merged with auto-discovered profiles in `combined` mode. | [] | no |
199 | **Limits** | limits.max_concurrency | Maximum concurrent batch queries to Azure Monitor. | 4 | no |
200 | | limits.max_batch_resources | Maximum resources per Azure Monitor batch request. | 50 | no |
201 | | limits.max_metrics_per_query | Maximum metrics per Azure Monitor batch request. | 20 | no |
@@ -240,6 +241,7 @@ Controls how the collector finds candidate Azure resources.
241 ##### discovery.mode_query.kql
242
243 A raw Azure Resource Graph KQL query used when `discovery.mode` is `query`.
244 +See the [Azure Resource Graph query language documentation](https://learn.microsoft.com/en-us/azure/governance/resource-graph/concepts/query-language) for syntax and supported operators.
245
246 The query **must** project these five columns:
247
@@ -251,6 +253,14 @@ The query **must** project these five columns:
253 | `resourceGroup` | Resource group name |
254 | `location` | Azure region |
255
256 +:::info
257 +
258 +- Returned resource `type` values should match the Azure resource types expected by the active profiles.
259 +- Resources with unsupported or non-matching types are ignored and do not activate profiles.
260 +- For the stock catalog, see [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default).
261 +
262 +:::
263 +
264 Example:
265
266 ```
@@ -267,11 +277,67 @@ Controls how the collector decides which metric profiles to activate.
277
278 | Mode | Behavior |
279 |:-----|:---------|
270 -| `auto` | Discovers resource types in your subscriptions and enables matching built-in profiles automatically. This is the default. |
271 -| `exact` | Uses only the profile basenames listed under `profiles.mode_exact.names`. No auto-discovery. |
272 -| `combined` | Merges auto-discovered profiles with the basenames listed under `profiles.mode_combined.names`. |
280 +| `auto` | Discovers resource types in your subscriptions and enables matching [built-in profiles](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) automatically. This is the default. |
281 +| `exact` | Uses only the profile entries listed under `profiles.mode_exact.entries`. No auto-discovery. |
282 +| `combined` | Merges auto-discovered profiles with the explicit entries listed under `profiles.mode_combined.entries`. |
283 +
284 +Each profile entry uses `name` as the canonical profile basename. The basename is the profile filename without the `.yaml` / `.yml` suffix and must be lowercase.
285 +
286 +Filter layering:
287 +
288 +- `discovery.mode_filters.*` defines the job-wide discovery scope.
289 +- `profiles.mode_*.entries[].filters.*` narrows resources for one profile only.
290 +- The effective resource set for a profile is the intersection of both filter sets.
291 +- Per-profile filters never widen or bypass the global discovery scope.
292 +- In `discovery.mode: query`, per-profile filters can use only `resource_groups` and `regions`. If you need per-profile tag filtering there, encode it in the KQL.
293 +
294 +
295 +<a id="option-profiles-profiles-mode-auto-entries"></a>
296 +##### profiles.mode_auto.entries
297 +
298 +Each entry has:
299 +
300 +| Field | Description |
301 +|:------|:------------|
302 +| `name` | Canonical profile basename. |
303 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
304 +| `filters.regions` | Optional region narrowing for this profile. |
305 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
306 +
307 +Auto-mode entries do not activate profiles on their own. They only override filtering for profiles that were auto-selected at bootstrap.
308 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
309 +
310 +
311 +<a id="option-profiles-profiles-mode-exact-entries"></a>
312 +##### profiles.mode_exact.entries
313 +
314 +Each entry has:
315 +
316 +| Field | Description |
317 +|:------|:------------|
318 +| `name` | Canonical profile basename. |
319 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
320 +| `filters.regions` | Optional region narrowing for this profile. |
321 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
322 +
323 +Per-profile filters only narrow the globally discovered resource set. They never widen it.
324 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
325 +
326 +
327 +<a id="option-profiles-profiles-mode-combined-entries"></a>
328 +##### profiles.mode_combined.entries
329 +
330 +Each entry has:
331 +
332 +| Field | Description |
333 +|:------|:------------|
334 +| `name` | Canonical profile basename. |
335 +| `filters.resource_groups` | Optional resource-group narrowing for this profile. |
336 +| `filters.regions` | Optional region narrowing for this profile. |
337 +| `filters.tags` | Optional tag narrowing for this profile in `discovery.mode: filters`. |
338
274 -Profile basename matching is case-insensitive. A basename is the profile filename without the `.yaml` / `.yml` suffix.
339 +If an explicit `combined` entry matches an auto-selected profile, the collector keeps one runtime profile and overlays the explicit entry filters onto it.
340 +In `discovery.mode: query`, only `filters.resource_groups` and `filters.regions` apply.
341
342
343
@@ -359,9 +425,48 @@ jobs:
425 profiles:
426 mode: exact
427 mode_exact:
362 - names:
363 - - sql_database
364 - - postgres_flexible
428 + entries:
429 + - name: sql_database
430 + - name: postgres_flexible
431 + auth:
432 + mode: managed_identity
433 +
434 +```
435 +</details>
436 +
437 +###### Global and per-profile filters together
438 +
439 +Apply a global discovery boundary to the whole job, then narrow only the SQL Database profile further with a per-profile tag filter.
440 +
441 +<details open><summary>Config</summary>
442 +
443 +```yaml
444 +jobs:
445 + - name: prod-databases
446 + subscription_ids:
447 + - "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
448 + discovery:
449 + mode: filters
450 + mode_filters:
451 + resource_groups:
452 + - production-rg
453 + regions:
454 + - eastus
455 + profiles:
456 + mode: combined
457 + mode_combined:
458 + entries:
459 + - name: sql_database
460 + filters:
461 + tags:
462 + env:
463 + - prod
464 + # Effective scope:
465 + # 1. Discovery first keeps only resources in production-rg and eastus.
466 + # 2. Auto-selected profiles use that global scope as-is.
467 + # 3. The sql_database profile is narrowed further to resources tagged env=prod.
468 + # 4. The sql_database profile cannot see resources outside production-rg/eastus,
469 + # because per-profile filters only narrow the globally discovered set.
470 auth:
471 mode: managed_identity
472
@@ -461,7 +566,7 @@ Labels:
566 | resource_group | The Azure resource group. |
567 | region | The Azure region where the resource is deployed. |
568 | resource_type | The Azure resource type identifier. |
464 -| profile | The Azure Monitor profile id. |
569 +| profile | The Azure Monitor profile basename. |
570 | subscription_id | The Azure subscription identifier. |
571 | resource_uid | The unique Azure resource identifier. |
572
@@ -598,8 +703,8 @@ Check the following:
703
704 Profiles are matched by Azure resource type. If a resource type exists but metrics are missing:
705
601 -- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.names` or `profiles.mode_combined.names`.
602 -- **Verify a built-in profile exists** -- List available profiles:
706 +- **Check profile mode** -- Ensure `profiles.mode: auto` (default), or explicitly list the profile basename under `profiles.mode_exact.entries` or `profiles.mode_combined.entries`.
707 +- **Verify a [built-in profile](https://github.com/netdata/netdata/tree/master/src/go/plugin/go.d/config/go.d/azure_monitor.profiles/default) exists** -- List available profiles:
708 ```bash
709 ls /usr/lib/netdata/conf.d/go.d/azure_monitor.profiles/default/
710 ```