blob: a5d6414ab4b3e1bddad81d98c56f44da6cbcff07 [file] [log] [blame]
package promalertsclient
import (
"bytes"
"io/ioutil"
"net/http"
"testing"
"go.skia.org/infra/go/testutils"
"github.com/stretchr/testify/mock"
assert "github.com/stretchr/testify/require"
)
func TestSunnyDayNoFilter(t *testing.T) {
testutils.SmallTest(t)
mc := &mockhttpclient{}
defer mc.AssertExpectations(t)
client := New(mc, "myalerts.skia.org")
mockResponse := http.Response{
Status: "200 OK",
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewBufferString(ALERTS_GROUPS_RESPONSE)),
}
mc.On("Get", "http://myalerts.skia.org/api/v1/alerts/groups").Return(&mockResponse, nil)
alerts, err := client.GetAlerts(nil)
assert.NoError(t, err)
assert.Len(t, alerts, 16)
}
func TestSunnyDayFilterGoneBots(t *testing.T) {
testutils.SmallTest(t)
mc := &mockhttpclient{}
defer mc.AssertExpectations(t)
client := New(mc, "myalerts.skia.org")
mockResponse := http.Response{
Status: "200 OK",
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewBufferString(ALERTS_GROUPS_RESPONSE)),
}
mc.On("Get", "http://myalerts.skia.org/api/v1/alerts/groups").Return(&mockResponse, nil)
alerts, err := client.GetAlerts(func(a Alert) bool {
alertName := string(a.Labels["alertname"])
return alertName == "BotMissing" || alertName == "BotQuarantined"
})
assert.NoError(t, err)
assert.Len(t, alerts, 4)
assert.Equal(t, "skia-rpi-130", string(alerts[0].Labels["bot"]))
assert.True(t, alerts[0].Silenced, "rpi-130's alert is silenced")
assert.Equal(t, "skia-e-win-055", string(alerts[1].Labels["bot"]))
assert.True(t, alerts[1].Silenced, "win-055's alert is silenced")
assert.Equal(t, "build87-m5", string(alerts[2].Labels["bot"]))
assert.True(t, alerts[2].Silenced, "build87-m5's alert is silenced")
assert.Equal(t, "build39-m5", string(alerts[3].Labels["bot"]))
assert.False(t, alerts[3].Silenced, "build39-m5's alert is *not* silenced")
}
type mockhttpclient struct {
mock.Mock
}
func (m *mockhttpclient) Get(url string) (*http.Response, error) {
args := m.Called(url)
return args.Get(0).(*http.Response), args.Error(1)
}
var ALERTS_GROUPS_RESPONSE = `{
"status": "success",
"data": [
{
"labels": {
"alertname": "AndroidMasterPerfUntriagedClusters"
},
"blocks": [
{
"routeOpts": {
"receiver": "android-master",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "AndroidMasterPerfUntriagedClusters",
"category": "general",
"instance": "skia-android-master-perf:20000",
"job": "skiaperfd",
"severity": "warning",
"specialroute": "android-master",
"subdomain": "android-master-perf"
},
"annotations": {
"description": "At least one untriaged perf cluster has been found. Please visit https://android-master-perf.skia.org/t/ to triage.",
"summary": "One or more untriaged clusters."
},
"startsAt": "2017-05-23T11:35:37.804Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=perf_clustering_untriaged%7Binstance%3D~%22skia-android-master-perf%3A20000%22%7D+%3E+0&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "BotMissing"
},
"blocks": [
{
"routeOpts": {
"receiver": "skiabot",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "BotMissing",
"bot": "skia-rpi-130",
"category": "infra",
"instance": "skia-datahopper2:20000",
"job": "datahopper",
"pool": "Skia",
"severity": "critical",
"swarming": "chromium-swarm.appspot.com"
},
"annotations": {
"abbr": "skia-rpi-130",
"description": "Swarming bot skia-rpi-130 is missing. https://chromium-swarm.appspot.com/bot?id=skia-rpi-130 https://goto.google.com/skolo-maintenance"
},
"startsAt": "2017-05-25T15:23:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=swarming_bots_last_seen+%2F+1024+%2F+1024+%2F+1024+%2F+60+%3E+15&g0.tab=0",
"inhibited": false,
"silenced": "d5dfce4a-c7b6-4c10-b656-cef11f2c89fb"
},
{
"labels": {
"alertname": "BotMissing",
"bot": "skia-e-win-055",
"category": "infra",
"instance": "skia-datahopper2:20000",
"job": "datahopper",
"pool": "Skia",
"severity": "critical",
"swarming": "chromium-swarm.appspot.com"
},
"annotations": {
"abbr": "skia-e-win-055",
"description": "Swarming bot skia-e-win-055 is missing. https://chromium-swarm.appspot.com/bot?id=skia-e-win-055 https://goto.google.com/skolo-maintenance"
},
"startsAt": "2017-05-23T11:35:37.804Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=swarming_bots_last_seen+%2F+1024+%2F+1024+%2F+1024+%2F+60+%3E+15&g0.tab=0",
"inhibited": false,
"silenced": "83ff3ee5-30d3-40ab-9a0f-8d3e98218691"
}
]
}
]
},
{
"labels": {
"alertname": "BotQuarantined"
},
"blocks": [
{
"routeOpts": {
"receiver": "skiabot",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "BotQuarantined",
"bot": "build87-m5",
"category": "infra",
"instance": "skia-datahopper2:20000",
"job": "datahopper",
"pool": "CT",
"severity": "critical",
"swarming": "chrome-swarming.appspot.com"
},
"annotations": {
"abbr": "build87-m5",
"description": "Swarming bot build87-m5 is quarantined. https://chromium-swarm.appspot.com/bot?id=build87-m5 https://goto.google.com/skolo-maintenance"
},
"startsAt": "2017-05-23T11:35:37.804Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=avg_over_time%28swarming_bots_quarantined%5B10m%5D%29+%3E%3D+1&g0.tab=0",
"inhibited": false,
"silenced": "6c3c4f57-4369-4de4-902e-906f66a9623f"
},
{
"labels": {
"alertname": "BotQuarantined",
"bot": "build39-m5",
"category": "infra",
"instance": "skia-datahopper2:20000",
"job": "datahopper",
"pool": "CT",
"severity": "critical",
"swarming": "chrome-swarming.appspot.com"
},
"annotations": {
"abbr": "build39-m5",
"description": "Swarming bot build39-m5 is quarantined. https://chromium-swarm.appspot.com/bot?id=build39-m5 https://goto.google.com/skolo-maintenance"
},
"startsAt": "2017-05-24T17:57:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=avg_over_time%28swarming_bots_quarantined%5B10m%5D%29+%3E%3D+1&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "CQWatcherCLsCount"
},
"blocks": [
{
"routeOpts": {
"receiver": "skiabot",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "CQWatcherCLsCount",
"category": "infra",
"instance": "skia-cq-watcher:20000",
"job": "cq_watcher",
"severity": "warning"
},
"annotations": {
"description": "There are 10 CLs or more in Skia's CL. https://skia.googlesource.com/buildbot/%2B/master/cq_watcher/PROD.md#too_many_cls",
"summary": "Too many CLs in CQ."
},
"startsAt": "2017-05-26T16:16:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=cq_watcher_in_flight_waiting_in_cq%7Binstance%3D%22skia-cq-watcher%3A20000%22%2Cjob%3D%22cq_watcher%22%7D+%3E%3D+10&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "DirtyPackages"
},
"blocks": [
{
"routeOpts": {
"receiver": "skiabot",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "DirtyPackages",
"category": "infra",
"instance": "skia-push:20000",
"job": "push",
"severity": "warning"
},
"annotations": {
"description": "One or more dirty packages have been running for more than 24 hours. https://push.skia.org"
},
"startsAt": "2017-05-25T20:30:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=min_over_time%28dirty_packages%5B25h%5D%29+%3E%3D+1&g0.tab=0",
"inhibited": false,
"silenced": "c14d499d-aa1a-4c06-9a2c-a6d1cf3d2d52"
}
]
}
]
},
{
"labels": {
"alertname": "GoldExpiredIgnores"
},
"blocks": [
{
"routeOpts": {
"receiver": "general",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "GoldExpiredIgnores",
"category": "general",
"instance": "skia-gold-prod:20001",
"job": "gold",
"severity": "warning"
},
"annotations": {
"description": "At least one expired ignore rule has been found. Please visit https://gold.skia.org/ignores to delete or extend."
},
"startsAt": "2017-05-23T11:35:37.804Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=gold_num_expired_ignore_rules%7Binstance%3D%22skia-gold-prod%3A20001%22%7D+%3E+0&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "GoldUntriaged"
},
"blocks": [
{
"routeOpts": {
"receiver": "general",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "GoldUntriaged",
"category": "general",
"corpus": "gm",
"instance": "skia-gold-prod:20001",
"job": "gold",
"severity": "warning",
"type": "untriaged"
},
"annotations": {
"description": "At least one untriaged GM has been found. Please visit https://gold.skia.org/ to triage."
},
"startsAt": "2017-05-23T11:35:37.804Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=gold_status_by_corpus%7Binstance%3D%22skia-gold-prod%3A20001%22%2Ctype%3D%22untriaged%22%7D+%3E+0&g0.tab=0",
"inhibited": false
},
{
"labels": {
"alertname": "GoldUntriaged",
"category": "general",
"corpus": "image",
"instance": "skia-gold-prod:20001",
"job": "gold",
"severity": "warning",
"type": "untriaged"
},
"annotations": {
"description": "At least one untriaged GM has been found. Please visit https://gold.skia.org/ to triage."
},
"startsAt": "2017-05-23T11:35:37.804Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=gold_status_by_corpus%7Binstance%3D%22skia-gold-prod%3A20001%22%2Ctype%3D%22untriaged%22%7D+%3E+0&g0.tab=0",
"inhibited": false
},
{
"labels": {
"alertname": "GoldUntriaged",
"category": "general",
"corpus": "svg",
"instance": "skia-gold-prod:20001",
"job": "gold",
"severity": "warning",
"type": "untriaged"
},
"annotations": {
"description": "At least one untriaged GM has been found. Please visit https://gold.skia.org/ to triage."
},
"startsAt": "2017-05-26T13:09:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=gold_status_by_corpus%7Binstance%3D%22skia-gold-prod%3A20001%22%2Ctype%3D%22untriaged%22%7D+%3E+0&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "NamedFiddles"
},
"blocks": [
{
"routeOpts": {
"receiver": "skiabot",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "NamedFiddles",
"category": "infra",
"instance": "skia-fiddle:20000",
"job": "fiddle",
"severity": "warning"
},
"annotations": {
"description": "See https://fiddle.skia.org/f/ and https://skia.googlesource.com/buildbot/%2B/master/fiddle/PROD.md#named_fail"
},
"startsAt": "2017-05-26T17:30:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=named_failures+%3E+0&g0.tab=0",
"inhibited": false,
"silenced": "a5af782c-6ef1-4283-899a-307f340923a5"
}
]
}
]
},
{
"labels": {
"alertname": "PerfUntriagedClusters"
},
"blocks": [
{
"routeOpts": {
"receiver": "general",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "PerfUntriagedClusters",
"category": "general",
"instance": "skia-perf:20000",
"job": "skiaperfd",
"severity": "warning"
},
"annotations": {
"description": "At least one untriaged perf cluster has been found. Please visit https://perf.skia.org/t/ to triage.",
"summary": "One or more untriaged clusters."
},
"startsAt": "2017-05-24T21:14:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=perf_clustering_untriaged%7Binstance%3D%22skia-perf%3A20000%22%7D+%3E+0&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "SkiaAutoRoll"
},
"blocks": [
{
"routeOpts": {
"receiver": "general",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "SkiaAutoRoll",
"category": "general",
"child_path": "src/third_party/skia",
"instance": "skia-autoroll:20000",
"job": "autoroll",
"severity": "warning"
},
"annotations": {
"description": "The last DEPS roll attempt for Skia failed. https://skia.googlesource.com/buildbot/%2B/master/autoroll/PROD.md#autoroll_failed."
},
"startsAt": "2017-05-25T14:35:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=autoroll_last_roll_result%7Bchild_path%3D%22src%2Fthird_party%2Fskia%22%7D+%3D%3D+0&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "SkiaAutoRoll24H"
},
"blocks": [
{
"routeOpts": {
"receiver": "general",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "SkiaAutoRoll24H",
"category": "general",
"child_path": "src/third_party/skia",
"instance": "skia-autoroll:20000",
"job": "autoroll",
"name": "last-autoroll-landed",
"severity": "warning",
"type": "liveness"
},
"annotations": {
"description": "The last-landed AutoRoll for Skia was over 24h ago. https://skia.googlesource.com/buildbot/%2B/master/autoroll/PROD.md#no_rolls_24h."
},
"startsAt": "2017-05-26T00:28:37.819Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=liveness_last_autoroll_landed_s%7Bchild_path%3D%22src%2Fthird_party%2Fskia%22%7D+%2F+60+%2F+60+%3E+24&g0.tab=0",
"inhibited": false
}
]
}
]
},
{
"labels": {
"alertname": "TaskSchedulerDBFreePages"
},
"blocks": [
{
"routeOpts": {
"receiver": "skiabot",
"groupBy": [
"alertname"
],
"groupWait": 300000000000,
"groupInterval": 120000000000,
"repeatInterval": 43200000000000
},
"alerts": [
{
"labels": {
"alertname": "TaskSchedulerDBFreePages",
"category": "infra",
"database": "task_scheduler_db",
"instance": "skia-task-scheduler-internal:20000",
"job": "task_scheduler",
"metric": "FreePageCount",
"severity": "critical"
},
"annotations": {
"description": "There are a large number of free pages in the Task Scheduler DB on skia-task-scheduler-internal:20000. https://skia.googlesource.com/buildbot/%2B/master/task_scheduler/PROD.md#db_too_many_free_pages",
"summary": "Task Scheduler DB excess free pages (skia-task-scheduler-internal:20000)"
},
"startsAt": "2017-05-23T12:35:37.804Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://prom.skia.org/graph?g0.expr=bolt_db%7Bdatabase%3D%22task_scheduler_db%22%2Cmetric%3D%22FreePageCount%22%7D+%3E+150&g0.tab=0",
"inhibited": false,
"silenced": "2fef345c-2cbf-4348-9be2-0be289122958"
}
]
}
]
}
]
}`