mononoke: add --logview-additional-level-filter

Summary:
While debugging T94402830 I noticed that logview category was using quite a lot
of scribe quota, however we don't really use it much. The reason it was using a
lot of scribe quota is because we were logging all stderr messages to logview,
even "DEBUG" ones. That might also be the reason why we didn't use logview - it
was too spammy.

Let's make it possible to add an additional log level filter for logview, so
that we could log only e.g. warn log messages and above.

Reviewed By: Croohand

Differential Revision: D29456888

fbshipit-source-id: 8cc66773ca8d82b00c3337937f519f6140fc8c9d
This commit is contained in:
Stanislau Hlebik 2021-06-30 06:43:52 -07:00 committed by Facebook GitHub Bot
parent a55ae93401
commit 9e98685fff
2 changed files with 41 additions and 12 deletions

View File

@ -79,6 +79,8 @@ pub const WITH_READONLY_STORAGE_ARG: &str = "with-readonly-storage";
pub const LOG_INCLUDE_TAG: &str = "log-include-tag";
pub const LOG_EXCLUDE_TAG: &str = "log-exclude-tag";
pub const LOGVIEW_CATEGORY: &str = "logview-category";
pub const LOGVIEW_ADDITIONAL_LEVEL_FILTER: &str = "logview-additional-level-filter";
// Argument, responsible for instantiation of `ObservabilityContext::Dynamic`
pub const WITH_DYNAMIC_OBSERVABILITY: &str = "with-dynamic-observability";
@ -839,11 +841,21 @@ fn add_logger_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
.help("fate of the process when a panic happens"),
)
.arg(
Arg::with_name("logview-category")
.long("logview-category")
Arg::with_name(LOGVIEW_CATEGORY)
.long(LOGVIEW_CATEGORY)
.takes_value(true)
.help("logview category to log to. Logview is not used if not set"),
)
.arg(
Arg::with_name(LOGVIEW_ADDITIONAL_LEVEL_FILTER)
.long(LOGVIEW_ADDITIONAL_LEVEL_FILTER)
.takes_value(true)
.possible_values(&slog::LOG_LEVEL_NAMES)
.requires(LOGVIEW_CATEGORY)
.help("logview level to filter. If logview category is not set then this is ignored. \
Note that this level is applied AFTER --log-level/--debug was applied, so it doesn't make sense to set this parameter to a lower level \
than --log-level"),
)
.arg(
Arg::with_name("debug")
.short("d")
@ -855,7 +867,7 @@ fn add_logger_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
.long("log-level")
.help("log level to use (does not work with --debug)")
.takes_value(true)
.possible_values(&["CRITICAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"])
.possible_values(&slog::LOG_LEVEL_NAMES)
.conflicts_with("debug"),
)
.arg(

View File

@ -52,11 +52,12 @@ use super::{
BLOBSTORE_SCRUB_ACTION_ARG, BLOBSTORE_SCRUB_GRACE_ARG,
BLOBSTORE_SCRUB_QUEUE_PEEK_BOUND_ARG, BLOBSTORE_SCRUB_WRITE_MOSTLY_MISSING_ARG,
CACHELIB_ATTEMPT_ZSTD_ARG, CRYPTO_PATH_REGEX_ARG, DISABLE_TUNABLES, ENABLE_MCROUTER,
LOCAL_CONFIGERATOR_PATH_ARG, LOG_EXCLUDE_TAG, LOG_INCLUDE_TAG, MANIFOLD_API_KEY_ARG,
MANIFOLD_THRIFT_OPS_ARG, MANIFOLD_WEAK_CONSISTENCY_MS_ARG, MYSQL_CONN_OPEN_TIMEOUT,
MYSQL_MASTER_ONLY, MYSQL_MAX_QUERY_TIME, MYSQL_POOL_AGE_TIMEOUT, MYSQL_POOL_IDLE_TIMEOUT,
MYSQL_POOL_LIMIT, MYSQL_POOL_PER_KEY_LIMIT, MYSQL_POOL_THREADS_NUM,
MYSQL_SQLBLOB_POOL_AGE_TIMEOUT, MYSQL_SQLBLOB_POOL_IDLE_TIMEOUT, MYSQL_SQLBLOB_POOL_LIMIT,
LOCAL_CONFIGERATOR_PATH_ARG, LOGVIEW_ADDITIONAL_LEVEL_FILTER, LOGVIEW_CATEGORY,
LOG_EXCLUDE_TAG, LOG_INCLUDE_TAG, MANIFOLD_API_KEY_ARG, MANIFOLD_THRIFT_OPS_ARG,
MANIFOLD_WEAK_CONSISTENCY_MS_ARG, MYSQL_CONN_OPEN_TIMEOUT, MYSQL_MASTER_ONLY,
MYSQL_MAX_QUERY_TIME, MYSQL_POOL_AGE_TIMEOUT, MYSQL_POOL_IDLE_TIMEOUT, MYSQL_POOL_LIMIT,
MYSQL_POOL_PER_KEY_LIMIT, MYSQL_POOL_THREADS_NUM, MYSQL_SQLBLOB_POOL_AGE_TIMEOUT,
MYSQL_SQLBLOB_POOL_IDLE_TIMEOUT, MYSQL_SQLBLOB_POOL_LIMIT,
MYSQL_SQLBLOB_POOL_PER_KEY_LIMIT, MYSQL_SQLBLOB_POOL_THREADS_NUM, READ_BURST_BYTES_ARG,
READ_BYTES_ARG, READ_CHAOS_ARG, READ_QPS_ARG, RENDEZVOUS_FREE_CONNECTIONS, RUNTIME_THREADS,
TUNABLES_CONFIG, WITH_DYNAMIC_OBSERVABILITY, WITH_READONLY_STORAGE_ARG,
@ -285,7 +286,7 @@ fn create_root_log_drain(
)?;
let root_log_drain: Arc<dyn SendSyncRefUnwindSafeDrain<Ok = (), Err = Never>> = match matches
.value_of("logview-category")
.value_of(LOGVIEW_CATEGORY)
{
Some(category) => {
#[cfg(fbcode_build)]
@ -293,14 +294,30 @@ fn create_root_log_drain(
// Sometimes scribe writes can fail due to backpressure - it's OK to drop these
// since logview is sampled anyway.
let logview_drain = ::slog_logview::LogViewDrain::new(fb, category).ignore_res();
match matches.value_of(LOGVIEW_ADDITIONAL_LEVEL_FILTER) {
Some(log_level_str) => {
let logview_level = Level::from_str(log_level_str)
.map_err(|_| format_err!("Unknown log level: {}", log_level_str))?;
let drain = slog::Duplicate::new(
glog_drain,
logview_drain.filter_level(logview_level).ignore_res(),
);
Arc::new(drain.ignore_res())
}
None => {
let drain = slog::Duplicate::new(glog_drain, logview_drain);
Arc::new(drain.ignore_res())
}
}
}
#[cfg(not(fbcode_build))]
{
let _unused = LOGVIEW_ADDITIONAL_LEVEL_FILTER;
let _ = (fb, category);
unimplemented!(
"Passed --logview-category, but it is supported only for fbcode builds"
"Passed --{}, but it is supported only for fbcode builds",
LOGVIEW_CATEGORY
)
}
}