|
20 | 20 | #include "google/cloud/testing_util/scoped_log.h" |
21 | 21 | #include <google/protobuf/text_format.h> |
22 | 22 | #include <gmock/gmock.h> |
| 23 | +#include <opentelemetry/sdk/common/attribute_utils.h> |
23 | 24 | #include <opentelemetry/sdk/metrics/export/metric_producer.h> |
24 | 25 | #include <opentelemetry/sdk/resource/resource.h> |
25 | 26 | #include <opentelemetry/sdk/resource/semantic_conventions.h> |
26 | 27 | #include <algorithm> |
27 | 28 | #include <cstdint> |
| 29 | +#include <string> |
28 | 30 |
|
29 | 31 | namespace google { |
30 | 32 | namespace cloud { |
@@ -155,6 +157,18 @@ auto IsTestResource() { |
155 | 157 | Pair("instance_id", "1020304050607080900")))); |
156 | 158 | } |
157 | 159 |
|
| 160 | +auto ResourceWithAllExtraLabels() { |
| 161 | + opentelemetry::sdk::common::AttributeMap labels; |
| 162 | + for (auto const& kv : kExtraLabelsLookup) { |
| 163 | + auto const& oks = kv.second.otel_keys; |
| 164 | + if (oks.empty()) { |
| 165 | + continue; |
| 166 | + } |
| 167 | + labels.SetAttribute(oks[0], kv.first); |
| 168 | + } |
| 169 | + return opentelemetry::sdk::resource::Resource::Create(labels); |
| 170 | +} |
| 171 | + |
158 | 172 | auto MetricType(std::string const& type) { |
159 | 173 | return ResultOf( |
160 | 174 | "metric.type", |
@@ -697,6 +711,82 @@ TEST(ToRequests, Batches) { |
697 | 711 | } |
698 | 712 | } |
699 | 713 |
|
| 714 | +TEST(WithExtraLabels, CopyLabels) { |
| 715 | + opentelemetry::sdk::metrics::PointDataAttributes pda; |
| 716 | + pda.point_data = opentelemetry::sdk::metrics::SumPointData{}; |
| 717 | + |
| 718 | + opentelemetry::sdk::metrics::MetricData md; |
| 719 | + md.point_data_attr_.push_back(std::move(pda)); |
| 720 | + md.instrument_descriptor.name_ = "metric-name"; |
| 721 | + md.instrument_descriptor.unit_ = "unit"; |
| 722 | + md.instrument_descriptor.type_ = {}; |
| 723 | + md.instrument_descriptor.value_type_ = {}; |
| 724 | + |
| 725 | + opentelemetry::sdk::metrics::ScopeMetrics sm; |
| 726 | + sm.metric_data_.push_back(md); |
| 727 | + sm.metric_data_.push_back(std::move(md)); |
| 728 | + |
| 729 | + opentelemetry::sdk::metrics::ResourceMetrics rm; |
| 730 | + auto resource = ResourceWithAllExtraLabels(); |
| 731 | + rm.resource_ = &resource; |
| 732 | + rm.scope_metric_data_.push_back(std::move(sm)); |
| 733 | + |
| 734 | + auto tss = ToTimeSeries(rm, PrefixWithWorkload); |
| 735 | + for (auto const& kv : kExtraLabelsLookup) { |
| 736 | + auto const& oks = kv.second.otel_keys; |
| 737 | + if (oks.empty()) { |
| 738 | + continue; |
| 739 | + } |
| 740 | + for (auto const& ts : tss) { |
| 741 | + auto const& labels = ts.metric().labels(); |
| 742 | + ASSERT_TRUE(labels.find(kv.first) != labels.end()); |
| 743 | + EXPECT_EQ(labels.at(kv.first), kv.first); |
| 744 | + } |
| 745 | + } |
| 746 | +} |
| 747 | + |
| 748 | +TEST(WithExtraLabels, NoOverwrites) { |
| 749 | + opentelemetry::sdk::metrics::PointDataAttributes pda; |
| 750 | + opentelemetry::sdk::common::OrderedAttributeMap existing_labels; |
| 751 | + existing_labels.SetAttribute("service_name", "do_not_overwrite"); |
| 752 | + pda.attributes = existing_labels; |
| 753 | + pda.point_data = opentelemetry::sdk::metrics::SumPointData{}; |
| 754 | + |
| 755 | + opentelemetry::sdk::metrics::MetricData md; |
| 756 | + md.point_data_attr_.push_back(std::move(pda)); |
| 757 | + md.instrument_descriptor.name_ = "metric-name"; |
| 758 | + md.instrument_descriptor.unit_ = "unit"; |
| 759 | + md.instrument_descriptor.type_ = {}; |
| 760 | + md.instrument_descriptor.value_type_ = {}; |
| 761 | + |
| 762 | + opentelemetry::sdk::metrics::ScopeMetrics sm; |
| 763 | + sm.metric_data_.push_back(md); |
| 764 | + sm.metric_data_.push_back(std::move(md)); |
| 765 | + |
| 766 | + opentelemetry::sdk::metrics::ResourceMetrics rm; |
| 767 | + auto resource = ResourceWithAllExtraLabels(); |
| 768 | + rm.resource_ = &resource; |
| 769 | + rm.scope_metric_data_.push_back(std::move(sm)); |
| 770 | + |
| 771 | + auto tss = ToTimeSeries(rm, PrefixWithWorkload); |
| 772 | + for (auto const& kv : kExtraLabelsLookup) { |
| 773 | + auto const& oks = kv.second.otel_keys; |
| 774 | + if (oks.empty()) { |
| 775 | + continue; |
| 776 | + } |
| 777 | + for (auto const& ts : tss) { |
| 778 | + auto const& labels = ts.metric().labels(); |
| 779 | + ASSERT_TRUE(labels.find(kv.first) != labels.end()); |
| 780 | + if (existing_labels.GetAttributes().find(kv.first) == |
| 781 | + existing_labels.GetAttributes().end()) { |
| 782 | + EXPECT_EQ(labels.at(kv.first), kv.first); |
| 783 | + } else { |
| 784 | + EXPECT_EQ(labels.at(kv.first), "do_not_overwrite"); |
| 785 | + } |
| 786 | + } |
| 787 | + } |
| 788 | +} |
| 789 | + |
700 | 790 | } // namespace |
701 | 791 | GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END |
702 | 792 | } // namespace otel_internal |
|
0 commit comments