Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c58f04c authored by Yangster-mac's avatar Yangster-mac
Browse files

Add a field in config to disable/enable the string hashing in metric report.

Statsd hashes (using its own hashing function) raw strings to reduce the
upload data size when there are duplicate strings in the report. And in cloud,
the clearcut translator would backfill the strings.

In a few droidfood users, we find the translator was unable to do that. While
debugging the root cause, we first decided to provide an option to disable
the hashing from the cloud.

Test: statsd unit test, CTS test, tested manually

BUG: b/79943763
Change-Id: If0359c8cf3f3cf83a2938db9ebf95ea7906f0b0c
parent 644c94f1
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -385,7 +385,11 @@ void StatsLogProcessor::onConfigMetricsReportLocked(const ConfigKey& key,
    // This skips the uid map if it's an empty config.
    if (it->second->getNumMetrics() > 0) {
        uint64_t uidMapToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_ID_UID_MAP);
        if (it->second->hashStringInReport()) {
            mUidMap->appendUidMap(dumpTimeStampNs, key, &str_set, proto);
        } else {
            mUidMap->appendUidMap(dumpTimeStampNs, key, nullptr, proto);
        }
        proto->end(uidMapToken);
    }

+9 −2
Original line number Diff line number Diff line
@@ -74,6 +74,8 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config,
                             mAllPeriodicAlarmTrackers, mConditionToMetricMap, mTrackerToMetricMap,
                             mTrackerToConditionMap, mNoReportMetricIds);

    mHashStringsInReport = config.hash_strings_in_metric_report();

    if (config.allowed_log_source_size() == 0) {
        mConfigValid = false;
        ALOGE("Log source whitelist is empty! This config won't get any data. Suggest adding at "
@@ -201,8 +203,13 @@ void MetricsManager::onDumpReport(const int64_t dumpTimeStampNs,
        if (mNoReportMetricIds.find(producer->getMetricId()) == mNoReportMetricIds.end()) {
            uint64_t token = protoOutput->start(
                    FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_METRICS);
            if (mHashStringsInReport) {
                producer->onDumpReport(dumpTimeStampNs, include_current_partial_bucket, str_set,
                                       protoOutput);
            } else {
                producer->onDumpReport(dumpTimeStampNs, include_current_partial_bucket, nullptr,
                                       protoOutput);
            }
            protoOutput->end(token);
        } else {
            producer->clearPastBuckets(dumpTimeStampNs);
+6 −0
Original line number Diff line number Diff line
@@ -77,6 +77,10 @@ public:
        return mTtlNs <= 0 || timestampNs < mTtlEndNs;
    };

    inline bool hashStringInReport() const {
        return mHashStringsInReport;
    };

    void refreshTtl(const int64_t currentTimestampNs) {
        if (mTtlNs > 0) {
            mTtlEndNs = currentTimestampNs + mTtlNs;
@@ -118,6 +122,8 @@ private:

    bool mConfigValid = false;

    bool mHashStringsInReport = false;

    const int64_t mTtlNs;
    int64_t mTtlEndNs;

+2 −0
Original line number Diff line number Diff line
@@ -364,6 +364,8 @@ message StatsdConfig {

  optional int64 ttl_in_seconds = 15;

  optional bool hash_strings_in_metric_report = 16 [default = true];

  // Field number 1000 is reserved for later use.
  reserved 1000;
}
+491 −452
Original line number Diff line number Diff line
@@ -29,7 +29,8 @@ namespace statsd {
namespace {

StatsdConfig CreateDurationMetricConfig_NoLink_AND_CombinationCondition(
        DurationMetric::AggregationType aggregationType, bool addExtraDimensionInCondition) {
        DurationMetric::AggregationType aggregationType, bool addExtraDimensionInCondition,
        bool hashStringInReport) {
    StatsdConfig config;
    config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
    *config.add_atom_matcher() = CreateStartScheduledJobAtomMatcher();
@@ -54,6 +55,7 @@ StatsdConfig CreateDurationMetricConfig_NoLink_AND_CombinationCondition(
        syncDimension->add_child()->set_field(2 /* name field*/);
    }

    config.set_hash_strings_in_metric_report(hashStringInReport);
    *config.add_predicate() = scheduledJobPredicate;
    *config.add_predicate() = screenIsOffPredicate;
    *config.add_predicate() = isSyncingPredicate;
@@ -80,14 +82,17 @@ StatsdConfig CreateDurationMetricConfig_NoLink_AND_CombinationCondition(
}  // namespace

TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondition) {
    for (const bool hashStringInReport : { true, false }) {
        for (bool isDimensionInConditionSubSetOfConditionTrackerDimension : { true, false }) {
            for (auto aggregationType : {DurationMetric::MAX_SPARSE, DurationMetric::SUM}) {
                ConfigKey cfgKey;
                auto config = CreateDurationMetricConfig_NoLink_AND_CombinationCondition(
                    aggregationType, isDimensionInConditionSubSetOfConditionTrackerDimension);
                        aggregationType, isDimensionInConditionSubSetOfConditionTrackerDimension,
                        hashStringInReport);
                int64_t bucketStartTimeNs = 10000000000;
                int64_t bucketSizeNs =
                    TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000LL;
                        TimeUnitToBucketSizeInMillis(
                            config.duration_metric(0).bucket()) * 1000000LL;

                auto processor = CreateStatsLogProcessor(
                        bucketStartTimeNs, bucketStartTimeNs, config, cfgKey);
@@ -116,12 +121,15 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi

                events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF,
                                                               bucketStartTimeNs + 650));
            events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON,
                events.push_back(CreateScreenStateChangedEvent(
                                    android::view::DISPLAY_STATE_ON,
                                    bucketStartTimeNs + bucketSizeNs + 100));

            events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF,
                events.push_back(CreateScreenStateChangedEvent(
                                    android::view::DISPLAY_STATE_OFF,
                                    bucketStartTimeNs + bucketSizeNs + 640));
            events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON,
                events.push_back(CreateScreenStateChangedEvent(
                                    android::view::DISPLAY_STATE_ON,
                                    bucketStartTimeNs + bucketSizeNs + 650));

                events.push_back(CreateStartScheduledJobEvent(
@@ -137,12 +145,15 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                events.push_back(CreateStartScheduledJobEvent(
                        {CreateAttribution(8888, "")}, "job2", bucketStartTimeNs + 600));
                events.push_back(CreateFinishScheduledJobEvent(
                    {CreateAttribution(8888, "")}, "job2",bucketStartTimeNs + bucketSizeNs + 850));
                        {CreateAttribution(8888, "")}, "job2",
                        bucketStartTimeNs + bucketSizeNs + 850));

                events.push_back(CreateStartScheduledJobEvent(
                    {CreateAttribution(8888, "")}, "job1", bucketStartTimeNs + bucketSizeNs + 600));
                        {CreateAttribution(8888, "")}, "job1",
                        bucketStartTimeNs + bucketSizeNs + 600));
                events.push_back(CreateFinishScheduledJobEvent(
                    {CreateAttribution(8888, "")}, "job1", bucketStartTimeNs + bucketSizeNs + 900));
                        {CreateAttribution(8888, "")}, "job1",
                        bucketStartTimeNs + bucketSizeNs + 900));

                events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail",
                                                      bucketStartTimeNs + 10));
@@ -192,9 +203,11 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              android::util::SCHEDULED_JOB_STATE_CHANGED);
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(),
                              2);  // job name field
                EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().
                                    dimensions_value(0).value_str(),
                              "job0");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 111, "App1");
                    EXPECT_EQ(data.bucket_info_size(), 1);
                    EXPECT_EQ(data.bucket_info(0).duration_nanos(), 40 - 11);
