Heroku: métricas de linguagem Ruby (beta público) na pilha: contêiner

Aqui no Pier, usamos o Heroku para hospedar alguns de nossos aplicativos e gostaríamos de ter as Métricas de Tempo de Execução de Idioma que eles fornecem em seu painel de métricas para cada aplicativo. Você pode ler a documentação em: https://devcenter.heroku.com/articles/language-runtime-metrics-ruby#getting-started

Feito tudo de acordo com o artigo, mas as métricas não aparecerão.
Depois de entrar em contato com o suporte, descobri que “stack: container” não terá as métricas de idioma porque buildpacks não estão disponíveis em aplicativos em container.
Neste momento há uma observação sobre isso, na época não havia.

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.

Depois de falar com o suporte do Heroku, encontramos uma maneira de fazer funcionar.

  1. Em primeiro lugar, estamos usando uma imagem docker alpina.
  2. Adicionamos bash e curl ao nosso Dockerfile ( apk add bash curl)
  3. Copiamos o heroku-metrics-daemon.sh(de https://github.com/heroku/heroku-buildpack-metrics ) para /etc/profile.d/executar como um profile.dscript na inicialização do dinamômetro heroku.
  4. Precisávamos editar o .sharquivo.
  5. Removemos o --warning=no-unknown-keywordsinalizador do comando tar. Aparentemente, não é compatível com o tar alpino, apenas com o tar GNU (você também pode adicionar o tar GNU à sua imagem).
  6. Tivemos problemas com a análise / sintaxe do array no script (mesmo com bashinstalado e com #!/bin/bash). Portanto, removemos a opção de usar AGENTMON_DEBUGdo script.

O script final é o seguinte:

#!/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