in exporter/kineticaexporter/metrics_exporter.go [748:947]
func (e *kineticaMetricsExporter) createHistogramRecord(resAttr pcommon.Map, _ string, scopeInstr pcommon.InstrumentationScope, _ string, histogramRecord pmetric.Histogram, name, description, unit string) (*kineticaHistogramRecord, error) {
e.logger.Debug("In createHistogramRecord ...")
var errs []error
kiHistogramRecord := new(kineticaHistogramRecord)
histogram := &Histogram{
HistogramID: uuid.New().String(),
MetricName: name,
Description: description,
Unit: unit,
AggregationTemporality: histogramRecord.AggregationTemporality(),
}
kiHistogramRecord.histogram = histogram
// Handle data points
var datapointAttribute []HistogramDataPointAttribute
datapointAttributes := make(map[string]ValueTypePair)
var exemplarAttribute []HistogramDataPointExemplarAttribute
exemplarAttributes := make(map[string]ValueTypePair)
// Handle data points
for i := 0; i < histogramRecord.DataPoints().Len(); i++ {
datapoint := histogramRecord.DataPoints().At(i)
histogramDatapoint := &HistogramDatapoint{
HistogramID: histogram.HistogramID,
ID: uuid.New().String(),
StartTimeUnix: datapoint.StartTimestamp().AsTime().UnixMilli(),
TimeUnix: datapoint.Timestamp().AsTime().UnixMilli(),
Count: int64(datapoint.Count()),
Sum: datapoint.Sum(),
Min: datapoint.Min(),
Max: datapoint.Max(),
Flags: int(datapoint.Flags()),
}
kiHistogramRecord.histogramDatapoint = append(kiHistogramRecord.histogramDatapoint, *histogramDatapoint)
// Handle histogram datapoint attribute
for k, v := range datapoint.Attributes().All() {
if k == "" {
e.logger.Debug("Histogram record attribute key is empty")
} else if v, err := attributeValueToKineticaFieldValue(v); err == nil {
datapointAttributes[k] = v
} else {
e.logger.Debug("Invalid histogram record attribute value", zap.String("Error", err.Error()))
errs = append(errs, err)
}
}
for key := range datapointAttributes {
vtPair := datapointAttributes[key]
sa, err := e.newHistogramDatapointAttributeValue(histogram.HistogramID, histogramDatapoint.ID, key, vtPair)
if err != nil {
e.logger.Error(err.Error())
} else {
datapointAttribute = append(datapointAttribute, *sa)
}
}
kiHistogramRecord.histogramDatapointAttribute = append(kiHistogramRecord.histogramDatapointAttribute, datapointAttribute...)
for k := range datapointAttributes {
delete(datapointAttributes, k)
}
// Handle data point exemplars
exemplars := datapoint.Exemplars()
for i := 0; i < exemplars.Len(); i++ {
exemplar := exemplars.At(i)
histogramDatapointExemplar := HistogramDatapointExemplar{
HistogramID: histogram.HistogramID,
DatapointID: histogramDatapoint.ID,
ExemplarID: uuid.New().String(),
TimeUnix: exemplar.Timestamp().AsTime().UnixMilli(),
HistogramValue: exemplar.DoubleValue(),
TraceID: exemplar.TraceID().String(),
SpanID: exemplar.SpanID().String(),
}
kiHistogramRecord.exemplars = append(kiHistogramRecord.exemplars, histogramDatapointExemplar)
// Handle Exemplar attribute
for k, v := range exemplar.FilteredAttributes().All() {
if k == "" {
e.logger.Debug("Histogram record attribute key is empty")
} else if v, err := attributeValueToKineticaFieldValue(v); err == nil {
exemplarAttributes[k] = v
} else {
e.logger.Debug("Invalid histogram record attribute value", zap.String("Error", err.Error()))
errs = append(errs, err)
}
}
for key := range exemplarAttributes {
vtPair := exemplarAttributes[key]
ea, err := e.newHistogramDatapointExemplarAttributeValue(histogramDatapoint.HistogramID, histogramDatapoint.ID, histogramDatapointExemplar.ExemplarID, key, vtPair)
if err != nil {
e.logger.Error(err.Error())
} else {
exemplarAttribute = append(exemplarAttribute, *ea)
}
}
kiHistogramRecord.exemplarAttribute = append(kiHistogramRecord.exemplarAttribute, exemplarAttribute...)
for k := range exemplarAttributes {
delete(exemplarAttributes, k)
}
}
histogramBucketCounts := datapoint.BucketCounts()
for i := 0; i < histogramBucketCounts.Len(); i++ {
bucketCount := HistogramDatapointBucketCount{
HistogramID: histogramDatapoint.HistogramID,
DatapointID: histogramDatapoint.ID,
CountID: uuid.New().String(),
Count: int64(histogramBucketCounts.At(i)),
}
kiHistogramRecord.histogramBucketCount = append(kiHistogramRecord.histogramBucketCount, bucketCount)
}
histogramExplicitBounds := datapoint.ExplicitBounds()
for i := 0; i < histogramExplicitBounds.Len(); i++ {
explicitBound := HistogramDatapointExplicitBound{
HistogramID: histogramDatapoint.HistogramID,
DatapointID: histogramDatapoint.ID,
BoundID: uuid.New().String(),
ExplicitBound: histogramExplicitBounds.At(i),
}
kiHistogramRecord.histogramExplicitBound = append(kiHistogramRecord.histogramExplicitBound, explicitBound)
}
}
// Handle Resource attribute
var resourceAttribute []HistogramResourceAttribute
resourceAttributes := make(map[string]ValueTypePair)
if resAttr.Len() > 0 {
for k, v := range resAttr.All() {
if k == "" {
e.logger.Debug("Resource attribute key is empty")
} else if v, err := attributeValueToKineticaFieldValue(v); err == nil {
resourceAttributes[k] = v
} else {
e.logger.Debug("Invalid resource attribute value", zap.String("Error", err.Error()))
errs = append(errs, err)
}
}
for key := range resourceAttributes {
vtPair := resourceAttributes[key]
ga, err := e.newHistogramResourceAttributeValue(histogram.HistogramID, key, vtPair)
if err != nil {
e.logger.Error(err.Error())
} else {
resourceAttribute = append(resourceAttribute, *ga)
}
}
kiHistogramRecord.histogramResourceAttribute = make([]HistogramResourceAttribute, len(resourceAttribute))
copy(kiHistogramRecord.histogramResourceAttribute, resourceAttribute)
}
// Handle Scope attribute
var scopeAttribute []HistogramScopeAttribute
scopeAttributes := make(map[string]ValueTypePair)
scopeName := scopeInstr.Name()
scopeVersion := scopeInstr.Version()
if scopeInstr.Attributes().Len() > 0 {
for k, v := range scopeInstr.Attributes().All() {
if k == "" {
e.logger.Debug("Scope attribute key is empty")
} else if v, err := attributeValueToKineticaFieldValue(v); err == nil {
scopeAttributes[k] = v
} else {
e.logger.Debug("Invalid scope attribute value", zap.String("Error", err.Error()))
errs = append(errs, err)
}
}
for key := range scopeAttributes {
vtPair := scopeAttributes[key]
sa, err := e.newHistogramScopeAttributeValue(histogram.HistogramID, key, scopeName, scopeVersion, vtPair)
if err != nil {
e.logger.Error(err.Error())
} else {
scopeAttribute = append(scopeAttribute, *sa)
}
}
kiHistogramRecord.histogramScopeAttribute = make([]HistogramScopeAttribute, len(scopeAttribute))
copy(kiHistogramRecord.histogramScopeAttribute, scopeAttribute)
}
return kiHistogramRecord, multierr.Combine(errs...)
}