Skip to content

Configuration Query ​

Read-only access to the active configuration state, including route providers and system statistics.

Overview ​

The internal/config/query package offers read-only access to the active configuration state. It provides functions to dump route providers, list providers, search for routes, and retrieve system statistics. This package is primarily used by the API layer to expose configuration information.

Primary consumers ​

  • internal/api/v1 - REST API endpoints for configuration queries
  • internal/homepage - Dashboard statistics display
  • Operators - CLI tools and debugging interfaces

Non-goals ​

  • Configuration modification (see internal/config)
  • Provider lifecycle management
  • Dynamic state updates

Stability ​

Stable internal package. Functions are simple read-only accessors.

Public API ​

Exported types ​

go
type RouteProviderListResponse struct {
    ShortName string `json:"short_name"`
    FullName  string `json:"full_name"`
}
go
type Statistics struct {
    Total          uint16                         `json:"total"`
    ReverseProxies types.RouteStats               `json:"reverse_proxies"`
    Streams        types.RouteStats               `json:"streams"`
    Providers      map[string]types.ProviderStats `json:"providers"`
}

Exported functions ​

go
func DumpRouteProviders() map[string]types.RouteProvider

Returns all route providers as a map keyed by their short name. Thread-safe access via config.ActiveState.Load().

go
func RouteProviderList() []RouteProviderListResponse

Searches for a route by alias across all providers. Returns nil if not found.

go
func GetStatistics() Statistics

Aggregates statistics from all route providers, including total routes, reverse proxies, streams, and per-provider stats.

Architecture ​

Core components ​

config/query/
├── query.go    # Provider and route queries
└── stats.go    # Statistics aggregation

Data flow ​

Thread safety model ​

All functions use config.ActiveState.Load() for thread-safe read access:

go
func DumpRouteProviders() map[string]types.RouteProvider {
    state := config.ActiveState.Load()
    entries := make(map[string]types.RouteProvider, state.NumProviders())
    for _, p := range state.IterProviders() {
        entries[p.ShortName()] = p
    }
    return entries
}

Configuration Surface ​

No configuration. This package only reads from the active state.

Dependency and Integration Map ​

Internal dependencies ​

  • internal/config/types - ActiveState atomic pointer and State interface
  • internal/types - Route provider and route types

Integration points ​

go
// API endpoint uses query functions
func ListProviders(w http.ResponseWriter, r *http.Request) {
    providers := statequery.RouteProviderList()
    json.NewEncoder(w).Encode(providers)
}

Observability ​

Logs ​

No logging in the query package itself.

Metrics ​

No metrics are currently exposed.

Security Considerations ​

  • Read-only access prevents state corruption
  • No sensitive data is exposed beyond what the configuration already contains
  • Caller should handle nil state gracefully

Failure Modes and Recovery ​

FailureBehaviorRecovery
No active stateFunctions return empty/nilInitialize config first
Provider returns nilSkipped in iterationProvider should not return nil
Route not foundReturns nilExpected behavior

Performance Characteristics ​

  • O(n) where n is number of providers for provider queries
  • O(n * m) where m is routes per provider for route search
  • O(n) for statistics aggregation
  • No locking required (uses atomic load)

Usage Examples ​

Listing all providers ​

go
providers := statequery.RouteProviderList()
for _, p := range providers {
    fmt.Printf("Short: %s, Full: %s\n", p.ShortName, p.FullName)
}

Getting all providers as a map ​

go
providers := statequery.DumpRouteProviders()
for shortName, provider := range providers {
    fmt.Printf("%s: %s\n", shortName, provider.String())
}

Getting system statistics ​

go
stats := statequery.GetStatistics()
fmt.Printf("Total routes: %d\n", stats.Total)
fmt.Printf("Reverse proxies: %d\n", stats.ReverseProxies.Total)
for name, providerStats := range stats.Providers {
    fmt.Printf("Provider %s: %d routes\n", name, providerStats.RPs.Total)
}

Integration with API ​

go
func handleGetProviders(w http.ResponseWriter, r *http.Request) {
    providers := statequery.RouteProviderList()
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(providers)
}

func handleGetStats(w http.ResponseWriter, r *http.Request) {
    stats := statequery.GetStatistics()
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(stats)
}

Released under the MIT License.