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

Commit a73894c

Browse files
author
Ian Sturdy
authored
Add an interned TagKey class. (#124)
Previously, tag keys were strings, and use string semantics. This has performance implications--we need to copy/hash/check equality frequently during aggregation. Interning tag keys makes those integer operations, substantially improving performance.
1 parent 3ea4b42 commit a73894c

34 files changed

Lines changed: 474 additions & 231 deletions

examples/helloworld/helloworld.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929

3030
namespace {
3131

32-
ABSL_CONST_INIT const absl::string_view kFrontendKey = "my.org/keys/frontend";
3332
ABSL_CONST_INIT const absl::string_view kVideoSizeViewName =
3433
"my.org/views/video_size";
3534
ABSL_CONST_INIT const absl::string_view kVideoSizeMeasureName =
@@ -45,6 +44,12 @@ opencensus::stats::MeasureInt VideoSizeMeasure() {
4544
return video_size;
4645
}
4746

47+
opencensus::stats::TagKey FrontendKey() {
48+
static const auto frontend_key =
49+
opencensus::stats::TagKey::Register("my.org/keys/frontend");
50+
return frontend_key;
51+
}
52+
4853
} // namespace
4954

5055
// Simple program that collects data for video size.
@@ -75,7 +80,7 @@ int main(int argc, char **argv) {
7580
.set_aggregation(opencensus::stats::Aggregation::Distribution(
7681
opencensus::stats::BucketBoundaries::Explicit(
7782
{0, 16 * kMiB, 256 * kMiB})))
78-
.add_column(kFrontendKey);
83+
.add_column(FrontendKey());
7984
opencensus::stats::View view(video_size_view);
8085
video_size_view.RegisterForExport();
8186

@@ -91,7 +96,7 @@ int main(int argc, char **argv) {
9196
absl::SleepFor(absl::Milliseconds(rand() % 10 + 1));
9297
// Record the processed video size.
9398
opencensus::stats::Record({{VideoSizeMeasure(), 25 * kMiB}},
94-
{{kFrontendKey, "video size"}});
99+
{{FrontendKey(), "video size"}});
95100
span.AddAnnotation("Finished processing video.");
96101
span.End();
97102

opencensus/exporters/stats/prometheus/internal/prometheus_test_server.cc

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ int main(int argc, char** argv) {
2828
std::make_shared<opencensus::exporters::stats::PrometheusExporter>();
2929
exposer.RegisterCollectable(exporter);
3030

31+
const auto key1 = opencensus::stats::TagKey::Register("key1");
32+
const auto key2 = opencensus::stats::TagKey::Register("key2");
33+
3134
// Create a view and register it with the exporter.
3235
const std::string foo_usage_measure_name = "example.com/Foo/FooUsage";
3336
const opencensus::stats::MeasureDouble foo_usage =
@@ -39,20 +42,19 @@ int main(int argc, char** argv) {
3942
.set_measure(foo_usage_measure_name)
4043
.set_aggregation(opencensus::stats::Aggregation::Distribution(
4144
opencensus::stats::BucketBoundaries::Explicit({0, 10})))
42-
.add_column("key1")
43-
.add_column("key2")
45+
.add_column(key1)
46+
.add_column(key2)
4447
.set_description(
4548
"Cumulative distribution of example.com/Foo/FooUsage broken down "
4649
"by 'key1' and 'key2'.");
4750
view_descriptor.RegisterForExport();
4851

4952
std::cout << "Access metrics on http://127.0.0.1:8080/metrics\n";
5053
while (true) {
51-
opencensus::stats::Record({{foo_usage, 1.0}}, {{"key1", "v1"}});
52-
opencensus::stats::Record({{foo_usage, 7.0}}, {{"key1", "v1"}});
53-
opencensus::stats::Record({{foo_usage, 12.0}}, {{"key1", "v1"}});
54-
opencensus::stats::Record({{foo_usage, 5.0}},
55-
{{"key1", "v1"}, {"key2", "v2"}});
54+
opencensus::stats::Record({{foo_usage, 1.0}}, {{key1, "v1"}});
55+
opencensus::stats::Record({{foo_usage, 7.0}}, {{key1, "v1"}});
56+
opencensus::stats::Record({{foo_usage, 12.0}}, {{key1, "v1"}});
57+
opencensus::stats::Record({{foo_usage, 5.0}}, {{key1, "v1"}, {key2, "v2"}});
5658
absl::SleepFor(absl::Seconds(10));
5759
}
5860
}

opencensus/exporters/stats/prometheus/internal/prometheus_utils.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ void SetData(const opencensus::stats::ViewDescriptor& descriptor,
8888
metric->set_timestamp_ms(time);
8989
for (int i = 0; i < descriptor.num_columns(); ++i) {
9090
auto* label = metric->add_label();
91-
label->set_name(SanitizeName(descriptor.columns()[i]));
91+
label->set_name(SanitizeName(descriptor.columns()[i].name()));
9292
label->set_value(row.first[i]);
9393
}
9494
SetValue(row.second, metric);

opencensus/exporters/stats/prometheus/internal/prometheus_utils_test.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ TEST(SetMetricFamilyTest, CountDouble) {
5454
"measure_count_double", "units", "");
5555
const std::string task = "test_task";
5656
const std::string view_name = "test_descriptor";
57-
const std::string tag_key_1 = "foo";
58-
const std::string tag_key_2 = "bar";
57+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
58+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
5959
const auto view_descriptor =
6060
opencensus::stats::ViewDescriptor()
6161
.set_name(view_name)
@@ -90,8 +90,8 @@ TEST(SetMetricFamilyTest, SumDouble) {
9090
"measure_sum_double", "units", "");
9191
const std::string task = "test_task";
9292
const std::string view_name = "test_descriptor";
93-
const std::string tag_key_1 = "foo";
94-
const std::string tag_key_2 = "bar";
93+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
94+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
9595
const auto view_descriptor =
9696
opencensus::stats::ViewDescriptor()
9797
.set_name(view_name)
@@ -126,8 +126,8 @@ TEST(SetMetricFamilyTest, SumInt) {
126126
"measure_sum_int", "units", "");
127127
const std::string task = "test_task";
128128
const std::string view_name = "test_descriptor";
129-
const std::string tag_key_1 = "foo";
130-
const std::string tag_key_2 = "bar";
129+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
130+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
131131
const auto view_descriptor =
132132
opencensus::stats::ViewDescriptor()
133133
.set_name(view_name)
@@ -161,8 +161,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesDistributionDouble) {
161161
const auto measure = opencensus::stats::MeasureRegistry::RegisterDouble(
162162
"measure_distribution_double", "units", "");
163163
const std::string view_name = "test_descriptor";
164-
const std::string tag_key_1 = "foo";
165-
const std::string tag_key_2 = "bar";
164+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
165+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
166166
const auto bucket_boundaries =
167167
opencensus::stats::BucketBoundaries::Explicit({0, 10});
168168
const auto view_descriptor =

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ class StackdriverE2eTest : public ::testing::Test {
8686
const std::unique_ptr<google::monitoring::v3::MetricService::Stub> stub_ =
8787
google::monitoring::v3::MetricService::NewStub(::grpc::CreateChannel(
8888
kGoogleStackdriverStatsAddress, ::grpc::GoogleDefaultCredentials()));
89+
90+
const opencensus::stats::TagKey key1_ =
91+
opencensus::stats::TagKey::Register("key1");
92+
const opencensus::stats::TagKey key2_ =
93+
opencensus::stats::TagKey::Register("key2");
8994
};
9095

9196
const absl::string_view StackdriverE2eTest::project_id_ =
@@ -161,17 +166,17 @@ TEST_F(StackdriverE2eTest, OneView) {
161166
prefix_))
162167
.set_measure(kTestMeasureName)
163168
.set_aggregation(::opencensus::stats::Aggregation::Sum())
164-
.add_column("key1")
165-
.add_column("key2")
169+
.add_column(key1_)
170+
.add_column(key2_)
166171
.set_description(
167172
"Cumulative sum of opencensus.io/TestMeasure broken down "
168173
"by 'key1' and 'key2'.");
169174
view_descriptor.RegisterForExport();
170175

171176
opencensus::stats::Record({{TestMeasure(), 1.0}},
172-
{{"key1", "v11"}, {"key2", "v21"}});
177+
{{key1_, "v11"}, {key2_, "v21"}});
173178
opencensus::stats::Record({{TestMeasure(), 2.0}},
174-
{{"key1", "v11"}, {"key2", "v22"}});
179+
{{key1_, "v11"}, {key2_, "v22"}});
175180

176181
std::cout << "Waiting for data to propagate.\n";
177182
absl::SleepFor(absl::Seconds(40));
@@ -197,8 +202,8 @@ TEST_F(StackdriverE2eTest, LargeTest) {
197202
prefix_))
198203
.set_measure(kTestMeasureName)
199204
.set_aggregation(::opencensus::stats::Aggregation::Count())
200-
.add_column("key1")
201-
.add_column("key2")
205+
.add_column(key1_)
206+
.add_column(key2_)
202207
.set_description(
203208
"Cumulative count of opencensus.io/TestMeasure broken down "
204209
"by 'key1' and 'key2'.");
@@ -211,8 +216,8 @@ TEST_F(StackdriverE2eTest, LargeTest) {
211216
prefix_))
212217
.set_measure(kTestMeasureName)
213218
.set_aggregation(::opencensus::stats::Aggregation::Sum())
214-
.add_column("key1")
215-
.add_column("key2")
219+
.add_column(key1_)
220+
.add_column(key2_)
216221
.set_description(
217222
"Cumulative sum of opencensus.io/TestMeasure broken down "
218223
"by 'key1' and 'key2'.");
@@ -233,7 +238,7 @@ TEST_F(StackdriverE2eTest, LargeTest) {
233238
const std::string tag2 = absl::StrCat("v1", j);
234239
const double value = i * j;
235240
opencensus::stats::Record({{TestMeasure(), value}},
236-
{{"key1", tag1}, {"key2", tag2}});
241+
{{key1_, tag1}, {key2_, tag2}});
237242
sum_matchers.push_back(testing::TimeSeriesDouble(
238243
{{"opencensus_task", "test_task"}, {"key1", tag1}, {"key2", tag2}},
239244
value));

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ std::vector<google::monitoring::v3::TimeSeries> DataToTimeSeries(
136136
auto& time_series = vector.back();
137137
for (int i = 0; i < view_descriptor.columns().size(); ++i) {
138138
(*time_series.mutable_metric()
139-
->mutable_labels())[view_descriptor.columns()[i]] = row.first[i];
139+
->mutable_labels())[view_descriptor.columns()[i].name()] =
140+
row.first[i];
140141
}
141142
// The point is already created in the base_time_series to set the times.
142143
SetTypedValue(row.second, type,
@@ -155,7 +156,7 @@ void SetMetricDescriptor(
155156
metric_descriptor->set_type(MakeType(view_descriptor.name()));
156157
SetOpenCensusTaskLabelDescriptor(metric_descriptor->add_labels());
157158
for (const auto& tag_key : view_descriptor.columns()) {
158-
SetLabelDescriptor(tag_key, metric_descriptor->add_labels());
159+
SetLabelDescriptor(tag_key.name(), metric_descriptor->add_labels());
159160
}
160161
metric_descriptor->set_metric_kind(google::api::MetricDescriptor::CUMULATIVE);
161162
metric_descriptor->set_value_type(GetValueType(view_descriptor));

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

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorNameAndType) {
5353
}
5454

5555
TEST(StackdriverUtilsTest, SetMetricDescriptorLabels) {
56-
const std::string tag_key_1 = "foo";
57-
const std::string tag_key_2 = "bar";
56+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
57+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
5858
const auto view_descriptor =
5959
opencensus::stats::ViewDescriptor().add_column(tag_key_1).add_column(
6060
tag_key_2);
@@ -65,10 +65,10 @@ TEST(StackdriverUtilsTest, SetMetricDescriptorLabels) {
6565
EXPECT_EQ("opencensus_task", metric_descriptor.labels(0).key());
6666
EXPECT_EQ(google::api::LabelDescriptor::STRING,
6767
metric_descriptor.labels(0).value_type());
68-
EXPECT_EQ(tag_key_1, metric_descriptor.labels(1).key());
68+
EXPECT_EQ(tag_key_1.name(), metric_descriptor.labels(1).key());
6969
EXPECT_EQ(google::api::LabelDescriptor::STRING,
7070
metric_descriptor.labels(1).value_type());
71-
EXPECT_EQ(tag_key_2, metric_descriptor.labels(2).key());
71+
EXPECT_EQ(tag_key_2.name(), metric_descriptor.labels(2).key());
7272
EXPECT_EQ(google::api::LabelDescriptor::STRING,
7373
metric_descriptor.labels(2).value_type());
7474
}
@@ -148,8 +148,8 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumDouble) {
148148
"measure_sum_double", "", "");
149149
const std::string task = "test_task";
150150
const std::string view_name = "test_view";
151-
const std::string tag_key_1 = "foo";
152-
const std::string tag_key_2 = "bar";
151+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
152+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
153153
const auto view_descriptor =
154154
opencensus::stats::ViewDescriptor()
155155
.set_name(view_name)
@@ -172,24 +172,25 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumDouble) {
172172
ts.points(0).interval().end_time().seconds());
173173
}
174174

