in elastictransport/metrics.go [80:134]
func (c *Client) Metrics() (Metrics, error) {
if c.metrics == nil {
return Metrics{}, errors.New("transport metrics not enabled")
}
c.metrics.RLock()
defer c.metrics.RUnlock()
if lockable, ok := c.pool.(sync.Locker); ok {
lockable.Lock()
defer lockable.Unlock()
}
m := Metrics{
Requests: c.metrics.requests,
Failures: c.metrics.failures,
Responses: make(map[int]int, len(c.metrics.responses)),
}
for code, num := range c.metrics.responses {
m.Responses[code] = num
}
if pool, ok := c.pool.(connectionable); ok {
for _, c := range pool.connections() {
c.Lock()
cm := ConnectionMetric{
URL: c.URL.String(),
IsDead: c.IsDead,
Failures: c.Failures,
}
if !c.DeadSince.IsZero() {
cm.DeadSince = &c.DeadSince
}
if c.ID != "" {
cm.Meta.ID = c.ID
}
if c.Name != "" {
cm.Meta.Name = c.Name
}
if len(c.Roles) > 0 {
cm.Meta.Roles = c.Roles
}
m.Connections = append(m.Connections, cm)
c.Unlock()
}
}
return m, nil
}