mirror_zfs/tests/zfs-tests/tests/functional/events/events_common.kshlib
Don Brady 13d65987a9
zed syslog entries drop important info
ZED will log zevents summaries to the syslog, however the log entries 
tend to drop event details that can be useful for diagnosis. This is 
especially true for ereport events, like io, checksum, and delay.

Update the all-syslog.sh script to log additional event information.

Add an optional config option, ZED_SYSLOG_DISPLAY_GUIDS, to zed.rc
for choosing GUIDs over names for pool and vdev.

Change the default ZED_SYSLOG_SUBCLASS_EXCLUDE to exclude history_event 
events. These events tend to be frequent, convey no meaningful info, 
and are already logged in the zpool history.

Reviewed-by: John Kennedy <john.kennedy@delphix.com>
Reviewed-by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Don Brady <don.brady@delphix.com>
Closes #10967
2020-10-19 11:01:00 -07:00

162 lines
4.0 KiB
Plaintext

#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2017 by Lawrence Livermore National Security, LLC.
# Use is subject to license terms.
#
# Copyright (c) 2020 by Delphix. All rights reserved.
#
. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/events/events.cfg
#
# wait for 'event' to show up in the log 'file'
function file_wait_event # file event timeout
{
file=$1
event=$2
timeout=${3:-120}
SECONDS=0
until grep -q "^ZEVENT_CLASS=$event" $ZED_DEBUG_LOG ; do
if [[ $SECONDS -gt $timeout ]]; then
echo file_wait_event exceeded $SECONDS seconds
return 1
fi
sleep 1
done
return 0;
}
#
# Wait for up to 'timeout' seconds for the 'file' to settle, i.e.
# not be updated for a period of 'delay' seconds.
#
function file_wait # file delay timeout
{
file=$1
delay=${2:-3}
timeout=${3:-120}
SECONDS=0
while [ $(( $(date +%s) - $(stat -c %Y $file) )) -lt $delay ]; do
if [[ $SECONDS -gt $timeout ]]; then
echo file_wait exceeded $SECONDS seconds
return 1
fi
sleep 1
done
return 0;
}
function run_and_verify
{
typeset event pool
set -A events
while getopts "e:p:" opt; do
case $opt in
e)
events+=("$OPTARG")
;;
p)
pool=$OPTARG
;;
esac
done
shift $(($OPTIND - 1))
pool=${pool:-$TESTPOOL}
fullcmd="$1"
cmd=$(echo $fullcmd | awk '{print $1}')
# If we aren't running zpool or zfs, something is wrong
[[ $cmd == "zpool" || $cmd == "zfs" ]] || \
log_fail "run_and_verify called with \"$cmd ($fullcmd)\""
log_note "Checking events for command: '$fullcmd'"
# Remove any previous events from the logs.
log_must zpool events -c
log_must truncate -s 0 $ZED_DEBUG_LOG
# Run the command as provided.
log_must eval "$fullcmd"
# Collect the new events and verify there are some.
log_must zpool sync -f
log_must eval "zpool events >$TMP_EVENTS 2>/dev/null"
log_must eval "zpool events -v > $TMP_EVENTS_FULL 2>/dev/null"
log_must test -s $TMP_EVENTS
log_must test -s $TMP_EVENTS_FULL
# If the only event is history then we don't observe zed debug log
if [[ "${events[0]}" != "sysevent.fs.zfs.history_event" ]]; then
# wait for the last event to show up in the debug log
log_must file_wait_event $ZED_DEBUG_LOG ${events[-1]}
log_must cp $ZED_DEBUG_LOG $TMP_EVENTS_ZED
log_must test -s $TMP_EVENTS_ZED
log_note "Events logged:"
grep "^ZEVENT_CLASS" $TMP_EVENTS_ZED
fi
log_note "Events generated:"
cat $TMP_EVENTS
# Verify all the expected events appear in the log.
for event in ${events[*]}; do
# Verify the event is in in the short output.
log_must grep -q "$event" $TMP_EVENTS
# Verify the event is in the verbose output with pool name.
awk -v event="$event" \
'BEGIN{FS="\n"; RS=""} $0 ~ event { print $0 }' \
$TMP_EVENTS_FULL >$TMP_EVENT_FULL
log_must grep -q "pool = \"$pool\"" $TMP_EVENT_FULL
# all-debug.sh filters history events (seen in ZED_DEBUG_LOG)
if [[ "$event" == "sysevent.fs.zfs.history_event" ]]; then
continue
fi
# Verify the event was received by the ZED and logged.
awk -v event="$event" \
'BEGIN{FS="\n"; RS=""} $0 ~ event { print $0 }' \
$TMP_EVENTS_ZED >$TMP_EVENT_ZED
log_must grep -q "^ZEVENT_POOL=$pool" $TMP_EVENT_ZED
done
rm -f $TMP_EVENTS $TMP_EVENTS_FULL $TMP_EVENT_FULL \
$TMP_EVENTS_ZED $TMP_EVENT_ZED
}