在Go模板中对Alertmanager电子邮件模板进行排序

我正在尝试自定义
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字段上进行排序.

我尝试使用sort函数,但它在电子邮件模板中不可用.

{{ 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()).这是因为模板必须是静态可分析的,并且在解析模板文本时知道哪些自定义函数是有效的是关键.

只是从模板文本,没有自定义函数的帮助,你无法实现这一点.

点赞