@@ -138,24 +138,55 @@ std::vector<prometheus_client::MetricFamily> PrometheusExporterUtils::TranslateT
138138 &output);
139139 }
140140
141+ std::unordered_map<std::string, std::size_t > family_index_by_name;
142+
141143 for (const auto &instrumentation_info : data.scope_metric_data_ )
142144 {
143145 for (const auto &metric_data : instrumentation_info.metric_data_ )
144146 {
145- prometheus_client::MetricFamily metric_family;
146- metric_family.help = metric_data.instrument_descriptor .description_ ;
147- auto front = metric_data.point_data_attr_ .front ();
148- auto kind = getAggregationType (front.point_data );
149- bool is_monotonic = true ;
147+ auto front = metric_data.point_data_attr_ .front ();
148+ auto kind = getAggregationType (front.point_data );
149+ bool is_monotonic = true ;
150150 if (kind == sdk::metrics::AggregationType::kSum )
151151 {
152152 is_monotonic = nostd::get<sdk::metrics::SumPointData>(front.point_data ).is_monotonic_ ;
153153 }
154154 const prometheus_client::MetricType type = TranslateType (kind, is_monotonic);
155- metric_family.name = MapToPrometheusName (metric_data.instrument_descriptor .name_ ,
156- metric_data.instrument_descriptor .unit_ , type,
157- without_units, without_type_suffix);
158- metric_family.type = type;
155+ const std::string name = MapToPrometheusName (metric_data.instrument_descriptor .name_ ,
156+ metric_data.instrument_descriptor .unit_ , type,
157+ without_units, without_type_suffix);
158+ prometheus_client::MetricFamily *metric_family_ptr = nullptr ;
159+ auto existing_it = family_index_by_name.find (name);
160+ if (existing_it != family_index_by_name.end ())
161+ {
162+ auto &existing_family = output[existing_it->second ];
163+ if (existing_family.type != type)
164+ {
165+ OTEL_INTERNAL_LOG_WARN (
166+ " [Prometheus Exporter] TranslateToPrometheus - "
167+ " Instrument type conflict for metric '"
168+ << name << " '. Dropping conflicting metric." );
169+ continue ;
170+ }
171+ if (existing_family.help != metric_data.instrument_descriptor .description_ )
172+ {
173+ OTEL_INTERNAL_LOG_WARN (
174+ " [Prometheus Exporter] TranslateToPrometheus - "
175+ " Instrument description conflict for metric '"
176+ << name << " ': '" << metric_data.instrument_descriptor .description_
177+ << " ', using existing description: '" << existing_family.help << " '." );
178+ }
179+ metric_family_ptr = &existing_family;
180+ }
181+ else
182+ {
183+ family_index_by_name.emplace (name, output.size ());
184+ output.emplace_back ();
185+ metric_family_ptr = &output.back ();
186+ metric_family_ptr->name = name;
187+ metric_family_ptr->help = metric_data.instrument_descriptor .description_ ;
188+ metric_family_ptr->type = type;
189+ }
159190 const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope =
160191 without_otel_scope ? nullptr : instrumentation_info.scope_ ;
161192
@@ -177,7 +208,7 @@ std::vector<prometheus_client::MetricFamily> PrometheusExporterUtils::TranslateT
177208 sum = static_cast <double >(nostd::get<int64_t >(histogram_point_data.sum_ ));
178209 }
179210 SetData (std::vector<double >{sum, static_cast <double >(histogram_point_data.count_ )},
180- boundaries, counts, point_data_attr.attributes , scope, &metric_family ,
211+ boundaries, counts, point_data_attr.attributes , scope, metric_family_ptr ,
181212 data.resource_ );
182213 }
183214 else if (type == prometheus_client::MetricType::Gauge)
@@ -188,15 +219,15 @@ std::vector<prometheus_client::MetricFamily> PrometheusExporterUtils::TranslateT
188219 auto last_value_point_data =
189220 nostd::get<sdk::metrics::LastValuePointData>(point_data_attr.point_data );
190221 std::vector<metric_sdk::ValueType> values{last_value_point_data.value_ };
191- SetData (values, point_data_attr.attributes , scope, type, &metric_family ,
222+ SetData (values, point_data_attr.attributes , scope, type, metric_family_ptr ,
192223 data.resource_ );
193224 }
194225 else if (nostd::holds_alternative<sdk::metrics::SumPointData>(point_data_attr.point_data ))
195226 {
196227 auto sum_point_data =
197228 nostd::get<sdk::metrics::SumPointData>(point_data_attr.point_data );
198229 std::vector<metric_sdk::ValueType> values{sum_point_data.value_ };
199- SetData (values, point_data_attr.attributes , scope, type, &metric_family ,
230+ SetData (values, point_data_attr.attributes , scope, type, metric_family_ptr ,
200231 data.resource_ );
201232 }
202233 else
@@ -213,7 +244,7 @@ std::vector<prometheus_client::MetricFamily> PrometheusExporterUtils::TranslateT
213244 auto sum_point_data =
214245 nostd::get<sdk::metrics::SumPointData>(point_data_attr.point_data );
215246 std::vector<metric_sdk::ValueType> values{sum_point_data.value_ };
216- SetData (values, point_data_attr.attributes , scope, type, &metric_family ,
247+ SetData (values, point_data_attr.attributes , scope, type, metric_family_ptr ,
217248 data.resource_ );
218249 }
219250 else
@@ -224,7 +255,6 @@ std::vector<prometheus_client::MetricFamily> PrometheusExporterUtils::TranslateT
224255 }
225256 }
226257 }
227- output.emplace_back (metric_family);
228258 }
229259 }
230260 return output;
0 commit comments