mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-06-29 12:37:35 +03:00

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
162 lines
4.0 KiB
Plaintext
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
|
|
}
|