@cryptotaxi247 / netdata / commits / eef108293

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