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

Commit 57cbb8b

Browse files
authored
StackdriverOptions: add metric_name_prefix. (#336)
Fixes #291.
1 parent 858195c commit 57cbb8b

File tree

5 files changed

+65
-48
lines changed

5 files changed

+65
-48
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ constexpr char kGoogleStackdriverStatsAddress[] = "monitoring.googleapis.com";
4343
constexpr char kProjectIdPrefix[] = "projects/";
4444
// Stackdriver limits a single CreateTimeSeries request to 200 series.
4545
constexpr int kTimeSeriesBatchSize = 200;
46+
constexpr char kDefaultMetricNamePrefix[] = "custom.googleapis.com/opencensus/";
4647

4748
class Handler : public ::opencensus::stats::StatsExporter::Handler {
4849
public:
@@ -64,6 +65,7 @@ class Handler : public ::opencensus::stats::StatsExporter::Handler {
6465

6566
const StackdriverOptions opts_;
6667
const std::string project_id_;
68+
const std::string metric_name_prefix_;
6769
const std::unique_ptr<google::monitoring::v3::MetricService::Stub> stub_;
6870
mutable absl::Mutex mu_;
6971
std::unordered_map<std::string, opencensus::stats::ViewDescriptor>
@@ -73,6 +75,9 @@ class Handler : public ::opencensus::stats::StatsExporter::Handler {
7375
Handler::Handler(const StackdriverOptions& opts)
7476
: opts_(opts),
7577
project_id_(absl::StrCat(kProjectIdPrefix, opts.project_id)),
78+
metric_name_prefix_(opts.metric_name_prefix.empty()
79+
? kDefaultMetricNamePrefix
80+
: opts.metric_name_prefix),
7681
stub_(google::monitoring::v3::MetricService::NewStub(
7782
::grpc::CreateCustomChannel(kGoogleStackdriverStatsAddress,
7883
::grpc::GoogleDefaultCredentials(),
@@ -89,8 +94,8 @@ void Handler::ExportViewData(
8994
if (!MaybeRegisterView(datum.first)) {
9095
continue;
9196
}
92-
const auto view_time_series =
93-
MakeTimeSeries(datum.first, datum.second, opts_.opencensus_task);
97+
const auto view_time_series = MakeTimeSeries(
98+
metric_name_prefix_, datum.first, datum.second, opts_.opencensus_task);
9499
time_series.insert(time_series.end(), view_time_series.begin(),
95100
view_time_series.end());
96101
}
@@ -147,7 +152,7 @@ bool Handler::MaybeRegisterView(
147152

148153
auto request = google::monitoring::v3::CreateMetricDescriptorRequest();
149154
request.set_name(project_id_);
150-
SetMetricDescriptor(project_id_, descriptor,
155+
SetMetricDescriptor(project_id_, metric_name_prefix_, descriptor,
151156
request.mutable_metric_descriptor());
152157
::grpc::ClientContext context;
153158
context.set_deadline(absl::ToChronoTime(absl::Now() + opts_.rpc_deadline));

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,23 @@ namespace stats {
3636

3737
namespace {
3838

39-
constexpr char kCustomMetricDomain[] = "custom.googleapis.com/opencensus/";
4039
constexpr char kLabelDescription[] = "OpenCensus TagKey";
4140
constexpr char kOpenCensusTaskKey[] = "opencensus_task";
4241
constexpr char kOpenCensusTaskDescription[] = "OpenCensus task identifier";
4342
constexpr char kDefaultResourceType[] = "global";
4443

45-
std::string MakeType(absl::string_view view_name) {
46-
return absl::StrCat(kCustomMetricDomain, view_name);
44+
std::string MakeType(absl::string_view metric_name_prefix,
45+
absl::string_view view_name) {
46+
return absl::StrCat(metric_name_prefix, view_name);
4747
}
4848

4949
// Creates a name in the format described in
5050
// https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors/create
5151
std::string MakeName(absl::string_view project_name,
52+
absl::string_view metric_name_prefix,
5253
absl::string_view view_name) {
53-
return absl::StrCat(project_name, "/metricDescriptors/", MakeType(view_name));
54+
return absl::StrCat(project_name, "/metricDescriptors/",
55+
MakeType(metric_name_prefix, view_name));
5456
}
5557

5658
void SetLabelDescriptor(absl::string_view tag_key,
@@ -152,11 +154,13 @@ std::vector<google::monitoring::v3::TimeSeries> DataToTimeSeries(
152154
} // namespace
153155

154156
void SetMetricDescriptor(
155-
absl::string_view project_name,
157+
absl::string_view project_name, absl::string_view metric_name_prefix,
156158
const opencensus::stats::ViewDescriptor& view_descriptor,
157159
google::api::MetricDescriptor* metric_descriptor) {
158-
metric_descriptor->set_name(MakeName(project_name, view_descriptor.name()));
159-
metric_descriptor->set_type(MakeType(view_descriptor.name()));
160+
metric_descriptor->set_name(
161+
MakeName(project_name, metric_name_prefix, view_descriptor.name()));
162+
metric_descriptor->set_type(
163+
MakeType(metric_name_prefix, view_descriptor.name()));
160164
SetOpenCensusTaskLabelDescriptor(metric_descriptor->add_labels());
161165
for (const auto& tag_key : view_descriptor.columns()) {
162166
SetLabelDescriptor(tag_key.name(), metric_descriptor->add_labels());
@@ -175,12 +179,14 @@ void SetMetricDescriptor(
175179
}
176180

177181
std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
182+
absl::string_view metric_name_prefix,
178183
const opencensus::stats::ViewDescriptor& view_descriptor,
179184
const opencensus::stats::ViewData& data,
180185
absl::string_view opencensus_task) {
181186
// Set values that are common across all the rows.
182187
auto base_time_series = google::monitoring::v3::TimeSeries();
183-
base_time_series.mutable_metric()->set_type(MakeType(view_descriptor.name()));
188+
base_time_series.mutable_metric()->set_type(
189+
MakeType(metric_name_prefix, view_descriptor.name()));
184190
base_time_series.mutable_resource()->set_type(kDefaultResourceType);
185191
auto* interval = base_time_series.add_points()->mutable_interval();
186192
// Stackdriver doesn't like start_time and end_time being different for GAUGE

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,21 @@ namespace opencensus {
2727
namespace exporters {
2828
namespace stats {
2929

30-
// Populates metric_descriptor based on project_name and view_descriptor.
31-
// project_name should be in the format "projects/project_id".
30+
// Populates metric_descriptor. project_name should be in the format
31+
// "projects/project_id". metric_name_prefix should have a trailing slash, e.g.
32+
// "custom.googleapis.com/opencensus/".
3233
void SetMetricDescriptor(
33-
absl::string_view project_name,
34+
absl::string_view project_name, absl::string_view metric_name_prefix,
3435
const opencensus::stats::ViewDescriptor& view_descriptor,
3536
google::api::MetricDescriptor* metric_descriptor);
3637

3738
// Converts each row of 'data' into TimeSeries.
3839
std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
40+
absl::string_view metric_name_prefix,
3941
const opencensus::stats::ViewDescriptor& view_descriptor,
4042
const opencensus::stats::ViewData& data, absl::string_view opencensus_task);
4143

44+
// Populates proto based on the given time.
4245
void SetTimestamp(absl::Time time, google::protobuf::Timestamp* proto);
4346

4447
} // namespace stats

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

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@ namespace {
3939

4040
TEST(StackdriverUtilsTest, SetMetricDescriptorNameAndType) {
4141
const std::string project_id = "projects/test-id";
42+
const std::string metric_name_prefix = "custom.googleapis.com/test/";
4243
const auto view_descriptor =
4344
opencensus::stats::ViewDescriptor().set_name("example.com/metric_name");
4445
google::api::MetricDescriptor metric_descriptor;
45-
SetMetricDescriptor(project_id, view_descriptor, &metric_descriptor);
46+
SetMetricDescriptor(project_id, metric_name_prefix, view_descriptor,
47+
&metric_descriptor);
4648

4749
const std::string expected_type =
48-
"custom.googleapis.com/opencensus/example.com/metric_name";
50+
"custom.googleapis.com/test/example.com/metric_name";
4951
const std::string expected_name =
5052
absl::StrCat("projects/test-id/metricDescriptors/", expected_type);
5153
EXPECT_EQ(expected_name, metric_descriptor.name());
@@ -59,7 +61,7 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorLabels) {
5961
opencensus::stats::ViewDescriptor().add_column(tag_key_1).add_column(
6062
tag_key_2);
6163
google::api::MetricDescriptor metric_descriptor;
62-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
64+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
6365

6466
ASSERT_EQ(3, metric_descriptor.labels_size());
6567
EXPECT_EQ("opencensus_task", metric_descriptor.labels(0).key());
@@ -78,23 +80,23 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorMetricKind) {
7880
google::api::MetricDescriptor metric_descriptor;
7981

8082
view_descriptor.set_aggregation(opencensus::stats::Aggregation::Count());
81-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
83+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
8284
EXPECT_EQ(google::api::MetricDescriptor::CUMULATIVE,
8385
metric_descriptor.metric_kind());
8486

8587
view_descriptor.set_aggregation(opencensus::stats::Aggregation::Sum());
86-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
88+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
8789
EXPECT_EQ(google::api::MetricDescriptor::CUMULATIVE,
8890
metric_descriptor.metric_kind());
8991

9092
view_descriptor.set_aggregation(opencensus::stats::Aggregation::LastValue());
91-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
93+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
9294
EXPECT_EQ(google::api::MetricDescriptor::GAUGE,
9395
metric_descriptor.metric_kind());
9496

9597
view_descriptor.set_aggregation(opencensus::stats::Aggregation::Distribution(
9698
opencensus::stats::BucketBoundaries::Explicit({})));
97-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
99+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
98100
EXPECT_EQ(google::api::MetricDescriptor::CUMULATIVE,
99101
metric_descriptor.metric_kind());
100102
}
@@ -108,33 +110,33 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorValueType) {
108110
// Sum depends on measure type.
109111
view_descriptor.set_aggregation(opencensus::stats::Aggregation::Sum());
110112
view_descriptor.set_measure("double_measure");
111-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
113+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
112114
EXPECT_EQ(google::api::MetricDescriptor::DOUBLE,
113115
metric_descriptor.value_type());
114116

115117
view_descriptor.set_measure("int_measure");
116-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
118+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
117119
EXPECT_EQ(google::api::MetricDescriptor::INT64,
118120
metric_descriptor.value_type());
119121

120122
view_descriptor.set_aggregation(opencensus::stats::Aggregation::Count());
121123
view_descriptor.set_measure("double_measure");
122-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
124+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
123125
EXPECT_EQ(google::api::MetricDescriptor::INT64,
124126
metric_descriptor.value_type());
125127
view_descriptor.set_measure("int_measure");
126-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
128+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
127129
EXPECT_EQ(google::api::MetricDescriptor::INT64,
128130
metric_descriptor.value_type());
129131

130132
view_descriptor.set_aggregation(opencensus::stats::Aggregation::Distribution(
131133
opencensus::stats::BucketBoundaries::Explicit({0})));
132134
view_descriptor.set_measure("double_measure");
133-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
135+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
134136
EXPECT_EQ(google::api::MetricDescriptor::DISTRIBUTION,
135137
metric_descriptor.value_type());
136138
view_descriptor.set_measure("int_measure");
137-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
139+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
138140
EXPECT_EQ(google::api::MetricDescriptor::DISTRIBUTION,
139141
metric_descriptor.value_type());
140142
}
@@ -145,7 +147,7 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorUnits) {
145147
const auto view_descriptor =
146148
opencensus::stats::ViewDescriptor().set_measure("measure");
147149
google::api::MetricDescriptor metric_descriptor;
148-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
150+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
149151

150152
EXPECT_EQ(units, metric_descriptor.unit());
151153
}
@@ -157,7 +159,7 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorUnitsCount) {
157159
.set_measure("measure")
158160
.set_aggregation(opencensus::stats::Aggregation::Count());
159161
google::api::MetricDescriptor metric_descriptor;
160-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
162+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
161163

162164
EXPECT_EQ("1", metric_descriptor.unit());
163165
}
@@ -167,12 +169,13 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorDescription) {
167169
const auto view_descriptor =
168170
opencensus::stats::ViewDescriptor().set_description(description);
169171
google::api::MetricDescriptor metric_descriptor;
170-
SetMetricDescriptor("", view_descriptor, &metric_descriptor);
172+
SetMetricDescriptor("", "", view_descriptor, &metric_descriptor);
171173

172174
EXPECT_EQ(description, metric_descriptor.description());
173175
}
174176

175-
TEST(StackdriverUtilsTest, MakeTimeSeriesSumDouble) {
177+
TEST(StackdriverUtilsTest, MakeTimeSeriesSumDoubleAndTypes) {
178+
const std::string metric_name_prefix = "custom.googleapis.com/test/";
176179
const auto measure =
177180
opencensus::stats::MeasureDouble::Register("measure_sum_double", "", "");
178181
const std::string task = "test_task";
@@ -189,10 +192,10 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumDouble) {
189192
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
190193
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
191194
const std::vector<google::monitoring::v3::TimeSeries> time_series =
192-
MakeTimeSeries(view_descriptor, data, task);
195+
MakeTimeSeries(metric_name_prefix, view_descriptor, data, task);
193196

194197
for (const auto& ts : time_series) {
195-
EXPECT_EQ("custom.googleapis.com/opencensus/test_view", ts.metric().type());
198+
EXPECT_EQ("custom.googleapis.com/test/test_view", ts.metric().type());
196199
EXPECT_EQ("global", ts.resource().type());
197200
ASSERT_EQ(1, ts.points_size());
198201
EXPECT_EQ(absl::ToUnixSeconds(data.start_time()),
@@ -230,12 +233,9 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumInt) {
230233
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
231234
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
232235
const std::vector<google::monitoring::v3::TimeSeries> time_series =
233-
MakeTimeSeries(view_descriptor, data, task);
236+
MakeTimeSeries("", view_descriptor, data, task);
234237

235238
for (const auto& ts : time_series) {
236-
EXPECT_EQ(absl::StrCat("custom.googleapis.com/opencensus/", view_name),
237-
ts.metric().type());
238-
EXPECT_EQ("global", ts.resource().type());
239239
ASSERT_EQ(1, ts.points_size());
240240
EXPECT_EQ(absl::ToUnixSeconds(data.start_time()),
241241
ts.points(0).interval().start_time().seconds());
@@ -273,12 +273,9 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesCountDouble) {
273273
view_descriptor,
274274
{{{"v1", "v1"}, 1.0}, {{"v1", "v1"}, 3.0}, {{"v1", "v2"}, 2.0}});
275275
const std::vector<google::monitoring::v3::TimeSeries> time_series =
276-
MakeTimeSeries(view_descriptor, data, task);
276+
MakeTimeSeries("", view_descriptor, data, task);
277277

278278
for (const auto& ts : time_series) {
279-
EXPECT_EQ(absl::StrCat("custom.googleapis.com/opencensus/", view_name),
280-
ts.metric().type());
281-
EXPECT_EQ("global", ts.resource().type());
282279
ASSERT_EQ(1, ts.points_size());
283280
EXPECT_EQ(absl::ToUnixSeconds(data.start_time()),
284281
ts.points(0).interval().start_time().seconds());
@@ -319,11 +316,9 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesDistributionDouble) {
319316
view_descriptor,
320317
{{{"v1", "v1"}, -1.0}, {{"v1", "v1"}, 7.0}, {{"v1", "v2"}, 1.0}});
321318
const std::vector<google::monitoring::v3::TimeSeries> time_series =
322-
MakeTimeSeries(view_descriptor, data, task);
319+
MakeTimeSeries("", view_descriptor, data, task);
323320

324321
for (const auto& ts : time_series) {
325-
EXPECT_EQ("custom.googleapis.com/opencensus/test_view", ts.metric().type());
326-
EXPECT_EQ("global", ts.resource().type());
327322
ASSERT_EQ(1, ts.points_size());
328323
EXPECT_EQ(absl::ToUnixSeconds(data.start_time()),
329324
ts.points(0).interval().start_time().seconds());
@@ -367,12 +362,9 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesLastValueInt) {
367362
const opencensus::stats::ViewData data = TestUtils::MakeViewData(
368363
view_descriptor, {{{"v1", "v1"}, 1.0}, {{"v1", "v2"}, 2.0}});
369364
const std::vector<google::monitoring::v3::TimeSeries> time_series =
370-
MakeTimeSeries(view_descriptor, data, task);
365+
MakeTimeSeries("", view_descriptor, data, task);
371366

372367
for (const auto& ts : time_series) {
373-
EXPECT_EQ(absl::StrCat("custom.googleapis.com/opencensus/", view_name),
374-
ts.metric().type());
375-
EXPECT_EQ("global", ts.resource().type());
376368
ASSERT_EQ(1, ts.points_size());
377369
EXPECT_FALSE(ts.points(0).interval().has_start_time());
378370
EXPECT_EQ(absl::ToUnixSeconds(data.end_time()),

opencensus/exporters/stats/stackdriver/stackdriver_exporter.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ struct StackdriverOptions {
3636

3737
// The RPC deadline to use when exporting to Stackdriver.
3838
absl::Duration rpc_deadline = absl::Seconds(5);
39+
40+
// Optional: the name prefix for Stackdriver metrics.
41+
//
42+
// It is suggested to use a prefix with a custom or external domain name, for
43+
// example:
44+
// - "custom.googleapis.com/myorg/"
45+
// - "external.googleapis.com/prometheus/"
46+
//
47+
// If empty, the exporter will use "custom.googleapis.com/opencensus/" by
48+
// default.
49+
std::string metric_name_prefix;
3950
};
4051

4152
// Exports stats for registered views (see opencensus/stats/stats_exporter.h) to

0 commit comments

Comments
 (0)