summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-06-13 23:20:59 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-06-13 23:20:59 +0000
commit21a6c0c4d9de7bc22d4b7772c3bd5837ba3069c1 (patch)
treeebb7fcee34e42f473bf2a4147f2becbe3a475b1f
parentb2423dd3163520c75696072b402d2e69f3986eb6 (diff)
parenta908af90eaa544259e3c1533e5ba4f05386412c6 (diff)
downloadStatsD-android14-s1-release.tar.gz
Change-Id: I5804d7ec2073fd620b6dee4636f144d2fe678261
-rw-r--r--service/java/com/android/server/stats/StatsCompanionService.java1
-rw-r--r--statsd/src/guardrail/StatsdStats.cpp9
-rw-r--r--statsd/src/guardrail/StatsdStats.h1
-rw-r--r--statsd/src/stats_log.proto1
-rw-r--r--statsd/src/utils/ShardOffsetProvider.cpp20
-rw-r--r--statsd/src/utils/ShardOffsetProvider.h9
-rw-r--r--statsd/tests/guardrail/StatsdStats_test.cpp11
7 files changed, 46 insertions, 6 deletions
diff --git a/service/java/com/android/server/stats/StatsCompanionService.java b/service/java/com/android/server/stats/StatsCompanionService.java
index fd987c21..367bfddb 100644
--- a/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/service/java/com/android/server/stats/StatsCompanionService.java
@@ -279,6 +279,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
} finally {
if (DEBUG) Log.d(TAG, "End thread for sending uid map data.");
+ FileUtils.closeQuietly(fout);
backgroundThread.quit();
}
});
diff --git a/statsd/src/guardrail/StatsdStats.cpp b/statsd/src/guardrail/StatsdStats.cpp
index 3fded0a2..7dd6d9ad 100644
--- a/statsd/src/guardrail/StatsdStats.cpp
+++ b/statsd/src/guardrail/StatsdStats.cpp
@@ -19,9 +19,11 @@
#include "StatsdStats.h"
#include <android/util/ProtoOutputStream.h>
+
#include "../stats_log_util.h"
#include "statslog_statsd.h"
#include "storage/StorageManager.h"
+#include "utils/ShardOffsetProvider.h"
namespace android {
namespace os {
@@ -35,6 +37,7 @@ using android::util::FIELD_TYPE_INT32;
using android::util::FIELD_TYPE_INT64;
using android::util::FIELD_TYPE_MESSAGE;
using android::util::FIELD_TYPE_STRING;
+using android::util::FIELD_TYPE_UINT32;
using android::util::ProtoOutputStream;
using std::lock_guard;
using std::shared_ptr;
@@ -54,6 +57,7 @@ const int FIELD_ID_LOGGER_ERROR_STATS = 16;
const int FIELD_ID_OVERFLOW = 18;
const int FIELD_ID_ACTIVATION_BROADCAST_GUARDRAIL = 19;
const int FIELD_ID_RESTRICTED_METRIC_QUERY_STATS = 20;
+const int FIELD_ID_SHARD_OFFSET = 21;
const int FIELD_ID_RESTRICTED_METRIC_QUERY_STATS_CALLING_UID = 1;
const int FIELD_ID_RESTRICTED_METRIC_QUERY_STATS_CONFIG_ID = 2;
@@ -1149,6 +1153,8 @@ void StatsdStats::dumpStats(int out) const {
}
}
}
+ dprintf(out, "********Shard Offset Provider stats***********\n");
+ dprintf(out, "Shard Offset: %u\n", ShardOffsetProvider::getInstance().getShardOffset());
}
void addConfigStatsToProto(const ConfigStats& configStats, ProtoOutputStream* proto) {
@@ -1491,6 +1497,9 @@ void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) {
proto.end(token);
}
+ proto.write(FIELD_TYPE_UINT32 | FIELD_ID_SHARD_OFFSET,
+ static_cast<long>(ShardOffsetProvider::getInstance().getShardOffset()));
+
output->clear();
size_t bufferSize = proto.size();
output->resize(bufferSize);
diff --git a/statsd/src/guardrail/StatsdStats.h b/statsd/src/guardrail/StatsdStats.h
index d33e4b01..4bf6ffdb 100644
--- a/statsd/src/guardrail/StatsdStats.h
+++ b/statsd/src/guardrail/StatsdStats.h
@@ -866,6 +866,7 @@ private:
FRIEND_TEST(StatsdStatsTest, TestAtomDroppedStats);
FRIEND_TEST(StatsdStatsTest, TestAtomLoggedAndDroppedStats);
FRIEND_TEST(StatsdStatsTest, TestAtomLoggedAndDroppedAndSkippedStats);
+ FRIEND_TEST(StatsdStatsTest, TestShardOffsetProvider);
FRIEND_TEST(StatsLogProcessorTest, InvalidConfigRemoved);
};
diff --git a/statsd/src/stats_log.proto b/statsd/src/stats_log.proto
index ebd2ad54..44add932 100644
--- a/statsd/src/stats_log.proto
+++ b/statsd/src/stats_log.proto
@@ -664,6 +664,7 @@ message StatsdStatsReport {
optional int64 query_latency_ns = 9;
}
repeated RestrictedMetricQueryStats restricted_metric_query_stats = 20;
+ optional uint32 shard_offset = 21;
}
message AlertTriggerDetails {
diff --git a/statsd/src/utils/ShardOffsetProvider.cpp b/statsd/src/utils/ShardOffsetProvider.cpp
index 6d847dff..4a0df977 100644
--- a/statsd/src/utils/ShardOffsetProvider.cpp
+++ b/statsd/src/utils/ShardOffsetProvider.cpp
@@ -16,15 +16,31 @@
#include "ShardOffsetProvider.h"
+#include <errno.h>
+#include <sys/random.h>
+#include <unistd.h>
+
+#include <chrono>
+
namespace android {
namespace os {
namespace statsd {
-ShardOffsetProvider::ShardOffsetProvider(const int shardOffset) : mShardOffset(shardOffset) {
+ShardOffsetProvider::ShardOffsetProvider() {
+ unsigned int seed = 0;
+ // getrandom() reads bytes from urandom source into buf. If getrandom()
+ // is unable to read from urandom source, then it returns -1 and we set
+ // our seed to be time(nullptr) as a fallback.
+ if (TEMP_FAILURE_RETRY(
+ getrandom(static_cast<void*>(&seed), sizeof(unsigned int), GRND_NONBLOCK)) < 0) {
+ seed = time(nullptr);
+ }
+ srand(seed);
+ mShardOffset = rand();
}
ShardOffsetProvider& ShardOffsetProvider::getInstance() {
- static ShardOffsetProvider sShardOffsetProvider(rand());
+ static ShardOffsetProvider sShardOffsetProvider;
return sShardOffsetProvider;
}
diff --git a/statsd/src/utils/ShardOffsetProvider.h b/statsd/src/utils/ShardOffsetProvider.h
index 0623e0f2..dd6a5a7d 100644
--- a/statsd/src/utils/ShardOffsetProvider.h
+++ b/statsd/src/utils/ShardOffsetProvider.h
@@ -32,21 +32,21 @@ class ShardOffsetProvider final {
public:
~ShardOffsetProvider(){};
- int getShardOffset() const {
+ uint32_t getShardOffset() const {
return mShardOffset;
}
static ShardOffsetProvider& getInstance();
private:
- ShardOffsetProvider(const int shardOffset);
+ ShardOffsetProvider();
// Only used for testing.
- void setShardOffset(const int shardOffset) {
+ void setShardOffset(const uint32_t shardOffset) {
mShardOffset = shardOffset;
}
- int mShardOffset;
+ uint32_t mShardOffset;
FRIEND_TEST(CountMetricE2eTest, TestDimensionalSampling);
FRIEND_TEST(DurationMetricE2eTest, TestDimensionalSampling);
@@ -54,6 +54,7 @@ private:
FRIEND_TEST(GaugeMetricProducerTest, TestPullDimensionalSampling);
FRIEND_TEST(KllMetricE2eTest, TestDimensionalSampling);
FRIEND_TEST(NumericValueMetricProducerTest, TestDimensionalSampling);
+ FRIEND_TEST(StatsdStatsTest, TestShardOffsetProvider);
};
} // namespace statsd
diff --git a/statsd/tests/guardrail/StatsdStats_test.cpp b/statsd/tests/guardrail/StatsdStats_test.cpp
index 0c816007..a2f32805 100644
--- a/statsd/tests/guardrail/StatsdStats_test.cpp
+++ b/statsd/tests/guardrail/StatsdStats_test.cpp
@@ -889,6 +889,17 @@ TEST(StatsdStatsTest, TestAtomLoggedAndDroppedAndSkippedStats) {
EXPECT_FALSE(nonPlatformPushedAtomStats.has_error_count());
}
+TEST(StatsdStatsTest, TestShardOffsetProvider) {
+ StatsdStats stats;
+ ShardOffsetProvider::getInstance().setShardOffset(15);
+ vector<uint8_t> output;
+ stats.dumpStats(&output, false);
+
+ StatsdStatsReport report;
+ EXPECT_TRUE(report.ParseFromArray(&output[0], output.size()));
+ EXPECT_EQ(report.shard_offset(), 15);
+}
+
} // namespace statsd
} // namespace os
} // namespace android