Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion config-sample.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@
"port": 8126,
"protocol": "udp",
"prefix": "products.tests.qa.debug-dev.jsonwire-grid.",
"enable": false
"enable": false,
"selectors": [
{"tag": "chrome", "capabilities": {"browserName": "chrome"}}
]
}
}
12 changes: 7 additions & 5 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"errors"
log "github.com/Sirupsen/logrus"
"github.com/qa-dev/jsonwire-grid/pool/metrics"
"os"
)

Expand Down Expand Up @@ -52,11 +53,12 @@ type DB struct {

// Statsd - Settings of metrics sender.
type Statsd struct {
Host string `json:"host"`
Port int `json:"port"`
Protocol string `json:"protocol"`
Prefix string `json:"prefix"`
Enable bool `json:"enable"`
Host string `json:"host"`
Port int `json:"port"`
Protocol string `json:"protocol"`
Prefix string `json:"prefix"`
Enable bool `json:"enable"`
CapabilitiesList []metrics.CapabilitiesSelector `json:"selectors"`
}

// New - Constructor of config.
Expand Down
3 changes: 2 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ func main() {
cfg.Statsd.Protocol,
cfg.Statsd.Prefix,
cfg.Statsd.Enable)
poolMetricsSender := poolMetrics.NewSender(statsdClient, poolInstance, time.Second*1) // todo: move to config
// todo: move to config
poolMetricsSender := poolMetrics.NewSender(statsdClient, poolInstance, time.Second*1, cfg.Statsd.CapabilitiesList, capsComparator)
go poolMetricsSender.SendAll()
if err != nil {
log.Errorf("Statsd create socked error: %s", err)
Expand Down
63 changes: 58 additions & 5 deletions pool/metrics/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,42 @@ package metrics
import (
log "github.com/Sirupsen/logrus"
"github.com/qa-dev/jsonwire-grid/pool"
"github.com/qa-dev/jsonwire-grid/pool/capabilities"
"gopkg.in/alexcesaro/statsd.v2"
"time"
)

// Sender - metrics sender.
type Sender struct {
statd *statsd.Client
pool *pool.Pool
duration time.Duration
statd *statsd.Client
pool *pool.Pool
duration time.Duration
selectorList []CapabilitiesSelector
capsComparator capabilities.ComparatorInterface
}

type CapabilitiesSelector struct {
Tag string `json:"tag"`
Capabilities capabilities.Capabilities `json:"capabilities"`
}

// NewSender - constructor of sender.
func NewSender(statd *statsd.Client, pool *pool.Pool, duration time.Duration) *Sender {
return &Sender{statd, pool, duration}
func NewSender(
statd *statsd.Client,
pool *pool.Pool,
duration time.Duration,
capsMetricList []CapabilitiesSelector,
capsComparator capabilities.ComparatorInterface,
) *Sender {
return &Sender{statd, pool, duration, capsMetricList, capsComparator}
}

// NewSender - sends metrics of nodes availability.
func (s *Sender) SendAll() {
for {
s.countAvailableNodes()
s.countTotalNodes()
s.countByCapabilities()
time.Sleep(s.duration)
}
}
Expand All @@ -46,3 +61,41 @@ func (s *Sender) countAvailableNodes() {
}
s.statd.Gauge("node.available", count)
}

func (s *Sender) countByCapabilities() {
nodeList, err := s.pool.GetAll()
if err != nil {
log.Error("Can't get all nodes: ", err.Error())
return
}

for _, node := range nodeList {
for _, availableCaps := range node.CapabilitiesList {
s.capsComparator.Register(availableCaps)
}
}

for _, requiredCaps := range s.selectorList {
availableCount := 0
reservedCount := 0
busyCount := 0
for _, node := range nodeList {
for _, availableCaps := range node.CapabilitiesList {
if s.capsComparator.Compare(requiredCaps.Capabilities, availableCaps) {
switch node.Status {
case pool.NodeStatusAvailable:
availableCount++
case pool.NodeStatusReserved:
reservedCount++
case pool.NodeStatusBusy:
busyCount++
}
break
}
}
}
s.statd.Gauge("node-by-caps."+requiredCaps.Tag+".available", availableCount)
s.statd.Gauge("node-by-caps."+requiredCaps.Tag+".reserved", reservedCount)
s.statd.Gauge("node-by-caps."+requiredCaps.Tag+".busy", busyCount)
}
}