Shentry is a single-file Python script which will run the wrapped command and, if it fails, post an event to Sentry. By default, if the wrapped script succeeds (exists with code 0), stdout/stderr are squashed, similarly to shuck or chronic. It also always exits with status 0 if events are able to be sent to Sentry.
Put the file shentry.py anywhere in your $PATH under the
name shentry and mark it as executable.
If the requests library is available, it will be used; otherwise, the standard
urllib2 / urllib.request methods are used. If requests is used, then
either $SHELL_SENTRY_PROXY or the contents of /etc/shentry_proxy can be
used to configure an outbound proxy.
The setup.py in this directory only exists for this project's dev tooling. To get
Shentry working on your machine, simply copy shentry.py wherever you need it.
You might want a crontab that looks something like the following:
SHELL_SENTRY_DSN=https://pub:priv@app.getsentry.com/id
15 * * * * /usr/local/bin/shentry /usr/local/bin/run-periodic-scriptsYou can also make shentry your $SHELL and wrap all commands in it:
SHELL_SENTRY_DSN=https://pub:priv@app.getsentry.com/id
SHELL=/usr/local/bin/shentry
15 * * * * /usr/local/bin/run-periodic-scripts
7 1 * * * /usr/local/bin/run-daily-scriptsIn this case, it will run the wrapped commands through /bin/sh (otherwise, it will honor $SHELL).
Shentry reads its configuration from the environment variable $SHELL_SENTRY_DSN
and, if such a variable is found, removes it from the environment before
calling the wrapped program. If that environment variable is not present, shentry will look
for $SENTRY_DSN (and similarly remove it from the environment).
If you need to use SENTRY_DSN inside your project code, make sure to set both.
You may also in that case want to put a top-level try/except around your whole
program to prevent uncaught exceptions from trigging both your in-process sentry sdk
and also your extra-process shentry, since you very likely only want one or the other.
If neither of the environment variables are present or both
are empty, shentry will try to read a DSN from /etc/shentry_dsn. If no DSN
can be found, the wrapped will have normal behavior (stdout/stderr will go
to their normal file descriptors, exit code will be passed through, etc).
This software is licensed under the ISC License, the full text of which can be found at LICENSE.txt.