Skip to content

Commit 4ed85a8

Browse files
authored
Introduce local rolling log in temporary location (#15)
This is intended to simplify debugging various issues that may arise in runtime + avoid emitting extra output to stderr which could be harmful (see #14 for details).
1 parent 3d8a08b commit 4ed85a8

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

loki_exporter.sh

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
# (OpenWRT's ash from busybox is kinda similar but there still could be issues)
66

77
_TMPDIR="$(mktemp -d -p /tmp loki_exporter.XXXXXX)"
8-
PIPE_NAME="/${_TMPDIR}/loki_exporter.pipe"
9-
BULK_DATA="/${_TMPDIR}/loki_exporter.boot"
8+
PIPE_NAME="${_TMPDIR}/loki_exporter.pipe"
9+
BULK_DATA="${_TMPDIR}/loki_exporter.boot"
10+
LOCAL_LOG="${_TMPDIR}/log"
1011

1112
LOKI_MSG_TEMPLATE="{\"streams\": [{\"stream\": {\"job\": \"openwrt_loki_exporter\", \"host\": \"${HOSTNAME}\"}, \"values\": [[\"TIMESTAMP\", \"MESSAGE\"]]}]}"
1213
LOKI_BULK_TEMPLATE_HEADER="{\"streams\": [{\"stream\": {\"job\": \"openwrt_loki_exporter\", \"host\": \"${HOSTNAME}\"}, \"values\": ["
@@ -28,7 +29,7 @@ if [ "${AUTOTEST-0}" -eq 1 ]; then
2829
-H "Connection: close" \
2930
"$@"
3031
else
31-
curl -fsS \
32+
curl --no-progress-meter -fi \
3233
-H "Content-Type: application/json" \
3334
-H "Content-Encoding: gzip" \
3435
-H "User-Agent: ${USER_AGENT}" \
@@ -70,11 +71,37 @@ _teardown() {
7071
if [ "${AUTOTEST-0}" -eq 1 ]; then
7172
mkdir -p results
7273
cp -r "${_TMPDIR}" results/
74+
echo "LOG:"
75+
cat "${LOCAL_LOG}"
7376
fi
7477
rm -rf "${_TMPDIR}"
7578
exit 0
7679
}
7780

81+
_rotate_local_log() {
82+
# maximum allowed size of a local log file (bytes)
83+
log_max_size=4096
84+
85+
# how many rotated logs to keep
86+
log_rotate=3
87+
88+
llsize="$(wc -c "${LOCAL_LOG}" | awk '{print $1}')"
89+
if [ "${llsize}" -le "${log_max_size}" ]; then
90+
return
91+
fi
92+
93+
for i in $(seq $((log_rotate - 1)) -1 1); do
94+
if [ ! -e "${LOCAL_LOG}.${i}" ]; then
95+
continue
96+
fi
97+
j=$((i + 1))
98+
mv "${LOCAL_LOG}.${i}" "${LOCAL_LOG}.${j}"
99+
done
100+
101+
mv "${LOCAL_LOG}" "${LOCAL_LOG}.1"
102+
touch "${LOCAL_LOG}"
103+
}
104+
78105
_do_bulk_post() {
79106
_log_file="$1"
80107
post_body="${LOKI_BULK_TEMPLATE_HEADER}"
@@ -86,7 +113,7 @@ _do_bulk_post() {
86113
# shellcheck disable=SC2116
87114
# subshell is required to handle multiplication errors and keep the loop
88115
if ! ts_ns="$(echo $(( ts_ms * 1000 * 1000 )) )" ; then
89-
echo "PARSE ERROR: '${line}'"
116+
echo "PARSE ERROR: '${line}'" >>"${LOCAL_LOG}"
90117
continue
91118
fi
92119

@@ -105,7 +132,7 @@ _do_bulk_post() {
105132
rm -f "${_log_file}"
106133

107134
if ! _curl_bulk_cmd --data-binary "@${_log_file}.payload.gz" "${LOKI_PUSH_URL}" >"${_log_file}.payload.gz-response" 2>&1; then
108-
echo "BULK POST FAILED: leaving ${_log_file}.payload.gz for now"
135+
echo "BULK POST FAILED: leaving ${_log_file}.payload.gz for now" >>"${LOCAL_LOG}"
109136
fi
110137
}
111138

@@ -226,7 +253,7 @@ _main_loop() {
226253
# shellcheck disable=SC2116
227254
# subshell is required to handle multiplication errors and keep the loop
228255
if ! ts_ns="$(echo $(( ts_ms * 1000 * 1000 )) )" ; then
229-
echo "PARSE ERROR: '${line}'"
256+
echo "PARSE ERROR: '${line}'" >>"${LOCAL_LOG}"
230257
continue
231258
fi
232259

@@ -243,11 +270,13 @@ _main_loop() {
243270
post_body="${post_body/TIMESTAMP/$ts_ns}"
244271
post_body="${post_body/MESSAGE/$msg}"
245272

246-
if ! _curl_cmd -d "${post_body}" "${LOKI_PUSH_URL}"; then
247-
echo "POST FAILED: '${post_body}'"
273+
if ! _curl_cmd -d "${post_body}" "${LOKI_PUSH_URL}" >>"${LOCAL_LOG}" 2>&1; then
274+
echo "POST FAILED: '${post_body}'" >>"${LOCAL_LOG}"
248275
fi
249276

250277
MIN_TIMESTAMP="${ts_ns}"
278+
279+
_rotate_local_log
251280
done <"${PIPE_NAME}"
252281
}
253282

@@ -271,7 +300,7 @@ if [ "${BOOT}" -eq 1 ]; then
271300
# shellcheck disable=SC2116
272301
# subshell is required to handle multiplication errors
273302
if ! ts_ns="$(echo $(( ts_ms * 1000 * 1000 )) )" ; then
274-
echo "PARSE ERROR: '${last_line}'"
303+
echo "PARSE ERROR: '${last_line}'" >>"${LOCAL_LOG}"
275304
else
276305
MIN_TIMESTAMP=${ts_ns}
277306
fi

0 commit comments

Comments
 (0)