Skip to content

Commit f0109eb

Browse files
authored
Prometheus exporter support Gauge Type (#1553)
1 parent 45037ac commit f0109eb

File tree

2 files changed

+65
-7
lines changed

2 files changed

+65
-7
lines changed

exporters/prometheus/src/exporter_utils.cc

+37-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# include <sstream>
66
# include <utility>
77
# include <vector>
8+
# include "prometheus/metric_family.h"
89

910
# include <prometheus/metric_type.h>
1011
# include "opentelemetry/exporters/prometheus/exporter_utils.h"
@@ -74,12 +75,38 @@ std::vector<prometheus_client::MetricFamily> PrometheusExporterUtils::TranslateT
7475
SetData(std::vector<double>{sum, (double)histogram_point_data.count_}, boundaries,
7576
counts, point_data_attr.attributes, time, &metric_family);
7677
}
78+
else if (type == prometheus_client::MetricType::Gauge)
79+
{
80+
if (nostd::holds_alternative<sdk::metrics::LastValuePointData>(
81+
point_data_attr.point_data))
82+
{
83+
auto last_value_point_data =
84+
nostd::get<sdk::metrics::LastValuePointData>(point_data_attr.point_data);
85+
std::vector<metric_sdk::ValueType> values{last_value_point_data.value_};
86+
SetData(values, point_data_attr.attributes, type, time, &metric_family);
87+
}
88+
else
89+
{
90+
OTEL_INTERNAL_LOG_WARN(
91+
"[Prometheus Exporter] TranslateToPrometheus - "
92+
"invalid LastValuePointData type");
93+
}
94+
}
7795
else // Counter, Untyped
7896
{
79-
auto sum_point_data =
80-
nostd::get<sdk::metrics::SumPointData>(point_data_attr.point_data);
81-
std::vector<metric_sdk::ValueType> values{sum_point_data.value_};
82-
SetData(values, point_data_attr.attributes, type, time, &metric_family);
97+
if (nostd::holds_alternative<sdk::metrics::SumPointData>(point_data_attr.point_data))
98+
{
99+
auto sum_point_data =
100+
nostd::get<sdk::metrics::SumPointData>(point_data_attr.point_data);
101+
std::vector<metric_sdk::ValueType> values{sum_point_data.value_};
102+
SetData(values, point_data_attr.attributes, type, time, &metric_family);
103+
}
104+
else
105+
{
106+
OTEL_INTERNAL_LOG_WARN(
107+
"[Prometheus Exporter] TranslateToPrometheus - "
108+
"invalid SumPointData type");
109+
}
83110
}
84111
}
85112
output.emplace_back(metric_family);
@@ -140,6 +167,8 @@ prometheus_client::MetricType PrometheusExporterUtils::TranslateType(
140167
return prometheus_client::MetricType::Counter;
141168
case metric_sdk::AggregationType::kHistogram:
142169
return prometheus_client::MetricType::Histogram;
170+
case metric_sdk::AggregationType::kLastValue:
171+
return prometheus_client::MetricType::Gauge;
143172
default:
144173
return prometheus_client::MetricType::Untyped;
145174
}
@@ -276,6 +305,10 @@ void PrometheusExporterUtils::SetValue(std::vector<T> values,
276305
metric->counter.value = value;
277306
break;
278307
}
308+
case prometheus_client::MetricType::Gauge: {
309+
metric->gauge.value = value;
310+
break;
311+
}
279312
case prometheus_client::MetricType::Untyped: {
280313
metric->untyped.value = value;
281314
break;

exporters/prometheus/test/exporter_utils_test.cc

+28-3
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ void assert_basic(prometheus_client::MetricFamily &metric,
4343
ASSERT_EQ(buckets.size(), vals[2]);
4444
break;
4545
}
46-
case prometheus_client::MetricType::Gauge:
47-
// Gauge type not supported
48-
ASSERT_TRUE(false);
46+
case prometheus_client::MetricType::Gauge: {
47+
ASSERT_DOUBLE_EQ(metric_data.gauge.value, vals[0]);
4948
break;
49+
}
50+
break;
5051
case prometheus_client::MetricType::Summary:
5152
// Summary type not supported
5253
ASSERT_TRUE(false);
@@ -110,6 +111,30 @@ TEST(PrometheusExporterUtils, TranslateToPrometheusIntegerCounter)
110111
vals);
111112
}
112113

114+
TEST(PrometheusExporterUtils, TranslateToPrometheusIntegerLastValue)
115+
{
116+
std::vector<std::unique_ptr<metric_sdk::ResourceMetrics>> collection;
117+
118+
collection.emplace_back(new metric_sdk::ResourceMetrics{CreateLastValuePointData()});
119+
120+
auto translated = PrometheusExporterUtils::TranslateToPrometheus(collection);
121+
ASSERT_EQ(translated.size(), collection.size());
122+
123+
auto metric1 = translated[0];
124+
std::vector<int> vals = {10};
125+
assert_basic(metric1, "library_name", "description", prometheus_client::MetricType::Gauge, 1,
126+
vals);
127+
128+
collection.emplace_back(new metric_sdk::ResourceMetrics{CreateLastValuePointData()});
129+
130+
translated = PrometheusExporterUtils::TranslateToPrometheus(collection);
131+
ASSERT_EQ(translated.size(), collection.size());
132+
133+
auto metric2 = translated[1];
134+
assert_basic(metric2, "library_name", "description", prometheus_client::MetricType::Gauge, 1,
135+
vals);
136+
}
137+
113138
TEST(PrometheusExporterUtils, TranslateToPrometheusHistogramNormal)
114139
{
115140
std::vector<std::unique_ptr<metric_sdk::ResourceMetrics>> collection;

0 commit comments

Comments
 (0)