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
parent
c80eb929d0
commit
9dcdbd05a1
|
@ -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.
|
// ExpressionStatement returns an *ast.ExpressionStagement of e.
|
||||||
func ExpressionStatement(e ast.Expression) *ast.ExpressionStatement {
|
func ExpressionStatement(e ast.Expression) *ast.ExpressionStatement {
|
||||||
return &ast.ExpressionStatement{Expression: e}
|
return &ast.ExpressionStatement{Expression: e}
|
||||||
|
|
|
@ -114,7 +114,7 @@ func (s *PagerDuty) generateFluxASTNotifyPipe(url string) ast.Statement {
|
||||||
// optional
|
// optional
|
||||||
// string
|
// string
|
||||||
// name of the client sending the alert.
|
// 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
|
// clientURL
|
||||||
// optional
|
// optional
|
||||||
|
@ -132,33 +132,37 @@ func (s *PagerDuty) generateFluxASTNotifyPipe(url string) ast.Statement {
|
||||||
// optional
|
// optional
|
||||||
// string
|
// string
|
||||||
// Logical grouping of components of a service, for example app-stack
|
// 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:
|
// severity:
|
||||||
// required
|
// required
|
||||||
// string
|
// 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.
|
// 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", severityFromLevel()))
|
||||||
endpointProps = append(endpointProps, flux.Property("severity", flux.Identifier("r._level")))
|
|
||||||
|
// 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:
|
// source:
|
||||||
// required
|
// required
|
||||||
// string
|
// string
|
||||||
// The unique location of the affected system, preferably a hostname or FQDN
|
// 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:
|
// summary:
|
||||||
// required
|
// required
|
||||||
// string
|
// 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.
|
// 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:
|
// timestamp:
|
||||||
// optional
|
// optional
|
||||||
// timestamp (rfc3339 milliseconds)
|
// timestamp (rfc3339 milliseconds)
|
||||||
// The time at which the emitting tool detected or generated the event.
|
// 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", generateTime()))
|
||||||
endpointProps = append(endpointProps, flux.Property("timestamp", flux.Identifier("r._status_timestamp")))
|
|
||||||
|
|
||||||
endpointFn := flux.Function(flux.FunctionParams("r"), flux.Object(endpointProps...))
|
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))
|
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...))
|
||||||
|
}
|
||||||
|
|
|
@ -33,14 +33,15 @@ statuses
|
||||||
|> monitor.notify(data: notification, endpoint: pagerduty_endpoint(mapFn: (r) =>
|
|> monitor.notify(data: notification, endpoint: pagerduty_endpoint(mapFn: (r) =>
|
||||||
({
|
({
|
||||||
routingKey: pagerduty_secret,
|
routingKey: pagerduty_secret,
|
||||||
client: r._check_name,
|
client: "influxdata",
|
||||||
clientURL: "http://localhost:7777",
|
clientURL: "http://localhost:7777",
|
||||||
class: r._check_name,
|
class: r._check_name,
|
||||||
group: r._check_name,
|
group: r._source_measurement,
|
||||||
severity: r._level,
|
severity: pagerduty.severityFromLevel(r._level),
|
||||||
source: r._source_measurement,
|
eventAction: pagerduty.actionFromLevel(r._level),
|
||||||
|
source: r._notification_rule_name,
|
||||||
summary: r._message,
|
summary: r._message,
|
||||||
timestamp: r._status_timestamp,
|
timestamp: time(v: r._source_timestamp),
|
||||||
})))`
|
})))`
|
||||||
|
|
||||||
s := &rule.PagerDuty{
|
s := &rule.PagerDuty{
|
||||||
|
|
Loading…
Reference in New Issue