Use generated code for logging events to statsd
Use the autogenerated libstatslog_lmkd to send events to statsd The logging schema for statsd is changing as part of statsd becoming a Mainline module in R. The autogenerated code will handle the schema change. Bug: 145887874 Test: m -j Test: atest android.cts.statsd.atom.UidAtomTests#testLmkKillOccurred Change-Id: Ibae4cd822807369a799d5c1f6a9c51272e38a074
This commit is contained in:
parent
36baf44179
commit
ed8fe8465a
34
Android.bp
34
Android.bp
|
|
@ -22,6 +22,7 @@ cc_binary {
|
||||||
],
|
],
|
||||||
static_libs: [
|
static_libs: [
|
||||||
"libstatslogc",
|
"libstatslogc",
|
||||||
|
"libstatslog_lmkd",
|
||||||
"libstatssocket",
|
"libstatssocket",
|
||||||
],
|
],
|
||||||
local_include_dirs: ["include"],
|
local_include_dirs: ["include"],
|
||||||
|
|
@ -42,7 +43,38 @@ cc_library_static {
|
||||||
shared_libs: [
|
shared_libs: [
|
||||||
"liblog",
|
"liblog",
|
||||||
],
|
],
|
||||||
static_libs: ["libstatssocket",],
|
static_libs: [
|
||||||
|
"libstatslog_lmkd",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
genrule {
|
||||||
|
name: "statslog_lmkd.h",
|
||||||
|
tools: ["stats-log-api-gen"],
|
||||||
|
cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_lmkd.h --module lmkd --namespace android,lmkd,stats",
|
||||||
|
out: [
|
||||||
|
"statslog_lmkd.h",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
genrule {
|
||||||
|
name: "statslog_lmkd.cpp",
|
||||||
|
tools: ["stats-log-api-gen"],
|
||||||
|
cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_lmkd.cpp --module lmkd --namespace android,lmkd,stats --importHeader statslog_lmkd.h",
|
||||||
|
out: [
|
||||||
|
"statslog_lmkd.cpp",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_library_static {
|
||||||
|
name: "libstatslog_lmkd",
|
||||||
|
generated_sources: ["statslog_lmkd.cpp"],
|
||||||
|
generated_headers: ["statslog_lmkd.h"],
|
||||||
|
export_generated_headers: ["statslog_lmkd.h"],
|
||||||
|
static_libs: [
|
||||||
|
"libcutils",
|
||||||
|
"libstatssocket",
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_library_static {
|
cc_library_static {
|
||||||
|
|
|
||||||
16
lmkd.cpp
16
lmkd.cpp
|
|
@ -22,6 +22,7 @@
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <statslog_lmkd.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
@ -790,7 +791,7 @@ static void poll_kernel(int poll_fd) {
|
||||||
ctrl_data_write_lmk_kill_occurred((pid_t)pid, (uid_t)uid);
|
ctrl_data_write_lmk_kill_occurred((pid_t)pid, (uid_t)uid);
|
||||||
mem_st.process_start_time_ns = starttime * (NS_PER_SEC / sysconf(_SC_CLK_TCK));
|
mem_st.process_start_time_ns = starttime * (NS_PER_SEC / sysconf(_SC_CLK_TCK));
|
||||||
mem_st.rss_in_bytes = rss_in_pages * PAGE_SIZE;
|
mem_st.rss_in_bytes = rss_in_pages * PAGE_SIZE;
|
||||||
stats_write_lmk_kill_occurred_pid(LMK_KILL_OCCURRED, uid, pid, oom_score_adj,
|
stats_write_lmk_kill_occurred_pid(uid, pid, oom_score_adj,
|
||||||
min_score_adj, 0, &mem_st);
|
min_score_adj, 0, &mem_st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2035,8 +2036,7 @@ static int kill_one_process(struct proc* procp, int min_oom_score, int kill_reas
|
||||||
uid, procp->oomadj, tasksize * page_k);
|
uid, procp->oomadj, tasksize * page_k);
|
||||||
}
|
}
|
||||||
|
|
||||||
stats_write_lmk_kill_occurred(LMK_KILL_OCCURRED, uid, taskname,
|
stats_write_lmk_kill_occurred(uid, taskname, procp->oomadj, min_oom_score, tasksize, mem_st);
|
||||||
procp->oomadj, min_oom_score, tasksize, mem_st);
|
|
||||||
|
|
||||||
ctrl_data_write_lmk_kill_occurred((pid_t)pid, uid);
|
ctrl_data_write_lmk_kill_occurred((pid_t)pid, uid);
|
||||||
|
|
||||||
|
|
@ -2075,8 +2075,8 @@ static int find_and_kill_process(int min_score_adj, int kill_reason, const char
|
||||||
if (killed_size >= 0) {
|
if (killed_size >= 0) {
|
||||||
if (!lmk_state_change_start) {
|
if (!lmk_state_change_start) {
|
||||||
lmk_state_change_start = true;
|
lmk_state_change_start = true;
|
||||||
stats_write_lmk_state_changed(LMK_STATE_CHANGED,
|
stats_write_lmk_state_changed(
|
||||||
LMK_STATE_CHANGE_START);
|
android::lmkd::stats::LMK_STATE_CHANGED__STATE__START);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -2087,7 +2087,7 @@ static int find_and_kill_process(int min_score_adj, int kill_reason, const char
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lmk_state_change_start) {
|
if (lmk_state_change_start) {
|
||||||
stats_write_lmk_state_changed(LMK_STATE_CHANGED, LMK_STATE_CHANGE_STOP);
|
stats_write_lmk_state_changed(android::lmkd::stats::LMK_STATE_CHANGED__STATE__STOP);
|
||||||
}
|
}
|
||||||
|
|
||||||
return killed_size;
|
return killed_size;
|
||||||
|
|
@ -3085,8 +3085,6 @@ int main(int argc __unused, char **argv __unused) {
|
||||||
|
|
||||||
ctx = create_android_logger(KILLINFO_LOG_TAG);
|
ctx = create_android_logger(KILLINFO_LOG_TAG);
|
||||||
|
|
||||||
statslog_init();
|
|
||||||
|
|
||||||
if (!init()) {
|
if (!init()) {
|
||||||
if (!use_inkernel_interface) {
|
if (!use_inkernel_interface) {
|
||||||
/*
|
/*
|
||||||
|
|
@ -3114,8 +3112,6 @@ int main(int argc __unused, char **argv __unused) {
|
||||||
mainloop();
|
mainloop();
|
||||||
}
|
}
|
||||||
|
|
||||||
statslog_destroy();
|
|
||||||
|
|
||||||
android_log_destroy(&ctx);
|
android_log_destroy(&ctx);
|
||||||
|
|
||||||
ALOGI("exiting");
|
ALOGI("exiting");
|
||||||
|
|
|
||||||
139
statslog.cpp
139
statslog.cpp
|
|
@ -16,13 +16,14 @@
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <log/log.h>
|
||||||
#include <log/log_id.h>
|
#include <log/log_id.h>
|
||||||
#include <stats_event_list.h>
|
|
||||||
#include <statslog.h>
|
#include <statslog.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#ifdef LMKD_LOG_STATS
|
#ifdef LMKD_LOG_STATS
|
||||||
|
|
@ -31,8 +32,7 @@
|
||||||
#define STRINGIFY(x) STRINGIFY_INTERNAL(x)
|
#define STRINGIFY(x) STRINGIFY_INTERNAL(x)
|
||||||
#define STRINGIFY_INTERNAL(x) #x
|
#define STRINGIFY_INTERNAL(x) #x
|
||||||
|
|
||||||
static bool enable_stats_log;
|
static bool enable_stats_log = property_get_bool("ro.lmk.log_stats", false);
|
||||||
static android_log_context log_ctx;
|
|
||||||
|
|
||||||
struct proc {
|
struct proc {
|
||||||
int pid;
|
int pid;
|
||||||
|
|
@ -44,60 +44,18 @@ struct proc {
|
||||||
static struct proc** pidhash = NULL;
|
static struct proc** pidhash = NULL;
|
||||||
#define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1))
|
#define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1))
|
||||||
|
|
||||||
static int64_t getElapsedRealTimeNs() {
|
|
||||||
struct timespec t;
|
|
||||||
t.tv_sec = t.tv_nsec = 0;
|
|
||||||
clock_gettime(CLOCK_BOOTTIME, &t);
|
|
||||||
return (int64_t)t.tv_sec * 1000000000LL + t.tv_nsec;
|
|
||||||
}
|
|
||||||
|
|
||||||
void statslog_init() {
|
|
||||||
enable_stats_log = property_get_bool("ro.lmk.log_stats", false);
|
|
||||||
|
|
||||||
if (enable_stats_log) {
|
|
||||||
log_ctx = create_android_logger(kStatsEventTag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void statslog_destroy() {
|
|
||||||
if (log_ctx) {
|
|
||||||
android_log_destroy(&log_ctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the change in LMKD state which is used as start/stop boundaries for logging
|
* Logs the change in LMKD state which is used as start/stop boundaries for logging
|
||||||
* LMK_KILL_OCCURRED event.
|
* LMK_KILL_OCCURRED event.
|
||||||
* Code: LMK_STATE_CHANGED = 54
|
* Code: LMK_STATE_CHANGED = 54
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
stats_write_lmk_state_changed(int32_t code, int32_t state) {
|
stats_write_lmk_state_changed(int32_t state) {
|
||||||
int ret = -EINVAL;
|
if (enable_stats_log) {
|
||||||
|
return android::lmkd::stats::stats_write(android::lmkd::stats::LMK_STATE_CHANGED, state);
|
||||||
if (!enable_stats_log) {
|
} else {
|
||||||
return ret;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(log_ctx != NULL);
|
|
||||||
if (!log_ctx) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
reset_log_context(log_ctx);
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, getElapsedRealTimeNs())) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int32(log_ctx, code)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int32(log_ctx, state)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return write_to_logger(log_ctx, LOG_ID_STATS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct proc* pid_lookup(int pid) {
|
static struct proc* pid_lookup(int pid) {
|
||||||
|
|
@ -116,78 +74,35 @@ static struct proc* pid_lookup(int pid) {
|
||||||
* Code: LMK_KILL_OCCURRED = 51
|
* Code: LMK_KILL_OCCURRED = 51
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
stats_write_lmk_kill_occurred(int32_t code, int32_t uid, char const* process_name,
|
stats_write_lmk_kill_occurred(int32_t uid, char const* process_name,
|
||||||
int32_t oom_score, int32_t min_oom_score, int tasksize,
|
int32_t oom_score, int32_t min_oom_score, int tasksize,
|
||||||
struct memory_stat *mem_st) {
|
struct memory_stat *mem_st) {
|
||||||
int ret = -EINVAL;
|
if (enable_stats_log) {
|
||||||
if (!enable_stats_log) {
|
return android::lmkd::stats::stats_write(
|
||||||
return ret;
|
android::lmkd::stats::LMK_KILL_OCCURRED,
|
||||||
|
uid,
|
||||||
|
process_name,
|
||||||
|
oom_score,
|
||||||
|
mem_st ? mem_st->pgfault : -1,
|
||||||
|
mem_st ? mem_st->pgmajfault : -1,
|
||||||
|
mem_st ? mem_st->rss_in_bytes : tasksize * BYTES_IN_KILOBYTE,
|
||||||
|
mem_st ? mem_st->cache_in_bytes : -1,
|
||||||
|
mem_st ? mem_st->swap_in_bytes : -1,
|
||||||
|
mem_st ? mem_st->process_start_time_ns : -1,
|
||||||
|
min_oom_score
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (!log_ctx) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
reset_log_context(log_ctx);
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, getElapsedRealTimeNs())) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int32(log_ctx, code)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int32(log_ctx, uid)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_string8(log_ctx, (process_name == NULL) ? "" : process_name)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int32(log_ctx, oom_score)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->pgfault : -1)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->pgmajfault : -1)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->rss_in_bytes
|
|
||||||
: tasksize * BYTES_IN_KILOBYTE)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->cache_in_bytes : -1)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->swap_in_bytes : -1)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->process_start_time_ns
|
|
||||||
: -1)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = android_log_write_int32(log_ctx, min_oom_score)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return write_to_logger(log_ctx, LOG_ID_STATS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int stats_write_lmk_kill_occurred_pid(int32_t code, int32_t uid, int pid, int32_t oom_score,
|
int stats_write_lmk_kill_occurred_pid(int32_t uid, int pid, int32_t oom_score,
|
||||||
int32_t min_oom_score, int tasksize,
|
int32_t min_oom_score, int tasksize,
|
||||||
struct memory_stat* mem_st) {
|
struct memory_stat* mem_st) {
|
||||||
struct proc* proc = pid_lookup(pid);
|
struct proc* proc = pid_lookup(pid);
|
||||||
if (!proc) return -EINVAL;
|
if (!proc) return -EINVAL;
|
||||||
|
|
||||||
return stats_write_lmk_kill_occurred(code, uid, proc->taskname, oom_score, min_oom_score,
|
return stats_write_lmk_kill_occurred(uid, proc->taskname, oom_score, min_oom_score,
|
||||||
tasksize, mem_st);
|
tasksize, mem_st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
40
statslog.h
40
statslog.h
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stats_event_list.h>
|
#include <statslog_lmkd.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
@ -37,27 +37,8 @@ struct memory_stat {
|
||||||
int64_t process_start_time_ns;
|
int64_t process_start_time_ns;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* These are defined in
|
|
||||||
* http://cs/android/frameworks/base/cmds/statsd/src/atoms.proto
|
|
||||||
*/
|
|
||||||
#define LMK_KILL_OCCURRED 51
|
|
||||||
#define LMK_STATE_CHANGED 54
|
|
||||||
#define LMK_STATE_CHANGE_START 1
|
|
||||||
#define LMK_STATE_CHANGE_STOP 2
|
|
||||||
|
|
||||||
#ifdef LMKD_LOG_STATS
|
#ifdef LMKD_LOG_STATS
|
||||||
|
|
||||||
/*
|
|
||||||
* The single event tag id for all stats logs.
|
|
||||||
* Keep this in sync with system/core/logcat/event.logtags
|
|
||||||
*/
|
|
||||||
const static int kStatsEventTag = 1937006964;
|
|
||||||
|
|
||||||
void statslog_init();
|
|
||||||
|
|
||||||
void statslog_destroy();
|
|
||||||
|
|
||||||
#define MEMCG_PROCESS_MEMORY_STAT_PATH "/dev/memcg/apps/uid_%u/pid_%u/memory.stat"
|
#define MEMCG_PROCESS_MEMORY_STAT_PATH "/dev/memcg/apps/uid_%u/pid_%u/memory.stat"
|
||||||
#define PROC_STAT_FILE_PATH "/proc/%d/stat"
|
#define PROC_STAT_FILE_PATH "/proc/%d/stat"
|
||||||
#define PROC_STAT_BUFFER_SIZE 1024
|
#define PROC_STAT_BUFFER_SIZE 1024
|
||||||
|
|
@ -69,22 +50,22 @@ void statslog_destroy();
|
||||||
* Code: LMK_STATE_CHANGED = 54
|
* Code: LMK_STATE_CHANGED = 54
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
stats_write_lmk_state_changed(int32_t code, int32_t state);
|
stats_write_lmk_state_changed(int32_t state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the event when LMKD kills a process to reduce memory pressure.
|
* Logs the event when LMKD kills a process to reduce memory pressure.
|
||||||
* Code: LMK_KILL_OCCURRED = 51
|
* Code: LMK_KILL_OCCURRED = 51
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
stats_write_lmk_kill_occurred(int32_t code, int32_t uid,
|
stats_write_lmk_kill_occurred(int32_t uid, char const* process_name,
|
||||||
char const* process_name, int32_t oom_score, int32_t min_oom_score,
|
int32_t oom_score, int32_t min_oom_score,
|
||||||
int tasksize, struct memory_stat *mem_st);
|
int tasksize, struct memory_stat *mem_st);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the event when LMKD kills a process to reduce memory pressure.
|
* Logs the event when LMKD kills a process to reduce memory pressure.
|
||||||
* Code: LMK_KILL_OCCURRED = 51
|
* Code: LMK_KILL_OCCURRED = 51
|
||||||
*/
|
*/
|
||||||
int stats_write_lmk_kill_occurred_pid(int32_t code, int32_t uid, int pid, int32_t oom_score,
|
int stats_write_lmk_kill_occurred_pid(int32_t uid, int pid, int32_t oom_score,
|
||||||
int32_t min_oom_score, int tasksize,
|
int32_t min_oom_score, int tasksize,
|
||||||
struct memory_stat* mem_st);
|
struct memory_stat* mem_st);
|
||||||
|
|
||||||
|
|
@ -107,19 +88,16 @@ void stats_remove_taskname(int pid);
|
||||||
|
|
||||||
#else /* LMKD_LOG_STATS */
|
#else /* LMKD_LOG_STATS */
|
||||||
|
|
||||||
static inline void statslog_init() {}
|
static inline int
|
||||||
static inline void statslog_destroy() {}
|
stats_write_lmk_state_changed(int32_t state __unused) { return -EINVAL; }
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
stats_write_lmk_state_changed(int32_t code __unused, int32_t state __unused) { return -EINVAL; }
|
stats_write_lmk_kill_occurred(int32_t uid __unused,
|
||||||
|
|
||||||
static inline int
|
|
||||||
stats_write_lmk_kill_occurred(int32_t code __unused, int32_t uid __unused,
|
|
||||||
char const* process_name __unused, int32_t oom_score __unused,
|
char const* process_name __unused, int32_t oom_score __unused,
|
||||||
int32_t min_oom_score __unused, int tasksize __unused,
|
int32_t min_oom_score __unused, int tasksize __unused,
|
||||||
struct memory_stat *mem_st __unused) { return -EINVAL; }
|
struct memory_stat *mem_st __unused) { return -EINVAL; }
|
||||||
|
|
||||||
static inline int stats_write_lmk_kill_occurred_pid(int32_t code __unused, int32_t uid __unused,
|
static inline int stats_write_lmk_kill_occurred_pid(int32_t uid __unused,
|
||||||
int pid __unused, int32_t oom_score __unused,
|
int pid __unused, int32_t oom_score __unused,
|
||||||
int32_t min_oom_score __unused,
|
int32_t min_oom_score __unused,
|
||||||
int tasksize __unused,
|
int tasksize __unused,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue