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

Commit 4622664

Browse files
authored
StackdriverOptions: add monitored_resource. (#343)
Fixes #334.
1 parent 57cbb8b commit 4622664

File tree

5 files changed

+84
-9
lines changed

5 files changed

+84
-9
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ void Handler::ExportViewData(
9494
if (!MaybeRegisterView(datum.first)) {
9595
continue;
9696
}
97-
const auto view_time_series = MakeTimeSeries(
98-
metric_name_prefix_, datum.first, datum.second, opts_.opencensus_task);
97+
const auto view_time_series =
98+
MakeTimeSeries(metric_name_prefix_, opts_.monitored_resource,
99+
datum.first, datum.second, opts_.opencensus_task);
99100
time_series.insert(time_series.end(), view_time_series.begin(),
100101
view_time_series.end());
101102
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,19 @@ void SetMetricDescriptor(
180180

181181
std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
182182
absl::string_view metric_name_prefix,
183+
const google::api::MonitoredResource& monitored_resource,
183184
const opencensus::stats::ViewDescriptor& view_descriptor,
184185
const opencensus::stats::ViewData& data,
185186
absl::string_view opencensus_task) {
186187
// Set values that are common across all the rows.
187188
auto base_time_series = google::monitoring::v3::TimeSeries();
188189
base_time_series.mutable_metric()->set_type(
189190
MakeType(metric_name_prefix, view_descriptor.name()));
190-
base_time_series.mutable_resource()->set_type(kDefaultResourceType);
191+
if (monitored_resource.type().empty()) {
192+
base_time_series.mutable_resource()->set_type(kDefaultResourceType);
193+
} else {
194+
*base_time_series.mutable_resource() = monitored_resource;
195+
}
191196
auto* interval = base_time_series.add_points()->mutable_interval();
192197
// Stackdriver doesn't like start_time and end_time being different for GAUGE
193198
// metrics.

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "absl/strings/string_view.h"
2121
#include "google/api/metric.pb.h"
22+
#include "google/api/monitored_resource.pb.h"
2223
#include "google/monitoring/v3/metric.pb.h"
2324
#include "google/protobuf/timestamp.pb.h"
2425
#include "opencensus/stats/stats.h"
@@ -38,6 +39,7 @@ void SetMetricDescriptor(
3839
// Converts each row of 'data' into TimeSeries.
3940
std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
4041
absl::string_view metric_name_prefix,
42+
const google::api::MonitoredResource& monitored_resource,
4143
const opencensus::stats::ViewDescriptor& view_descriptor,
4244
const opencensus::stats::ViewData& data, absl::string_view opencensus_task);
4345

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

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ namespace exporters {
3737
namespace stats {
3838
namespace {
3939

40+
google::api::MonitoredResource DefaultResource() {
41+
return google::api::MonitoredResource();
42+
}
43+
4044
TEST(StackdriverUtilsTest, SetMetricDescriptorNameAndType) {
4145
const std::string project_id = "projects/test-id";
4246
const std::string metric_name_prefix = "custom.googleapis.com/test/";
@@ -174,6 +178,58 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorDescription) {
174178
EXPECT_EQ(description, metric_descriptor.description());
175179
}
176180

181+
TEST(StackdriverUtilsTest, MakeTimeSeriesDefaultResource) {
182+
const auto measure =
183+
opencensus::stats::MeasureDouble::Register("my_measure", "", "");
184+
const std::string task = "test_task";
185+
const std::string view_name = "test_view";
186+
const auto view_descriptor =
187+
opencensus::stats::ViewDescriptor()
188+
.set_name(view_name)
189+
.set_measure(measure.GetDescriptor().name())
190+
.set_aggregation(opencensus::stats::Aggregation::Sum());
191+
const opencensus::stats::ViewData data =
192+
TestUtils::MakeViewData(view_descriptor, {{{}, 1.0}});
193+
const std::vector<google::monitoring::v3::TimeSeries> time_series =
194+
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
195+
ASSERT_EQ(1, time_series.size());
196+
const auto& ts = time_series.front();
197+
EXPECT_EQ("global", ts.resource().type());
198+
EXPECT_EQ(0, ts.resource().labels_size());
199+
}
200+
201+
TEST(StackdriverUtilsTest, MakeTimeSeriesCustomResource) {
202+
const auto measure =
203+
opencensus::stats::MeasureDouble::Register("my_measure", "", "");
204+
const std::string task = "test_task";
205+
const std::string view_name = "test_view";
206+
const auto view_descriptor =
207+
opencensus::stats::ViewDescriptor()
208+
.set_name(view_name)
209+
.set_measure(measure.GetDescriptor().name())
210+
.set_aggregation(opencensus::stats::Aggregation::Sum());
211+
const opencensus::stats::ViewData data =
212+
TestUtils::MakeViewData(view_descriptor, {{{}, 1.0}});
213+
google::api::MonitoredResource resource;
214+
resource.set_type("gce_instance");
215+
(*resource.mutable_labels())["project_id"] = "my_project";
216+
(*resource.mutable_labels())["instance_id"] = "1234";
217+
(*resource.mutable_labels())["zone"] = "my_zone";
218+
const std::vector<google::monitoring::v3::TimeSeries> time_series =
219+
MakeTimeSeries("", resource, view_descriptor, data, task);
220+
ASSERT_EQ(1, time_series.size());
221+
const auto& ts = time_series.front();
222+
EXPECT_EQ("gce_instance", ts.resource().type());
223+
// EXPECT_EQ(0, ts.resource().labels_size());
224+
using ::testing::Pair;
225+
EXPECT_THAT(ts.resource().labels(),
226+
::testing::UnorderedElementsAre(Pair("project_id", "my_project"),
227+
Pair("instance_id", "1234"),
228+
Pair("zone", "my_zone")))
229+
<< " resource() is:\n"
230+
<< ts.resource().DebugString();
231+
}
232+
177233
TEST(StackdriverUtilsTest, MakeTimeSeriesSumDoubleAndTypes) {
178234
const std::string metric_name_prefix = "custom.googleapis.com/test/";
179235
const auto measure =
@@ -192,11 +248,11 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumDoubleAndTypes) {
192248
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
193249
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
194250
const std::vector<google::monitoring::v3::TimeSeries> time_series =
195-
MakeTimeSeries(metric_name_prefix, view_descriptor, data, task);
251+
MakeTimeSeries(metric_name_prefix, DefaultResource(), view_descriptor,
252+
data, task);
196253

197254
for (const auto& ts : time_series) {
198255
EXPECT_EQ("custom.googleapis.com/test/test_view", ts.metric().type());
199-
EXPECT_EQ("global", ts.resource().type());
200256
ASSERT_EQ(1, ts.points_size());
201257
EXPECT_EQ(absl::ToUnixSeconds(data.start_time()),
202258
ts.points(0).interval().start_time().seconds());
@@ -233,7 +289,7 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumInt) {
233289
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
234290
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
235291
const std::vector<google::monitoring::v3::TimeSeries> time_series =
236-
MakeTimeSeries("", view_descriptor, data, task);
292+
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
237293

238294
for (const auto& ts : time_series) {
239295
ASSERT_EQ(1, ts.points_size());
@@ -273,7 +329,7 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesCountDouble) {
273329
view_descriptor,
274330
{{{"v1", "v1"}, 1.0}, {{"v1", "v1"}, 3.0}, {{"v1", "v2"}, 2.0}});
275331
const std::vector<google::monitoring::v3::TimeSeries> time_series =
276-
MakeTimeSeries("", view_descriptor, data, task);
332+
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
277333

278334
for (const auto& ts : time_series) {
279335
ASSERT_EQ(1, ts.points_size());
@@ -316,7 +372,7 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesDistributionDouble) {
316372
view_descriptor,
317373
{{{"v1", "v1"}, -1.0}, {{"v1", "v1"}, 7.0}, {{"v1", "v2"}, 1.0}});
318374
const std::vector<google::monitoring::v3::TimeSeries> time_series =
319-
MakeTimeSeries("", view_descriptor, data, task);
375+
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
320376

321377
for (const auto& ts : time_series) {
322378
ASSERT_EQ(1, ts.points_size());
@@ -362,7 +418,7 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesLastValueInt) {
362418
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
363419
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
364420
const std::vector<google::monitoring::v3::TimeSeries> time_series =
365-
MakeTimeSeries("", view_descriptor, data, task);
421+
MakeTimeSeries("", DefaultResource(), view_descriptor, data, task);
366422

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

opencensus/exporters/stats/stackdriver/stackdriver_exporter.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "absl/base/macros.h"
2121
#include "absl/strings/string_view.h"
2222
#include "absl/time/time.h"
23+
#include "google/api/monitored_resource.pb.h"
2324

2425
namespace opencensus {
2526
namespace exporters {
@@ -37,6 +38,16 @@ struct StackdriverOptions {
3738
// The RPC deadline to use when exporting to Stackdriver.
3839
absl::Duration rpc_deadline = absl::Seconds(5);
3940

41+
// Optional: the Stackdriver MonitoredResource to use.
42+
//
43+
// If not set (i.e. if monitored_resource.type is empty), the exporter will
44+
// use the "global" resource.
45+
//
46+
// See also:
47+
// https://cloud.google.com/monitoring/api/ref_v3/rpc/google.api#google.api.MonitoredResource
48+
// https://cloud.google.com/monitoring/api/resources
49+
google::api::MonitoredResource monitored_resource;
50+
4051
// Optional: the name prefix for Stackdriver metrics.
4152
//
4253
// It is suggested to use a prefix with a custom or external domain name, for

0 commit comments

Comments
 (0)