@@ -209,9 +222,11 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              android::util::SCHEDULED_JOB_STATE_CHANGED);
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(),
                              2);  // job name field
                EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().
                                    dimensions_value(0).value_str(),
                              "job1");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 333, "App2");
                    EXPECT_EQ(data.bucket_info_size(), 1);
                    EXPECT_EQ(data.bucket_info(0).duration_nanos(), 10);
@@ -225,9 +240,11 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              android::util::SCHEDULED_JOB_STATE_CHANGED);
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(),
                              2);  // job name field
                EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().
                                    dimensions_value(0).value_str(),
                              "job2");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 111, "App1");
                    EXPECT_EQ(data.bucket_info_size(), 2);
                    EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs);
@@ -245,9 +262,11 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              android::util::SCHEDULED_JOB_STATE_CHANGED);
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(),
                              2);  // job name field
                EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().
                                    dimensions_value(0).value_str(),
                              "job2");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 333, "App2");
                    EXPECT_EQ(data.bucket_info_size(), 2);
                    EXPECT_EQ(data.bucket_info(0).duration_nanos(), 450 - 401 + bucketSizeNs - 600);
@@ -266,9 +285,11 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              android::util::SCHEDULED_JOB_STATE_CHANGED);
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(),
                              2);  // job name field
                EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().
                                    dimensions_value(0).value_str(),
                              "job0");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 111, "App1");
                    EXPECT_EQ(data.bucket_info_size(), 1);
                    EXPECT_EQ(data.bucket_info(0).duration_nanos(), 40 - 11);
