Skip to content

Instantly share code, notes, and snippets.

@demipixel
Created November 9, 2019 15:22
Show Gist options
  • Save demipixel/63e87ee7ea61533ded014ccca77f37b5 to your computer and use it in GitHub Desktop.
Save demipixel/63e87ee7ea61533ded014ccca77f37b5 to your computer and use it in GitHub Desktop.
#!/bin/sh
# Datadog Agent installation from source script (should support most Unix OSes):
# download the source of the Agent, install its dependencies and set it up.
# Bail on errors
set -e
# We shouldn't have unbounded vars
set -u
#######################################################################
# SCRIPT KNOBS
#######################################################################
# Update for new releases, will pull this tag in the repo
DEFAULT_AGENT_VERSION="5.32.2"
# Pin pip version, in the past there was some buggy releases and get-pip.py
# always pulls the latest version
PIP_VERSION="19.0.3"
VIRTUALENV_VERSION="1.11.6"
SUPERVISOR_VERSION="3.3.0"
SETUPTOOLS_VERSION="20.9.0"
#######################################################################
# OVERRIDABLE VARIABLES:
# $AGENT_VERSION
# The tag or branch from which the source install performs.
# Defaults to $DEFAULT_AGENT_VERSION
# $INTEGRATIONS_VERSION
# The tag or branch from which the source install grabs the check
# sources in the GH integrations-core repo (DataDog/integrations-core).
# Defaults to $AGENT_VERSION
# $DD_API_KEY
# Sets your API key in the config when installing.
# If not specified, the script will not install a default config.
# You can find a sample at $DD_HOME/datadog.conf.example and create
# one yourself at $DD_HOME/datadog.conf
# $DD_HOME
# Sets the agent installation directory.
# Defaults to $HOME/.datadog-agent
# $DD_START_AGENT
# 0/1 value. 1 will start the agent at the end of the script
# Defaults to 1.
# $DD_DOG
# 0/1 value. 1 will print a cute pup at the beginning of the script
# Defaults to 0.
# $DD_SKIP_INTEGRATIONS
# 0/1 value. 1 will skip the installation of any integrations. This is useful
# when only the base agent is needed.
# Defaults to 0.
#
#
# $IS_OPENSHIFT DEPRECATED!
# Used to be a different setup for OpenShift, it's no a noop, upgrade
# your cartridge if you're using it.
#######################################################################
set +u # accept temporarily unbound vars, because we set defaults
AGENT_VERSION=${AGENT_VERSION:-$DEFAULT_AGENT_VERSION}
# If DD_HOME is unset
if [ -z "$DD_HOME" ]; then
# Compatibilty: dd_home used in lieu of DD_HOME
if [ -n "$dd_home" ]; then
DD_HOME="$dd_home"
else
if [ "$(uname)" = "SunOS" ]; then
DD_HOME="/opt/local/datadog"
else
DD_HOME=$HOME/.datadog-agent
fi
fi
fi
DD_API_KEY=${DD_API_KEY:-no_key}
DD_START_AGENT=${DD_START_AGENT:-1}
DD_SKIP_INTEGRATIONS=${DD_SKIP_INTEGRATIONS:-0}
if [ -n "$IS_OPENSHIFT" ]; then
printf "IS_OPENSHIFT is deprecated and won't do anything\n"
fi
DD_DOG=${DD_DOG:-0}
set -u
#######################################################################
# CONSTANTS
#######################################################################
PRE_SDK_RELEASE="5.11.3"
LAST_JMXFETCH_BUNDLE_RELEASE="5.13.2"
JMXFETCH_URL="https://dl.bintray.com/datadog/datadog-maven/com/datadoghq/jmxfetch"
REPORT_FAILURE_URL="https://app.datadoghq.com/agent_stats/report_failure"
REPORT_FAILURE_EMAIL="support@datadoghq.com"
AGENT_HELP_URL="http://docs.datadoghq.com/guides/basic_agent_usage/"
INFRA_URL="https://app.datadoghq.com/infrastructure"
DOG="
7 77II?+~,,,,,,
77II?~:,,,,,,,,,,,,,,,,,,,
77I?+~:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,I
7 77II?+~,,,,,,,,,,,,,,,,,,,,,,,,,,,,I :,,,,,,,,,,,,,,,:
II?=:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,: ~ +,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,=7:,,,,,,,,,,,,,,,,,,,,,,~ = 7,,,,,,,,,,,,,7
,,,,,,,,,,,,,= =7,,,,,,,,,,, ~7:I,,,: 7I ,,,,,,,,,,,,I
,,,,,,,,,,,,7 , ,,,,,= ,7 ,,,,,,,,,,,,
I,,,,,,,,,, +~ 7:I ,, 7 ,,,,,,,,,,,
,,,,,,,,+ ,I 7 ,+ ,,I +,,,,,,,,,,7
,,,,,,,, ,, ,,,,,,I7?,,,,,,,,,,+
:,,,,,,, 7, ,,,,,,,,,,,,,,,,,,,
7,,,,,,,7 ,7 ,,,,,,,,,,,,,,,,,,
,,,,,,,,7 ,7 7,,,I ,,,,,,,,,,,,,,,,,7
,,,,,,,,,I 7,7 7I:,,: I,,,7:,,,,,,,,,,,,,,,,=
=,,,,,,,,,, I,, 7,,,,, 7 ?,, =,,,,,,,,,,,,,,,,,
7,,,,,,,,,,,,I77?,,, =,,,,,7 ?,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,, ,,,= 7,,,,,,,,,,,,,,,,
,,,,,,,,,,,,= ,,,,,,,,,,,,,,,7
,,,,,,,,,,,,: ,,,,,,,,,,,,,,=
~,,,,,,,,,,,, 7 I?~,,,7 ,,,,,,,,,,,,,,
7,,,,,,,,,,,,I 7,,,,,,,7 ,,,,,,,,,,,,,,
,,,,,,,,,,,,, 7 ,,,,,,,7 ,,,,,,,,,,,,,,I
,,,,,,,,,,,,,7 7 ~,,: ,,,,,,,,,,,,,,:
=,,,,,,,,,,,,:,7 I 77 ?,,,,,,,,,,,,,,,
7,,,,,,,,,,,,,,, 7 ,7 7, ,,,,,,,,,,,,,:,,7 7
,,,,,,,,,,,,,,,,, :,I 7,,+?~,,,,,:? 7,,I
,,,,,,,,,,,,,,,,,: ,,,I 7+,,,= ,,,
?,,,,,,,,,,,,,,,,, +:,,,,,,,,,,,,,, ,,,
,,,,,,,,,,,,,,,,, 7,7 ~,~ 7 7, ,,,77
,,,,,,,,,,,,,,,,, ,= 7 I,,7 ,,,+
,,,,,,,,,,,,,,,,I ,, 7 7,,,7 ,,,,
I,,,,,,,,,,,,,, ,, ,,,I I,,,,+ ,,,,
,,,,,,,,,,,,7 7 +, ?,,,,,7 =,,,,,: ,,,,7
,,,,,,,,,,?+,,,,,,? 7,7 7?,,,,,,,,,,,,,,, =,,,=
:,,,,,,,,, 7,,I ,= ~I I,,,,,,,,,,,,,,,, 7,,,,
7,,,,,, ,, ,, 7 ?,,,~7 I,,,,,,,,,,,,,,,,, 7,,,,
,,,,, ,, ,, 7+,,,,,,,,,,,,,,,,,,,,,,,,,7 ,,,,
,,,, ,I ,, +,,,,,,,,,,,,,,,,,,,,,,,,,,I ,,,,7
,,,,7 ,, =,7 7+,,,,,,,,,,,,,,,,,,,,,,,,,,,= ,,7
:,,,: I,III=,= =,,,,,,,,,,,,,,,,,,,,,~7 7 7,,=
7,,,,: 7,,,,,,, ,,,,,,,,,,,,,,+ 7I?~,,,,,,,,
,,,,,, ,=7 7,, ,,,,,= 7 7I?=,,,,,,,,,,,,,,,,,7
,,,,,,: 7, ,, II+:,,,,,,,,,,,,,,,,,,~?
7 :, ,,?~,,,,,,,,,,,,,,:?
,+ ,,,,,:=7
I 7,,
I,,~++:,,,
?:,:I 7
"
LOGFILE="$DD_HOME/ddagent-install.log"
BASE_GITHUB_URL="https://raw.githubusercontent.com/DataDog/dd-agent/$AGENT_VERSION"
#######################################################################
# Error reporting helpers
#######################################################################
print_console() {
printf "%s\n" "$*" | tee -a "$LOGFILE" >&3
}
print_console_wo_nl() {
printf "%s" "$*" | tee -a "$LOGFILE" >&3
}
print_red() {
printf "\033[31m%s\033[0m\n" "$*" | tee -a "$LOGFILE" >&3
}
print_green() {
printf "\033[32m%s\033[0m\n" "$*" | tee -a "$LOGFILE" >&3
}
print_done() {
print_green "Done"
}
# If the user doesn't want to automatically report, give info so he can report manually
report_manual() {
print_red "Troubleshooting and basic usage information for the Agent are available at:
$AGENT_HELP_URL
If you're still having problems, please send an email to $REPORT_FAILURE_EMAIL
with the content of $LOGFILE and any
information you think would be useful and we'll do our very best to help you
solve your problem."
exit 1
}
# Try to send the report using the mail function if curl failed, and display
# a message in case the mail function also failed
report_using_mail() {
if mail -s "Agent source installation failure" "$REPORT_FAILURE_EMAIL" < "$LOGFILE"; then
print_red "Unable to send the report (you need curl or mail to send the report).
Troubleshooting and basic usage information for the Agent are available at:
$REPORT_FAILURE_URL
If you're still having problems, please send an email to $REPORT_FAILURE_EMAIL
with the content of $LOGFILE and any
information you think would be useful and we'll do our very best to help you
solve your problem."
exit 1
else
report_manual
fi
}
# Try to use curl to post the log in case of failure to an endpoint
# Will try to send it by mail using the mail function if curl failed
report() {
ESC_LOG=$(python -c 'import sys, urllib; print urllib.quote(sys.stdin.read().strip())' < "$LOGFILE")
ESC_OS=$(uname | python -c 'import sys, urllib; print urllib.quote(sys.stdin.read().strip())')
ESC_API_KEY=$(echo "$DD_API_KEY" | python -c 'import sys, urllib; print urllib.quote(sys.stdin.read().strip())')
ESC_AGENT_VERSION=$(echo "$AGENT_VERSION" | python -c 'import sys, urllib; print urllib.quote(sys.stdin.read().strip())')
if curl -f -s -d "version=$ESC_AGENT_VERSION&os=$ESC_OS&apikey=$ESC_API_KEY&log=$ESC_LOG" $REPORT_FAILURE_URL; then
print_red "A notification has been sent to Datadog with the content of $LOGFILE
Troubleshooting and basic usage information for the Agent are available at:
$AGENT_HELP_URL
If you're still having problems please send an email to $REPORT_FAILURE_EMAIL
and we'll do our very best to help you solve your problem."
exit 1
else
report_using_mail
fi
}
# Allows us to compare versions
# Returns 0 if the second arg version is > than the first.
check_version()
{
local version=$1 check=$2
local winner=$(printf "%s\n%s" "$version" "$check" | sort -t '.' -n -k1,1 -k2,2 -k3,3 | head -n 1)
[ "$winner" = "$version" ] && return 0
return 1
}
# Grab any param from the python config.
get_from_py_config()
{
cd $DD_HOME/agent >/dev/null 2>&1
local param=$(PYTHONPATH='agent/checks/libs:$PYTHONPATH' $DD_HOME/venv/bin/python -c "import config ; print config.$1")
cd - >/dev/null 2>&1
printf "%s" $param
}
# Will be called if an unknown error appears and that the Agent is not running
# It asks the user if he wants to automatically send a failure report
error_trap() {
print_red "It looks like you hit an issue when trying to install the Datadog agent."
print_console "###"
if [ -n "$ERROR_MESSAGE" ]; then
print_red "$ERROR_MESSAGE"
else
tail -n 5 "$LOGFILE" | tee -a "$LOGFILE" >&3
fi
print_console "###"
print_console
while true; do
print_console "Do you want to send a failure report to Datadog (Content of the report is in $LOGFILE)? (y/n)"
read yn
case $yn in
[Yy]* )
print_console "Please enter your email address so Datadog Support can be sure to follow up!";
read email;
print_console "Email Address: " $email; report; break;;
[Nn]* ) report_manual; break;;
* ) print_console "Please answer yes or no.";;
esac
done
}
#######################################################################
# PREPARING FOR EXECUTION
#######################################################################
# We need to create this dir beforehand to put the logfile somewhere
mkdir -p "$DD_HOME"
# Redirect all stdout/stderr to a log file
# Let fd 3 opened to output to console
exec 3>&1 1>>"$LOGFILE" 2>&1
# Check logfile is writable
print_console "Checking that logfile is writable"
print_green "OK"
# Catch errors and handle them
trap error_trap INT TERM
trap '[ "$?" -eq 0 ] || error_trap' EXIT
if [ "$DD_DOG" != "0" ]; then
echo "$DOG" 1>&3
fi
#######################################################################
# CHECKING REQUIREMENTS
#######################################################################
detect_python() {
if command -v python2.7; then
export PYTHON_CMD="python2.7"
elif command -v python2; then
# FreeBSD apparently uses this
export PYTHON_CMD="python2"
else
export PYTHON_CMD="python"
fi
}
detect_downloader() {
if command -v curl; then
export DOWNLOADER="curl -k -L -o"
export HTTP_TESTER="curl -f"
elif command -v wget; then
export DOWNLOADER="wget -O"
export HTTP_TESTER="wget -O /dev/null"
fi
}
detect_sed() {
if command -v sed; then
export SED_CMD="sed"
fi
}
print_console "Checking installation requirements"
print_green "* uname $(uname)"
# Sysstat must be installed, except on Macs
ERROR_MESSAGE="sysstat is not installed on your system
If you run CentOs/RHEL, you can install it by running:
sudo yum install sysstat
If you run Debian/Ubuntu, you can install it by running:
sudo apt-get install sysstat"
if [ "$(uname)" != "Darwin" ]; then
iostat > /dev/null 2>&1
fi
print_green "* sysstat is installed"
# Detect Python version
ERROR_MESSAGE="Python 2.7 is required to install the agent from source"
detect_python
if [ -z "$PYTHON_CMD" ]; then exit 1; fi
$PYTHON_CMD -c "import sys; exit_code = 0 if sys.version_info[0]==2 and sys.version_info[1] > 5 else 66 ; sys.exit(exit_code)" > /dev/null 2>&1
print_green "* python found, using \`$PYTHON_CMD\`"
# Detect downloader
ERROR_MESSAGE="curl OR wget are required to install the agent from source"
detect_downloader
if [ -z "$DOWNLOADER" ]; then exit 1; fi
print_green "* downloader found, using \`$DOWNLOADER\`"
# sed is required to "template" the configuration files
detect_sed
if [ -z "$SED_CMD" ]; then
print_red "* sed command not found. Will proceed without configuring the agent"
else
print_green "* sed found, using \`$SED_CMD\`"
fi
#######################################################################
# INSTALLING
#######################################################################
print_console
print_console
print_console "Installing Datadog Agent $AGENT_VERSION"
print_console "Installation is logged at $LOGFILE"
print_console
# The steps are detailed enough to know where it fails
ERROR_MESSAGE=""
print_console "* Setting up a python virtual env"
$DOWNLOADER "$DD_HOME/virtualenv.py" "https://raw.githubusercontent.com/pypa/virtualenv/$VIRTUALENV_VERSION/virtualenv.py"
$PYTHON_CMD "$DD_HOME/virtualenv.py" --no-pip --no-setuptools "$DD_HOME/venv"
rm -f "$DD_HOME/virtualenv.py"
rm -f "$DD_HOME/virtualenv.pyc"
print_done
print_console "* Activating the virtual env"
# venv activation script doesn't handle -u mode
set +u
. "$DD_HOME/venv/bin/activate"
set -u
print_done
VENV_PYTHON_CMD="$DD_HOME/venv/bin/python"
VENV_PIP_CMD="$DD_HOME/venv/bin/pip"
print_console "* Setting up setuptools"
$DOWNLOADER "$DD_HOME/ez_setup.py" https://bootstrap.pypa.io/ez_setup.py
$VENV_PYTHON_CMD "$DD_HOME/ez_setup.py" --version="$SETUPTOOLS_VERSION" --to-dir=$DD_HOME
rm -f "$DD_HOME/setuptools-$SETUPTOOLS_VERSION.zip"
rm -f "$DD_HOME/ez_setup.py"
rm -f "$DD_HOME/ez_setup.pyc"
print_done
print_console "* Setting up pip"
$DOWNLOADER "$DD_HOME/get-pip.py" https://bootstrap.pypa.io/get-pip.py
$VENV_PYTHON_CMD "$DD_HOME/get-pip.py"
$VENV_PIP_CMD install "pip==$PIP_VERSION"
rm -f "$DD_HOME/get-pip.py"
rm -f "$DD_HOME/get-pip.pyc"
print_done
print_console "* Installing requirements"
$DOWNLOADER "$DD_HOME/requirements.txt" "$BASE_GITHUB_URL/requirements.txt"
$VENV_PIP_CMD install -r "$DD_HOME/requirements.txt"
rm -f "$DD_HOME/requirements.txt"
print_done
print_console "* Downloading agent version $AGENT_VERSION from GitHub (~5 MB)"
mkdir -p "$DD_HOME/agent"
$DOWNLOADER "$DD_HOME/agent.tar.gz" "https://github.com/DataDog/dd-agent/tarball/$AGENT_VERSION"
print_done
print_console "* Uncompressing tarball"
tar -xz -C "$DD_HOME/agent" --strip-components 1 -f "$DD_HOME/agent.tar.gz"
rm -f "$DD_HOME/agent.tar.gz"
print_done
# get the version from the actual config file in the branch
AGENT_VERSION=$(get_from_py_config AGENT_VERSION)
INTEGRATIONS_VERSION=${INTEGRATIONS_VERSION:-$AGENT_VERSION}
IFS='.' read AGENT_MAJOR_VERSION AGENT_MINOR_VERSION AGENT_BUGFIX_VERSION<<VERSION
$AGENT_VERSION
VERSION
# Only install the integrations from the integrations-core if it's version 5.12 or above.
if [ "$DD_SKIP_INTEGRATIONS" = "1" ]; then
print_console "* Skipping downloading and installing integrations"
elif check_version $PRE_SDK_RELEASE $AGENT_VERSION; then
print_console "* Downloading integrations from GitHub"
mkdir -p "$DD_HOME/integrations"
mkdir -p "$DD_HOME/agent/checks.d"
mkdir -p "$DD_HOME/agent/conf.d/auto_conf"
$DOWNLOADER "$DD_HOME/integrations.tar.gz" "https://api.github.com/repos/DataDog/integrations-core/tarball/$INTEGRATIONS_VERSION"
print_done
print_console "* Uncompressing tarball"
tar -xz -C "$DD_HOME/integrations" --strip-components 1 -f "$DD_HOME/integrations.tar.gz"
rm -f "$DD_HOME/integrations.tar.gz"
print_done
print_console "* Setting up integrations"
INTEGRATIONS=$(ls $DD_HOME/integrations/)
# Install `datadog_checks_base` dependency before any checks
# Handle both old (`-`) and new (`_`) names
cd "$DD_HOME/integrations/datadog_checks_base" || cd "$DD_HOME/integrations/datadog-checks-base"
if [ -f "requirements.in" ]; then
"$DD_HOME/agent/utils/pip-allow-failures.sh" "requirements.in"
elif [ -f "requirements.txt" ]; then
"$DD_HOME/agent/utils/pip-allow-failures.sh" "requirements.txt"
fi
$PYTHON_CMD "setup.py" bdist_wheel && $VENV_PIP_CMD install dist/*.whl
cd -
for INT in $INTEGRATIONS; do
if [ "$INT" = "datadog_checks_base" -o "$INT" = "datadog-checks-base" ]; then continue; fi
# Skip development packages
if [ "$INT" = "datadog_checks_dev" ]; then continue; fi
if [ "$INT" = "datadog_checks_tests_helper" ]; then continue; fi
# We do not support Windows checks when installing from source
if [ "$INT" = "sqlserver" ]; then continue; fi
INT_DIR="$DD_HOME/integrations/$INT"
# Only take into account directories with a `manifest.json` file
[ -f "$INT_DIR/manifest.json" ] || continue
cd "$INT_DIR"
if [ -f "requirements.in" ]; then
"$DD_HOME/agent/utils/pip-allow-failures.sh" "requirements.in"
elif [ -f "requirements.txt" ]; then
"$DD_HOME/agent/utils/pip-allow-failures.sh" "requirements.txt"
fi
if [ -f "setup.py" ]; then
($PYTHON_CMD "setup.py" bdist_wheel && $VENV_PIP_CMD install dist/*.whl) || true
else
if [ -f "datadog_checks/$INT/$INT.py" ]; then
cp "datadog_checks/$INT/$INT.py" "$DD_HOME/agent/checks.d/$INT.py"
elif [ -f "check.py" ]; then
cp "check.py" "$DD_HOME/agent/checks.d/$INT.py"
fi
fi
if [ -f "datadog_checks/$INT/data/conf.yaml.example" ]; then
cp "datadog_checks/$INT/data/conf.yaml.example" "$DD_HOME/agent/conf.d/$INT.yaml.example"
fi
if [ -f "datadog_checks/$INT/data/auto_conf.yaml" ]; then
cp "datadog_checks/$INT/data/auto_conf.yaml" "$DD_HOME/agent/conf.d/auto_conf/$INT.yaml"
fi
if [ -f "datadog_checks/$INT/data/conf.yaml.default" ]; then
cp "datadog_checks/$INT/data/conf.yaml.default" "$DD_HOME/agent/conf.d/$INT.yaml.default"
fi
cd -
done
print_done
fi
print_console "* Trying to install optional requirements"
$DOWNLOADER "$DD_HOME/requirements-opt.txt" "$BASE_GITHUB_URL/requirements-opt.txt"
"$DD_HOME/agent/utils/pip-allow-failures.sh" "$DD_HOME/requirements-opt.txt"
print_done
if check_version $LAST_JMXFETCH_BUNDLE_RELEASE $AGENT_VERSION;
then
print_console "* Trying to install JMXFetch jarfile from $JMXFETCH_URL"
JMX_VERSION=$(get_from_py_config JMX_VERSION)
JMX_ARTIFACT="jmxfetch-${JMX_VERSION}-jar-with-dependencies.jar"
mkdir -p "$DD_HOME/agent/checks/libs"
$DOWNLOADER "$DD_HOME/agent/checks/libs/${JMX_ARTIFACT}" "$JMXFETCH_URL/${JMX_VERSION}/${JMX_ARTIFACT}"
print_done
fi
print_console "* Setting up a datadog.conf generic configuration file"
if [ -z "$SED_CMD" ]; then
print_console " No sed command. Proceeding without installing datadog.conf
Please make sure that the agent's log files are explicitly configured in datadog.conf"
else
dd_conf_file="$DD_HOME/agent/datadog.conf"
if [ "$DD_API_KEY" = "no_key" ]; then
print_console " Got no API KEY through $DD_API_KEY. Proceeding without installing datadog.conf"
else
# Install API key
$SED_CMD -e "s/api_key:.*/api_key: $DD_API_KEY/" "$dd_conf_file.example" > "$dd_conf_file"
# Disable syslog by default on SunOS as it causes errors
if [ "$(uname)" = "SunOS" ]; then
$SED_CMD -i -e "s/# log_to_syslog: yes/log_to_syslog: no/" "$dd_conf_file"
fi
chmod 640 "$dd_conf_file"
fi
# Setting up logging
# Make the changes to the example config file if datadog.conf doesn't exist.
if [ ! -f "$dd_conf_file" ]; then
dd_conf_file="$dd_conf_file.example"
fi
# Remove `disable_file_logging` that was set by this script before 5.7.0
$SED_CMD -i -e "s/disable_file_logging: True/# disable_file_logging: True/" "$dd_conf_file"
# Log to $DD_HOME/logs/
# Needed to avoid "unknown var $prog_log_file"
log_suffix="_log_file"
for prog in collector forwarder dogstatsd jmxfetch; do
if ! grep "^[[:space:]]*$prog$log_suffix" "$dd_conf_file"; then
$SED_CMD -i -e "/^api_key/a\\
$prog$log_suffix: $DD_HOME/logs/$prog.log
" $dd_conf_file
fi
done
fi
print_done
print_console "* Setting up init scripts"
mkdir -p "$DD_HOME/bin"
cp "$DD_HOME/agent/packaging/datadog-agent/source/agent" "$DD_HOME/bin/agent"
chmod +x "$DD_HOME/bin/agent"
if [ "$(uname)" = "SunOS" ]; then
cp "$DD_HOME/agent/packaging/datadog-agent/smartos/dd-agent" "$DD_HOME/bin/dd-agent"
chmod +x "$DD_HOME/bin/dd-agent"
fi
print_done
print_console "* Setting up supervisord"
mkdir -p "$DD_HOME/logs"
$VENV_PIP_CMD install "supervisor==$SUPERVISOR_VERSION"
cp "$DD_HOME/agent/packaging/datadog-agent/source/supervisor.conf" "$DD_HOME/agent/supervisor.conf"
mkdir -p "$DD_HOME/run"
print_done
print_console "* Starting the agent"
if [ "$DD_START_AGENT" = "0" ]; then
print_console " Skipping due to \$DD_START_AGENT"
exit 0
fi
# on solaris, skip the test, svcadm the Agent
if [ "$(uname)" = "SunOS" ]; then
# Install pyexpat for our version of python, a dependency for xml parsing (varnish et al.)
# Tested with /bin/sh
$PYTHON_CMD -V 2>&1 | awk '{split($2, arr, "."); printf("py%d%d-expat", arr[1], arr[2]);}' | xargs pkgin -y in
# SMF work now
svccfg import "$DD_HOME/agent/packaging/datadog-agent/smartos/dd-agent.xml"
svcadm enable site/datadog
if svcs datadog; then
print_done
print_console "*** The Agent is running. My work here is done... (^_^) ***"
exit 0
else
exit $?
fi
fi
# supervisord.conf uses relative paths so need to chdir
cd "$DD_HOME"
supervisord -c agent/supervisor.conf &
cd -
AGENT_PID=$!
sleep 1
# Checking that the agent is up
if ! kill -0 $AGENT_PID; then
ERROR_MESSAGE="Failure when launching supervisord"
exit 1
fi
print_green " - supervisord started"
# On errors and exit, quit properly
trap '{ kill $AGENT_PID; exit 255; }' INT TERM
trap '{ kill $AGENT_PID; exit; }' EXIT
print_console
print_green "Your Agent has started up for the first time. We're currently verifying
that data is being submitted. You should see your Agent show up in Datadog
shortly at:
$INFRA_URL"
print_console
print_console "* Waiting 30s to see if the Agent submits metrics correctly"
c=0
while [ "$c" -lt "30" ]; do
sleep 1
print_console_wo_nl "."
c=$((c+1))
done
# Hit this endpoint to check if the Agent is submitting metrics
# and retry every sec for 60 more sec before failing
print_console
print_console "* Testing if the Agent is submitting metrics"
ERROR_MESSAGE="The Agent hasn't submitted metrics after 90 seconds"
while [ "$c" -lt "90" ]; do
sleep 1
print_console_wo_nl "."
if $HTTP_TESTER "http://localhost:17123/status?threshold=0"; then
break
fi
c=$((c+1))
done
print_console
if [ "$c" -ge "90" ]; then
error_trap
fi
# Yay IT WORKED!
print_green "Success! Your Agent is functioning properly"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment