Skip to main content

Global Search

Global Search answers a question that is otherwise tedious to chase by hand: "where is this domain or IP address used across my configuration?" Instead of opening resources one by one, you type a hostname or address once and Elchi scans the relevant collections and returns every match with enough context to act on it.

Navigate to /search. The page leads with a search box titled Search Domain and IP Addresses. Type a value and press Enter (or click Search); the query is placed in the URL as ?q=<value>, so a search is shareable and survives a refresh.

Search runs against the currently selected project. The backend requires a project parameter and validates that you have access to it before running — so results are scoped to the project in the sidebar selector, not across every project you belong to. Switching projects and re-running the query re-scopes the search.

What gets indexed

Search is deliberately focused on the two things that are hard to grep for across a distributed config: IP addresses and domains. It inspects these collections:

CollectionMatched on
Virtual Hostsdomains, plus route host_rewrite / host_redirect
Routesinline virtual-host domains and route rewrites/redirects
FiltersHTTP Connection Manager inline route domains; RBAC IP permissions/principals
Endpointsload-balancer endpoint socket addresses
Clustersload_assignment endpoint addresses
Listenerslistener socket address
Bootstrapadmin socket address
Servicesclient downstream_address
DiscoveryK8s node ExternalIP / InternalIP

For the resources these map to, see the configuration model and Listeners.

Query behavior

The backend first sanitizes your input, then decides whether you are searching for an IP or a domain:

  • A value that looks like a full or partial dotted address (for example 10.218.16.1 or 10.218.16) is treated as an IP. IP search is anchored to the start of the address and matches literally, so a partial address behaves like a prefix search across an address space.
  • Anything else is treated as a domain and matched as a case-insensitive substring, so example finds api.example.com, example.org, and so on.

A collection is only searched if it has fields relevant to the detected query type — an IP query skips the domain-only collections and vice versa.

Reading results

Results are grouped by collection. When matches span more than one collection, a row of filter pills appears (All, plus one per collection with its count) so you can narrow to just Listeners, just Routes, and so on. Each result card shows:

  • The resource name and a colored collection tag.
  • The resource type (gtype) and version as muted metadata.
  • One chip per match: the matched value in monospace, followed by context tags that tell you where in the resource it was found — for example the virtual-host name, route name, filter type, K8s node name and address type (Internal/External), locality, port, whether it was an inline route, or the client ID for a service match.

That context is what makes the result actionable: you see not just that 10.0.0.5 appears in a cluster, but which endpoint and port.

Deep-linking to the resource

Clicking a result navigates straight to the underlying resource, with the correct identifiers already in the URL:

  • Discovery results open the K8s discovery view directly.
  • Services open /services/<id> (with the version when known).
  • Every other result opens its resource editor, carrying the resource_id and version so the exact object loads.

This turns search into a navigation tool as much as a lookup: find the domain, click, and you are editing the resource that references it.

Scope of the index

Search targets domain and IP fields specifically — it is not a full-text search over arbitrary configuration values, resource names, or secret contents. If a value you expect isn't found, confirm it lives in one of the indexed fields above and that you are in the right project.