@@ -282,9 +303,11 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              android::util::SCHEDULED_JOB_STATE_CHANGED);
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(),
                              2);  // job name field
                EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().
                                    dimensions_value(0).value_str(),
                              "job1");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 333, "App2");
                    EXPECT_EQ(data.bucket_info_size(), 1);
                    EXPECT_EQ(data.bucket_info(0).duration_nanos(), 10);
@@ -300,7 +323,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              2);  // job name field
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                              "job2");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 111, "App1");
                    EXPECT_EQ(data.bucket_info_size(), 2);
                    EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs);
@@ -318,9 +342,11 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
                              android::util::SCHEDULED_JOB_STATE_CHANGED);
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(),
                              2);  // job name field
                EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(),
                    EXPECT_EQ(data.dimensions_in_what().value_tuple().
                                    dimensions_value(0).value_str(),
                              "job2");  // job name
                ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(),
                    ValidateAttributionUidAndTagDimension(
                            data.dimensions_in_condition(),
                            android::util::SYNC_STATE_CHANGED, 333, "App2");
                    EXPECT_EQ(data.bucket_info_size(), 2);
                    EXPECT_EQ(data.bucket_info(0).duration_nanos(), 450 - 401);
@@ -336,6 +362,7 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondi
            }
        }
    }
}

namespace {

@@ -588,7 +615,7 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_AND_CombinationConditi
namespace {

StatsdConfig CreateDurationMetricConfig_PartialLink_AND_CombinationCondition(
        DurationMetric::AggregationType aggregationType) {
        DurationMetric::AggregationType aggregationType, bool hashStringInReport) {
    StatsdConfig config;
    config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
    *config.add_atom_matcher() = CreateStartScheduledJobAtomMatcher();
@@ -612,6 +639,7 @@ StatsdConfig CreateDurationMetricConfig_PartialLink_AND_CombinationCondition(

    auto screenIsOffPredicate = CreateScreenIsOffPredicate();

    config.set_hash_strings_in_metric_report(hashStringInReport);
    *config.add_predicate() = scheduledJobPredicate;
    *config.add_predicate() = screenIsOffPredicate;
    *config.add_predicate() = isSyncingPredicate;
@@ -645,10 +673,12 @@ StatsdConfig CreateDurationMetricConfig_PartialLink_AND_CombinationCondition(
}  // namespace

TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_CombinationCondition) {
    for (const bool hashStringInReport : {true, false}) {
        for (auto aggregationType : {DurationMetric::SUM, DurationMetric::MAX_SPARSE}) {
            ConfigKey cfgKey;
            auto config =
                CreateDurationMetricConfig_PartialLink_AND_CombinationCondition(aggregationType);
                    CreateDurationMetricConfig_PartialLink_AND_CombinationCondition(
                            aggregationType, hashStringInReport);
            int64_t bucketStartTimeNs = 10000000000;
            int64_t bucketSizeNs =
                    TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000LL;
@@ -739,8 +769,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination

            ConfigMetricsReportList reports;
            vector<uint8_t> buffer;
        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, ADB_DUMP,
                                &buffer);
            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false,
                                    ADB_DUMP, &buffer);
            EXPECT_TRUE(buffer.size() > 0);
            EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
            backfillDimensionPath(&reports);
@@ -760,7 +790,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 111);
                EXPECT_EQ("ReadEmail",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 1);
                EXPECT_EQ(data.bucket_info(0).duration_nanos(), 101 - 55);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(),
@@ -774,7 +805,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333);
                EXPECT_EQ("ReadDoc",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 1);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs);
                EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(),
@@ -787,7 +819,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333);
                EXPECT_EQ("ReadEmail",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 2);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs);
                EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(),
@@ -805,7 +838,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 444);
                EXPECT_EQ("ReadDoc",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 2);
                EXPECT_EQ(data.bucket_info(0).duration_nanos(), 1);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs);
@@ -824,7 +858,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 111);
                EXPECT_EQ("ReadEmail",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 1);
                EXPECT_EQ(data.bucket_info(0).duration_nanos(), 101 - 55);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(),
@@ -838,7 +873,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333);
                EXPECT_EQ("ReadDoc",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 2);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs);
                EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(),
@@ -856,7 +892,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333);
                EXPECT_EQ("ReadEmail",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 2);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs);
                EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(),
@@ -874,7 +911,8 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
                ValidateAttributionUidDimension(
                    data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 444);
                EXPECT_EQ("ReadDoc",
                      data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str());
                          data.dimensions_in_condition().value_tuple().
                                dimensions_value(1).value_str());
                EXPECT_EQ(data.bucket_info_size(), 1);
                EXPECT_EQ(data.bucket_info(0).duration_nanos(), 101);
                EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(),
@@ -884,6 +922,7 @@ TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_Combination
            }
        }
    }
}

#else
GTEST_LOG_(INFO) << "This test does nothing.\n";