func TestTargetRunScraperScrapes(t *testing.T) { testTarget := target{ state: Unknown, url: "bad schema", httpClient: utility.NewDeadlineClient(0), scraperStopping: make(chan struct{}), scraperStopped: make(chan struct{}), } go testTarget.RunScraper(nopIngester{}, time.Duration(time.Millisecond)) // Enough time for a scrape to happen. time.Sleep(2 * time.Millisecond) if testTarget.lastScrape.IsZero() { t.Errorf("Scrape hasn't occured.") } testTarget.StopScraper() // Wait for it to take effect. time.Sleep(2 * time.Millisecond) last := testTarget.lastScrape // Enough time for a scrape to happen. time.Sleep(2 * time.Millisecond) if testTarget.lastScrape != last { t.Errorf("Scrape occured after it was stopped.") } }
// Construct a new NotificationHandler. func NewNotificationHandler(alertmanagerUrl string, notificationReqs <-chan NotificationReqs) *NotificationHandler { return &NotificationHandler{ alertmanagerUrl: alertmanagerUrl, pendingNotifications: notificationReqs, httpClient: utility.NewDeadlineClient(*deadline), } }
func TestTargetScrapeUpdatesState(t *testing.T) { testTarget := target{ state: Unknown, url: "bad schema", httpClient: utility.NewDeadlineClient(0), } testTarget.scrape(nopIngester{}) if testTarget.state != Unreachable { t.Errorf("Expected target state %v, actual: %v", Unreachable, testTarget.state) } }
func TestTargetScrapeUpdatesState(t *testing.T) { testTarget := target{ scheduler: literalScheduler{}, state: UNKNOWN, address: "bad schema", httpClient: utility.NewDeadlineClient(0), } testTarget.Scrape(time.Time{}, nopIngester{}) if testTarget.state != UNREACHABLE { t.Errorf("Expected target state %v, actual: %v", UNREACHABLE, testTarget.state) } }
// NewTarget creates a reasonably configured target for querying. func NewTarget(url string, deadline time.Duration, baseLabels clientmodel.LabelSet) Target { target := &target{ url: url, Deadline: deadline, baseLabels: baseLabels, httpClient: utility.NewDeadlineClient(deadline), scraperStopping: make(chan struct{}), scraperStopped: make(chan struct{}), newBaseLabels: make(chan clientmodel.LabelSet, 1), } return target }
// Furnish a reasonably configured target for querying. func NewTarget(address string, deadline time.Duration, baseLabels clientmodel.LabelSet) Target { target := &target{ address: address, Deadline: deadline, baseLabels: baseLabels, httpClient: utility.NewDeadlineClient(deadline), } scheduler := &healthScheduler{ target: target, } target.scheduler = scheduler return target }
func TestTargetRecordScrapeHealth(t *testing.T) { testTarget := target{ url: "http://example.url", baseLabels: clientmodel.LabelSet{clientmodel.JobLabel: "testjob"}, httpClient: utility.NewDeadlineClient(0), } now := clientmodel.Now() ingester := &collectResultIngester{} testTarget.recordScrapeHealth(ingester, now, true, 2*time.Second) result := ingester.result if len(result) != 2 { t.Fatalf("Expected two samples, got %d", len(result)) } actual := result[0] expected := &clientmodel.Sample{ Metric: clientmodel.Metric{ clientmodel.MetricNameLabel: scrapeHealthMetricName, InstanceLabel: "http://example.url", clientmodel.JobLabel: "testjob", }, Timestamp: now, Value: 1, } if !actual.Equal(expected) { t.Fatalf("Expected and actual samples not equal. Expected: %v, actual: %v", expected, actual) } actual = result[1] expected = &clientmodel.Sample{ Metric: clientmodel.Metric{ clientmodel.MetricNameLabel: scrapeDurationMetricName, InstanceLabel: "http://example.url", clientmodel.JobLabel: "testjob", }, Timestamp: now, Value: 2.0, } if !actual.Equal(expected) { t.Fatalf("Expected and actual samples not equal. Expected: %v, actual: %v", expected, actual) } }
// NewNotificationHandler constructs a new NotificationHandler. func NewNotificationHandler(alertmanagerURL string, notificationQueueCapacity int) *NotificationHandler { return &NotificationHandler{ alertmanagerURL: alertmanagerURL, pendingNotifications: make(chan NotificationReqs, notificationQueueCapacity), httpClient: utility.NewDeadlineClient(*deadline), notificationLatency: prometheus.NewSummary(prometheus.SummaryOpts{ Namespace: namespace, Subsystem: subsystem, Name: "latency_milliseconds", Help: "Latency quantiles for sending alert notifications (not including dropped notifications).", }), notificationErrors: prometheus.NewCounter(prometheus.CounterOpts{ Namespace: namespace, Subsystem: subsystem, Name: "errors_total", Help: "Total number of errors sending alert notifications.", }), notificationDropped: prometheus.NewCounter(prometheus.CounterOpts{ Namespace: namespace, Subsystem: subsystem, Name: "dropped_total", Help: "Total number of alert notifications dropped due to alert manager missing in configuration.", }), notificationsQueueLength: prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: namespace, Subsystem: subsystem, Name: "queue_length", Help: "The number of alert notifications in the queue.", }), notificationsQueueCapacity: prometheus.MustNewConstMetric( prometheus.NewDesc( prometheus.BuildFQName(namespace, subsystem, "queue_capacity"), "The capacity of the alert notifications queue.", nil, nil, ), prometheus.GaugeValue, float64(notificationQueueCapacity), ), stopped: make(chan struct{}), } }
func TestTargetRecordScrapeHealth(t *testing.T) { testTarget := target{ scheduler: literalScheduler{}, address: "http://example.url", baseLabels: clientmodel.LabelSet{clientmodel.JobLabel: "testjob"}, httpClient: utility.NewDeadlineClient(0), } now := clientmodel.Now() ingester := &collectResultIngester{} testTarget.recordScrapeHealth(ingester, now, true) result := ingester.result if len(result.Samples) != 1 { t.Fatalf("Expected one sample, got %d", len(result.Samples)) } actual := result.Samples[0] expected := &clientmodel.Sample{ Metric: clientmodel.Metric{ clientmodel.MetricNameLabel: ScrapeHealthMetricName, InstanceLabel: "http://example.url", clientmodel.JobLabel: "testjob", }, Timestamp: now, Value: 1, } if result.Err != nil { t.Fatalf("Got unexpected error: %v", result.Err) } if !actual.Equal(expected) { t.Fatalf("Expected and actual samples not equal. Expected: %v, actual: %v", expected, actual) } }
// NewClient creates a new Client. func NewClient(url string, timeout time.Duration) *Client { return &Client{ url: url, httpClient: utility.NewDeadlineClient(timeout), } }