Skip to content

Commit b17d474

Browse files
committed
add tests
1 parent 1775a3e commit b17d474

File tree

5 files changed

+115
-23
lines changed

5 files changed

+115
-23
lines changed

google/cloud/opentelemetry/internal/monitored_resource.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,6 @@ struct AsStringVisitor {
4949
std::string operator()(bool const& v) const { return v ? "true" : "false"; }
5050
};
5151

52-
struct OTelKeyMatch {
53-
std::vector<std::string> otel_keys;
54-
absl::optional<std::string> fallback = absl::nullopt;
55-
};
56-
5752
class MonitoredResourceProvider {
5853
public:
5954
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 & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
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"
1716
#include "google/cloud/opentelemetry/internal/monitored_resource.h"
1817
#include "google/cloud/internal/absl_str_replace_quiet.h"
@@ -21,10 +20,8 @@
2120
#include <opentelemetry/common/attribute_value.h>
2221
#include <opentelemetry/sdk/metrics/data/metric_data.h>
2322
#include <opentelemetry/sdk/metrics/export/metric_producer.h>
24-
#include <opentelemetry/sdk/resource/semantic_conventions.h>
2523
#include <cctype>
2624
#include <string>
27-
#include <unordered_map>
2825
#include <vector>
2926

3027
namespace google {
@@ -33,18 +30,6 @@ namespace otel_internal {
3330
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
3431
namespace {
3532

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-
4833
google::protobuf::Timestamp ToProtoTimestamp(
4934
opentelemetry::common::SystemTimestamp ts) {
5035
return internal::ToProtoTimestamp(
@@ -255,14 +240,15 @@ std::vector<google::monitoring::v3::CreateTimeSeriesRequest> ToRequests(
255240

256241
std::vector<google::monitoring::v3::TimeSeries> WithExtraLabels(
257242
opentelemetry::sdk::metrics::ResourceMetrics const& data,
258-
std::vector<google::monitoring::v3::TimeSeries>& tss) {
243+
std::vector<google::monitoring::v3::TimeSeries>& tss,
244+
std::unordered_map<std::string, OTelKeyMatch> const& extra_labels) {
259245
if (!data.resource_) {
260246
return tss;
261247
}
262248

263249
opentelemetry::sdk::resource::ResourceAttributes const& attributes =
264250
data.resource_->GetAttributes();
265-
for (auto const& kv : kExtraLabelsLookup) {
251+
for (auto const& kv : extra_labels) {
266252
auto const& oks = kv.second.otel_keys;
267253
auto found = std::find_first_of(
268254
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: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
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 <string>
2830

2931
namespace google {
3032
namespace cloud {
@@ -155,6 +157,18 @@ auto IsTestResource() {
155157
Pair("instance_id", "1020304050607080900"))));
156158
}
157159

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+
158172
auto MetricType(std::string const& type) {
159173
return ResultOf(
160174
"metric.type",
@@ -697,6 +711,82 @@ TEST(ToRequests, Batches) {
697711
}
698712
}
699713

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+
700790
} // namespace
701791
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
702792
} // namespace otel_internal

0 commit comments

Comments
 (0)