Kubernetes DNS search domain expansion creates multiple NXDOMAIN queries
for the same external domain (e.g. auth.docker.io.cluster.local,
auth.docker.io.svc.cluster.local). Without normalization, each variant
becomes a separate Neo4j node, inflating Public connections on the Map.
Backend (graph-writer):
- Rewrite _normalize_dns_name with TLD-safe 4-step algorithm
- Strip .svc.cluster.local, .<ns>.svc.cluster.local, .cluster.local
- Support custom search domains via DNS_SEARCH_DOMAINS env var
- Apply normalization in process_dns_query and process_sni_event
- Fix NXDOMAIN vertex overriding NOERROR resolved IP data
- Add KNOWN_TLDS/MULTI_LEVEL_TLDS for .com.tr/.co.uk safety checks
Frontend (NetworkExplorer):
- Add "Hide Search Domain Artifacts" toggle on DNS Queries tab
- Detect NXDOMAIN entries ending with .cluster.local
- Show artifact count, toggle hidden by default
Raw ClickHouse data and API responses are NOT modified — only the
dependency graph (Neo4j) is deduplicated. Full debugging data preserved.
Tests: 31 cases covering normalization, edge cases, and integration.
Made-with: Cursor
The config-generated emptyDir volume added inside an f-string
used literal {} which Python interprets as an empty expression.
Escaped to {{}} so it renders as {} in the generated script.
Made-with: Cursor
Apply init container auto-detection to kubernetes-manifests DaemonSet
and ConfigMap. Update OPENSHIFT_GADGET_FIX.md and README with
detect-runtime troubleshooting guidance.
Made-with: Cursor
Apply the same init container auto-detection to the setup script
generator (clusters.py). Both emptyDir and PVC DaemonSet variants
now detect K3s/RKE2/MicroK8s/standard containerd socket paths
automatically at pod startup.
Made-with: Cursor
Add init container to Inspektor Gadget DaemonSet that detects the correct
containerd socket path at pod startup. Supports K3s, RKE2, MicroK8s, and
standard Kubernetes without manual configuration. Also adds hostPID,
hostNetwork, and dnsPolicy for proper eBPF tracing.
Made-with: Cursor
Restructure /dependencies/summary response to provide per-service
downstream/callers breakdowns instead of a single aggregated view.
Backend:
- Unified loop in format_dependency_summary handles single and multi-service
identically, fixing replica data loss bug for single-service queries
- Each matched_service now carries its own downstream/callers DependencySummaryGroup
- New top-level summary object with globally deduplicated aggregate counts
(split downstream_critical_count and callers_critical_count)
- hop_count added to _compact_service (only when > 1 to avoid depth=1 noise)
- _dedup_entries now preserves entry with lowest hop_count on collision
- multi_service flag now correctly checks collapsed workload count
Frontend:
- Updated TypeScript interfaces (DependencySummary, MatchedService with groups)
- IntegrationHub Preview: per-service Collapse for multi-service, summary stats
- DependencyCategoryGroup: conditional hop_count column for multi-depth queries
- Snippet builders updated to parse matched_services and summary structure
API & Docs:
- OpenAPI spec: new DependencySummary schema, depth parameter descriptions
- README, feature-list, DATA_ARCHITECTURE docs updated
- Fixed pre-existing doc bug (default traversal depth 3 -> 1)
Made-with: Cursor