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
1112LOKI_MSG_TEMPLATE=" {\" streams\" : [{\" stream\" : {\" job\" : \" openwrt_loki_exporter\" , \" host\" : \" ${HOSTNAME} \" }, \" values\" : [[\" TIMESTAMP\" , \" MESSAGE\" ]]}]}"
1213LOKI_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 " $@ "
3031else
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