diff options
author | Yu-Hsuan Hsu <yuhsuan@chromium.org> | 2021-01-11 13:31:49 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-01-26 05:09:45 +0000 |
commit | 39eeca0997aac7a5d5b5e0b9c5820f38c1377ba6 (patch) | |
tree | 250c07b6d06cb91aa3e85d5774c40b5bfea567d2 /cras/src/server/cras_server_metrics.c | |
parent | afb6f7a116dd16b882886239c0c7c547853ac310 (diff) | |
download | adhd-39eeca0997aac7a5d5b5e0b9c5820f38c1377ba6.tar.gz |
CRAS: cras_server_metrics - Log runtime for each stream type
Log runtime for each stream type. Currectly, only Default and
VoiceCommunication may be logged.
BUG=b:177185438
TEST=Verified Cras.InputStreamRuntime.Chrome.VoiceCommunication is
logged.
Change-Id: I6ee9be48309d2a9f88a7d2f584a362a3e5d55456
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/2620903
Tested-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Commit-Queue: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
Diffstat (limited to 'cras/src/server/cras_server_metrics.c')
-rw-r--r-- | cras/src/server/cras_server_metrics.c | 109 |
1 files changed, 65 insertions, 44 deletions
diff --git a/cras/src/server/cras_server_metrics.c b/cras/src/server/cras_server_metrics.c index ef4011bd..6def6a37 100644 --- a/cras/src/server/cras_server_metrics.c +++ b/cras/src/server/cras_server_metrics.c @@ -163,7 +163,8 @@ struct cras_server_metrics_device_data { }; struct cras_server_metrics_stream_data { - enum CRAS_CLIENT_TYPE type; + enum CRAS_CLIENT_TYPE client_type; + enum CRAS_STREAM_TYPE stream_type; enum CRAS_STREAM_DIRECTION direction; struct timespec runtime; }; @@ -309,6 +310,27 @@ metrics_client_type_str(enum CRAS_CLIENT_TYPE client_type) } } +static inline const char * +metrics_stream_type_str(enum CRAS_STREAM_TYPE stream_type) +{ + switch (stream_type) { + case CRAS_STREAM_TYPE_DEFAULT: + return "Default"; + case CRAS_STREAM_TYPE_MULTIMEDIA: + return "Multimedia"; + case CRAS_STREAM_TYPE_VOICE_COMMUNICATION: + return "VoiceCommunication"; + case CRAS_STREAM_TYPE_SPEECH_RECOGNITION: + return "SpeechRecognition"; + case CRAS_STREAM_TYPE_PRO_AUDIO: + return "ProAudio"; + case CRAS_STREAM_TYPE_ACCESSIBILITY: + return "Accessibility"; + default: + return "InvalidType"; + } +} + static enum CRAS_METRICS_DEVICE_TYPE get_metrics_device_type(struct cras_iodev *iodev) { @@ -394,6 +416,42 @@ get_metrics_device_type(struct cras_iodev *iodev) } } +/* + * Logs metrics for each group it belongs to. The UMA does not merge subgroups + * automatically so we need to log them separately. + * + * For example, if we call this function with argument (3, 48000, + * Cras.StreamSamplingRate, Input, Chrome), it will send 48000 to below + * metrics: + * Cras.StreamSamplingRate.Input.Chrome + * Cras.StreamSamplingRate.Input + * Cras.StreamSamplingRate + */ +static void log_sparse_histogram_each_level(int num, int sample, ...) +{ + char metrics_name[METRICS_NAME_BUFFER_SIZE] = {}; + va_list valist; + int i, len = 0; + + va_start(valist, sample); + + for (i = 0; i < num && len < METRICS_NAME_BUFFER_SIZE; i++) { + int metric_len = + snprintf(metrics_name + len, + METRICS_NAME_BUFFER_SIZE - len, "%s%s", + i ? "." : "", va_arg(valist, char *)); + // Exit early on error or running out of bufferspace. Avoids + // logging partial or corrupted strings. + if (metric_len < 0 || + metric_len > METRICS_NAME_BUFFER_SIZE - len) + break; + len += metric_len; + cras_metrics_log_sparse_histogram(metrics_name, sample); + } + + va_end(valist); +} + int cras_server_metrics_hfp_sco_connection_error( enum CRAS_METRICS_BT_SCO_ERROR_TYPE type) { @@ -869,7 +927,8 @@ int cras_server_metrics_stream_runtime(const struct cras_rstream *stream) struct timespec now; int err; - data.stream_data.type = stream->client_type; + data.stream_data.client_type = stream->client_type; + data.stream_data.stream_type = stream->stream_type; data.stream_data.direction = stream->direction; clock_gettime(CLOCK_MONOTONIC_RAW, &now); subtract_timespecs(&now, &stream->start_ts, &data.stream_data.runtime); @@ -975,15 +1034,11 @@ static void metrics_stream_runtime(struct cras_server_metrics_stream_data data) snprintf(metrics_name, METRICS_NAME_BUFFER_SIZE, "Cras.%sStreamRuntime", data.direction == CRAS_STREAM_INPUT ? "Input" : "Output"); - cras_metrics_log_histogram(metrics_name, (unsigned)data.runtime.tv_sec, - 0, 10000, 20); - snprintf(metrics_name, METRICS_NAME_BUFFER_SIZE, - "Cras.%sStreamRuntime.%s", - data.direction == CRAS_STREAM_INPUT ? "Input" : "Output", - metrics_client_type_str(data.type)); - cras_metrics_log_histogram(metrics_name, (unsigned)data.runtime.tv_sec, - 0, 10000, 20); + log_sparse_histogram_each_level( + 3, (int)data.runtime.tv_sec, metrics_name, + metrics_client_type_str(data.client_type), + metrics_stream_type_str(data.stream_type)); } static void metrics_busyloop(struct cras_server_metrics_timespec_data data) @@ -996,40 +1051,6 @@ static void metrics_busyloop(struct cras_server_metrics_timespec_data data) cras_metrics_log_histogram(metrics_name, data.count, 0, 1000, 20); } -/* - * Logs metrics for each group it belongs to. The UMA does not merge subgroups - * automatically so we need to log them separately. - * - * For example, if we call this function with argument (3, 48000, - * Cras.StreamSamplingRate, Input, Chrome), it will send 48000 to below - * metrics: - * Cras.StreamSamplingRate.Input.Chrome - * Cras.StreamSamplingRate.Input - * Cras.StreamSamplingRate - */ -static void log_sparse_histogram_each_level(int num, int sample, ...) -{ - char metrics_name[METRICS_NAME_BUFFER_SIZE] = {}; - va_list valist; - int i, len = 0; - - va_start(valist, sample); - - for (i = 0; i < num && len < METRICS_NAME_BUFFER_SIZE; i++) { - int metric_len = snprintf(metrics_name + len, - METRICS_NAME_BUFFER_SIZE - len, "%s%s", - i ? "." : "", va_arg(valist, char *)); - // Exit early on error or running out of bufferspace. Avoids - // logging partial or corrupted strings. - if (metric_len < 0 || metric_len > METRICS_NAME_BUFFER_SIZE - len) - break; - len += metric_len; - cras_metrics_log_sparse_histogram(metrics_name, sample); - } - - va_end(valist); -} - static void metrics_stream_config(struct cras_server_metrics_stream_config config) { |