in metricsgenreceiver/internal/metricstmpl/metricstmpl.go [25:73]
func RenderMetricsTemplate(path string, templateModel any) (pmetric.Metrics, error) {
funcMap := template.FuncMap{
"loop": func(from, to int) <-chan int {
ch := make(chan int)
go func() {
for i := from; i <= to; i++ {
ch <- i
}
close(ch)
}()
return ch
},
}
for _, ext := range []string{".json", ".yaml", ".yml"} {
p := path + ext
var tpl *template.Template
var err error
if strings.HasPrefix(p, "builtin/") {
tpl, err = template.New(p).Funcs(funcMap).ParseFS(fsys, p)
} else {
tpl, err = template.New(p).Funcs(funcMap).ParseFiles(p)
}
if err != nil {
continue
}
buf := new(bytes.Buffer)
err = tpl.ExecuteTemplate(buf, filepath.Base(p), templateModel)
if err != nil {
return pmetric.Metrics{}, err
}
b := buf.Bytes()
if strings.HasSuffix(p, ".yaml") || strings.HasSuffix(p, ".yml") {
var m map[string]any
if err = yaml.Unmarshal(b, &m); err != nil {
return pmetric.Metrics{}, err
}
b, err = json.Marshal(m)
if err != nil {
return pmetric.Metrics{}, err
}
}
metricsUnmarshaler := &pmetric.JSONUnmarshaler{}
metrics, err := metricsUnmarshaler.UnmarshalMetrics(b)
return metrics, err
}
return pmetric.Metrics{}, fmt.Errorf("no .json/.yaml/.yml template file found for %s", path)
}