2017-01-06 66 views
4

我試圖從定製AlertManager使用該打印使用下面的結構警報的列表圍棋HTML模板電子郵件模板:圍棋模板排序Alertmanager電子郵件模板

{{ 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任何想法?

回答

2

在將警報傳遞給模板執行之前對警報排序。這很容易,模板也不應該改變註定要顯示的數據。

例子:

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...) 
    ... 
} 

編輯:

排序功能不可用從默認模板。您可以註冊可以從模板調用的自定義函數,但是這必須在解析模板之前完成,並從轉到代碼(不是來自模板文本;請參閱Template.Funcs())。這是因爲模板必須是靜態可分析的,並且知道自定義函數的有效性在解析模板文本時很關鍵。

只是從模板文本,沒有自定義函數的幫助,你不能實現這一點。

+0

我絕對可以看到這是一個有效的選項。但是該模板是框架中可配置項目的一部分,其中用於將對象放入模板的Go代碼不是。有沒有辦法在模板中完成它,或者我們無法訪問該功能? – ddewaele

+0

@ddewaele查看編輯答案。 – icza