1
0
Fork 0

Adding upstream version 1.34.4.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-05-24 07:26:29 +02:00
parent e393c3af3f
commit 4978089aab
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
4963 changed files with 677545 additions and 0 deletions

View file

@ -0,0 +1,145 @@
package opensearch_query
import (
"encoding/json"
"github.com/influxdata/telegraf"
)
type aggregationResponse struct {
Hits *searchHits `json:"hits"`
Aggregations *aggregation `json:"aggregations"`
}
type searchHits struct {
TotalHits *totalHits `json:"total,omitempty"`
}
type totalHits struct {
Relation string `json:"relation"`
Value int64 `json:"value"`
}
type metricAggregation map[string]interface{}
type aggregateValue struct {
metrics metricAggregation
buckets []bucketData
}
type aggregation map[string]aggregateValue
type bucketData struct {
DocumentCount int64 `json:"doc_count"`
Key string `json:"key"`
subaggregation aggregation
}
func (a *aggregationResponse) getMetrics(acc telegraf.Accumulator, measurement string) error {
// Simple case (no aggregations)
if a.Aggregations == nil {
tags := make(map[string]string)
fields := map[string]interface{}{
"doc_count": a.Hits.TotalHits.Value,
}
acc.AddFields(measurement, fields, tags)
return nil
}
return a.Aggregations.getMetrics(acc, measurement, a.Hits.TotalHits.Value, make(map[string]string))
}
func (a *aggregation) getMetrics(acc telegraf.Accumulator, measurement string, docCount int64, tags map[string]string) error {
var err error
fields := make(map[string]interface{})
for name, agg := range *a {
if agg.isAggregation() {
for _, bucket := range agg.buckets {
tt := map[string]string{name: bucket.Key}
for k, v := range tags {
tt[k] = v
}
err = bucket.subaggregation.getMetrics(acc, measurement, bucket.DocumentCount, tt)
if err != nil {
return err
}
}
return nil
}
for metric, value := range agg.metrics {
switch value := value.(type) {
case map[string]interface{}:
for k, v := range value {
fields[name+"_"+metric+"_"+k] = v
}
default:
fields[name+"_"+metric] = value
}
}
}
fields["doc_count"] = docCount
acc.AddFields(measurement, fields, tags)
return nil
}
// UnmarshalJSON is a custom JSON unmarshaler for the aggregateValue struct.
func (a *aggregateValue) UnmarshalJSON(bytes []byte) error {
var partial map[string]json.RawMessage
err := json.Unmarshal(bytes, &partial)
if err != nil {
return err
}
// We'll continue to unmarshal if we have buckets
if b, found := partial["buckets"]; found {
return json.Unmarshal(b, &a.buckets)
}
// Use the remaining bytes as metrics
return json.Unmarshal(bytes, &a.metrics)
}
func (a *aggregateValue) isAggregation() bool {
return a.buckets != nil
}
// UnmarshalJSON is a custom JSON unmarshaler for the bucketData struct.
func (b *bucketData) UnmarshalJSON(bytes []byte) error {
var partial map[string]json.RawMessage
var err error
err = json.Unmarshal(bytes, &partial)
if err != nil {
return err
}
err = json.Unmarshal(partial["doc_count"], &b.DocumentCount)
if err != nil {
return err
}
delete(partial, "doc_count")
err = json.Unmarshal(partial["key"], &b.Key)
if err != nil {
return err
}
delete(partial, "key")
if b.subaggregation == nil {
b.subaggregation = make(aggregation)
}
for name, message := range partial {
var subaggregation aggregateValue
err = json.Unmarshal(message, &subaggregation)
if err != nil {
return err
}
b.subaggregation[name] = subaggregation
}
return nil
}