在 Go 模板中对 Alertmanager 电子邮件模板进行排序
Sorting Alertmanager email templates in Go templating
我正在尝试自定义来自 AlertManager 的电子邮件模板,该模板使用 Go html 模板,该模板使用以下结构打印警报列表:
{{ range .Alerts.Firing }}
它像这样插入到模板中:
func (n *Email) Notify(ctx context.Context, as ...*types.Alert) (bool, error) {
...
data = n.tmpl.Data(receiverName(ctx), groupLabels(ctx), as...)
...
}
警报定义如下:
type Alert struct {
Labels LabelSet `json:"labels"`
Annotations LabelSet `json:"annotations"`
StartsAt time.Time `json:"startsAt,omitempty"`
EndsAt time.Time `json:"endsAt,omitempty"`
GeneratorURL string `json:"generatorURL"`
}
我想对 StartsAt 字段进行排序。
我尝试使用排序功能,但它在电子邮件模板中不可用。
{{ range sort .Alerts.Firing }}
我正在
function \"sort\" not defined
关于如何让它在 StartsAt 上排序的任何想法?
在将警报传递给模板执行之前对其进行排序。它更容易,而且模板不应该改变它注定要显示的数据。
示例:
type ByStart []*types.Alert
func (a ByStart) Len() int { return len(a) }
func (a ByStart) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByStart) Less(i, j int) bool { return a[i].StartAt.Before(a[j].StartAt) }
func (n *Email) Notify(ctx context.Context, as ...*types.Alert) (bool, error) {
...
sort.Sort(ByStart(as))
data = n.tmpl.Data(receiverName(ctx), groupLabels(ctx), as...)
...
}
编辑:
默认情况下,模板不提供排序功能。您可以注册可以从模板中调用的自定义函数,但这必须在解析模板之前完成,并从 Go 代码(不是从模板文本;参见 Template.Funcs()
).之所以如此,是因为模板必须是静态可分析的,并且在解析模板文本时了解哪些自定义函数有效是关键。
仅靠模板文本,如果不借助自定义函数,是做不到的。
在那个 alertmanager email template 中,我注意到了这一行:
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
也许你可以试试:
{{ range .Alerts.Firing.Sorted }}
我正在尝试自定义来自 AlertManager 的电子邮件模板,该模板使用 Go html 模板,该模板使用以下结构打印警报列表:
{{ range .Alerts.Firing }}
它像这样插入到模板中:
func (n *Email) Notify(ctx context.Context, as ...*types.Alert) (bool, error) {
...
data = n.tmpl.Data(receiverName(ctx), groupLabels(ctx), as...)
...
}
警报定义如下:
type Alert struct {
Labels LabelSet `json:"labels"`
Annotations LabelSet `json:"annotations"`
StartsAt time.Time `json:"startsAt,omitempty"`
EndsAt time.Time `json:"endsAt,omitempty"`
GeneratorURL string `json:"generatorURL"`
}
我想对 StartsAt 字段进行排序。
我尝试使用排序功能,但它在电子邮件模板中不可用。
{{ range sort .Alerts.Firing }}
我正在
function \"sort\" not defined
关于如何让它在 StartsAt 上排序的任何想法?
在将警报传递给模板执行之前对其进行排序。它更容易,而且模板不应该改变它注定要显示的数据。
示例:
type ByStart []*types.Alert
func (a ByStart) Len() int { return len(a) }
func (a ByStart) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByStart) Less(i, j int) bool { return a[i].StartAt.Before(a[j].StartAt) }
func (n *Email) Notify(ctx context.Context, as ...*types.Alert) (bool, error) {
...
sort.Sort(ByStart(as))
data = n.tmpl.Data(receiverName(ctx), groupLabels(ctx), as...)
...
}
编辑:
默认情况下,模板不提供排序功能。您可以注册可以从模板中调用的自定义函数,但这必须在解析模板之前完成,并从 Go 代码(不是从模板文本;参见 Template.Funcs()
).之所以如此,是因为模板必须是静态可分析的,并且在解析模板文本时了解哪些自定义函数有效是关键。
仅靠模板文本,如果不借助自定义函数,是做不到的。
在那个 alertmanager email template 中,我注意到了这一行:
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
也许你可以试试:
{{ range .Alerts.Firing.Sorted }}