Skip to content

Commit 08d6741

Browse files
committed
resolving comments
1 parent 5517146 commit 08d6741

File tree

8 files changed

+55
-174
lines changed

8 files changed

+55
-174
lines changed

google/cloud/opentelemetry/internal/monitoring_exporter.cc

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,28 @@ std::string FormatProjectFullName(std::string const& project) {
3131
return absl::StrCat("projects/", project);
3232
}
3333

34+
otel_internal::ResourceFilterDataFn MakeFilter(Options const& options) {
35+
if (!options.has<otel::ResourceFilterDataFnOption>()) {
36+
return nullptr;
37+
}
38+
39+
// Get the excluded labels list.
40+
auto const& excluded = options.get<otel::ResourceFilterDataFnOption>();
41+
if (excluded.empty()) return nullptr;
42+
43+
// Capture by value to avoid dangling reference in the lambda.
44+
return [excluded = std::move(excluded)](std::string const& key) -> bool {
45+
return excluded.count(key) > 0;
46+
};
47+
}
48+
3449
} // namespace
3550

3651
MonitoringExporter::MonitoringExporter(
3752
std::shared_ptr<monitoring_v3::MetricServiceConnection> conn,
38-
otel::MonitoredResourceFromDataFn dynamic_resource_fn,
39-
otel::ResourceFilterDataFn resource_filter_fn, Options const& options)
53+
otel_internal::MonitoredResourceFromDataFn dynamic_resource_fn,
54+
otel_internal::ResourceFilterDataFn resource_filter_fn,
55+
Options const& options)
4056
: client_(std::move(conn)),
4157
formatter_(options.get<otel::MetricNameFormatterOption>()),
4258
use_service_time_series_(options.get<otel::ServiceTimeSeriesOption>()),
@@ -48,9 +64,7 @@ MonitoringExporter::MonitoringExporter(
4864
Project project,
4965
std::shared_ptr<monitoring_v3::MetricServiceConnection> conn,
5066
Options const& options)
51-
: MonitoringExporter(std::move(conn),
52-
options.get<otel::MonitoredResourceFromDataFnOption>(),
53-
options.get<otel::ResourceFilterDataFnOption>(),
67+
: MonitoringExporter(std::move(conn), nullptr, MakeFilter(options),
5468
options) {
5569
project_ = std::move(project);
5670
}
@@ -140,8 +154,8 @@ Options DefaultOptions(Options o) {
140154
}
141155

142156
std::unique_ptr<opentelemetry::sdk::metrics::PushMetricExporter>
143-
MakeMonitoringExporter(otel::MonitoredResourceFromDataFn dynamic_resource_fn,
144-
otel::ResourceFilterDataFn resource_filter_fn,
157+
MakeMonitoringExporter(MonitoredResourceFromDataFn dynamic_resource_fn,
158+
ResourceFilterDataFn resource_filter_fn,
145159
Options options) {
146160
// TODO(#15321): Determine which options, if any, should be passed along from
147161
// the options parameter to MakeMetricServiceConnection.
@@ -154,8 +168,8 @@ MakeMonitoringExporter(otel::MonitoredResourceFromDataFn dynamic_resource_fn,
154168

155169
std::unique_ptr<opentelemetry::sdk::metrics::PushMetricExporter>
156170
MakeMonitoringExporter(
157-
otel::MonitoredResourceFromDataFn dynamic_resource_fn,
158-
otel::ResourceFilterDataFn resource_filter_fn,
171+
MonitoredResourceFromDataFn dynamic_resource_fn,
172+
ResourceFilterDataFn resource_filter_fn,
159173
std::shared_ptr<monitoring_v3::MetricServiceConnection> conn,
160174
Options options) {
161175
options = DefaultOptions(std::move(options));

google/cloud/opentelemetry/internal/monitoring_exporter.h

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,25 @@ namespace cloud {
3333
namespace otel_internal {
3434
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
3535

36+
// For use with dynamic monitored resources, this function constructs the
37+
// correct MonitoredResource from the PointDataAttributes passed in. This
38+
// function is called in ToTimeSeriesWithResources.
39+
using MonitoredResourceFromDataFn =
40+
std::function<std::pair<std::string, google::api::MonitoredResource>(
41+
opentelemetry::sdk::metrics::PointDataAttributes const&)>;
42+
43+
// For use with dynamic monitored resources, this function is used in ToMetric
44+
// to indicate which labels should be skipped when populating the labels field
45+
// of the google::api::Metric proto.
46+
using ResourceFilterDataFn = std::function<bool(std::string const&)>;
47+
3648
class MonitoringExporter final
3749
: public opentelemetry::sdk::metrics::PushMetricExporter {
3850
public:
3951
MonitoringExporter(
4052
std::shared_ptr<monitoring_v3::MetricServiceConnection> conn,
41-
otel::MonitoredResourceFromDataFn dynamic_resource_fn,
42-
otel::ResourceFilterDataFn resource_filter_fn, Options const& options);
53+
otel_internal::MonitoredResourceFromDataFn dynamic_resource_fn,
54+
otel_internal::ResourceFilterDataFn resource_filter_fn, Options const& options);
4355

4456
MonitoringExporter(
4557
Project project,
@@ -71,21 +83,21 @@ class MonitoringExporter final
7183
otel::MetricNameFormatterOption::Type formatter_;
7284
bool use_service_time_series_;
7385
absl::optional<google::api::MonitoredResource> mr_proto_;
74-
otel::MonitoredResourceFromDataFn dynamic_resource_fn_;
75-
otel::ResourceFilterDataFn resource_filter_fn_;
86+
otel_internal::MonitoredResourceFromDataFn dynamic_resource_fn_;
87+
otel_internal::ResourceFilterDataFn resource_filter_fn_;
7688
};
7789

7890
Options DefaultOptions(Options o);
7991

8092
std::unique_ptr<opentelemetry::sdk::metrics::PushMetricExporter>
81-
MakeMonitoringExporter(otel::MonitoredResourceFromDataFn dynamic_resource_fn,
82-
otel::ResourceFilterDataFn resource_filter_fn,
93+
MakeMonitoringExporter(MonitoredResourceFromDataFn dynamic_resource_fn,
94+
ResourceFilterDataFn resource_filter_fn,
8395
Options options = {});
8496

8597
std::unique_ptr<opentelemetry::sdk::metrics::PushMetricExporter>
8698
MakeMonitoringExporter(
87-
otel::MonitoredResourceFromDataFn dynamic_resource_fn,
88-
otel::ResourceFilterDataFn resource_filter_fn,
99+
MonitoredResourceFromDataFn dynamic_resource_fn,
100+
ResourceFilterDataFn resource_filter_fn,
89101
std::shared_ptr<monitoring_v3::MetricServiceConnection> conn,
90102
Options options = {});
91103

google/cloud/opentelemetry/internal/time_series.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ google::api::Metric ToMetric(
133133
opentelemetry::sdk::metrics::PointAttributes const& attributes,
134134
opentelemetry::sdk::resource::Resource const* resource,
135135
std::function<std::string(std::string)> const& name_formatter,
136-
otel::ResourceFilterDataFn const& resource_filter_fn) {
136+
ResourceFilterDataFn const& resource_filter_fn) {
137137
auto add_label = [&resource_filter_fn](auto& labels, auto key,
138138
auto const& value) {
139139
// GCM labels match on the regex: R"([a-zA-Z_][a-zA-Z0-9_]*)".
@@ -304,8 +304,8 @@ std::unordered_map<std::string, std::vector<google::monitoring::v3::TimeSeries>>
304304
ToTimeSeriesWithResources(
305305
opentelemetry::sdk::metrics::ResourceMetrics const& data,
306306
std::function<std::string(std::string)> const& metrics_name_formatter,
307-
otel::ResourceFilterDataFn const& resource_filter_fn,
308-
otel::MonitoredResourceFromDataFn const& dynamic_resource_fn) {
307+
ResourceFilterDataFn const& resource_filter_fn,
308+
MonitoredResourceFromDataFn const& dynamic_resource_fn) {
309309
std::unordered_map<std::string,
310310
std::vector<google::monitoring::v3::TimeSeries>>
311311
tss_map;

google/cloud/opentelemetry/internal/time_series.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ google::api::Metric ToMetric(
4141
opentelemetry::sdk::metrics::PointAttributes const& attributes,
4242
opentelemetry::sdk::resource::Resource const* resource,
4343
std::function<std::string(std::string)> const& metrics_name_formatter,
44-
otel::ResourceFilterDataFn const& resource_filter_fn);
44+
ResourceFilterDataFn const& resource_filter_fn);
4545

4646
google::api::Metric ToMetric(
4747
opentelemetry::sdk::metrics::MetricData const& metric_data,
@@ -94,8 +94,8 @@ std::unordered_map<std::string, std::vector<google::monitoring::v3::TimeSeries>>
9494
ToTimeSeriesWithResources(
9595
opentelemetry::sdk::metrics::ResourceMetrics const& data,
9696
std::function<std::string(std::string)> const& metrics_name_formatter,
97-
otel::ResourceFilterDataFn const& resource_filter_fn,
98-
otel::MonitoredResourceFromDataFn const& resource_fn);
97+
ResourceFilterDataFn const& resource_filter_fn,
98+
MonitoredResourceFromDataFn const& resource_fn);
9999

100100
bool IsEmptyTimeSeries(
101101
opentelemetry::sdk::metrics::ResourceMetrics const& data);

google/cloud/opentelemetry/monitoring_exporter.h

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include "google/cloud/opentelemetry/internal/recordable.h"
2020
#include "google/cloud/project.h"
2121
#include "google/cloud/version.h"
22-
#include <opentelemetry/sdk/metrics/data/metric_data.h>
2322
#include <opentelemetry/sdk/metrics/push_metric_exporter.h>
2423
#include <functional>
2524
#include <memory>
@@ -30,18 +29,6 @@ namespace cloud {
3029
namespace otel {
3130
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
3231

33-
// For use with dynamic monitored resources, this function constructs the
34-
// correct MonitoredResource from the PointDataAttributes passed in. This
35-
// function is called in ToTimeSeriesWithResources.
36-
using MonitoredResourceFromDataFn =
37-
std::function<std::pair<std::string, google::api::MonitoredResource>(
38-
opentelemetry::sdk::metrics::PointDataAttributes const&)>;
39-
40-
// For use with dynamic monitored resources, this function is used in ToMetric
41-
// to indicate which labels should be skipped when populating the labels field
42-
// of the google::api::Metric proto.
43-
using ResourceFilterDataFn = std::function<bool(std::string const&)>;
44-
4532
/**
4633
* Change formatting for metric names.
4734
*
@@ -88,24 +75,14 @@ struct MonitoredResourceOption {
8875
using Type = google::api::MonitoredResource;
8976
};
9077

91-
/**
92-
* Override the monitored resource builder.
93-
*
94-
* This option is primarily relevant to Google applications and libraries. It
95-
* can be ignored by external developers.
96-
*/
97-
struct MonitoredResourceFromDataFnOption {
98-
using Type = MonitoredResourceFromDataFn;
99-
};
100-
10178
/**
10279
* Filter resource labels.
10380
*
10481
* This option is primarily relevant to Google applications and libraries. It
10582
* can be ignored by external developers.
10683
*/
10784
struct ResourceFilterDataFnOption {
108-
using Type = ResourceFilterDataFn;
85+
using Type = std::set<std::string>;
10986
};
11087

11188
std::unique_ptr<opentelemetry::sdk::metrics::PushMetricExporter>

google/cloud/opentelemetry/monitoring_exporter_test.cc

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -264,35 +264,6 @@ TEST(MonitoringExporter, CustomMonitoredResource) {
264264
EXPECT_EQ(result, opentelemetry::sdk::common::ExportResult::kSuccess);
265265
}
266266

267-
TEST(MonitoringExporter, CustomMonitoredResourceFromDataFunction) {
268-
auto mock =
269-
std::make_shared<monitoring_v3_mocks::MockMetricServiceConnection>();
270-
EXPECT_CALL(*mock, CreateTimeSeries)
271-
.WillOnce(
272-
[](google::monitoring::v3::CreateTimeSeriesRequest const& request) {
273-
EXPECT_THAT(request.name(), "projects/test-project");
274-
EXPECT_THAT(request.time_series(), SizeIs(2));
275-
EXPECT_THAT(request.time_series(),
276-
Each(ResourceType("test_resource")));
277-
return Status();
278-
});
279-
280-
// Define a function that maps PointDataAttributes to a MonitoredResource.
281-
auto resource_fn = [](opentelemetry::sdk::metrics::PointDataAttributes const&)
282-
-> std::pair<std::string, google::api::MonitoredResource> {
283-
google::api::MonitoredResource resource;
284-
resource.set_type("test_resource");
285-
return {"test-project", resource};
286-
};
287-
288-
auto options = Options{}.set<MonitoredResourceFromDataFnOption>(resource_fn);
289-
auto exporter =
290-
MakeMonitoringExporter(Project("test-project"), std::move(mock), options);
291-
auto data = MakeResourceMetrics(/*expected_time_series_count=*/2);
292-
auto result = exporter->Export(data);
293-
EXPECT_EQ(result, opentelemetry::sdk::common::ExportResult::kSuccess);
294-
}
295-
296267
TEST(MonitoringExporter, CustomResourceFilterDataFunction) {
297268
auto mock =
298269
std::make_shared<monitoring_v3_mocks::MockMetricServiceConnection>();
@@ -304,12 +275,7 @@ TEST(MonitoringExporter, CustomResourceFilterDataFunction) {
304275
return Status();
305276
});
306277

307-
// Define a function that filters out labels starting with "internal_".
308-
auto filter_fn = [](std::string const& label) -> bool {
309-
return label.rfind("internal_", 0) == 0;
310-
};
311-
312-
auto options = Options{}.set<ResourceFilterDataFnOption>(filter_fn);
278+
auto options = Options{}.set<ResourceFilterDataFnOption>({"test_label"});
313279
auto exporter =
314280
MakeMonitoringExporter(Project("test-project"), std::move(mock), options);
315281
auto data = MakeResourceMetrics(/*expected_time_series_count=*/2);

google/cloud/storage/internal/grpc/metrics_exporter_impl.cc

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -79,26 +79,6 @@ class ExporterRegistry {
7979
std::mutex mu_;
8080
};
8181

82-
otel::ResourceFilterDataFn MakeFilter(Options const& options) {
83-
// Check for explicit filter function first.
84-
if (options.has<otel::ResourceFilterDataFnOption>()) {
85-
return options.get<otel::ResourceFilterDataFnOption>();
86-
}
87-
88-
// Check for excluded labels list.
89-
if (!options.has<storage_experimental::GrpcMetricsExcludedLabelsOption>()) {
90-
return nullptr;
91-
}
92-
auto const& excluded =
93-
options.get<storage_experimental::GrpcMetricsExcludedLabelsOption>();
94-
if (excluded.empty()) return nullptr;
95-
96-
// Capture by value to avoid dangling reference in the lambda.
97-
return [excluded](std::string const& key) -> bool {
98-
return excluded.count(key) > 0;
99-
};
100-
}
101-
10282
} // namespace
10383

10484
absl::optional<ExporterConfig> MakeMeterProviderConfig(
@@ -111,7 +91,10 @@ absl::optional<ExporterConfig> MakeMeterProviderConfig(
11191
if (!project) return absl::nullopt;
11292

11393
auto exporter_options = MetricsExporterOptions(*project, resource);
114-
exporter_options.set<otel::ResourceFilterDataFnOption>(MakeFilter(options));
94+
if (options.has<storage_experimental::GrpcMetricsExcludedLabelsOption>()) {
95+
exporter_options.set<otel::ResourceFilterDataFnOption>(
96+
options.get<storage_experimental::GrpcMetricsExcludedLabelsOption>());
97+
}
11598

11699
auto exporter_connection_options = MetricsExporterConnectionOptions(options);
117100
return ExporterConfig{std::move(*project), std::move(exporter_options),

google/cloud/storage/internal/grpc/metrics_exporter_impl_test.cc

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -156,77 +156,6 @@ TEST(GrpcMetricsExporter, ReaderOptionsAreSetFromConfig) {
156156
std::chrono::milliseconds(expected_timeout));
157157
}
158158

159-
TEST(GrpcMetricsExporter, MakeFilterWithServiceName) {
160-
auto excluded_labels = std::set<std::string>{"service_name"};
161-
auto options =
162-
TestOptions().set<storage_experimental::GrpcMetricsExcludedLabelsOption>(
163-
excluded_labels);
164-
165-
auto config = MakeMeterProviderConfig(FullResource(), options);
166-
ASSERT_TRUE(config.has_value());
167-
168-
// Test that filter option is set.
169-
ASSERT_TRUE(config->exporter_options.has<otel::ResourceFilterDataFnOption>());
170-
auto filter_fn =
171-
config->exporter_options.get<otel::ResourceFilterDataFnOption>();
172-
ASSERT_NE(filter_fn, nullptr);
173-
174-
// Test filtering behavior.
175-
EXPECT_TRUE(filter_fn("service_name"));
176-
EXPECT_FALSE(filter_fn("service_version"));
177-
}
178-
179-
TEST(GrpcMetricsExporter, MakeFilterWithExplicitFilterFunction) {
180-
auto explicit_filter = [](std::string const& key) {
181-
return key == "explicit_test";
182-
};
183-
auto excluded_labels = std::set<std::string>{"service_name"};
184-
185-
// Test when explicit filter function takes precedence.
186-
auto options =
187-
TestOptions()
188-
.set<otel::ResourceFilterDataFnOption>(explicit_filter)
189-
.set<storage_experimental::GrpcMetricsExcludedLabelsOption>(
190-
excluded_labels);
191-
auto config = MakeMeterProviderConfig(FullResource(), options);
192-
ASSERT_TRUE(config.has_value());
193-
194-
auto filter_fn =
195-
config->exporter_options.get<otel::ResourceFilterDataFnOption>();
196-
ASSERT_NE(filter_fn, nullptr);
197-
198-
// Explicit filter should take precedence
199-
EXPECT_TRUE(filter_fn("explicit_test"));
200-
EXPECT_FALSE(filter_fn("service_name"));
201-
}
202-
203-
TEST(GrpcMetricsExporter, MakeFilterWithEmptyExcludedLabels) {
204-
auto excluded_labels = std::set<std::string>{};
205-
206-
// Test when empty excluded labels returns nullptr.
207-
auto options =
208-
TestOptions().set<storage_experimental::GrpcMetricsExcludedLabelsOption>(
209-
excluded_labels);
210-
auto config = MakeMeterProviderConfig(FullResource(), options);
211-
ASSERT_TRUE(config.has_value());
212-
213-
auto filter_fn =
214-
config->exporter_options.get<otel::ResourceFilterDataFnOption>();
215-
EXPECT_EQ(filter_fn, nullptr);
216-
}
217-
218-
TEST(GrpcMetricsExporter, MakeFilterWithNoExcludedLabelsOption) {
219-
auto options = TestOptions();
220-
221-
// Test when no excluded labels option returns nullptr.
222-
auto config = MakeMeterProviderConfig(FullResource(), options);
223-
ASSERT_TRUE(config.has_value());
224-
225-
auto filter_fn =
226-
config->exporter_options.get<otel::ResourceFilterDataFnOption>();
227-
EXPECT_EQ(filter_fn, nullptr);
228-
}
229-
230159
} // namespace
231160
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
232161
} // namespace storage_internal

0 commit comments

Comments
 (0)