Skip to content
This repository was archived by the owner on Jul 31, 2023. It is now read-only.

Commit e292a37

Browse files
bianpengyuang-easy
authored andcommitted
StackdriverOptions: add per-metric monitored resource. (#344)
Followup to #334.
1 parent 4622664 commit e292a37

File tree

5 files changed

+106
-10
lines changed

5 files changed

+106
-10
lines changed

opencensus/exporters/stats/stackdriver/internal/stackdriver_exporter.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ void Handler::ExportViewData(
9696
}
9797
const auto view_time_series =
9898
MakeTimeSeries(metric_name_prefix_, opts_.monitored_resource,
99-
datum.first, datum.second, opts_.opencensus_task);
99+
opts_.per_metric_monitored_resource, datum.first,
100+
datum.second, opts_.opencensus_task);
100101
time_series.insert(time_series.end(), view_time_series.begin(),
101102
view_time_series.end());
102103
}

opencensus/exporters/stats/stackdriver/internal/stackdriver_utils.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,14 +181,19 @@ void SetMetricDescriptor(
181181
std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
182182
absl::string_view metric_name_prefix,
183183
const google::api::MonitoredResource& monitored_resource,
184+
const std::unordered_map<std::string, google::api::MonitoredResource>&
185+
per_metric_monitored_resource,
184186
const opencensus::stats::ViewDescriptor& view_descriptor,
185187
const opencensus::stats::ViewData& data,
186188
absl::string_view opencensus_task) {
187189
// Set values that are common across all the rows.
188190
auto base_time_series = google::monitoring::v3::TimeSeries();
189191
base_time_series.mutable_metric()->set_type(
190192
MakeType(metric_name_prefix, view_descriptor.name()));
191-
if (monitored_resource.type().empty()) {
193+
auto iter = per_metric_monitored_resource.find(view_descriptor.name());
194+
if (iter != per_metric_monitored_resource.end()) {
195+
*base_time_series.mutable_resource() = iter->second;
196+
} else if (monitored_resource.type().empty()) {
192197
base_time_series.mutable_resource()->set_type(kDefaultResourceType);
193198
} else {
194199
*base_time_series.mutable_resource() = monitored_resource;

opencensus/exporters/stats/stackdriver/internal/stackdriver_utils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ void SetMetricDescriptor(
4040
std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
4141
absl::string_view metric_name_prefix,
4242
const google::api::MonitoredResource& monitored_resource,
43+
const std::unordered_map<std::string, google::api::MonitoredResource>&
44+
per_metric_monitored_resource,
4345
const opencensus::stats::ViewDescriptor& view_descriptor,
4446
const opencensus::stats::ViewData& data, absl::string_view opencensus_task);
4547

opencensus/exporters/stats/stackdriver/internal/stackdriver_utils_test.cc

Lines changed: 83 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ google::api::MonitoredResource DefaultResource() {
4141
return google::api::MonitoredResource();
4242
}
4343

44+
std::unordered_map<std::string, google::api::MonitoredResource>
45+
DefaultPerMetricResource() {
46+
return std::unordered_map<std::string, google::api::MonitoredResource>();
47+
}
48+
4449
TEST(StackdriverUtilsTest, SetMetricDescriptorNameAndType) {
4550
const std::string project_id = "projects/test-id";
4651
const std::string metric_name_prefix = "custom.googleapis.com/test/";
@@ -191,7 +196,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesDefaultResource) {
191196
const opencensus::stats::ViewData data =
192197
TestUtils::MakeViewData(view_descriptor, {{{}, 1.0}});
193198
const std::vector<google::monitoring::v3::TimeSeries> time_series =
194-
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
199+
MakeTimeSeries("", DefaultResource(), DefaultPerMetricResource(),
200+
view_descriptor, data, task);
195201
ASSERT_EQ(1, time_series.size());
196202
const auto& ts = time_series.front();
197203
EXPECT_EQ("global", ts.resource().type());
@@ -216,7 +222,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesCustomResource) {
216222
(*resource.mutable_labels())["instance_id"] = "1234";
217223
(*resource.mutable_labels())["zone"] = "my_zone";
218224
const std::vector<google::monitoring::v3::TimeSeries> time_series =
219-
MakeTimeSeries("", resource, view_descriptor, data, task);
225+
MakeTimeSeries("", resource, DefaultPerMetricResource(), view_descriptor,
226+
data, task);
220227
ASSERT_EQ(1, time_series.size());
221228
const auto& ts = time_series.front();
222229
EXPECT_EQ("gce_instance", ts.resource().type());
@@ -230,6 +237,70 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesCustomResource) {
230237
<< ts.resource().DebugString();
231238
}
232239

240+
TEST(StackdriverUtilsTest, MakeTimeSeriesPerMetricCustomResource) {
241+
const auto measure =
242+
opencensus::stats::MeasureDouble::Register("my_measure", "", "");
243+
const std::string task = "test_task";
244+
const std::string view_name = "test_view";
245+
const auto view_descriptor =
246+
opencensus::stats::ViewDescriptor()
247+
.set_name(view_name)
248+
.set_measure(measure.GetDescriptor().name())
249+
.set_aggregation(opencensus::stats::Aggregation::Sum());
250+
const opencensus::stats::ViewData data =
251+
TestUtils::MakeViewData(view_descriptor, {{{}, 1.0}});
252+
google::api::MonitoredResource resource;
253+
resource.set_type("gce_instance");
254+
(*resource.mutable_labels())["project_id"] = "my_project";
255+
(*resource.mutable_labels())["instance_id"] = "1234";
256+
(*resource.mutable_labels())["zone"] = "my_zone";
257+
std::unordered_map<std::string, google::api::MonitoredResource>
258+
per_metric_resources;
259+
per_metric_resources[view_name] = resource;
260+
const std::vector<google::monitoring::v3::TimeSeries> time_series =
261+
MakeTimeSeries("", DefaultResource(), per_metric_resources,
262+
view_descriptor, data, task);
263+
ASSERT_EQ(1, time_series.size());
264+
const auto& ts = time_series.front();
265+
EXPECT_EQ("gce_instance", ts.resource().type());
266+
using ::testing::Pair;
267+
EXPECT_THAT(ts.resource().labels(),
268+
::testing::UnorderedElementsAre(Pair("project_id", "my_project"),
269+
Pair("instance_id", "1234"),
270+
Pair("zone", "my_zone")))
271+
<< " resource() is:\n"
272+
<< ts.resource().DebugString();
273+
}
274+
275+
TEST(StackdriverUtilsTest, MakeTimeSeriesPerMetricCustomResourceNotMatch) {
276+
const auto measure =
277+
opencensus::stats::MeasureDouble::Register("my_measure", "", "");
278+
const std::string task = "test_task";
279+
const std::string view_name = "test_view";
280+
const auto view_descriptor =
281+
opencensus::stats::ViewDescriptor()
282+
.set_name(view_name)
283+
.set_measure(measure.GetDescriptor().name())
284+
.set_aggregation(opencensus::stats::Aggregation::Sum());
285+
const opencensus::stats::ViewData data =
286+
TestUtils::MakeViewData(view_descriptor, {{{}, 1.0}});
287+
google::api::MonitoredResource resource;
288+
resource.set_type("gce_instance");
289+
(*resource.mutable_labels())["project_id"] = "my_project";
290+
(*resource.mutable_labels())["instance_id"] = "1234";
291+
(*resource.mutable_labels())["zone"] = "my_zone";
292+
std::unordered_map<std::string, google::api::MonitoredResource>
293+
per_metric_resources;
294+
per_metric_resources["some_other_view"] = resource;
295+
const std::vector<google::monitoring::v3::TimeSeries> time_series =
296+
MakeTimeSeries("", DefaultResource(), per_metric_resources,
297+
view_descriptor, data, task);
298+
ASSERT_EQ(1, time_series.size());
299+
const auto& ts = time_series.front();
300+
EXPECT_EQ("global", ts.resource().type());
301+
EXPECT_EQ(0, ts.resource().labels_size());
302+
}
303+
233304
TEST(StackdriverUtilsTest, MakeTimeSeriesSumDoubleAndTypes) {
234305
const std::string metric_name_prefix = "custom.googleapis.com/test/";
235306
const auto measure =
@@ -248,8 +319,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumDoubleAndTypes) {
248319
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
249320
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
250321
const std::vector<google::monitoring::v3::TimeSeries> time_series =
251-
MakeTimeSeries(metric_name_prefix, DefaultResource(), view_descriptor,
252-
data, task);
322+
MakeTimeSeries(metric_name_prefix, DefaultResource(),
323+
DefaultPerMetricResource(), view_descriptor, data, task);
253324

254325
for (const auto& ts : time_series) {
255326
EXPECT_EQ("custom.googleapis.com/test/test_view", ts.metric().type());
@@ -289,7 +360,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumInt) {
289360
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
290361
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
291362
const std::vector<google::monitoring::v3::TimeSeries> time_series =
292-
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
363+
MakeTimeSeries("", DefaultResource(), DefaultPerMetricResource(),
364+
view_descriptor, data, task);
293365

294366
for (const auto& ts : time_series) {
295367
ASSERT_EQ(1, ts.points_size());
@@ -329,7 +401,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesCountDouble) {
329401
view_descriptor,
330402
{{{"v1", "v1"}, 1.0}, {{"v1", "v1"}, 3.0}, {{"v1", "v2"}, 2.0}});
331403
const std::vector<google::monitoring::v3::TimeSeries> time_series =
332-
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
404+
MakeTimeSeries("", DefaultResource(), DefaultPerMetricResource(),
405+
view_descriptor, data, task);
333406

334407
for (const auto& ts : time_series) {
335408
ASSERT_EQ(1, ts.points_size());
@@ -372,7 +445,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesDistributionDouble) {
372445
view_descriptor,
373446
{{{"v1", "v1"}, -1.0}, {{"v1", "v1"}, 7.0}, {{"v1", "v2"}, 1.0}});
374447
const std::vector<google::monitoring::v3::TimeSeries> time_series =
375-
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
448+
MakeTimeSeries("", DefaultResource(), DefaultPerMetricResource(),
449+
view_descriptor, data, task);
376450

377451
for (const auto& ts : time_series) {
378452
ASSERT_EQ(1, ts.points_size());
@@ -418,7 +492,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesLastValueInt) {
418492
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
419493
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
420494
const std::vector<google::monitoring::v3::TimeSeries> time_series =
421-
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
495+
MakeTimeSeries("", DefaultResource(), DefaultPerMetricResource(),
496+
view_descriptor, data, task);
422497

423498
for (const auto& ts : time_series) {
424499
ASSERT_EQ(1, ts.points_size());

opencensus/exporters/stats/stackdriver/stackdriver_exporter.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ struct StackdriverOptions {
4848
// https://cloud.google.com/monitoring/api/resources
4949
google::api::MonitoredResource monitored_resource;
5050

51+
// Optional: per metric Stackdriver MonitoredResource to use. Key is the view
52+
// descriptor name, value is the monitored resource to use for that view.
53+
//
54+
// If the view name cannot be found in the map, the exporter will use the
55+
// monitored_resource set above, or the "global" resource if that is not
56+
// set.
57+
//
58+
// See also:
59+
// https://cloud.google.com/monitoring/api/ref_v3/rpc/google.api#google.api.MonitoredResource
60+
// https://cloud.google.com/monitoring/api/resources
61+
std::unordered_map<std::string, google::api::MonitoredResource>
62+
per_metric_monitored_resource;
63+
5164
// Optional: the name prefix for Stackdriver metrics.
5265
//
5366
// It is suggested to use a prefix with a custom or external domain name, for

0 commit comments

Comments
 (0)