Add ability to filter triton_sd targets by pre-defined groups (#4701)
Additionally, add triton groups metadata to the discovery reponse and correct a documentation error regarding the triton server id metadata. Signed-off-by: Richard Kiene <richard.kiene@joyent.com>
This commit is contained in:
parent
eb4cc37e50
commit
b537f6047a
|
@ -19,6 +19,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-kit/kit/log"
|
"github.com/go-kit/kit/log"
|
||||||
|
@ -33,6 +35,7 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
tritonLabel = model.MetaLabelPrefix + "triton_"
|
tritonLabel = model.MetaLabelPrefix + "triton_"
|
||||||
|
tritonLabelGroups = tritonLabel + "groups"
|
||||||
tritonLabelMachineID = tritonLabel + "machine_id"
|
tritonLabelMachineID = tritonLabel + "machine_id"
|
||||||
tritonLabelMachineAlias = tritonLabel + "machine_alias"
|
tritonLabelMachineAlias = tritonLabel + "machine_alias"
|
||||||
tritonLabelMachineBrand = tritonLabel + "machine_brand"
|
tritonLabelMachineBrand = tritonLabel + "machine_brand"
|
||||||
|
@ -65,6 +68,7 @@ type SDConfig struct {
|
||||||
Account string `yaml:"account"`
|
Account string `yaml:"account"`
|
||||||
DNSSuffix string `yaml:"dns_suffix"`
|
DNSSuffix string `yaml:"dns_suffix"`
|
||||||
Endpoint string `yaml:"endpoint"`
|
Endpoint string `yaml:"endpoint"`
|
||||||
|
Groups []string `yaml:"groups,omitempty"`
|
||||||
Port int `yaml:"port"`
|
Port int `yaml:"port"`
|
||||||
RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"`
|
RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"`
|
||||||
TLSConfig config_util.TLSConfig `yaml:"tls_config,omitempty"`
|
TLSConfig config_util.TLSConfig `yaml:"tls_config,omitempty"`
|
||||||
|
@ -102,11 +106,12 @@ func init() {
|
||||||
// DiscoveryResponse models a JSON response from the Triton discovery.
|
// DiscoveryResponse models a JSON response from the Triton discovery.
|
||||||
type DiscoveryResponse struct {
|
type DiscoveryResponse struct {
|
||||||
Containers []struct {
|
Containers []struct {
|
||||||
ServerUUID string `json:"server_uuid"`
|
Groups []string `json:"groups"`
|
||||||
VMAlias string `json:"vm_alias"`
|
ServerUUID string `json:"server_uuid"`
|
||||||
VMBrand string `json:"vm_brand"`
|
VMAlias string `json:"vm_alias"`
|
||||||
VMImageUUID string `json:"vm_image_uuid"`
|
VMBrand string `json:"vm_brand"`
|
||||||
VMUUID string `json:"vm_uuid"`
|
VMImageUUID string `json:"vm_image_uuid"`
|
||||||
|
VMUUID string `json:"vm_uuid"`
|
||||||
} `json:"containers"`
|
} `json:"containers"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,6 +192,11 @@ func (d *Discovery) refresh() (tg *targetgroup.Group, err error) {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var endpoint = fmt.Sprintf("https://%s:%d/v%d/discover", d.sdConfig.Endpoint, d.sdConfig.Port, d.sdConfig.Version)
|
var endpoint = fmt.Sprintf("https://%s:%d/v%d/discover", d.sdConfig.Endpoint, d.sdConfig.Port, d.sdConfig.Version)
|
||||||
|
if len(d.sdConfig.Groups) > 0 {
|
||||||
|
groups := url.QueryEscape(strings.Join(d.sdConfig.Groups, ","))
|
||||||
|
endpoint = fmt.Sprintf("%s?groups=%s", endpoint, groups)
|
||||||
|
}
|
||||||
|
|
||||||
tg = &targetgroup.Group{
|
tg = &targetgroup.Group{
|
||||||
Source: endpoint,
|
Source: endpoint,
|
||||||
}
|
}
|
||||||
|
@ -219,6 +229,12 @@ func (d *Discovery) refresh() (tg *targetgroup.Group, err error) {
|
||||||
}
|
}
|
||||||
addr := fmt.Sprintf("%s.%s:%d", container.VMUUID, d.sdConfig.DNSSuffix, d.sdConfig.Port)
|
addr := fmt.Sprintf("%s.%s:%d", container.VMUUID, d.sdConfig.DNSSuffix, d.sdConfig.Port)
|
||||||
labels[model.AddressLabel] = model.LabelValue(addr)
|
labels[model.AddressLabel] = model.LabelValue(addr)
|
||||||
|
|
||||||
|
if len(container.Groups) > 0 {
|
||||||
|
name := "," + strings.Join(container.Groups, ",") + ","
|
||||||
|
labels[tritonLabelGroups] = model.LabelValue(name)
|
||||||
|
}
|
||||||
|
|
||||||
tg.Targets = append(tg.Targets, labels)
|
tg.Targets = append(tg.Targets, labels)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,16 @@ var (
|
||||||
CertFile: "shouldnotexist.cert",
|
CertFile: "shouldnotexist.cert",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
groupsconf = SDConfig{
|
||||||
|
Account: "testAccount",
|
||||||
|
DNSSuffix: "triton.example.com",
|
||||||
|
Endpoint: "127.0.0.1",
|
||||||
|
Groups: []string{"foo", "bar"},
|
||||||
|
Port: 443,
|
||||||
|
Version: 1,
|
||||||
|
RefreshInterval: 1,
|
||||||
|
TLSConfig: config.TLSConfig{InsecureSkipVerify: true},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTritonSDNew(t *testing.T) {
|
func TestTritonSDNew(t *testing.T) {
|
||||||
|
@ -76,6 +86,20 @@ func TestTritonSDNewBadConfig(t *testing.T) {
|
||||||
testutil.Assert(t, td == nil, "")
|
testutil.Assert(t, td == nil, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTritonSDNewGroupsConfig(t *testing.T) {
|
||||||
|
td, err := New(nil, &groupsconf)
|
||||||
|
testutil.Ok(t, err)
|
||||||
|
testutil.Assert(t, td != nil, "")
|
||||||
|
testutil.Assert(t, td.client != nil, "")
|
||||||
|
testutil.Assert(t, td.interval != 0, "")
|
||||||
|
testutil.Assert(t, td.sdConfig != nil, "")
|
||||||
|
testutil.Equals(t, groupsconf.Account, td.sdConfig.Account)
|
||||||
|
testutil.Equals(t, groupsconf.DNSSuffix, td.sdConfig.DNSSuffix)
|
||||||
|
testutil.Equals(t, groupsconf.Endpoint, td.sdConfig.Endpoint)
|
||||||
|
testutil.Equals(t, groupsconf.Groups, td.sdConfig.Groups)
|
||||||
|
testutil.Equals(t, groupsconf.Port, td.sdConfig.Port)
|
||||||
|
}
|
||||||
|
|
||||||
func TestTritonSDRun(t *testing.T) {
|
func TestTritonSDRun(t *testing.T) {
|
||||||
var (
|
var (
|
||||||
td, err = New(nil, &conf)
|
td, err = New(nil, &conf)
|
||||||
|
@ -112,6 +136,7 @@ func TestTritonSDRefreshMultipleTargets(t *testing.T) {
|
||||||
var (
|
var (
|
||||||
dstr = `{"containers":[
|
dstr = `{"containers":[
|
||||||
{
|
{
|
||||||
|
"groups":["foo","bar","baz"],
|
||||||
"server_uuid":"44454c4c-5000-104d-8037-b7c04f5a5131",
|
"server_uuid":"44454c4c-5000-104d-8037-b7c04f5a5131",
|
||||||
"vm_alias":"server01",
|
"vm_alias":"server01",
|
||||||
"vm_brand":"lx",
|
"vm_brand":"lx",
|
||||||
|
|
|
@ -935,10 +935,12 @@ discovery endpoints.
|
||||||
|
|
||||||
The following meta labels are available on targets during relabeling:
|
The following meta labels are available on targets during relabeling:
|
||||||
|
|
||||||
* `__meta_triton_machine_id`: the UUID of the target container
|
* `__meta_triton_groups`: the list of groups belonging to the target joined by a comma separator
|
||||||
* `__meta_triton_machine_alias`: the alias of the target container
|
* `__meta_triton_machine_alias`: the alias of the target container
|
||||||
|
* `__meta_triton_machine_brand`: the brand of the target container
|
||||||
|
* `__meta_triton_machine_id`: the UUID of the target container
|
||||||
* `__meta_triton_machine_image`: the target containers image type
|
* `__meta_triton_machine_image`: the target containers image type
|
||||||
* `__meta_triton_machine_server_id`: the server UUID for the target container
|
* `__meta_triton_server_id`: the server UUID for the target container
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# The information to access the Triton discovery API.
|
# The information to access the Triton discovery API.
|
||||||
|
@ -953,6 +955,11 @@ dns_suffix: <string>
|
||||||
# often the same value as dns_suffix.
|
# often the same value as dns_suffix.
|
||||||
endpoint: <string>
|
endpoint: <string>
|
||||||
|
|
||||||
|
# A list of groups for which targets are retrieved. If omitted, all containers
|
||||||
|
# available to the requesting account are scraped.
|
||||||
|
groups:
|
||||||
|
[ - <string> ... ]
|
||||||
|
|
||||||
# The port to use for discovery and metric scraping.
|
# The port to use for discovery and metric scraping.
|
||||||
[ port: <int> | default = 9163 ]
|
[ port: <int> | default = 9163 ]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue