Add GeoIP support for unique IP aggregation
Publish telemt-api gateway Docker image / test (push) Failing after 17s
Publish telemt-api gateway Docker image / build-and-push (push) Has been skipped

- Introduced GeoIP configuration options in config.example.yaml to enable geolocation lookups for the /api/agg/unique-ips endpoint.
- Updated the aggregate handler to include optional GeoIP data in responses, enriching unique IP information with country and city details, as well as ASN data if available.
- Enhanced documentation in AGGREGATE.md and README.md to reflect the new GeoIP functionality and its usage.
- Added a dependency on the geoip2-golang library in go.mod for GeoIP lookups.
- Modified tests to accommodate the new GeoIP integration in the aggregate handler.
This commit is contained in:
Denozordec
2026-03-30 01:47:08 +07:00
parent 4a4f15bd0b
commit d7a63f0da3
15 changed files with 449 additions and 12 deletions
+8 -2
View File
@@ -15,6 +15,7 @@ import (
"github.com/telemt/telemt-api/internal/aggregate"
"github.com/telemt/telemt-api/internal/config"
"github.com/telemt/telemt-api/internal/geoip"
"github.com/telemt/telemt-api/internal/proxy"
)
@@ -23,13 +24,14 @@ type Gateway struct {
parsed *config.Parsed
proxies map[string]*httputil.ReverseProxy
agg *aggregate.Handler
geo *geoip.Service
log *slog.Logger
transport *http.Transport
promHandler http.Handler
}
// NewGateway builds handlers and reverse proxies from parsed config.
func NewGateway(p *config.Parsed, log *slog.Logger) (*Gateway, error) {
func NewGateway(p *config.Parsed, log *slog.Logger, geo *geoip.Service) (*Gateway, error) {
t := proxy.DirectTransport()
t.MaxIdleConns = 64
t.IdleConnTimeout = 90 * time.Second
@@ -40,6 +42,7 @@ func NewGateway(p *config.Parsed, log *slog.Logger) (*Gateway, error) {
g := &Gateway{
parsed: p,
proxies: make(map[string]*httputil.ReverseProxy),
geo: geo,
log: log,
transport: t,
promHandler: promhttp.Handler(),
@@ -65,7 +68,7 @@ func NewGateway(p *config.Parsed, log *slog.Logger) (*Gateway, error) {
}
g.proxies[s.Alias] = rp
}
g.agg = aggregate.NewHandler(p, &http.Client{Transport: t})
g.agg = aggregate.NewHandler(p, &http.Client{Transport: t}, geo)
return g, nil
}
@@ -222,5 +225,8 @@ func (s *statusWriter) WriteHeader(code int) {
// Shutdown idle connections on the shared transport.
func (g *Gateway) Shutdown(ctx context.Context) error {
g.transport.CloseIdleConnections()
if g.geo != nil {
_ = g.geo.Close()
}
return nil
}