mirror of https://github.com/prometheus/prometheus
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.3 KiB
85 lines
2.3 KiB
// Copyright 2013 Prometheus Team |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// http://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
|
|
package retrieval |
|
|
|
import ( |
|
"fmt" |
|
"net" |
|
"net/url" |
|
"time" |
|
|
|
"github.com/prometheus/prometheus/config" |
|
"github.com/prometheus/prometheus/model" |
|
"github.com/prometheus/prometheus/utility" |
|
) |
|
|
|
// TargetProvider encapsulates retrieving all targets for a job. |
|
type TargetProvider interface { |
|
// Retrieves the current list of targets for this provider. |
|
Targets() ([]Target, error) |
|
} |
|
|
|
type sdTargetProvider struct { |
|
job config.JobConfig |
|
|
|
targets []Target |
|
|
|
lastRefresh time.Time |
|
refreshInterval time.Duration |
|
} |
|
|
|
// Constructs a new sdTargetProvider for a job. |
|
func NewSdTargetProvider(job config.JobConfig) *sdTargetProvider { |
|
i, err := utility.StringToDuration(job.GetSdRefreshInterval()) |
|
if err != nil { |
|
panic(fmt.Sprintf("illegal refresh duration string %s: %s", job.GetSdRefreshInterval(), err)) |
|
} |
|
return &sdTargetProvider{ |
|
job: job, |
|
refreshInterval: i, |
|
} |
|
} |
|
|
|
func (p *sdTargetProvider) Targets() ([]Target, error) { |
|
if time.Since(p.lastRefresh) > p.refreshInterval { |
|
return p.targets, nil |
|
} |
|
|
|
_, addrs, err := net.LookupSRV("", "", p.job.GetSdName()) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
baseLabels := model.LabelSet{ |
|
model.JobLabel: model.LabelValue(p.job.GetName()), |
|
} |
|
|
|
targets := make([]Target, 0, len(addrs)) |
|
endpoint := &url.URL{ |
|
Scheme: "http", |
|
Path: p.job.GetMetricsPath(), |
|
} |
|
for _, addr := range addrs { |
|
// Remove the final dot from rooted DNS names to make them look more usual. |
|
if addr.Target[len(addr.Target)-1] == '.' { |
|
addr.Target = addr.Target[:len(addr.Target)-1] |
|
} |
|
endpoint.Host = fmt.Sprintf("%s:%d", addr.Target, addr.Port) |
|
t := NewTarget(endpoint.String(), time.Second*5, baseLabels) |
|
targets = append(targets, t) |
|
} |
|
|
|
p.targets = targets |
|
return targets, nil |
|
}
|
|
|