Skip to content

Commit 74fd49a

Browse files
committed
Add prom type as metric attribute
1 parent f8c550f commit 74fd49a

File tree

2 files changed

+82
-4
lines changed

2 files changed

+82
-4
lines changed

exporter/awsemfexporter/metric_translator.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,23 @@ const (
3232
// DimensionRollupOptions
3333
zeroAndSingleDimensionRollup = "ZeroAndSingleDimensionRollup"
3434
singleDimensionRollupOnly = "SingleDimensionRollupOnly"
35+
36+
prometheusReceiver = "prometheus"
37+
attributeReceiver = "receiver"
38+
fieldPrometheusMetricType = "prom_metric_type"
3539
)
3640

41+
var fieldPrometheusTypes = map[pdata.MetricDataType]string{
42+
pdata.MetricDataTypeNone: "",
43+
pdata.MetricDataTypeIntGauge: "gauge",
44+
pdata.MetricDataTypeDoubleGauge: "gauge",
45+
pdata.MetricDataTypeIntSum: "counter",
46+
pdata.MetricDataTypeDoubleSum: "counter",
47+
pdata.MetricDataTypeIntHistogram: "histogram",
48+
pdata.MetricDataTypeDoubleHistogram: "histogram",
49+
pdata.MetricDataTypeDoubleSummary: "summary",
50+
}
51+
3752
// CWMetrics defines
3853
type CWMetrics struct {
3954
Measurements []CWMeasurement
@@ -63,6 +78,9 @@ type CWMetricMetadata struct {
6378
LogGroup string
6479
LogStream string
6580
InstrumentationLibraryName string
81+
82+
receiver string
83+
metricDataType pdata.MetricDataType
6684
}
6785

6886
type metricTranslator struct {
@@ -87,6 +105,10 @@ func (mt metricTranslator) translateOTelToGroupedMetric(rm *pdata.ResourceMetric
87105
logGroup, logStream := getLogInfo(rm, cWNamespace, config)
88106

89107
ilms := rm.InstrumentationLibraryMetrics()
108+
var metricReceiver string
109+
if receiver, ok := rm.Resource().Attributes().Get(attributeReceiver); ok {
110+
metricReceiver = receiver.StringVal()
111+
}
90112
for j := 0; j < ilms.Len(); j++ {
91113
ilm := ilms.At(j)
92114
if ilm.InstrumentationLibrary().Name() == "" {
@@ -104,6 +126,8 @@ func (mt metricTranslator) translateOTelToGroupedMetric(rm *pdata.ResourceMetric
104126
LogGroup: logGroup,
105127
LogStream: logStream,
106128
InstrumentationLibraryName: instrumentationLibName,
129+
receiver: metricReceiver,
130+
metricDataType: metric.DataType(),
107131
}
108132
addToGroupedMetric(&metric, groupedMetrics, metadata, config.logger, mt.metricDescriptor)
109133
}
@@ -113,17 +137,25 @@ func (mt metricTranslator) translateOTelToGroupedMetric(rm *pdata.ResourceMetric
113137
// translateGroupedMetricToCWMetric converts Grouped Metric format to CloudWatch Metric format.
114138
func translateGroupedMetricToCWMetric(groupedMetric *GroupedMetric, config *Config) *CWMetrics {
115139
labels := groupedMetric.Labels
116-
fields := make(map[string]interface{}, len(labels)+len(groupedMetric.Metrics))
140+
fieldsLength := len(labels) + len(groupedMetric.Metrics)
141+
142+
isPrometheusMetric := groupedMetric.Metadata.receiver == prometheusReceiver
143+
if isPrometheusMetric {
144+
fieldsLength++
145+
}
146+
fields := make(map[string]interface{}, fieldsLength)
117147

118148
// Add labels to fields
119149
for k, v := range labels {
120150
fields[k] = v
121151
}
122-
123152
// Add metrics to fields
124153
for metricName, metricInfo := range groupedMetric.Metrics {
125154
fields[metricName] = metricInfo.Value
126155
}
156+
if isPrometheusMetric {
157+
fields[fieldPrometheusMetricType] = fieldPrometheusTypes[groupedMetric.Metadata.metricDataType]
158+
}
127159

128160
var cWMeasurements []CWMeasurement
129161
if len(config.MetricDeclarations) == 0 {
@@ -181,7 +213,9 @@ func groupedMetricToCWMeasurement(groupedMetric *GroupedMetric, config *Config)
181213
for metricName, metricInfo := range groupedMetric.Metrics {
182214
metrics[idx] = map[string]string{
183215
"Name": metricName,
184-
"Unit": metricInfo.Unit,
216+
}
217+
if metricInfo.Unit != "" {
218+
metrics[idx]["Unit"] = metricInfo.Unit
185219
}
186220
idx++
187221
}
@@ -247,7 +281,9 @@ func groupedMetricToCWMeasurementsWithFilters(groupedMetric *GroupedMetric, conf
247281

248282
metric := map[string]string{
249283
"Name": metricName,
250-
"Unit": metricInfo.Unit,
284+
}
285+
if metricInfo.Unit != "" {
286+
metric["Unit"] = metricInfo.Unit
251287
}
252288
metricDeclKey := fmt.Sprint(metricDeclIdx)
253289
if group, ok := metricDeclGroups[metricDeclKey]; ok {

exporter/awsemfexporter/metric_translator_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func createMetricTestData() internaldata.MetricsData {
5252
Labels: map[string]string{
5353
conventions.AttributeServiceName: "myServiceName",
5454
conventions.AttributeServiceNamespace: "myServiceNS",
55+
attributeReceiver: prometheusReceiver,
5556
},
5657
},
5758
Metrics: []*metricspb.Metric{
@@ -795,6 +796,47 @@ func TestTranslateGroupedMetricToCWMetric(t *testing.T) {
795796
},
796797
},
797798
},
799+
{
800+
"prometheus metrics",
801+
&GroupedMetric{
802+
Labels: map[string]string{
803+
"label1": "value1",
804+
},
805+
Metrics: map[string]*MetricInfo{
806+
"metric1": {
807+
Value: 1,
808+
Unit: "Count",
809+
},
810+
},
811+
Metadata: CWMetricMetadata{
812+
Namespace: namespace,
813+
TimestampMs: timestamp,
814+
receiver: prometheusReceiver,
815+
metricDataType: pdata.MetricDataTypeDoubleGauge,
816+
},
817+
},
818+
nil,
819+
&CWMetrics{
820+
Measurements: []CWMeasurement{
821+
{
822+
Namespace: namespace,
823+
Dimensions: [][]string{{"label1"}},
824+
Metrics: []map[string]string{
825+
{
826+
"Name": "metric1",
827+
"Unit": "Count",
828+
},
829+
},
830+
},
831+
},
832+
TimestampMs: timestamp,
833+
Fields: map[string]interface{}{
834+
"label1": "value1",
835+
"metric1": 1,
836+
fieldPrometheusMetricType: "gauge",
837+
},
838+
},
839+
},
798840
}
799841

800842
logger := zap.NewNop()

0 commit comments

Comments
 (0)