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

Commit cc198ff

Browse files
authored
Stackdriver stats: improve handling of builtin metrics. (#373)
* Don't send a CreateMetricDescriptor RPC. * Don't add the opencensus_task label.
1 parent 91f1f53 commit cc198ff

5 files changed

Lines changed: 145 additions & 55 deletions

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@ bool Handler::MaybeRegisterView(
165165
return true;
166166
}
167167

168+
const std::string metric_type =
169+
MakeType(opts_.metric_name_prefix, descriptor.name());
170+
if (!IsKnownCustomMetric(metric_type)) {
171+
// Builtin metrics are already defined, skip the CreateMetricDescriptor RPC.
172+
return true;
173+
}
168174
auto request = google::monitoring::v3::CreateMetricDescriptorRequest();
169175
request.set_name(opts_.project_id);
170176
SetMetricDescriptor(opts_.project_id, opts_.metric_name_prefix, descriptor,

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

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "absl/base/internal/sysinfo.h"
2020
#include "absl/base/macros.h"
21+
#include "absl/strings/match.h"
2122
#include "absl/strings/str_cat.h"
2223
#include "absl/strings/string_view.h"
2324
#include "absl/time/time.h"
@@ -41,11 +42,6 @@ constexpr char kOpenCensusTaskKey[] = "opencensus_task";
4142
constexpr char kOpenCensusTaskDescription[] = "OpenCensus task identifier";
4243
constexpr char kDefaultResourceType[] = "global";
4344

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);
47-
}
48-
4945
// Creates a name in the format described in
5046
// https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors/create
5147
std::string MakeName(absl::string_view project_name,
@@ -153,15 +149,28 @@ std::vector<google::monitoring::v3::TimeSeries> DataToTimeSeries(
153149

154150
} // namespace
155151

152+
std::string MakeType(absl::string_view metric_name_prefix,
153+
absl::string_view view_name) {
154+
return absl::StrCat(metric_name_prefix, view_name);
155+
}
156+
157+
bool IsKnownCustomMetric(absl::string_view metric_type) {
158+
return absl::StartsWith(metric_type, "custom.googleapis.com/") ||
159+
absl::StartsWith(metric_type, "external.googleapis.com/");
160+
}
161+
156162
void SetMetricDescriptor(
157163
absl::string_view project_name, absl::string_view metric_name_prefix,
158164
const opencensus::stats::ViewDescriptor& view_descriptor,
159165
google::api::MetricDescriptor* metric_descriptor) {
160166
metric_descriptor->set_name(
161167
MakeName(project_name, metric_name_prefix, view_descriptor.name()));
162-
metric_descriptor->set_type(
163-
MakeType(metric_name_prefix, view_descriptor.name()));
164-
SetOpenCensusTaskLabelDescriptor(metric_descriptor->add_labels());
168+
const std::string metric_type =
169+
MakeType(metric_name_prefix, view_descriptor.name());
170+
metric_descriptor->set_type(metric_type);
171+
if (IsKnownCustomMetric(metric_type)) {
172+
SetOpenCensusTaskLabelDescriptor(metric_descriptor->add_labels());
173+
}
165174
for (const auto& tag_key : view_descriptor.columns()) {
166175
SetLabelDescriptor(tag_key.name(), metric_descriptor->add_labels());
167176
}
@@ -188,8 +197,9 @@ std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
188197
absl::string_view opencensus_task) {
189198
// Set values that are common across all the rows.
190199
auto base_time_series = google::monitoring::v3::TimeSeries();
191-
base_time_series.mutable_metric()->set_type(
192-
MakeType(metric_name_prefix, view_descriptor.name()));
200+
const std::string metric_type =
201+
MakeType(metric_name_prefix, view_descriptor.name());
202+
base_time_series.mutable_metric()->set_type(metric_type);
193203
auto iter = per_metric_monitored_resource.find(view_descriptor.name());
194204
if (iter != per_metric_monitored_resource.end()) {
195205
*base_time_series.mutable_resource() = iter->second;
@@ -206,9 +216,10 @@ std::vector<google::monitoring::v3::TimeSeries> MakeTimeSeries(
206216
SetTimestamp(data.start_time(), interval->mutable_start_time());
207217
}
208218
SetTimestamp(data.end_time(), interval->mutable_end_time());
209-
(*base_time_series.mutable_metric()->mutable_labels())[kOpenCensusTaskKey] =
210-
std::string(opencensus_task);
211-
219+
if (IsKnownCustomMetric(metric_type)) {
220+
(*base_time_series.mutable_metric()->mutable_labels())[kOpenCensusTaskKey] =
221+
std::string(opencensus_task);
222+
}
212223
switch (data.type()) {
213224
case opencensus::stats::ViewData::Type::kDouble:
214225
return DataToTimeSeries(view_descriptor, data.double_data(),

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef OPENCENSUS_EXPORTERS_STATS_INTERNAL_STACKDRIVER_UTILS_H_
1616
#define OPENCENSUS_EXPORTERS_STATS_INTERNAL_STACKDRIVER_UTILS_H_
1717

18+
#include <string>
1819
#include <vector>
1920

2021
#include "absl/strings/string_view.h"
@@ -28,8 +29,17 @@ namespace opencensus {
2829
namespace exporters {
2930
namespace stats {
3031

31-
// Populates metric_descriptor. project_name should be in the format
32-
// "projects/project_id". metric_name_prefix should have a trailing slash, e.g.
32+
// Returns a MetricType string. metric_name_prefix must have a trailing slash,
33+
// e.g. "custom.googleapis.com/opencensus/".
34+
std::string MakeType(absl::string_view metric_name_prefix,
35+
absl::string_view view_name);
36+
37+
// Returns true if the metric type is a heuristically known
38+
// custom (i.e not built-in) Stackdriver metric.
39+
bool IsKnownCustomMetric(absl::string_view metric_type);
40+
41+
// Populates metric_descriptor. project_name must be in the format
42+
// "projects/project_id". metric_name_prefix must have a trailing slash, e.g.
3343
// "custom.googleapis.com/opencensus/".
3444
void SetMetricDescriptor(
3545
absl::string_view project_name, absl::string_view metric_name_prefix,

0 commit comments

Comments
 (0)