Heroku: Ruby Language Metrics (Public Beta) on Stack: Container
Here at Pier we use Heroku for hosting some of our applications and we would like to have the Language Runtime Metrics that they provide in their metrics dashboard for each app. You can read the docs at: https://devcenter.heroku.com/articles/language-runtime-metrics-ruby#getting-started
Done everything according to the article but the metrics won't show up.
After contacting the support I've found out that "stack: container" won't have the language metrics because buildpacks aren't available at containerized apps.
Right now there is a note about this, at the time there wasn't one.
This process does not work with container based-applications because they do not use buildpacks. Currently container-based applications are not supported in this beta.
After speaking with Heroku support we found a way to make it work.
- First of all, we’re using an alpine docker image.
- We added bash and curl to our Dockerfile (
apk add bash curl
) - We copied the
heroku-metrics-daemon.sh
(from https://github.com/heroku/heroku-buildpack-metrics) to/etc/profile.d/
to run as aprofile.d
script on the boot of the heroku dyno. - We needed to edit the
.sh
file. - We removed the
--warning=no-unknown-keyword
flag from the tar command. Apparently it’s not compatible with the alpine tar, only GNU tar (you could also add GNU tar to your image). - We had problems with the array parsing/syntax in the script (even with
bash
installed and with#!/bin/bash
). So we removed the option to useAGENTMON_DEBUG
from the script.
The final script is as follows:
#!/bin/bash
# From: https://github.com/heroku/heroku-buildpack-metrics/blob/master/.profile.d/heroku-metrics-daemon.sh
setup_metrics() {
# don't do anything if we don't have a metrics url.
if [[ -z "$HEROKU_METRICS_URL" ]] || [[ "${DYNO}" = run\.* ]]; then
return 0
fi
STARTTIME=$(date +%s)
BUILD_DIR=/tmp
DOWNLOAD_URL=$(curl --retry 3 -s https://agentmon-releases.s3.amazonaws.com/latest)
if [ -z "${DOWNLOAD_URL}" ]; then
echo "!!!!! Failed to find latest agentmon. Please report this as a bug. Metrics collection will be disabled this run."
return 1
fi
BASENAME=$(basename "${DOWNLOAD_URL}")
curl -L --retry 3 -s -o "${BUILD_DIR}/${BASENAME}" "${DOWNLOAD_URL}"
# Ensure the bin folder exists, if not already.
mkdir -p "${BUILD_DIR}/bin"
# Extract agentmon release
# tar --warning=no-unknown-keyword -C "${BUILD_DIR}/bin" -zxf "${BUILD_DIR}/${BASENAME}"
tar -C "${BUILD_DIR}/bin" -zxf "${BUILD_DIR}/${BASENAME}"
chmod +x "${BUILD_DIR}/bin/agentmon"
ELAPSEDTIME=$(($(date +%s) - STARTTIME))
echo "agentmon setup took ${ELAPSEDTIME} seconds"
# AGENTMON_FLAGS=("-statsd-addr=:${PORT}")
AGENTMON_FLAG="-statsd-addr=:${PORT}"
# if [[ "${AGENTMON_DEBUG}" = "true" ]]; then
# AGENTMON_FLAGS+=("-debug")
# fi
if [[ -x "${BUILD_DIR}/bin/agentmon" ]]; then
(while true; do
# ${BUILD_DIR}/bin/agentmon "${AGENTMON_FLAGS[@]}" "${HEROKU_METRICS_URL}"
${BUILD_DIR}/bin/agentmon "${AGENTMON_FLAG}" "${HEROKU_METRICS_URL}"
echo "agentmon completed with status=${?}. Restarting"
sleep 1
done) &
else
echo "No agentmon executable found. Not starting."
fi
}
setup_metrics
Written by Rafael Oliveira
Related protips
2 Responses
Very usefull!
Thanks guys. Share the knowledge as much as you like, I took a lot of time to find that solution. :)