Support discover instances from all projects (#4682)
By default, OpenStack SD only queries for instances from specified project. To discover instances from other projects, users have to add more openstack_sd_configs for each project. This patch adds `all_tenants` <bool> options to openstack_sd_configs. For example: - job_name: 'openstack_all_instances' openstack_sd_configs: - role: instance region: RegionOne identity_endpoint: http://<identity_server>/identity/v3 username: <username> password: <super_secret_password> domain_name: Default all_tenants: true Co-authored-by: Kien Nguyen <kiennt2609@gmail.com> Signed-off-by: dmatosl <danielmatos.lima@gmail.com>
This commit is contained in:
parent
a0ba9b7f3e
commit
9c5370fdfe
|
@ -27,7 +27,6 @@ import (
|
|||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||
"github.com/gophercloud/gophercloud/pagination"
|
||||
"github.com/prometheus/common/model"
|
||||
|
||||
"github.com/prometheus/prometheus/discovery/targetgroup"
|
||||
"github.com/prometheus/prometheus/util/strutil"
|
||||
)
|
||||
|
@ -46,22 +45,23 @@ const (
|
|||
|
||||
// InstanceDiscovery discovers OpenStack instances.
|
||||
type InstanceDiscovery struct {
|
||||
provider *gophercloud.ProviderClient
|
||||
authOpts *gophercloud.AuthOptions
|
||||
region string
|
||||
interval time.Duration
|
||||
logger log.Logger
|
||||
port int
|
||||
provider *gophercloud.ProviderClient
|
||||
authOpts *gophercloud.AuthOptions
|
||||
region string
|
||||
interval time.Duration
|
||||
logger log.Logger
|
||||
port int
|
||||
allTenants bool
|
||||
}
|
||||
|
||||
// NewInstanceDiscovery returns a new instance discovery.
|
||||
func NewInstanceDiscovery(provider *gophercloud.ProviderClient, opts *gophercloud.AuthOptions,
|
||||
interval time.Duration, port int, region string, l log.Logger) *InstanceDiscovery {
|
||||
interval time.Duration, port int, region string, allTenants bool, l log.Logger) *InstanceDiscovery {
|
||||
if l == nil {
|
||||
l = log.NewNopLogger()
|
||||
}
|
||||
return &InstanceDiscovery{provider: provider, authOpts: opts,
|
||||
region: region, interval: interval, port: port, logger: l}
|
||||
region: region, interval: interval, port: port, allTenants: allTenants, logger: l}
|
||||
}
|
||||
|
||||
// Run implements the Discoverer interface.
|
||||
|
@ -153,7 +153,9 @@ func (i *InstanceDiscovery) refresh() (*targetgroup.Group, error) {
|
|||
|
||||
// OpenStack API reference
|
||||
// https://developer.openstack.org/api-ref/compute/#list-servers
|
||||
opts := servers.ListOpts{}
|
||||
opts := servers.ListOpts{
|
||||
AllTenants: i.allTenants,
|
||||
}
|
||||
pager := servers.List(client, opts)
|
||||
tg := &targetgroup.Group{
|
||||
Source: fmt.Sprintf("OS_" + i.region),
|
||||
|
|
|
@ -48,6 +48,7 @@ func (s *OpenstackSDInstanceTestSuite) openstackAuthSuccess() (Discovery, error)
|
|||
DomainName: "12345",
|
||||
Region: "RegionOne",
|
||||
Role: "instance",
|
||||
AllTenants: true,
|
||||
}
|
||||
return NewDiscovery(&conf, nil)
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ import (
|
|||
"github.com/prometheus/client_golang/prometheus"
|
||||
config_util "github.com/prometheus/common/config"
|
||||
"github.com/prometheus/common/model"
|
||||
|
||||
"github.com/prometheus/prometheus/discovery/targetgroup"
|
||||
)
|
||||
|
||||
|
@ -63,6 +62,7 @@ type SDConfig struct {
|
|||
Region string `yaml:"region"`
|
||||
RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"`
|
||||
Port int `yaml:"port"`
|
||||
AllTenants bool `yaml:"all_tenants,omitempty"`
|
||||
TLSConfig config_util.TLSConfig `yaml:"tls_config,omitempty"`
|
||||
}
|
||||
|
||||
|
@ -168,7 +168,7 @@ func NewDiscovery(conf *SDConfig, l log.Logger) (Discovery, error) {
|
|||
return hypervisor, nil
|
||||
case OpenStackRoleInstance:
|
||||
instance := NewInstanceDiscovery(client, &opts,
|
||||
time.Duration(conf.RefreshInterval), conf.Port, conf.Region, l)
|
||||
time.Duration(conf.RefreshInterval), conf.Port, conf.Region, conf.AllTenants, l)
|
||||
return instance, nil
|
||||
default:
|
||||
return nil, errors.New("unknown OpenStack discovery role")
|
||||
|
|
|
@ -531,6 +531,10 @@ region: <string>
|
|||
[ project_name: <string> ]
|
||||
[ project_id: <string> ]
|
||||
|
||||
# Whether the service discovery should list all instances for all projects.
|
||||
# It is only relevant for the 'instance' role and usually requires admin permissions.
|
||||
[ all_tenants: <boolean> | default: false ]
|
||||
|
||||
# Refresh interval to re-read the instance list.
|
||||
[ refresh_interval: <duration> | default = 60s ]
|
||||
|
||||
|
|
Loading…
Reference in New Issue