175-
EXPECT_THAT(
176-
time_series,
177-
::testing::UnorderedElementsAre(
178-
testing::TimeSeriesDouble(
179-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v1"}},
180-
1.0),
181-
testing::TimeSeriesDouble(
182-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v2"}},
183-
2.0)));
175+
EXPECT_THAT(time_series,
176+
::testing::UnorderedElementsAre(
177+
testing::TimeSeriesDouble({{"opencensus_task", task},
178+
{tag_key_1.name(), "v1"},
179+
{tag_key_2.name(), "v1"}},
180+
1.0),
181+
testing::TimeSeriesDouble({{"opencensus_task", task},
182+
{tag_key_1.name(), "v1"},
183+
{tag_key_2.name(), "v2"}},
184+
2.0)));
184185
}
185186

186187
TEST(StackdriverUtilsTest, MakeTimeSeriesSumInt) {
187188
const auto measure = opencensus::stats::MeasureRegistry::RegisterInt(
188189
"measure_sum_int", "", "");
189190
const std::string task = "test_task";
190191
const std::string view_name = "test_descriptor";
191-
const std::string tag_key_1 = "foo";
192-
const std::string tag_key_2 = "bar";
192+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
193+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
193194
const auto view_descriptor =
194195
opencensus::stats::ViewDescriptor()
195196
.set_name(view_name)
@@ -213,24 +214,25 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesSumInt) {
213214
ts.points(0).interval().end_time().seconds());
214215
}
215216

216-
EXPECT_THAT(
217-
time_series,
218-
::testing::UnorderedElementsAre(
219-
testing::TimeSeriesInt(
220-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v1"}},
221-
1),
222-
testing::TimeSeriesInt(
223-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v2"}},
224-
2)));
217+
EXPECT_THAT(time_series,
218+
::testing::UnorderedElementsAre(
219+
testing::TimeSeriesInt({{"opencensus_task", task},
220+
{tag_key_1.name(), "v1"},
221+
{tag_key_2.name(), "v1"}},
222+
1),
223+
testing::TimeSeriesInt({{"opencensus_task", task},
224+
{tag_key_1.name(), "v1"},
225+
{tag_key_2.name(), "v2"}},
226+
2)));
225227
}
226228

227229
TEST(StackdriverUtilsTest, MakeTimeSeriesCountDouble) {
228230
const auto measure = opencensus::stats::MeasureRegistry::RegisterDouble(
229231
"measure_count_double", "", "");
230232
const std::string task = "test_task";
231233
const std::string view_name = "test_descriptor";
232-
const std::string tag_key_1 = "foo";
233-
const std::string tag_key_2 = "bar";
234+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
235+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
234236
const auto view_descriptor =
235237
opencensus::stats::ViewDescriptor()
236238
.set_name(view_name)
@@ -255,24 +257,25 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesCountDouble) {
255257
ts.points(0).interval().end_time().seconds());
256258
}
257259

