Skip to content

Commit bbdf043

Browse files
committed
Unify content relation mapping and add traffic analysis FAQ
1 parent a854848 commit bbdf043

8 files changed

Lines changed: 189 additions & 60 deletions

File tree

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
- case: /cases/uia-remote-network
1+
"/cases/uia-remote-network":
22
services:
33
- /services/office-network
44
faq:
@@ -7,7 +7,7 @@
77
tech:
88
- /tech/wifi-controller-firmware-schedule
99
- /tech/passive-inspection-report-workflow
10-
- case: /cases/ttw-remote-network
10+
"/cases/ttw-remote-network":
1111
services:
1212
- /services/office-network
1313
- /services/mdm
@@ -21,7 +21,7 @@
2121
- /tech/shared-dns-radius-isolation
2222
- /tech/jamf-trust-vpn-control
2323
- /tech/vpn-radius-certificate-lifecycle
24-
- case: /cases/tgw-remote-network
24+
"/cases/tgw-remote-network":
2525
services:
2626
- /services/office-network
2727
- /services/mdm
@@ -34,7 +34,7 @@
3434
tech:
3535
- /tech/jamf-trust-vpn-control
3636
- /tech/vpn-radius-certificate-lifecycle
37-
- case: /cases/cay-machine-room
37+
"/cases/cay-machine-room":
3838
services:
3939
- /services/idc-deployment
4040
- /services/virtualization-cloud
@@ -47,7 +47,7 @@
4747
tech:
4848
- /tech/onboarding-account-automation
4949
- /tech/datacenter-move-ups-improvement
50-
- case: /cases/jal-pa
50+
"/cases/jal-pa":
5151
services:
5252
- /services/office-network
5353
- /services/zero-trust
@@ -57,7 +57,7 @@
5757
tech:
5858
- /tech/network-license-takeover-checklist
5959
- /tech/controlled-ap-dual-path
60-
- case: /cases/cpa-jjp-network-audit
60+
"/cases/cpa-jjp-network-audit":
6161
services:
6262
- /services/office-network
6363
faq:
@@ -66,7 +66,7 @@
6666
tech:
6767
- /tech/it-inventory-recovery-manual
6868
- /tech/network-audit-template-delivery
69-
- case: /cases/klm-aua-erp
69+
"/cases/klm-aua-erp":
7070
services:
7171
- /services/virtualization-cloud
7272
- /services/backup-security
@@ -76,7 +76,7 @@
7676
tech:
7777
- /tech/pve-pbs-backup-schedule-validation
7878
- /tech/pve-quarterly-report-template
79-
- case: /cases/lgl-csa-vpn
79+
"/cases/lgl-csa-vpn":
8080
services:
8181
- /services/custom-dev
8282
- /services/zero-trust
@@ -86,15 +86,15 @@
8686
tech:
8787
- /tech/custom-app-review-transfer
8888
- /tech/app-ownership-transfer-process
89-
- case: /cases/lgl-hda-openvz-pve-eval
89+
"/cases/lgl-hda-openvz-pve-eval":
9090
services:
9191
- /services/virtualization-cloud
9292
faq:
9393
- /faq/closed-hypervisor-migration-plan
9494
tech:
9595
- /tech/closed-hypervisor-migration-validation
9696
- /tech/multi-stage-migration-checklist
97-
- case: /cases/lgl-awe-pve-vgpu-jamf
97+
"/cases/lgl-awe-pve-vgpu-jamf":
9898
services:
9999
- /services/virtualization-cloud
100100
- /services/mdm
@@ -104,7 +104,7 @@
104104
tech:
105105
- /tech/pve-vgpu-rollout-training
106106
- /tech/jamf-audit-cross-team
107-
- case: /cases/wzz-network-controller
107+
"/cases/wzz-network-controller":
108108
services:
109109
- /services/office-network
110110
- /services/hosting-operations
@@ -115,7 +115,7 @@
115115
tech:
116116
- /tech/unifi-controller-migration-light-ops
117117
- /tech/budget-nas-refresh-plan
118-
- case: /cases/lgl-tax-pve-io-wait
118+
"/cases/lgl-tax-pve-io-wait":
119119
services:
120120
- /services/virtualization-cloud
121121
faq:
@@ -124,7 +124,7 @@
124124
tech:
125125
- /tech/pve-io-wait-diagnostics-workflow
126126
- /tech/pve-backup-schedule-tuning-guide
127-
- case: /cases/lgl-cal-jamf-oidc
127+
"/cases/lgl-cal-jamf-oidc":
128128
services:
129129
- /services/mdm
130130
- /services/iam-zitadel
@@ -134,7 +134,7 @@
134134
tech:
135135
- /tech/zitadel-jamf-connect-validation-lab
136136
- /tech/oidc-test-logs-communication
137-
- case: /cases/lgl-nax-gpu-passthrough
137+
"/cases/lgl-nax-gpu-passthrough":
138138
services:
139139
- /services/virtualization-cloud
140140
- /services/it-outsourcing
@@ -144,7 +144,7 @@
144144
tech:
145145
- /tech/offline-pve-gpu-passthrough
146146
- /tech/on-site-troubleshooting-handbook
147-
- case: /cases/ana-unifi-controller
147+
"/cases/ana-unifi-controller":
148148
services:
149149
- /services/office-network
150150
- /services/it-outsourcing
@@ -155,7 +155,7 @@
155155
tech:
156156
- /tech/unifi-controller-migration-light-ops
157157
- /tech/budget-nas-refresh-plan
158-
- case: /cases/cay-server-farm
158+
"/cases/cay-server-farm":
159159
services:
160160
- /services/idc-deployment
161161
- /services/container-devops
@@ -166,9 +166,7 @@
166166
tech:
167167
- /tech/operations-handover-package
168168
- /tech/it-refresh-migration-blueprint
169-
- /tech/akvorado-flow-collector-overview
170-
- /tech/akvorado-traffic-analysis-workflow
171-
- case: /cases/cay-dns-filter
169+
"/cases/cay-dns-filter":
172170
services:
173171
- /services/office-network
174172
- /services/zero-trust
@@ -178,7 +176,7 @@
178176
tech:
179177
- /tech/shared-dns-radius-isolation
180178
- /tech/remote-inspection-reporting
181-
- case: /cases/cay-ldap-onboarding
179+
"/cases/cay-ldap-onboarding":
182180
services:
183181
- /services/office-network
184182
- /services/iam-zitadel
@@ -190,7 +188,7 @@
190188
- /tech/onboarding-account-automation
191189
- /tech/operations-handover-package
192190
- /tech/vpn-radius-certificate-lifecycle
193-
- case: /cases/cay-azure-erp
191+
"/cases/cay-azure-erp":
194192
services:
195193
- /services/virtualization-cloud
196194
- /services/backup-security
@@ -200,7 +198,7 @@
200198
tech:
201199
- /tech/pve-pbs-backup-schedule-validation
202200
- /tech/pve-quarterly-report-template
203-
- case: /cases/ttw-mdm
201+
"/cases/ttw-mdm":
204202
services:
205203
- /services/mdm
206204
faq:
@@ -209,7 +207,7 @@
209207
tech:
210208
- /tech/jamf-audit-cross-team
211209
- /tech/jamf-trust-vpn-control
212-
- case: /cases/tgw-mdm
210+
"/cases/tgw-mdm":
213211
services:
214212
- /services/mdm
215213
faq:
@@ -218,7 +216,7 @@
218216
tech:
219217
- /tech/jamf-audit-cross-team
220218
- /tech/jamf-trust-vpn-control
221-
- case: /cases/tgw-zero-trust-monitoring
219+
"/cases/tgw-zero-trust-monitoring":
222220
services:
223221
- /services/zero-trust
224222
- /services/it-monitoring
@@ -228,7 +226,7 @@
228226
tech:
229227
- /tech/jamf-trust-vpn-control
230228
- /tech/remote-inspection-reporting
231-
- case: /cases/wzz-nas-migration
229+
"/cases/wzz-nas-migration":
232230
services:
233231
- /services/hosting-operations
234232
- /services/backup-security
@@ -238,7 +236,7 @@
238236
tech:
239237
- /tech/budget-nas-refresh-plan
240238
- /tech/pve-backup-schedule-tuning-guide
241-
- case: /cases/wzz-contract-strategy
239+
"/cases/wzz-contract-strategy":
242240
services:
243241
- /services/it-outsourcing
244242
- /services/office-network
@@ -248,3 +246,23 @@
248246
tech:
249247
- /tech/operations-handover-package
250248
- /tech/it-refresh-migration-blueprint
249+
"/tech/akvorado-flow-collector-overview":
250+
services:
251+
- /services/it-monitoring
252+
- /services/office-network
253+
- /services/idc-deployment
254+
faq:
255+
- /faq/akvorado-vs-snmp-monitoring
256+
- /faq/akvorado-data-quality-checks
257+
tech:
258+
- /tech/akvorado-traffic-analysis-workflow
259+
"/tech/akvorado-traffic-analysis-workflow":
260+
services:
261+
- /services/it-monitoring
262+
- /services/office-network
263+
- /services/idc-deployment
264+
faq:
265+
- /faq/akvorado-vs-snmp-monitoring
266+
- /faq/akvorado-data-quality-checks
267+
tech:
268+
- /tech/akvorado-flow-collector-overview

docs/content-relations.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Content Relations
2+
3+
`config/content-relations.yaml` is the single source of truth for case, service, FAQ, and tech relationships. Each top-level key is an absolute content slug, and each value may include:
4+
5+
- `services`: service slugs shown on the source article and used to surface the article from matching service and case pages.
6+
- `faq`: FAQ slugs shown on the source article and surfaced from matching service and case pages.
7+
- `tech`: related tech article slugs shown on the source article and used for inverse tech relationships.
8+
9+
Case entries should use their case slug as the top-level key. Tool-focused or educational tech articles should use their tech slug directly instead of being attached to an unrelated case.

src/components/RelationShipArticleList.vue

Lines changed: 65 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import { useI18n } from 'vue-i18n'
55
import YAML from 'yaml'
66
import FaqArticleCard from './FaqArticleCard.vue'
77
import ArticlePreview from './ArticlePreview.vue'
8-
import mappingRaw from '../../config/case-mapping.yaml?raw'
8+
import relationsRaw from '../../config/content-relations.yaml?raw'
99
import { resolveContentInfo, buildLocalizedPath } from '@/utils/contentIndex'
1010
import { useFallbackNotice } from '@/composables/useFallbackNotice'
1111
12-
const caseMappings = YAML.parse(mappingRaw) || []
12+
const relations = YAML.parse(relationsRaw) || {}
1313
1414
const { locale, availableLocales, fallbackLocale } = useI18n()
1515
const supportedLocales = computed(() => availableLocales || [])
@@ -79,53 +79,92 @@ const detectPageType = (slug) => {
7979
return null
8080
}
8181
82-
const findCaseEntry = (slug) => caseMappings.find((entry) => entry.case === slug)
82+
const normalizeRelationEntry = (slug, entry = {}) => ({
83+
slug,
84+
services: toArray(entry.services),
85+
faq: toArray(entry.faq),
86+
tech: toArray(entry.tech),
87+
})
88+
89+
const relationEntries = Object.entries(relations).map(([slug, entry]) => normalizeRelationEntry(slug, entry))
90+
91+
const isCaseSlug = (slug) => slug.startsWith('/cases/')
92+
const isTechSlug = (slug) => slug.startsWith('/tech/')
93+
94+
const findRelationEntry = (slug) => normalizeRelationEntry(slug, relations[slug])
8395
84-
const findCasesByService = (serviceSlug) =>
85-
caseMappings.filter((entry) => entry.services?.includes(serviceSlug))
96+
const findRelationEntriesByService = (serviceSlug) =>
97+
relationEntries.filter((entry) => entry.services.includes(serviceSlug))
98+
99+
const findRelationEntriesByTech = (techSlug) =>
100+
relationEntries.filter((entry) => entry.tech.includes(techSlug))
101+
102+
const dedupeRelationEntries = (entries) => {
103+
const seen = new Set()
104+
return entries.filter((entry) => {
105+
if (!entry.slug || seen.has(entry.slug)) return false
106+
seen.add(entry.slug)
107+
return true
108+
})
109+
}
86110
87-
const findCasesByTech = (techSlug) =>
88-
caseMappings.filter((entry) => entry.tech?.includes(techSlug))
111+
const findTechEntriesByServices = (serviceSlugs) =>
112+
dedupeRelationEntries(
113+
toArray(serviceSlugs)
114+
.flatMap((serviceSlug) => findRelationEntriesByService(serviceSlug))
115+
.filter((entry) => isTechSlug(entry.slug)),
116+
)
89117
90118
const relatedData = computed(() => {
91119
const slug = currentSlug.value
92120
const type = detectPageType(slug)
93121
const localeValue = locale.value
94-
//console.log('[RelationShipArticleList] computing relations for', slug, type, localeValue, caseMappings)
122+
//console.log('[RelationShipArticleList] computing relations for', slug, type, localeValue, relations)
95123
if (!type) return { cases: [], services: [], tech: [], faq: [] }
96124
let caseSlugs = []
97125
let serviceSlugs = []
98126
let techSlugs = []
99127
let faqSlugs = []
100-
const serviceEntry = findCasesByService(slug)
101-
const caseEntry = findCaseEntry(slug)
102-
const techEntry = findCasesByTech(slug)
128+
const relationEntry = findRelationEntry(slug)
129+
const entriesByService = findRelationEntriesByService(slug)
130+
const entriesByTech = findRelationEntriesByTech(slug)
103131
switch (type) {
104132
case 'service':
105-
caseSlugs = serviceEntry.map((entry) => entry.case)
106-
faqSlugs = serviceEntry.flatMap((entry) => entry.faq || [])
107-
techSlugs = serviceEntry.flatMap((entry) => entry.tech || [])
133+
caseSlugs = entriesByService.filter((entry) => isCaseSlug(entry.slug)).map((entry) => entry.slug)
134+
faqSlugs = entriesByService.flatMap((entry) => entry.faq)
135+
techSlugs = entriesByService.flatMap((entry) =>
136+
isTechSlug(entry.slug) ? [entry.slug] : entry.tech,
137+
)
108138
break;
109139
case 'case':
110-
if (caseEntry) {
111-
serviceSlugs = caseEntry.services || []
112-
faqSlugs = caseEntry.faq || []
113-
techSlugs = caseEntry.tech || []
114-
}
140+
serviceSlugs = relationEntry.services
141+
faqSlugs = relationEntry.faq
142+
techSlugs = relationEntry.tech
143+
const serviceTechEntries = findTechEntriesByServices(serviceSlugs)
144+
faqSlugs.push(...serviceTechEntries.flatMap((entry) => entry.faq))
145+
techSlugs.push(...serviceTechEntries.map((entry) => entry.slug))
115146
break;
116147
case 'tech':
117-
caseSlugs = techEntry.map((entry) => entry.case)
118-
serviceSlugs = techEntry.flatMap((entry) => entry.services || [])
119-
faqSlugs = techEntry.flatMap((entry) => entry.faq || [])
148+
caseSlugs = entriesByTech.filter((entry) => isCaseSlug(entry.slug)).map((entry) => entry.slug)
149+
serviceSlugs = entriesByTech
150+
.filter((entry) => isCaseSlug(entry.slug))
151+
.flatMap((entry) => entry.services)
152+
faqSlugs = entriesByTech
153+
.filter((entry) => isCaseSlug(entry.slug))
154+
.flatMap((entry) => entry.faq)
155+
serviceSlugs.push(...relationEntry.services)
156+
faqSlugs.push(...relationEntry.faq)
157+
techSlugs.push(...relationEntry.tech)
158+
techSlugs.push(...entriesByTech.filter((entry) => isTechSlug(entry.slug)).map((entry) => entry.slug))
120159
break;
121160
default:
122161
break;
123162
}
124163
125-
caseSlugs = unique(caseSlugs)
126-
serviceSlugs = unique(serviceSlugs)
127-
techSlugs = unique(techSlugs)
128-
faqSlugs = unique(faqSlugs)
164+
caseSlugs = unique(caseSlugs).filter(Boolean)
165+
serviceSlugs = unique(serviceSlugs).filter(Boolean)
166+
techSlugs = unique(techSlugs).filter(Boolean)
167+
faqSlugs = unique(faqSlugs).filter(Boolean)
129168
130169
//console.log('[RelationShipArticleList] unique relations for', slug, type, localeValue, caseSlugs, serviceSlugs, techSlugs, faqSlugs)
131170
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
type: faq
3+
slug: faq/akvorado-data-quality-checks
4+
title: |
5+
What data-quality checks are needed before trusting Akvorado Top Talkers?
6+
description: |
7+
Follow [Akvorado Traffic Analysis Tutorial](/tech/akvorado-traffic-analysis-workflow): confirm exporters keep sending flows, Inlet counters increase, Outlet writes into ClickHouse, and sampling plus SNMP enrichment remain stable.
8+
ogType: article
9+
index: false
10+
deploy: true
11+
sitemap:
12+
priority: 0.4
13+
changefreq: monthly
14+
lastmod: build
15+
---

0 commit comments

Comments
 (0)