fix(notification/rule): convert time, trigger, severity

Semantically, we've done the following:

// name of the client sending the alert.
client: "influxdata"

// url of the client sending the alert.
client_url: the endpoint URL for now (needs to change to rule)

// The class/type of the event, for example ping failure or cpu load
class: check's name

// Logical grouping of components of a service, for example app-stack
group: source measurement

Co-authored-by: Alirie Gray <alirie.gray@gmail.com>
pull/15043/head
Chris Goller 2019-09-06 18:21:41 -05:00
parent c80eb929d0
commit 9dcdbd05a1
3 changed files with 49 additions and 13 deletions

View File

@ -113,6 +113,16 @@ func Call(fn ast.Expression, args *ast.ObjectExpression) *ast.CallExpression {
}
}
// DirectCall returns a *ast.CallExpression that is a function call of fn with args.
func DirectCall(fn ast.Expression, args ast.Expression) *ast.CallExpression {
return &ast.CallExpression{
Callee: fn,
Arguments: []ast.Expression{
args,
},
}
}
// ExpressionStatement returns an *ast.ExpressionStagement of e.
func ExpressionStatement(e ast.Expression) *ast.ExpressionStatement {
return &ast.ExpressionStatement{Expression: e}

View File

@ -114,7 +114,7 @@ func (s *PagerDuty) generateFluxASTNotifyPipe(url string) ast.Statement {
// optional
// string
// name of the client sending the alert.
endpointProps = append(endpointProps, flux.Property("client", flux.Identifier("r._check_name")))
endpointProps = append(endpointProps, flux.Property("client", flux.String("influxdata")))
// clientURL
// optional
@ -132,33 +132,37 @@ func (s *PagerDuty) generateFluxASTNotifyPipe(url string) ast.Statement {
// optional
// string
// Logical grouping of components of a service, for example app-stack
endpointProps = append(endpointProps, flux.Property("group", flux.Identifier("r._check_name")))
endpointProps = append(endpointProps, flux.Property("group", flux.Member("r", "_source_measurement")))
// severity:
// required
// string
// The perceived severity of the status the event is describing with respect to the affected system. This can be critical, error, warning or info.
// TODO: transfrom the influx names to pagerduty names
endpointProps = append(endpointProps, flux.Property("severity", flux.Identifier("r._level")))
endpointProps = append(endpointProps, flux.Property("severity", severityFromLevel()))
// event_action:
// required
// string trigger
// The type of event. Can be trigger, acknowledge or resolve. See Event Action.
endpointProps = append(endpointProps, flux.Property("eventAction", actionFromLevel()))
// source:
// required
// string
// The unique location of the affected system, preferably a hostname or FQDN
endpointProps = append(endpointProps, flux.Property("source", flux.Identifier("r._source_measurement")))
endpointProps = append(endpointProps, flux.Property("source", flux.Member("r", "_notification_rule_name")))
// summary:
// required
// string
// A brief text summary of the event, used to generate the summaries/titles of any associated alerts. The maximum permitted length of this property is 1024 characters.
endpointProps = append(endpointProps, flux.Property("summary", flux.Identifier("r._message")))
endpointProps = append(endpointProps, flux.Property("summary", flux.Member("r", "_message")))
// timestamp:
// optional
// timestamp (rfc3339 milliseconds)
// The time at which the emitting tool detected or generated the event.
// TODO: this should be r._status_timestamp
endpointProps = append(endpointProps, flux.Property("timestamp", flux.Identifier("r._status_timestamp")))
endpointProps = append(endpointProps, flux.Property("timestamp", generateTime()))
endpointFn := flux.Function(flux.FunctionParams("r"), flux.Object(endpointProps...))
@ -171,3 +175,24 @@ func (s *PagerDuty) generateFluxASTNotifyPipe(url string) ast.Statement {
return flux.ExpressionStatement(flux.Pipe(flux.Identifier("statuses"), call))
}
func severityFromLevel() *ast.CallExpression {
return flux.DirectCall(
flux.Member("pagerduty", "severityFromLevel"),
flux.Member("r", "_level"),
)
}
func actionFromLevel() *ast.CallExpression {
return flux.DirectCall(
flux.Member("pagerduty", "actionFromLevel"),
flux.Member("r", "_level"),
)
}
func generateTime() *ast.CallExpression {
props := []*ast.Property{
flux.Property("v", flux.Member("r", "_source_timestamp")),
}
return flux.Call(flux.Identifier("time"), flux.Object(props...))
}

View File

@ -33,14 +33,15 @@ statuses
|> monitor.notify(data: notification, endpoint: pagerduty_endpoint(mapFn: (r) =>
({
routingKey: pagerduty_secret,
client: r._check_name,
client: "influxdata",
clientURL: "http://localhost:7777",
class: r._check_name,
group: r._check_name,
severity: r._level,
source: r._source_measurement,
group: r._source_measurement,
severity: pagerduty.severityFromLevel(r._level),
eventAction: pagerduty.actionFromLevel(r._level),
source: r._notification_rule_name,
summary: r._message,
timestamp: r._status_timestamp,
timestamp: time(v: r._source_timestamp),
})))`
s := &rule.PagerDuty{