1
0
mirror of https://github.com/divan/expvarmon.git synced 2025-04-27 13:48:55 +08:00
expvarmon/utils.go

138 lines
3.2 KiB
Go
Raw Normal View History

2015-05-01 16:49:19 +03:00
package main
import (
"errors"
2015-05-03 19:02:28 +03:00
"fmt"
2015-07-10 19:29:22 +03:00
"net/url"
2015-05-02 10:56:09 +03:00
"path/filepath"
2015-05-01 16:49:19 +03:00
"strings"
2015-05-03 19:02:28 +03:00
"github.com/bsiegert/ranges"
2015-05-01 16:49:19 +03:00
)
2015-07-10 19:29:22 +03:00
var ErrParsePorts = fmt.Errorf("cannot parse ports argument")
2015-05-01 16:49:19 +03:00
// ParseVars returns parsed and validated slice of strings with
// variables names that will be used for monitoring.
2015-05-01 20:12:23 +03:00
func ParseVars(vars string) ([]VarName, error) {
if vars == "" {
2015-05-01 16:49:19 +03:00
return nil, errors.New("no vars specified")
}
2015-05-01 20:12:23 +03:00
ss := strings.FieldsFunc(vars, func(r rune) bool { return r == ',' })
2015-05-01 18:48:34 +03:00
var ret []VarName
2015-05-01 20:12:23 +03:00
for _, s := range ss {
ret = append(ret, VarName(s))
}
2015-05-01 16:49:19 +03:00
return ret, nil
}
2015-05-02 10:56:09 +03:00
// BaseCommand returns cleaned command name from Cmdline array.
//
// I.e. "./some.service/binary.name -arg 1 -arg" will be "binary.name".
func BaseCommand(cmdline []string) string {
if len(cmdline) == 0 {
return ""
}
return filepath.Base(cmdline[0])
}
2015-05-02 10:56:55 +03:00
2015-07-10 19:29:22 +03:00
// flattenURLs returns URLs for the given addr and set of ports.
//
// Note, rawurl shouldn't contain port, as port will be appended.
func flattenURLs(rawurl string, ports []string) ([]url.URL, error) {
var urls []url.URL
// Add http by default
if !strings.HasPrefix(rawurl, "http") {
rawurl = fmt.Sprintf("http://%s", rawurl)
}
// Make URL from rawurl
baseUrl, err := url.Parse(rawurl)
if err != nil {
return nil, err
2015-05-03 20:42:21 +03:00
}
2015-07-10 19:29:22 +03:00
baseUrl.Path = ExpvarsPath
2015-05-03 20:42:21 +03:00
2015-07-10 19:29:22 +03:00
// Create new URL for each port
for _, port := range ports {
u := *baseUrl
u.Host = fmt.Sprintf("%s:%s", u.Host, port)
urls = append(urls, u)
}
return urls, nil
}
2015-05-03 20:42:21 +03:00
2015-07-10 19:29:22 +03:00
// ParsePorts parses and flattens comma-separated ports/urls into URLs slice
func ParsePorts(s string) ([]url.URL, error) {
var urls []url.URL
2015-05-03 20:42:21 +03:00
fields := strings.FieldsFunc(s, func(r rune) bool { return r == ',' })
for _, field := range fields {
2015-07-10 19:29:22 +03:00
// Try simple 'ports range' mode, ports only ("1234-1235,80")
// Defaults to "localhost" will be used.
ports, err := parseRange(field)
if err == nil {
furls, err := flattenURLs("http://localhost", ports)
if err != nil {
return nil, err
}
urls = append(urls, furls...)
continue
}
// then, try host:ports notation ("localhost:1234-1235,https://remote:2000,2345")
var rawurl, portsRange string
2015-05-03 20:42:21 +03:00
parts := strings.FieldsFunc(field, func(r rune) bool { return r == ':' })
2015-07-10 19:29:22 +03:00
switch len(parts) {
case 1:
// "1234-234"
rawurl = "http://localhost"
case 2:
// "localhost:1234"
rawurl, portsRange = parts[0], parts[1]
default:
// "https://user:pass@remote.name:1234"
rawurl = strings.Join(parts[:len(parts)-1], ":")
portsRange = parts[len(parts)-1]
2015-05-03 20:42:21 +03:00
}
2015-07-10 19:29:22 +03:00
ports, err = parseRange(portsRange)
2015-05-03 20:42:21 +03:00
if err != nil {
return nil, ErrParsePorts
}
2015-07-10 19:29:22 +03:00
purls, err := flattenURLs(rawurl, ports)
if err != nil {
return nil, ErrParsePorts
2015-05-03 20:42:21 +03:00
}
2015-07-10 19:29:22 +03:00
urls = append(urls, purls...)
2015-05-03 20:42:21 +03:00
}
2015-07-10 19:29:22 +03:00
return urls, nil
2015-05-03 20:42:21 +03:00
}
2015-07-10 19:29:22 +03:00
// parseRange flattens port ranges, such as "1234-1240,1333"
2015-05-03 20:42:21 +03:00
func parseRange(s string) ([]string, error) {
2015-05-03 19:02:28 +03:00
portsInt, err := ranges.Parse(s)
if err != nil {
return nil, err
2015-05-02 10:56:55 +03:00
}
2015-05-03 19:02:28 +03:00
var ports []string
for _, port := range portsInt {
ports = append(ports, fmt.Sprintf("%d", port))
}
2015-05-02 10:56:55 +03:00
return ports, nil
}
2015-07-10 19:29:22 +03:00
// NewURL returns net.URL for the given port, with expvarmon defaults set.
func NewURL(port string) url.URL {
return url.URL{
Scheme: "http",
2015-08-20 21:48:53 -04:00
Host: fmt.Sprintf("localhost:%s", port),
2015-07-10 19:29:22 +03:00
Path: "/debug/vars",
}
}