Skip to content

Commit ef964b2

Browse files
committed
add tests
1 parent 1775a3e commit ef964b2

File tree

5 files changed

+117
-25
lines changed

5 files changed

+117
-25
lines changed

google/cloud/opentelemetry/internal/monitored_resource.cc

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "google/cloud/internal/absl_str_cat_quiet.h"
1717
#include "google/cloud/internal/absl_str_join_quiet.h"
1818
#include "google/cloud/version.h"
19-
#include "absl/types/optional.h"
2019
#include "absl/types/variant.h"
2120
#include <opentelemetry/common/attribute_value.h>
2221
#include <opentelemetry/sdk/resource/resource.h>
@@ -49,11 +48,6 @@ struct AsStringVisitor {
4948
std::string operator()(bool const& v) const { return v ? "true" : "false"; }
5049
};
5150

52-
struct OTelKeyMatch {
53-
std::vector<std::string> otel_keys;
54-
absl::optional<std::string> fallback = absl::nullopt;
55-
};
56-
5751
class MonitoredResourceProvider {
5852
public:
5953
MonitoredResourceProvider(

google/cloud/opentelemetry/internal/monitored_resource.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,23 @@
1515
#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_OPENTELEMETRY_INTERNAL_MONITORED_RESOURCE_H
1616
#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_OPENTELEMETRY_INTERNAL_MONITORED_RESOURCE_H
1717

18+
#include "absl/types/optional.h"
1819
#include "google/cloud/version.h"
1920
#include <opentelemetry/sdk/resource/resource.h>
2021
#include <string>
2122
#include <unordered_map>
23+
#include <vector>
2224

2325
namespace google {
2426
namespace cloud {
2527
namespace otel_internal {
2628
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
2729

30+
struct OTelKeyMatch {
31+
std::vector<std::string> otel_keys;
32+
absl::optional<std::string> fallback = absl::nullopt;
33+
};
34+
2835
std::string AsString(
2936
opentelemetry::sdk::common::OwnedAttributeValue const& attribute);
3037

google/cloud/opentelemetry/internal/time_series.cc

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,15 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#include "absl/types/optional.h"
1615
#include "google/cloud/opentelemetry/internal/time_series.h"
17-
#include "google/cloud/opentelemetry/internal/monitored_resource.h"
1816
#include "google/cloud/internal/absl_str_replace_quiet.h"
1917
#include "google/cloud/internal/time_utils.h"
2018
#include "google/cloud/log.h"
2119
#include <opentelemetry/common/attribute_value.h>
2220
#include <opentelemetry/sdk/metrics/data/metric_data.h>
2321
#include <opentelemetry/sdk/metrics/export/metric_producer.h>
24-
#include <opentelemetry/sdk/resource/semantic_conventions.h>
2522
#include <cctype>
2623
#include <string>
27-
#include <unordered_map>
2824
#include <vector>
2925

3026
namespace google {
@@ -33,18 +29,6 @@ namespace otel_internal {
3329
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
3430
namespace {
3531

36-
namespace sc = opentelemetry::sdk::resource::SemanticConventions;
37-
38-
struct OTelKeyMatch {
39-
std::vector<std::string> otel_keys;
40-
absl::optional<std::string> fallback = absl::nullopt;
41-
};
42-
43-
std::unordered_map<std::string, OTelKeyMatch> const kExtraLabelsLookup = {
44-
{"service_name", {{sc::kServiceName}}},
45-
{"service_namespace", {{sc::kServiceNamespace}}},
46-
{"service_instance_id", {{sc::kServiceInstanceId}}}};
47-
4832
google::protobuf::Timestamp ToProtoTimestamp(
4933
opentelemetry::common::SystemTimestamp ts) {
5034
return internal::ToProtoTimestamp(
@@ -255,14 +239,15 @@ std::vector<google::monitoring::v3::CreateTimeSeriesRequest> ToRequests(
255239

256240
std::vector<google::monitoring::v3::TimeSeries> WithExtraLabels(
257241
opentelemetry::sdk::metrics::ResourceMetrics const& data,
258-
std::vector<google::monitoring::v3::TimeSeries>& tss) {
242+
std::vector<google::monitoring::v3::TimeSeries>& tss,
243+
std::unordered_map<std::string, OTelKeyMatch> const& extra_labels) {
259244
if (!data.resource_) {
260245
return tss;
261246
}
262247

263248
opentelemetry::sdk::resource::ResourceAttributes const& attributes =
264249
data.resource_->GetAttributes();
265-
for (auto const& kv : kExtraLabelsLookup) {
250+
for (auto const& kv : extra_labels) {
266251
auto const& oks = kv.second.otel_keys;
267252
auto found = std::find_first_of(
268253
oks.begin(), oks.end(), attributes.begin(), attributes.end(),

google/cloud/opentelemetry/internal/time_series.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@
1515
#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_OPENTELEMETRY_INTERNAL_TIME_SERIES_H
1616
#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_OPENTELEMETRY_INTERNAL_TIME_SERIES_H
1717

18+
#include "google/cloud/opentelemetry/internal/monitored_resource.h"
1819
#include "google/cloud/version.h"
1920
#include "absl/types/optional.h"
2021
#include <google/api/metric.pb.h>
2122
#include <google/api/monitored_resource.pb.h>
2223
#include <google/monitoring/v3/metric_service.pb.h>
2324
#include <opentelemetry/sdk/metrics/metric_reader.h>
2425
#include <opentelemetry/sdk/resource/resource.h>
26+
#include <opentelemetry/sdk/resource/semantic_conventions.h>
2527
#include <functional>
2628
#include <string>
29+
#include <unordered_map>
2730

2831
namespace google {
2932
namespace cloud {
@@ -35,6 +38,15 @@ GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
3538
// See: https://cloud.google.com/monitoring/quotas
3639
auto constexpr kMaxTimeSeriesPerRequest = 200;
3740

41+
std::unordered_map<std::string, OTelKeyMatch> const kExtraLabelsLookup = {
42+
{"service_name",
43+
{{opentelemetry::sdk::resource::SemanticConventions::kServiceName}}},
44+
{"service_namespace",
45+
{{opentelemetry::sdk::resource::SemanticConventions::kServiceNamespace}}},
46+
{"service_instance_id",
47+
{{opentelemetry::sdk::resource::SemanticConventions::
48+
kServiceInstanceId}}}};
49+
3850
google::api::Metric ToMetric(
3951
opentelemetry::sdk::metrics::MetricData const& metric_data,
4052
opentelemetry::sdk::metrics::PointAttributes const& attributes,
@@ -102,7 +114,9 @@ std::vector<google::monitoring::v3::CreateTimeSeriesRequest> ToRequests(
102114
*/
103115
std::vector<google::monitoring::v3::TimeSeries> WithExtraLabels(
104116
opentelemetry::sdk::metrics::ResourceMetrics const& data,
105-
std::vector<google::monitoring::v3::TimeSeries>& tss);
117+
std::vector<google::monitoring::v3::TimeSeries>& tss,
118+
std::unordered_map<std::string, OTelKeyMatch> const& extra_labels =
119+
kExtraLabelsLookup);
106120

107121
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
108122
} // namespace otel_internal

google/cloud/opentelemetry/internal/time_series_test.cc

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@
2020
#include "google/cloud/testing_util/scoped_log.h"
2121
#include <google/protobuf/text_format.h>
2222
#include <gmock/gmock.h>
23+
#include <opentelemetry/sdk/common/attribute_utils.h>
2324
#include <opentelemetry/sdk/metrics/export/metric_producer.h>
2425
#include <opentelemetry/sdk/resource/resource.h>
2526
#include <opentelemetry/sdk/resource/semantic_conventions.h>
2627
#include <algorithm>
2728
#include <cstdint>
29+
#include <map>
30+
#include <string>
31+
#include <unordered_map>
2832

2933
namespace google {
3034
namespace cloud {
@@ -155,6 +159,18 @@ auto IsTestResource() {
155159
Pair("instance_id", "1020304050607080900"))));
156160
}
157161

162+
auto ResourceWithAllExtraLabels() {
163+
opentelemetry::sdk::common::AttributeMap labels;
164+
for (auto const& kv : kExtraLabelsLookup) {
165+
auto const& oks = kv.second.otel_keys;
166+
if (oks.empty()) {
167+
continue;
168+
}
169+
labels.SetAttribute(oks[0], kv.first);
170+
}
171+
return opentelemetry::sdk::resource::Resource::Create(labels);
172+
}
173+
158174
auto MetricType(std::string const& type) {
159175
return ResultOf(
160176
"metric.type",
@@ -697,6 +713,82 @@ TEST(ToRequests, Batches) {
697713
}
698714
}
699715

716+
TEST(WithExtraLabels, CopyLabels) {
717+
opentelemetry::sdk::metrics::PointDataAttributes pda;
718+
pda.point_data = opentelemetry::sdk::metrics::SumPointData{};
719+
720+
opentelemetry::sdk::metrics::MetricData md;
721+
md.point_data_attr_.push_back(std::move(pda));
722+
md.instrument_descriptor.name_ = "metric-name";
723+
md.instrument_descriptor.unit_ = "unit";
724+
md.instrument_descriptor.type_ = {};
725+
md.instrument_descriptor.value_type_ = {};
726+
727+
opentelemetry::sdk::metrics::ScopeMetrics sm;
728+
sm.metric_data_.push_back(md);
729+
sm.metric_data_.push_back(std::move(md));
730+
731+
opentelemetry::sdk::metrics::ResourceMetrics rm;
732+
auto resource = ResourceWithAllExtraLabels();
733+
rm.resource_ = &resource;
734+
rm.scope_metric_data_.push_back(std::move(sm));
735+
736+
auto tss = ToTimeSeries(rm, PrefixWithWorkload);
737+
for (auto const& ts : tss) {
738+
auto const& labels = ts.metric().labels();
739+
for (auto const& kv : kExtraLabelsLookup) {
740+
auto const& oks = kv.second.otel_keys;
741+
if (oks.empty()) {
742+
continue;
743+
}
744+
ASSERT_TRUE(labels.find(kv.first) != labels.end());
745+
EXPECT_EQ(labels.at(kv.first), kv.first);
746+
}
747+
}
748+
}
749+
750+
TEST(WithExtraLabels, NoOverwrites) {
751+
opentelemetry::sdk::metrics::PointDataAttributes pda;
752+
opentelemetry::sdk::common::OrderedAttributeMap existing_labels;
753+
existing_labels.SetAttribute("service_name", "do_not_overwrite");
754+
pda.attributes = existing_labels;
755+
pda.point_data = opentelemetry::sdk::metrics::SumPointData{};
756+
757+
opentelemetry::sdk::metrics::MetricData md;
758+
md.point_data_attr_.push_back(std::move(pda));
759+
md.instrument_descriptor.name_ = "metric-name";
760+
md.instrument_descriptor.unit_ = "unit";
761+
md.instrument_descriptor.type_ = {};
762+
md.instrument_descriptor.value_type_ = {};
763+
764+
opentelemetry::sdk::metrics::ScopeMetrics sm;
765+
sm.metric_data_.push_back(md);
766+
sm.metric_data_.push_back(std::move(md));
767+
768+
opentelemetry::sdk::metrics::ResourceMetrics rm;
769+
auto resource = ResourceWithAllExtraLabels();
770+
rm.resource_ = &resource;
771+
rm.scope_metric_data_.push_back(std::move(sm));
772+
773+
auto tss = ToTimeSeries(rm, PrefixWithWorkload);
774+
for (auto const& ts : tss) {
775+
auto const& labels = ts.metric().labels();
776+
for (auto const& kv : kExtraLabelsLookup) {
777+
auto const& oks = kv.second.otel_keys;
778+
if (oks.empty()) {
779+
continue;
780+
}
781+
ASSERT_TRUE(labels.find(kv.first) != labels.end());
782+
if (existing_labels.GetAttributes().find(kv.first) ==
783+
existing_labels.GetAttributes().end()) {
784+
EXPECT_EQ(labels.at(kv.first), kv.first);
785+
} else {
786+
EXPECT_EQ(labels.at(kv.first), "do_not_overwrite");
787+
}
788+
}
789+
}
790+
}
791+
700792
} // namespace
701793
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
702794
} // namespace otel_internal

0 commit comments

Comments
 (0)