func RenderMetricsTemplate()

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