mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-26 20:30:10 +01:00
7d7fbf890e
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/203 Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/38
90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package csm
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
lock sync.Mutex
|
|
)
|
|
|
|
const (
|
|
// DefaultPort is used when no port is specified.
|
|
DefaultPort = "31000"
|
|
|
|
// DefaultHost is the host that will be used when none is specified.
|
|
DefaultHost = "127.0.0.1"
|
|
)
|
|
|
|
// AddressWithDefaults returns a CSM address built from the host and port
|
|
// values. If the host or port is not set, default values will be used
|
|
// instead. If host is "localhost" it will be replaced with "127.0.0.1".
|
|
func AddressWithDefaults(host, port string) string {
|
|
if len(host) == 0 || strings.EqualFold(host, "localhost") {
|
|
host = DefaultHost
|
|
}
|
|
|
|
if len(port) == 0 {
|
|
port = DefaultPort
|
|
}
|
|
|
|
// Only IP6 host can contain a colon
|
|
if strings.Contains(host, ":") {
|
|
return "[" + host + "]:" + port
|
|
}
|
|
|
|
return host + ":" + port
|
|
}
|
|
|
|
// Start will start a long running go routine to capture
|
|
// client side metrics. Calling start multiple time will only
|
|
// start the metric listener once and will panic if a different
|
|
// client ID or port is passed in.
|
|
//
|
|
// r, err := csm.Start("clientID", "127.0.0.1:31000")
|
|
// if err != nil {
|
|
// panic(fmt.Errorf("expected no error, but received %v", err))
|
|
// }
|
|
// sess := session.NewSession()
|
|
// r.InjectHandlers(sess.Handlers)
|
|
//
|
|
// svc := s3.New(sess)
|
|
// out, err := svc.GetObject(&s3.GetObjectInput{
|
|
// Bucket: aws.String("bucket"),
|
|
// Key: aws.String("key"),
|
|
// })
|
|
func Start(clientID string, url string) (*Reporter, error) {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
|
|
if sender == nil {
|
|
sender = newReporter(clientID, url)
|
|
} else {
|
|
if sender.clientID != clientID {
|
|
panic(fmt.Errorf("inconsistent client IDs. %q was expected, but received %q", sender.clientID, clientID))
|
|
}
|
|
|
|
if sender.url != url {
|
|
panic(fmt.Errorf("inconsistent URLs. %q was expected, but received %q", sender.url, url))
|
|
}
|
|
}
|
|
|
|
if err := connect(url); err != nil {
|
|
sender = nil
|
|
return nil, err
|
|
}
|
|
|
|
return sender, nil
|
|
}
|
|
|
|
// Get will return a reporter if one exists, if one does not exist, nil will
|
|
// be returned.
|
|
func Get() *Reporter {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
|
|
return sender
|
|
}
|