* feat(alerting): Persist triggered alerts across application restart Fixes #679 * test(alerting): Add numerous tests related to alerts
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package sql
 | |
| 
 | |
| func (s *Store) createPostgresSchema() error {
 | |
| 	_, err := s.db.Exec(`
 | |
| 		CREATE TABLE IF NOT EXISTS endpoints (
 | |
| 			endpoint_id    BIGSERIAL PRIMARY KEY,
 | |
| 			endpoint_key   TEXT UNIQUE,
 | |
| 			endpoint_name  TEXT NOT NULL,
 | |
| 			endpoint_group TEXT NOT NULL,
 | |
| 			UNIQUE(endpoint_name, endpoint_group)
 | |
| 		)
 | |
| 	`)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	_, err = s.db.Exec(`
 | |
| 		CREATE TABLE IF NOT EXISTS endpoint_events (
 | |
| 			endpoint_event_id  BIGSERIAL PRIMARY KEY,
 | |
| 			endpoint_id        BIGINT    NOT NULL REFERENCES endpoints(endpoint_id) ON DELETE CASCADE,
 | |
| 			event_type         TEXT      NOT NULL,
 | |
| 			event_timestamp    TIMESTAMP NOT NULL
 | |
| 		)
 | |
| 	`)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	_, err = s.db.Exec(`
 | |
| 		CREATE TABLE IF NOT EXISTS endpoint_results (
 | |
| 			endpoint_result_id     BIGSERIAL PRIMARY KEY,
 | |
| 			endpoint_id            BIGINT    NOT NULL REFERENCES endpoints(endpoint_id) ON DELETE CASCADE,
 | |
| 			success                BOOLEAN   NOT NULL,
 | |
| 			errors                 TEXT      NOT NULL,
 | |
| 			connected              BOOLEAN   NOT NULL,
 | |
| 			status                 BIGINT    NOT NULL,
 | |
| 			dns_rcode              TEXT      NOT NULL,
 | |
| 			certificate_expiration BIGINT    NOT NULL,
 | |
| 			domain_expiration      BIGINT    NOT NULL,
 | |
| 			hostname               TEXT      NOT NULL,
 | |
| 			ip                     TEXT      NOT NULL,
 | |
| 			duration               BIGINT    NOT NULL,
 | |
| 			timestamp              TIMESTAMP NOT NULL
 | |
| 		)
 | |
| 	`)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	_, err = s.db.Exec(`
 | |
| 		CREATE TABLE IF NOT EXISTS endpoint_result_conditions (
 | |
| 			endpoint_result_condition_id  BIGSERIAL PRIMARY KEY,
 | |
| 			endpoint_result_id            BIGINT  NOT NULL REFERENCES endpoint_results(endpoint_result_id) ON DELETE CASCADE,
 | |
| 			condition                     TEXT    NOT NULL,
 | |
| 			success                       BOOLEAN NOT NULL
 | |
| 		)
 | |
| 	`)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	_, err = s.db.Exec(`
 | |
| 		CREATE TABLE IF NOT EXISTS endpoint_uptimes (
 | |
| 			endpoint_uptime_id     BIGSERIAL PRIMARY KEY,
 | |
| 			endpoint_id            BIGINT NOT NULL REFERENCES endpoints(endpoint_id) ON DELETE CASCADE,
 | |
| 			hour_unix_timestamp    BIGINT NOT NULL,
 | |
| 			total_executions       BIGINT NOT NULL,
 | |
| 			successful_executions  BIGINT NOT NULL,
 | |
| 			total_response_time    BIGINT NOT NULL,
 | |
| 			UNIQUE(endpoint_id, hour_unix_timestamp)
 | |
| 		)
 | |
| 	`)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	_, err = s.db.Exec(`
 | |
| 		CREATE TABLE IF NOT EXISTS endpoint_alerts_triggered (
 | |
| 			endpoint_alert_trigger_id     BIGSERIAL PRIMARY KEY,
 | |
| 			endpoint_id                   BIGINT    NOT NULL REFERENCES endpoints(endpoint_id) ON DELETE CASCADE,
 | |
| 		    configuration_checksum        TEXT      NOT NULL,
 | |
| 		    resolve_key		              TEXT      NOT NULL,
 | |
| 			number_of_successes_in_a_row  INTEGER   NOT NULL,
 | |
| 			UNIQUE(endpoint_id, configuration_checksum)
 | |
| 		)
 | |
| 	`)
 | |
| 	// Silent table modifications TODO: Remove this in v6.0.0
 | |
| 	_, _ = s.db.Exec(`ALTER TABLE endpoint_results ADD IF NOT EXISTS domain_expiration BIGINT NOT NULL DEFAULT 0`)
 | |
| 	return err
 | |
| }
 |