Hide HTTP auth parts from URL

This  instroduces an extra function in the Target interface (PublicURL)
which is used to populate the instance field in scraped metrics.
This commit is contained in:
Sergiusz 'q3k' Bazański 2015-02-19 18:58:47 +01:00
parent 79bf5a278e
commit bb69a3d284
3 changed files with 34 additions and 3 deletions

View file

@ -17,6 +17,7 @@ import (
"fmt" "fmt"
"math/rand" "math/rand"
"net/http" "net/http"
"net/url"
"os" "os"
"strings" "strings"
"sync" "sync"
@ -114,6 +115,8 @@ type Target interface {
// points in this interface, this one is the best candidate to change given // points in this interface, this one is the best candidate to change given
// the ways to express the endpoint. // the ways to express the endpoint.
URL() string URL() string
// The URL without any auth data in it, used to label data
PublicURL() string
// The URL as seen from other hosts. References to localhost are resolved // The URL as seen from other hosts. References to localhost are resolved
// to the address of the prometheus server. // to the address of the prometheus server.
GlobalURL() string GlobalURL() string
@ -186,8 +189,8 @@ func (t *target) recordScrapeHealth(ingester extraction.Ingester, timestamp clie
} }
healthMetric[clientmodel.MetricNameLabel] = clientmodel.LabelValue(scrapeHealthMetricName) healthMetric[clientmodel.MetricNameLabel] = clientmodel.LabelValue(scrapeHealthMetricName)
durationMetric[clientmodel.MetricNameLabel] = clientmodel.LabelValue(scrapeDurationMetricName) durationMetric[clientmodel.MetricNameLabel] = clientmodel.LabelValue(scrapeDurationMetricName)
healthMetric[InstanceLabel] = clientmodel.LabelValue(t.URL()) healthMetric[InstanceLabel] = clientmodel.LabelValue(t.PublicURL())
durationMetric[InstanceLabel] = clientmodel.LabelValue(t.URL()) durationMetric[InstanceLabel] = clientmodel.LabelValue(t.PublicURL())
healthValue := clientmodel.SampleValue(0) healthValue := clientmodel.SampleValue(0)
if healthy { if healthy {
@ -320,7 +323,7 @@ func (t *target) scrape(ingester extraction.Ingester) (err error) {
return err return err
} }
baseLabels := clientmodel.LabelSet{InstanceLabel: clientmodel.LabelValue(t.URL())} baseLabels := clientmodel.LabelSet{InstanceLabel: clientmodel.LabelValue(t.PublicURL())}
for baseLabel, baseValue := range t.baseLabels { for baseLabel, baseValue := range t.baseLabels {
baseLabels[baseLabel] = baseValue baseLabels[baseLabel] = baseValue
} }
@ -363,6 +366,17 @@ func (t *target) URL() string {
return t.url return t.url
} }
// PublicURL implements Target.
func (t *target) PublicURL() string {
u, err := url.Parse(t.url)
if err != nil {
glog.Warning("Could not parse URL for auth stripping (%s), returning it unchanged", err)
return t.url
}
u.User = nil
return u.String()
}
// GlobalURL implements Target. // GlobalURL implements Target.
func (t *target) GlobalURL() string { func (t *target) GlobalURL() string {
url := t.url url := t.url

View file

@ -34,6 +34,19 @@ func (i *collectResultIngester) Ingest(s clientmodel.Samples) error {
return nil return nil
} }
func TestTargetHidesURLAuth(t *testing.T) {
testTarget := target{
state: Unknown,
url: "http://secret:data@host.com/query?args#fragment",
httpClient: utility.NewDeadlineClient(0),
}
expected := "http://host.com/query?args#fragment"
u := testTarget.PublicURL()
if u != expected {
t.Errorf("Expected PublicURL to be %v, actual %v", expected, u)
}
}
func TestTargetScrapeUpdatesState(t *testing.T) { func TestTargetScrapeUpdatesState(t *testing.T) {
testTarget := target{ testTarget := target{
state: Unknown, state: Unknown,

View file

@ -42,6 +42,10 @@ func (t fakeTarget) URL() string {
return "fake" return "fake"
} }
func (t fakeTarget) PublicURL() string {
return "fake"
}
func (t fakeTarget) GlobalURL() string { func (t fakeTarget) GlobalURL() string {
return t.URL() return t.URL()
} }