Fix metadata Learn links (#22455)
Costa Tsaousis committed
May 8, 2026 at 19:48 UTC
eef108293d52550f35b5e34b0447065fad51e35d
10 files changed
+317
-12
.agents/skills/integrations-lifecycle/how-tos/INDEX.md
+1
@@ -25,6 +25,7 @@ violation.
25
| Topic | Slug | Notes |
26
|---|---|---|
27
| Adding a new top-level `integration_type` (peer of collector, logs, exporter, etc.) | [adding-new-integration-type](adding-new-integration-type.md) | 8-step recipe: schema, pipeline, templates, categories.yaml, map.yaml, source metadata, downstream repos. Covers what to clone from existing types, the hardcoded-vs-derived `learn_rel_path` distinction, and the `integration_placeholder` mechanism. |
28
+| Auditing `metadata.yaml` links to Learn | [auditing-metadata-learn-links](auditing-metadata-learn-links.md) | Commands and repair rules for finding absolute Learn URL drift, validating fragments, and checking source-relative metadata links. |
29
| Keeping Network Flows on the Learn "Monitor anything" page | [monitor-anything-network-flows](monitor-anything-network-flows.md) | Explains that `src/collectors/COLLECTORS.md` is generated by `gen_doc_collector_page.py`, why top-level `flows` must be treated as a section, and how to validate the generated `Network Flows` section. |
30
31
Description authoring rules live in `../description-authoring.md`
.agents/skills/integrations-lifecycle/how-tos/auditing-metadata-learn-links.md
new
+100
@@ -0,0 +1,100 @@
1
+# Auditing `metadata.yaml` links to Learn
2
+
3
+Use this when a generated integration page contains links to
4
+`learn.netdata.cloud` and one of them drifts from the current Learn route.
5
+
6
+## Why this matters
7
+
8
+`metadata.yaml` is rendered into integration pages on Learn, the website, and
9
+the in-app integrations catalog (`../SKILL.md:37`). A broken Learn URL in
10
+metadata therefore becomes a user-visible broken link on multiple surfaces.
11
+
12
+Learn routes are not derived from source filenames. They are derived from
13
+`docs/.map/map.yaml` labels and hierarchy, while source-relative `/docs/... .md`
14
+links can be rewritten by Learn ingest (`../../learn-site-structure/mapping.md:219`).
15
+For example, `docs/network-flows/visualization/summary-sankey.md` is published
16
+as `/docs/network-flows/visualization/sankey-and-table` because the map label is
17
+`Sankey and Table` (`docs/.map/map.yaml:515`).
18
+
19
+## Audit command
20
+
21
+Extract unique absolute Learn URLs from all metadata files and check their
22
+published response:
23
+
24
+```bash
25
+rg -No "https://learn\\.netdata\\.cloud/docs[^)\\]\\s,\"']+" --glob 'metadata.yaml' . \
26
+ | sed 's/^.*https:/https:/' \
27
+ | sort -u \
28
+ | while read -r url; do
29
+ printf '%s\t' "$url"
30
+ curl -sL -o /dev/null -w '%{http_code}\t%{url_effective}\n' "$url"
31
+ done
32
+```
33
+
34
+For URLs with fragments, also confirm the target anchor exists in the rendered
35
+HTML:
36
+
37
+```bash
38
+curl -A 'Mozilla/5.0' -sL 'https://learn.netdata.cloud/docs/netdata-agent/configuration' \
39
+ | rg 'id="locate-your-config-directory"'
40
+```
41
+
42
+Validate source-relative metadata links locally:
43
+
44
+```bash
45
+python3 - <<'PY'
46
+import pathlib, re, sys
47
+
48
+root = pathlib.Path('.')
49
+pat = re.compile(r'\[[^\]]+\]\(([^)]+)\)')
50
+problems = []
51
+
52
+for path in sorted(root.rglob('metadata.yaml')):
53
+ text = path.read_text(errors='replace')
54
+ for match in pat.finditer(text):
55
+ target = match.group(1).strip()
56
+ if target.startswith('/docs/'):
57
+ file = root / target.split('#', 1)[0].lstrip('/')
58
+ elif target.startswith('../') or target.startswith('./'):
59
+ file = (path.parent / target.split('#', 1)[0]).resolve()
60
+ else:
61
+ continue
62
+
63
+ if not file.is_file():
64
+ line = text.count('\n', 0, match.start()) + 1
65
+ problems.append((str(path), line, target))
66
+
67
+if problems:
68
+ for path, line, target in problems:
69
+ print(f'{path}:{line}: missing linked source file: {target}')
70
+ sys.exit(1)
71
+
72
+print('OK: all metadata.yaml /docs and relative markdown links resolve to source files')
73
+PY
74
+```
75
+
76
+## Repair rule
77
+
78
+- If the link is Markdown text and points to a Netdata source doc, prefer the
79
+ source-relative `/docs/... .md` form when the consuming surface supports Learn
80
+ ingest rewriting.
81
+- If the same metadata is consumed by non-Learn surfaces that do not rewrite
82
+ source-relative links, keep an absolute `https://learn.netdata.cloud/docs/...`
83
+ URL, but derive the slug from `docs/.map/map.yaml` labels and verify it with
84
+ `curl`.
85
+- Do not infer slugs from filenames. Check the map label first, then validate
86
+ the published URL.
87
+
88
+## How I figured this out
89
+
90
+Files read:
91
+
92
+- `../SKILL.md`
93
+- `../../learn-site-structure/mapping.md`
94
+- `docs/.map/map.yaml`
95
+
96
+Commands run:
97
+
98
+- `rg -No 'https://learn\.netdata\.cloud/docs...' --glob 'metadata.yaml' .`
99
+- `curl -sL -o /dev/null -w '%{http_code}\t%{url_effective}\n' <url>`
100
+- local source-relative metadata link validation script above.
.agents/sow/done/SOW-0014-20260506-netflow-sflow-ipfix-documentation-guide.md
+204
@@ -4,6 +4,15 @@
4
5
Status: completed
6
7
+Reopened 2026-05-08 after a user report found at least one
8
+`metadata.yaml` Learn URL that no longer matches the published Learn route:
9
+`https://learn.netdata.cloud/docs/network-flows/visualization/summary-sankey`
10
+should point to the current Sankey/table page. This regression covers auditing
11
+all `metadata.yaml` Learn links, repairing source metadata, regenerating
12
+integration artifacts, and recording durable validation.
13
+The regression was repaired and revalidated on 2026-05-08; see
14
+`## Regression - 2026-05-08 - Metadata Learn Links`.
15
+
16
Reopened 2026-05-07 after the netlify deploy preview for learn PR #2852 surfaced major content errors that the prior validation pass missed. The closure on 2026-05-07 (Status: completed) was premature: the docs contained multiple statements that contradicted the source code, generic flow-monitoring advice imported from research notes that did not apply to Netdata, and several invented behaviours. The regression was repaired and revalidated by 2026-05-08; see the `## Regression - 2026-05-07` section and closeout notes at the end of this file.
17
18
Reopened 2026-05-08 after PR #22449 review and CI reported additional issues after the SOW had been marked completed and moved to `done/`. The open items are tracked in `## Regression - 2026-05-08` and include automated review threads, `yamllint`, `check-documentation`, Codacy triage, a code-only review subagent requested by the user, and a new user-requested local Learn preview skill/workflow.
@@ -2999,3 +3008,198 @@ collector-like schema that `flows.json` delegates to.
3008
No deferred follow-up remains for this regression. The website integration PR
3009
must be regenerated after this repair reaches `netdata/master`; that is the
3010
normal downstream propagation path rather than a separate source-code TODO.
3011
+
3012
+## Regression - 2026-05-08 - Metadata Learn Links
3013
+
3014
+### What broke
3015
+
3016
+User reported that `src/crates/netflow-plugin/metadata.yaml` links the Sankey
3017
+visualization guidance to
3018
+`https://learn.netdata.cloud/docs/network-flows/visualization/summary-sankey`,
3019
+but the actual Learn page is
3020
+`https://learn.netdata.cloud/docs/network-flows/visualization/sankey-and-table`.
3021
+
3022
+### Evidence
3023
+
3024
+- `src/crates/netflow-plugin/metadata.yaml` contains absolute
3025
+ `https://learn.netdata.cloud/docs/...` links in user-facing metadata
3026
+ rendered into integration pages.
3027
+- `.agents/skills/learn-site-structure/mapping.md` says inter-page links should
3028
+ use repo-relative `/docs/... .md` paths where possible, because Learn ingest
3029
+ rewrites them to the final route.
3030
+- The prior validation checked generated integration rendering and downstream
3031
+ builds, but did not crawl/validate every Learn URL embedded in
3032
+ `metadata.yaml`.
3033
+
3034
+### Why previous validation missed it
3035
+
3036
+- Build validation proves markdown renders, but does not prove every external
3037
+ absolute Learn URL resolves to the intended current page.
3038
+- The broken link returns a routing/publishing problem only when clicked or
3039
+ link-checked against Learn, not during metadata schema validation.
3040
+
3041
+### Pre-Implementation Gate
3042
+
3043
+Status: ready
3044
+
3045
+Problem / root-cause model:
3046
+
3047
+- Network Flow metadata contains hard-coded Learn URLs that drifted from the
3048
+ current Learn route names. The concrete example is the Sankey visualization
3049
+ page rename from `summary-sankey` to `sankey-and-table`.
3050
+- Other `metadata.yaml` files also contain Learn URLs, including repeated
3051
+ Virtual Node links in Go collector configuration descriptions. They need a
3052
+ full audit, not a single replacement.
3053
+
3054
+Evidence reviewed:
3055
+
3056
+- User-reported broken URL and current target URL.
3057
+- `rg` scan of all `metadata.yaml` files for `learn.netdata.cloud/docs` and
3058
+ `/docs/...` links.
3059
+- `learn-site-structure` skill mapping rules for source-relative links and
3060
+ Learn URL computation.
3061
+- `integrations-lifecycle` skill rules that `metadata.yaml` is the source of
3062
+ truth for generated integration pages.
3063
+
3064
+Affected contracts and surfaces:
3065
+
3066
+- `metadata.yaml` source files that render into integration pages.
3067
+- Generated `integrations/*.md`, `integrations/integrations.json`,
3068
+ `integrations/integrations.js`, and `src/collectors/COLLECTORS.md` if source
3069
+ metadata changes affect rendered artifacts.
3070
+- Learn and website integration pages that expose these links to users.
3071
+
3072
+Existing patterns to reuse:
3073
+
3074
+- Prefer `/docs/... .md` source-relative links when the target is a source doc
3075
+ in this repository and Learn ingest can rewrite it.
3076
+- Keep absolute links only when required by metadata schema fields or when
3077
+ linking to a page not represented as a source-relative doc path.
3078
+- Run the integrations generators after metadata edits.
3079
+
3080
+Risk and blast radius:
3081
+
3082
+- Documentation/integration metadata only.
3083
+- Incorrect replacements could break GitHub browsing or generated integration
3084
+ links, so every changed target must be verified against source docs and/or
3085
+ published Learn.
3086
+- No runtime collector behavior is changed.
3087
+
3088
+Sensitive data handling plan:
3089
+
3090
+- Link audit uses public documentation URLs and repository paths only.
3091
+- No credentials, customer data, IP addresses, or proprietary incident details
3092
+ are needed or recorded.
3093
+
3094
+Implementation plan:
3095
+
3096
+1. Extract every Learn-related URL from `metadata.yaml` files.
3097
+2. Validate targets against the Learn source map and published Learn responses.
3098
+3. Replace proven-broken hard-coded Learn URLs with correct source-relative doc
3099
+ links where possible.
3100
+4. Update the integrations/learn skills with a durable link-audit workflow if
3101
+ the current skills do not already document this audit.
3102
+5. Regenerate integration artifacts and run focused validation.
3103
+
3104
+Validation plan:
3105
+
3106
+- Re-run the `metadata.yaml` Learn-link extraction after edits.
3107
+- Validate changed links against source files and published Learn routes.
3108
+- Run `python3 integrations/gen_integrations.py`.
3109
+- Run `python3 integrations/gen_docs_integrations.py`.
3110
+- Run `python3 integrations/gen_doc_collector_page.py`.
3111
+- Run `git diff --check`.
3112
+- Run `.agents/sow/audit.sh` and record any unrelated pre-existing findings.
3113
+
3114
+Artifact updates needed:
3115
+
3116
+- **Code**: no runtime code expected.
3117
+- **Metadata**: update source `metadata.yaml` links proven wrong.
3118
+- **Generated artifacts**: update generated integrations if generator output
3119
+ changes.
3120
+- **Runtime project skills**: add/update link-audit guidance if absent.
3121
+- **Specs**: no product contract change expected.
3122
+- **End-user/operator docs**: generated integration docs may change.
3123
+
3124
+### Repair completed
3125
+
3126
+Repaired the proven-broken Learn targets:
3127
+
3128
+- `src/crates/netflow-plugin/metadata.yaml:147`,
3129
+ `src/crates/netflow-plugin/metadata.yaml:285`, and
3130
+ `src/crates/netflow-plugin/metadata.yaml:423` now link Validation and Data
3131
+ Quality to
3132
+ `https://learn.netdata.cloud/docs/network-flows/validation-and-data-quality`.
3133
+- `src/crates/netflow-plugin/metadata.yaml:159` now links Sankey and Table to
3134
+ `https://learn.netdata.cloud/docs/network-flows/visualization/sankey-and-table`.
3135
+- `src/crates/netflow-plugin/metadata.yaml:161` now links Maps and Globe to
3136
+ `https://learn.netdata.cloud/docs/network-flows/visualization/maps-and-globe`.
3137
+- `src/crates/netflow-plugin/metadata.yaml:542` now links Enrichment Intel
3138
+ Downloader to
3139
+ `https://learn.netdata.cloud/docs/network-flows/enrichment-intel-downloader`.
3140
+- `src/go/plugin/go.d/collector/snmp/metadata.yaml:243` now links the config
3141
+ directory section to
3142
+ `https://learn.netdata.cloud/docs/netdata-agent/configuration#locate-your-config-directory`.
3143
+
3144
+Regenerated the committed per-integration markdown files affected by those
3145
+metadata changes:
3146
+
3147
+- `src/crates/netflow-plugin/integrations/netflow.md`
3148
+- `src/crates/netflow-plugin/integrations/ipfix.md`
3149
+- `src/crates/netflow-plugin/integrations/sflow.md`
3150
+- `src/crates/netflow-plugin/integrations/db-ip_ip_intelligence.md`
3151
+- `src/go/plugin/go.d/collector/snmp/integrations/snmp_devices.md`
3152
+
3153
+Added `integrations-lifecycle` how-to
3154
+`.agents/skills/integrations-lifecycle/how-tos/auditing-metadata-learn-links.md`
3155
+and indexed it in
3156
+`.agents/skills/integrations-lifecycle/how-tos/INDEX.md`.
3157
+
3158
+### Validation evidence
3159
+
3160
+- Absolute Learn URL audit after repair found 12 unique
3161
+ `https://learn.netdata.cloud/docs/...` targets in `metadata.yaml`; every
3162
+ target returned HTTP 200.
3163
+- Fragment validation passed for:
3164
+ - `https://learn.netdata.cloud/docs/netdata-agent/configuration#locate-your-config-directory`
3165
+ - `https://learn.netdata.cloud/docs/netdata-agent/configuration/organize-systems-metrics-and-alerts#virtual-nodes`
3166
+- Source-relative metadata link audit passed: all `/docs/...` and relative
3167
+ markdown links in `metadata.yaml` resolve to source files.
3168
+- Same-failure search passed: no exact stale targets remain in the edited
3169
+ source metadata or generated integration markdown for `summary-sankey`,
3170
+ `maps-globe`, `network-flows/intel-downloader`, exact
3171
+ `network-flows/validation`, or `the-netdata-config-directory`.
3172
+- `python3 integrations/gen_integrations.py` passed.
3173
+- `python3 integrations/gen_docs_integrations.py` passed.
3174
+- `python3 integrations/gen_doc_collector_page.py` passed.
3175
+- `git diff --check` passed.
3176
+- `.agents/sow/audit.sh` exited 2 because of the pre-existing unrelated
3177
+ sensitive-pattern warning in
3178
+ `.agents/skills/mirror-netdata-repos/SKILL.md`; status/directory consistency
3179
+ was otherwise checked during the in-progress state.
3180
+
3181
+### Artifact maintenance gate
3182
+
3183
+- **AGENTS.md**: no update needed; repository-wide workflow did not change.
3184
+- **Runtime project skills**: updated `integrations-lifecycle` with a reusable
3185
+ metadata Learn-link audit how-to.
3186
+- **Specs**: no update needed; this changes documentation links, not product
3187
+ behavior or data contracts.
3188
+- **End-user/operator docs**: generated integration markdown updated from the
3189
+ source metadata.
3190
+- **End-user/operator skills**: no update needed; no public AI skill workflow
3191
+ changed.
3192
+- **SOW lifecycle**: SOW 14 reopened as a regression, will be returned to
3193
+ `Status: completed` and moved back to `.agents/sow/done/` in the same commit
3194
+ as the repair.
3195
+
3196
+### Sensitive data gate
3197
+
3198
+Only public Learn URLs and repository paths were recorded. No secrets,
3199
+credentials, bearer tokens, SNMP communities, customer data, personal data,
3200
+private endpoints, or proprietary incident details were used or written.
3201
+
3202
+### Follow-up mapping
3203
+
3204
+No deferred follow-up remains for this regression. The downstream website and
3205
+Learn integration refresh should follow the normal post-merge generation paths.
src/crates/netflow-plugin/integrations/db-ip_ip_intelligence.md
+1
-1
@@ -102,7 +102,7 @@ the binary is available (packaged 32-bit installs do not include it) to populate
102
sudo /usr/sbin/topology-ip-intel-downloader
103
```
104
105
-See the [Enrichment Intel Downloader](https://learn.netdata.cloud/docs/network-flows/intel-downloader)
105
+See the [Enrichment Intel Downloader](https://learn.netdata.cloud/docs/network-flows/enrichment-intel-downloader)
106
page for downloader options and how to schedule periodic refreshes. DB-IP Lite
107
data is published monthly, so a monthly cron of the downloader is the right
108
cadence -- more frequent runs will not produce newer data.
src/crates/netflow-plugin/integrations/ipfix.md
+1
-1
@@ -135,7 +135,7 @@ See [Troubleshooting](https://learn.netdata.cloud/docs/network-flows/troubleshoo
135
the full diagnostic recipe. For IPFIX specifically, watch the `template_errors` dimension
136
on `netflow.input_packets` -- IPFIX is template-driven and data records arriving before
137
their templates are dropped. See also
138
-[Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation).
138
+[Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation-and-data-quality).
139
140
141
src/crates/netflow-plugin/integrations/netflow.md
+1
-1
@@ -157,7 +157,7 @@ journal:
157
See [Troubleshooting](https://learn.netdata.cloud/docs/network-flows/troubleshooting) for
158
the full diagnostic recipe -- including UDP path checks, template-error analysis,
159
and the "looks like a bug but isn't" section (doubling, mirroring, internal-IP geolocation).
160
-See also [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation)
160
+See also [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation-and-data-quality)
161
and [Anti-patterns](https://learn.netdata.cloud/docs/network-flows/anti-patterns).
162
163
src/crates/netflow-plugin/integrations/sflow.md
+1
-1
@@ -137,7 +137,7 @@ the full diagnostic recipe. sFlow-specific gotchas: counter samples are not surf
137
(only flow samples), bytes/packets are statistical estimates that won't match SNMP
138
byte-for-byte, and VLAN information comes from `ExtendedSwitch` records only -- not
139
from 802.1Q tags inside the sampled header. See also
140
-[Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation)
140
+[Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation-and-data-quality)
141
and the sFlow section of [Anti-patterns](https://learn.netdata.cloud/docs/network-flows/anti-patterns).
142
143
src/crates/netflow-plugin/metadata.yaml
+6
-6
@@ -144,7 +144,7 @@ modules:
144
See [Troubleshooting](https://learn.netdata.cloud/docs/network-flows/troubleshooting) for
145
the full diagnostic recipe -- including UDP path checks, template-error analysis,
146
and the "looks like a bug but isn't" section (doubling, mirroring, internal-IP geolocation).
147
- See also [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation)
147
+ See also [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation-and-data-quality)
148
and [Anti-patterns](https://learn.netdata.cloud/docs/network-flows/anti-patterns).
149
alerts: []
150
metrics:
@@ -156,9 +156,9 @@ modules:
156
Use the Network Flows view in the Netdata dashboard to query and visualize flow data.
157
For the full list of fields and the per-protocol availability matrix, see the
158
[Field Reference](https://learn.netdata.cloud/docs/network-flows/field-reference).
159
- For visualisation guidance see [Sankey and Table](https://learn.netdata.cloud/docs/network-flows/visualization/summary-sankey),
159
+ For visualisation guidance see [Sankey and Table](https://learn.netdata.cloud/docs/network-flows/visualization/sankey-and-table),
160
[Time-Series](https://learn.netdata.cloud/docs/network-flows/visualization/time-series),
161
- and [Maps and Globe](https://learn.netdata.cloud/docs/network-flows/visualization/maps-globe).
161
+ and [Maps and Globe](https://learn.netdata.cloud/docs/network-flows/visualization/maps-and-globe).
162
availability: []
163
scopes: []
164
@@ -282,7 +282,7 @@ modules:
282
the full diagnostic recipe. For IPFIX specifically, watch the `template_errors` dimension
283
on `netflow.input_packets` -- IPFIX is template-driven and data records arriving before
284
their templates are dropped. See also
285
- [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation).
285
+ [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation-and-data-quality).
286
alerts: []
287
metrics:
288
folding:
@@ -420,7 +420,7 @@ modules:
420
(only flow samples), bytes/packets are statistical estimates that won't match SNMP
421
byte-for-byte, and VLAN information comes from `ExtendedSwitch` records only -- not
422
from 802.1Q tags inside the sampled header. See also
423
- [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation)
423
+ [Validation and Data Quality](https://learn.netdata.cloud/docs/network-flows/validation-and-data-quality)
424
and the sFlow section of [Anti-patterns](https://learn.netdata.cloud/docs/network-flows/anti-patterns).
425
alerts: []
426
metrics:
@@ -539,7 +539,7 @@ modules:
539
sudo /usr/sbin/topology-ip-intel-downloader
540
```
541
542
- See the [Enrichment Intel Downloader](https://learn.netdata.cloud/docs/network-flows/intel-downloader)
542
+ See the [Enrichment Intel Downloader](https://learn.netdata.cloud/docs/network-flows/enrichment-intel-downloader)
543
page for downloader options and how to schedule periodic refreshes. DB-IP Lite
544
data is published monthly, so a monthly cron of the downloader is the right
545
cadence -- more frequent runs will not produce newer data.
src/go/plugin/go.d/collector/snmp/integrations/snmp_devices.md
+1
-1
@@ -93,7 +93,7 @@ SNMP service discovery can automatically scan configured networks and feed the S
93
94
The configuration file name is [go.d/sd/snmp.conf](https://github.com/netdata/netdata/blob/master/src/go/plugin/go.d/config/go.d/sd/snmp.conf).
95
96
-You can edit the configuration file using the edit-config script from the Netdata [config directory](https://learn.netdata.cloud/docs/netdata-agent/configuration#the-netdata-config-directory).
96
+You can edit the configuration file using the edit-config script from the Netdata [config directory](https://learn.netdata.cloud/docs/netdata-agent/configuration#locate-your-config-directory).
97
98
```bash
99
cd /etc/netdata 2>/dev/null || cd /opt/netdata/etc/netdata
src/go/plugin/go.d/collector/snmp/metadata.yaml
+1
-1
@@ -240,7 +240,7 @@ modules:
240
241
The configuration file name is [go.d/sd/snmp.conf](https://github.com/netdata/netdata/blob/master/src/go/plugin/go.d/config/go.d/sd/snmp.conf).
242
243
- You can edit the configuration file using the edit-config script from the Netdata [config directory](https://learn.netdata.cloud/docs/netdata-agent/configuration#the-netdata-config-directory).
243
+ You can edit the configuration file using the edit-config script from the Netdata [config directory](https://learn.netdata.cloud/docs/netdata-agent/configuration#locate-your-config-directory).
244
245
```bash
246
cd /etc/netdata 2>/dev/null || cd /opt/netdata/etc/netdata