258-
EXPECT_THAT(
259-
time_series,
260-
::testing::UnorderedElementsAre(
261-
testing::TimeSeriesInt(
262-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v1"}},
263-
2),
264-
testing::TimeSeriesInt(
265-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v2"}},
266-
1)));
260+
EXPECT_THAT(time_series,
261+
::testing::UnorderedElementsAre(
262+
testing::TimeSeriesInt({{"opencensus_task", task},
263+
{tag_key_1.name(), "v1"},
264+
{tag_key_2.name(), "v1"}},
265+
2),
266+
testing::TimeSeriesInt({{"opencensus_task", task},
267+
{tag_key_1.name(), "v1"},
268+
{tag_key_2.name(), "v2"}},
269+
1)));
267270
}
268271

269272
TEST(StackdriverUtilsTest, MakeTimeSeriesDistributionDouble) {
270273
const auto measure = opencensus::stats::MeasureRegistry::RegisterDouble(
271274
"measure_distribution_double", "", "");
272275
const std::string task = "test_task";
273276
const std::string view_name = "test_view";
274-
const std::string tag_key_1 = "foo";
275-
const std::string tag_key_2 = "bar";
277+
const auto tag_key_1 = opencensus::stats::TagKey::Register("foo");
278+
const auto tag_key_2 = opencensus::stats::TagKey::Register("bar");
276279
const auto bucket_boundaries =
277280
opencensus::stats::BucketBoundaries::Explicit({0});
278281
const auto view_descriptor =
@@ -306,15 +309,16 @@ TEST(StackdriverUtilsTest, MakeTimeSeriesDistributionDouble) {
306309
auto distribution2 = TestUtils::MakeDistribution(&bucket_boundaries);
307310
TestUtils::AddToDistribution(&distribution2, 1.0);
308311

309-
EXPECT_THAT(
310-
time_series,
311-
::testing::UnorderedElementsAre(
312-
testing::TimeSeriesDistribution(
313-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v1"}},
314-
distribution1),
315-
testing::TimeSeriesDistribution(
316-
{{"opencensus_task", task}, {tag_key_1, "v1"}, {tag_key_2, "v2"}},
317-
distribution2)));
312+
EXPECT_THAT(time_series,
313+
::testing::UnorderedElementsAre(
314+
testing::TimeSeriesDistribution({{"opencensus_task", task},
315+
{tag_key_1.name(), "v1"},
316+
{tag_key_2.name(), "v1"}},
317+
distribution1),
318+
testing::TimeSeriesDistribution({{"opencensus_task", task},
319+
{tag_key_1.name(), "v1"},
320+
{tag_key_2.name(), "v2"}},
321+
distribution2)));
318322
}
319323

320324
} // namespace

opencensus/exporters/stats/stdout/internal/stdout_exporter.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ void StdoutExporter::Handler::ExportViewDataImpl(
110110
for (const auto& row : data) {
111111
absl::StrAppend(&output, " ");
112112
for (int i = 0; i < descriptor.columns().size(); ++i) {
113-
absl::StrAppend(&output, descriptor.columns()[i], "=", row.first[i], " ");
113+
absl::StrAppend(&output, descriptor.columns()[i].name(), "=",
114+
row.first[i], " ");
114115
}
115116
absl::StrAppend(&output, DataToString(row.second));
116117
}

0 commit comments

Comments
 (0)