11// Package traefikmetrics scrapes Traefik's Prometheus metrics endpoint and
2- // reports per-service HTTP signals: request rate, error rate, and response
2+ // reports per-entrypoint HTTP signals: request rate, error rate, and response
33// time percentiles. These reflect real user traffic, not synthetic probes.
44//
55// Prerequisites: Traefik must have metrics enabled.
@@ -24,15 +24,15 @@ import (
2424)
2525
2626type Collector interface {
27- Collect (ctx context.Context ) ([]ServiceMetricSet , error )
27+ Collect (ctx context.Context ) ([]EntrypointMetricSet , error )
2828}
2929
30- type ServiceMetricSet struct {
31- Attributes domainmetrics.TraefikServiceAttributes
32- Metrics domainmetrics.TraefikServiceMetrics
30+ type EntrypointMetricSet struct {
31+ Attributes domainmetrics.TraefikEntrypointAttributes
32+ Metrics domainmetrics.TraefikEntrypointMetrics
3333}
3434
35- type lastRequests struct {
35+ type lastRequestsEntrypoint struct {
3636 total int64
3737 collectedAt time.Time
3838}
@@ -41,7 +41,7 @@ type traefikCollector struct {
4141 endpoint string
4242 client * http.Client
4343 mu sync.Mutex
44- lastReqs map [string ]lastRequests // keyed by clean service name
44+ lastReqs map [string ]lastRequestsEntrypoint // keyed by entrypoint name
4545}
4646
4747func New () Collector {
@@ -52,11 +52,11 @@ func NewWithEndpoint(endpoint string) Collector {
5252 return & traefikCollector {
5353 endpoint : endpoint ,
5454 client : & http.Client {Timeout : 5 * time .Second },
55- lastReqs : make (map [string ]lastRequests ),
55+ lastReqs : make (map [string ]lastRequestsEntrypoint ),
5656 }
5757}
5858
59- func (tc * traefikCollector ) Collect (ctx context.Context ) ([]ServiceMetricSet , error ) {
59+ func (tc * traefikCollector ) Collect (ctx context.Context ) ([]EntrypointMetricSet , error ) {
6060 req , err := http .NewRequestWithContext (ctx , http .MethodGet , tc .endpoint , nil )
6161 if err != nil {
6262 return nil , fmt .Errorf ("build request: %w" , err )
@@ -166,9 +166,9 @@ func parseLabels(s string) map[string]string {
166166 return labels
167167}
168168
169- // ── Per-service aggregation ──── ───────────────────────────────────────────────
169+ // ── Per-entrypoint aggregation ───────────────────────────────────────────────
170170
171- type serviceAgg struct {
171+ type entrypointAgg struct {
172172 requestsTotal int64
173173 requests2xx int64
174174 requests4xx int64
@@ -179,27 +179,26 @@ type serviceAgg struct {
179179 durationCount float64 // total request count from _count samples
180180}
181181
182- func (tc * traefikCollector ) aggregate (text string ) ([]ServiceMetricSet , error ) {
182+ func (tc * traefikCollector ) aggregate (text string ) ([]EntrypointMetricSet , error ) {
183183 samples := parseSamples (text )
184184
185- svcs := make (map [string ]* serviceAgg )
186- ensure := func (name string ) * serviceAgg {
187- if svcs [name ] == nil {
188- svcs [name ] = & serviceAgg {buckets : make (map [float64 ]float64 )}
185+ eps := make (map [string ]* entrypointAgg )
186+ ensure := func (name string ) * entrypointAgg {
187+ if eps [name ] == nil {
188+ eps [name ] = & entrypointAgg {buckets : make (map [float64 ]float64 )}
189189 }
190- return svcs [name ]
190+ return eps [name ]
191191 }
192192
193193 for _ , s := range samples {
194- svcRaw , ok := s .labels ["service " ]
194+ entrypoint , ok := s .labels ["entrypoint " ]
195195 if ! ok {
196196 continue
197197 }
198- svc := cleanName (svcRaw )
199- agg := ensure (svc )
198+ agg := ensure (entrypoint )
200199
201200 switch s .name {
202- case "traefik_service_requests_total " :
201+ case "traefik_entrypoint_requests_total " :
203202 count := int64 (s .value )
204203 agg .requestsTotal += count
205204 switch {
@@ -211,7 +210,7 @@ func (tc *traefikCollector) aggregate(text string) ([]ServiceMetricSet, error) {
211210 agg .requests5xx += count
212211 }
213212
214- case "traefik_service_request_duration_seconds_bucket " :
213+ case "traefik_entrypoint_request_duration_seconds_bucket " :
215214 leStr := s .labels ["le" ]
216215 if leStr == "+Inf" {
217216 continue // use _count instead
@@ -221,10 +220,10 @@ func (tc *traefikCollector) aggregate(text string) ([]ServiceMetricSet, error) {
221220 agg .buckets [le ] += s .value
222221 }
223222
224- case "traefik_service_request_duration_seconds_sum " :
223+ case "traefik_entrypoint_request_duration_seconds_sum " :
225224 agg .durationSum += s .value
226225
227- case "traefik_service_request_duration_seconds_count " :
226+ case "traefik_entrypoint_request_duration_seconds_count " :
228227 agg .durationCount += s .value
229228 }
230229 }
@@ -233,9 +232,9 @@ func (tc *traefikCollector) aggregate(text string) ([]ServiceMetricSet, error) {
233232 tc .mu .Lock ()
234233 defer tc .mu .Unlock ()
235234
236- var results []ServiceMetricSet
237- for svcName , agg := range svcs {
238- m := domainmetrics.TraefikServiceMetrics {
235+ var results []EntrypointMetricSet
236+ for epName , agg := range eps {
237+ m := domainmetrics.TraefikEntrypointMetrics {
239238 Up : true ,
240239 RequestsTotal : agg .requestsTotal ,
241240 Requests2xx : agg .requests2xx ,
@@ -260,16 +259,16 @@ func (tc *traefikCollector) aggregate(text string) ([]ServiceMetricSet, error) {
260259 }
261260
262261 // Requests/sec via delta on cumulative counter
263- if prev , ok := tc .lastReqs [svcName ]; ok {
262+ if prev , ok := tc .lastReqs [epName ]; ok {
264263 elapsed := now .Sub (prev .collectedAt ).Seconds ()
265264 if elapsed > 0 && agg .requestsTotal >= prev .total {
266265 m .RequestsPerSecond = float64 (agg .requestsTotal - prev .total ) / elapsed
267266 }
268267 }
269- tc .lastReqs [svcName ] = lastRequests {total : agg .requestsTotal , collectedAt : now }
268+ tc .lastReqs [epName ] = lastRequestsEntrypoint {total : agg .requestsTotal , collectedAt : now }
270269
271- results = append (results , ServiceMetricSet {
272- Attributes : domainmetrics.TraefikServiceAttributes { ServiceName : svcName },
270+ results = append (results , EntrypointMetricSet {
271+ Attributes : domainmetrics.TraefikEntrypointAttributes { EntrypointName : epName },
273272 Metrics : m ,
274273 })
275274 }
@@ -311,11 +310,4 @@ func pct(buckets map[float64]float64, total, p float64) float64 {
311310 return prevLe
312311}
313312
314- // cleanName strips the provider suffix Traefik appends to service names
315- // e.g. "myapp@docker" → "myapp", "api@internal" → "api".
316- func cleanName (name string ) string {
317- if idx := strings .LastIndexByte (name , '@' ); idx != - 1 {
318- return name [:idx ]
319- }
320- return name
321- }
313+
0 commit comments