lnav/example-scripts/report-demo.lnav
2024-04-12 20:54:23 -07:00

84 lines
2.5 KiB
Plaintext

#
# @synopsis: report-demo [<output-path>]
# @description: Generate a report for requests in access_log files
#
# Figure out the file path where the report should be written to, default is
# stdout
;SELECT CASE
WHEN $1 IS NULL THEN '-'
ELSE $1
END AS out_path
# Redirect output from commands to $out_path
:redirect-to $out_path
# Print an introductory message
;SELECT printf('\n%d total requests', count(1)) AS msg FROM access_log
:echo $msg
;WITH top_paths AS MATERIALIZED (
SELECT
cs_uri_stem,
count(1) AS total_hits,
sum(sc_bytes) as bytes,
count(distinct c_ip) as visitors
FROM access_log
WHERE sc_status BETWEEN 200 AND 300
GROUP BY cs_uri_stem
ORDER BY total_hits DESC
LIMIT 50),
weekly_hits_with_gaps AS MATERIALIZED (
SELECT timeslice(log_time_msecs, '1w') AS week,
cs_uri_stem,
count(1) AS weekly_hits
FROM access_log
WHERE cs_uri_stem IN (SELECT cs_uri_stem FROM top_paths) AND
sc_status BETWEEN 200 AND 300
GROUP BY week, cs_uri_stem),
all_weeks AS (
SELECT week
FROM weekly_hits_with_gaps
GROUP BY week
ORDER BY week ASC),
weekly_hits AS (
SELECT all_weeks.week,
top_paths.cs_uri_stem,
ifnull(weekly_hits, 0) AS hits
FROM all_weeks
CROSS JOIN top_paths
LEFT JOIN weekly_hits_with_gaps
ON all_weeks.week = weekly_hits_with_gaps.week AND
top_paths.cs_uri_stem = weekly_hits_with_gaps.cs_uri_stem)
SELECT weekly_hits.cs_uri_stem AS Path,
printf('%,9d', total_hits) AS Hits,
printf('%,9d', visitors) AS Visitors,
printf('%9s', humanize_file_size(bytes)) as Amount,
sparkline(hits) AS Weeks
FROM weekly_hits
LEFT JOIN top_paths ON top_paths.cs_uri_stem = weekly_hits.cs_uri_stem
GROUP BY weekly_hits.cs_uri_stem
ORDER BY Hits DESC
LIMIT 10
:write-table-to -
:echo
:echo Failed Requests
:echo
;SELECT printf('%,9d', count(1)) AS Hits,
printf('%,9d', count(distinct c_ip)) AS Visitors,
sc_status AS Status,
cs_method AS Method,
group_concat(distinct cs_version) AS Versions,
cs_uri_stem AS Path,
replicate('|', (cast(count(1) AS REAL) / $total_requests) * 100.0) AS "% of Requests"
FROM access_log
WHERE sc_status >= 400
GROUP BY cs_method, cs_uri_stem
ORDER BY Hits DESC
LIMIT 10
:write-table-to -