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
}