func()

in pkg/client/elasticsearch/discovery.go [64:117]


func (mc *MetricsClient) discoverMetrics() error {
	namer, err := config.NewNamer(mc.GetConfiguration().Rename)
	if err != nil {
		return fmt.Errorf("%s: failed to create namer: %v", mc.GetConfiguration().Name, err)
	}
	metricRecorder := newRecorder(namer)

	// We first record static fields, they do not require to read the mapping
	for _, metricSet := range mc.metricServerCfg.MetricSets {
		for _, field := range metricSet.Fields {
			if len(field.Name) > 0 {
				search := field.Search
				search.Template = template.Must(template.New("").Parse(search.Body))
				metricResultQuery, err := gojq.Parse(search.MetricPath)
				if err != nil {
					return fmt.Errorf("error while parsing metricResultQuery for field %s: error: %v", field.Name, err)
				}
				search.MetricResultQuery = metricResultQuery
				timestampResultQuery, err := gojq.Parse(search.TimestampPath)
				if err != nil {
					return fmt.Errorf("error while parsing timestampResultQuery for field %s: error: %v", field.Name, err)

				}
				search.TimestampResultQuery = timestampResultQuery
				// This is a static field, save the request body and the metric path
				metricRecorder.indexedMetrics[field.Name] = MetricMetadata{
					Search:  &search,
					Indices: metricSet.Indices,
				}
				metricRecorder.metrics[field.Name] = provider.CustomMetricInfo{
					GroupResource: schema.GroupResource{ // TODO: infer resource from configuration
						Group:    "",
						Resource: "pods",
					},
					Namespaced: true,
					Metric:     field.Name,
				}
			}
		}
	}

	for _, metricSet := range mc.metricServerCfg.MetricSets {
		if err := getMappingFor(mc.logger, metricSet, mc.Client, metricRecorder); err != nil {
			return err
		}
	}

	mc.lock.Lock()
	defer mc.lock.Unlock()
	mc.metrics = metricRecorder.metrics
	mc.indexedMetrics = metricRecorder.indexedMetrics
	mc.namer = namer
	return nil
}