mirror of https://github.com/ekimekim/wubloader
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.3 KiB
Plaintext
46 lines
1.3 KiB
Plaintext
6 years ago
|
#!/bin/bash
|
||
|
|
||
|
set -eu
|
||
|
|
||
|
USAGE="USAGE: $0 PROM_URL SERVICE DURATION [TIME [LABELS]] > flamegraph.svg
|
||
|
Generate a flamegraph for the given service using data from the given prometheus server.
|
||
|
Uses DURATION amount of data (in prometheus timespec format, eg '15m'), ending at TIME,
|
||
|
which may be unix time or RFC3339, defaults to now.
|
||
|
Labels is optional extra prometheus labels to match on, in promql format,
|
||
|
eg. 'foo=\"bar\",baz=\"123\"'
|
||
|
Note that in the resulting flamegraph, the 'samples' value is actually showing milliseconds
|
||
|
of cpu time over the given duration."
|
||
|
|
||
|
if [ "$#" -lt 3 ]; then
|
||
|
echo "$USAGE" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
PROM=$1
|
||
|
SERVICE=$2
|
||
|
DURATION=$3
|
||
|
TIME=${4:-now}
|
||
|
LABELS=${5:-}
|
||
|
|
||
|
if [ "$TIME" == "now" ]; then
|
||
|
TIME=$(date +%s)
|
||
|
fi
|
||
|
|
||
|
if [ -n "$LABELS" ]; then
|
||
|
LABELS="job=\"$SERVICE\""
|
||
|
else
|
||
|
LABELS="job=\"$SERVICE\",$LABELS"
|
||
|
fi
|
||
|
|
||
|
docker build -t wubloader-flamegraph:latest . -f - 1>&2 <<EOF
|
||
|
FROM alpine:3.7
|
||
|
RUN apk --update add curl jq perl
|
||
|
RUN curl https://raw.githubusercontent.com/brendangregg/FlameGraph/master/flamegraph.pl -o /flamegraph.pl
|
||
|
EOF
|
||
|
|
||
|
docker run -i --rm -e PROM= wubloader-flamegraph:latest /bin/sh -c "
|
||
|
curl -G '$PROM/api/v1/query' --data-urlencode 'time=$TIME' --data-urlencode 'query=sum(increase(flamegraph_total{$LABELS}[$DURATION])) by (stack) * 1000 > 0' |
|
||
|
jq -r '.data.result[]|\"\\(.metric.stack) \\(.value[1])\"' |
|
||
|
perl /flamegraph.pl
|
||
|
"
|