【问题标题】:Sorting Alertmanager email templates in Go templating在 Go 模板中对 Alertmanager 电子邮件模板进行排序
【发布时间】:2017-01-06 12:24:41
【问题描述】:

我正在尝试从 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 上排序的任何想法?

【问题讨论】:

    标签: go go-templates prometheus


    【解决方案1】:

    在将警报传递给模板执行之前对其进行排序。这更容易,而且模板不应该改变它注定要显示的数据。

    例子:

    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())。之所以如此,是因为模板必须是可静态分析的,并且在解析模板文本时了解哪些自定义函数有效是关键。

    仅从模板文本中,没有自定义函数的帮助,是无法实现的。

    【讨论】:

    • 我绝对可以认为这是一个有效的选项。然而,模板是框架中可配置项的一部分,而将对象放入模板的 Go 代码则不是。有没有办法在模板中做到这一点,或者我们不能访问该功能?
    【解决方案2】:

    在那个 alertmanager email template 我注意到了这一行:

      {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
    

    所以也许你可以试试:

    {{ range .Alerts.Firing.Sorted }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2013-08-12
      • 2021-09-12
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多