2017-01-06 7 views
4

Я пытаюсь настроить шаблон электронной почты из AlertManager, который использует шаблон HTML Go, которая выводит список предупреждений с помощью следующей конструкции:Сортировка Alertmanager шаблоны электронной почты в Go шаблонах

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

Edit:

Сортировка функциональность не доступна из шаблонов по умолчанию. Вы можете зарегистрировать пользовательские функции, которые могут быть вызваны из шаблонов, но это необходимо сделать до разбора шаблонов и от Перейти код (не из текста шаблона, см. Template.Funcs()). Это связано с тем, что шаблоны должны быть подвергнуты статическому анализу, и знание того, какие пользовательские функции действительны, является ключевым при анализе текста шаблона.

Просто из текста шаблона, без помощи пользовательских функций, вы не можете достичь этого.

+0

Я могу определенно увидеть это как действительный вариант. однако шаблон является частью настраиваемого элемента в структуре, где код Go, который помещает объекты в шаблон, не является. Есть ли способ сделать это в шаблоне, или мы не можем получить доступ к этой функции? – ddewaele

+0

@ddewaele См. Отредактированный ответ. – icza