- Change to tz-aware dates internally (Issue #799)
- psutil dependency un-pin (#790)
- "Operation" attribute added to TrackedRequest class to better support development of scout_apm_python_logging
- Updates Core Agent to v1.5.0
- Capture allocation metrics for Celery tasks
- Capture latency metrics for Celery tasks
- Send remaining batched payloads on receiving termination signals
- Update the tag name and unit of time for job latency to similarly match that of request queue time.
- Handle change in exit codes for the core agent.
- Core Agent fails to download on newer Mac OS/Apple Silicon (Issue #779)
- Build wheels for Python 3.12
Version 3.0.0 drops support for Python 2.7 and < 3.8, as well as Django < 3.2. If you need to continue using Python < 3.8 or Django < 3.2, please continue using v2.26.1.
- Add formal support for Python 3.11 and Django 4.2.
- Fix CI for 3.8+.
- Remove support for Python 2.7, 3.4, 3.5, 3.6.
- Remove support for Django < 3.2.
- Remove support for CherryPy, Nameko, and Pyramid.
- Update ElasticSearch support for 8.7.0 (
health_check
). - Support flask_sqlalchemy v3. This requires an integration
change where
instrument_sqlalchemy
is called beforedb.init_app()
.
- Wrap an import of elasticsearch in a try/except. (Issue 744)
- Added Django 4.1 to the testing matrix.
- Added support for Elasticsearch v8+. (Issue 725)
- Catch SIGQUIT and SIGTERM errors when running core agent. They will now be logged as debug messages rather than exceptions.
- Always return a tuple from
filepaths
. (Issue 737)
- Return the full path for backtraces that are used by the core-agent and APM product. The error stacktraces now prepend the SCM_DIRECTORY setting if it has been set. (Issue 723)
- Avoid assuming Celery tasks will have a truth-y
delivery_info
property. (Issue 731)
- Add
log_payload_content
to support logging the content of the message being sent to either the core agent socket or the error service. (Issue 724)
- Only log warnings for ElasticSearch client method instrumentation if no client methods were instrumented. Otherwise, log the issues at the debug level. This avoids flooding logs when clients use an older version of ElasticSearch. (Issue 713)
- Restore building wheels for python 3.4 and 3.5. (Issue 584)
- Avoid instrumenting PyMongo collection methods that were removed in v4. (Issue 710)
- When Celery
task_failure
signal has a string type for thetraceback
parameter, use theeinfo.tb
to fetch the traceback. (Issue 708) - Use urllib3 to post errors to Scout Errors API. Removes dependency on requests library.
- Switch to a dict for the
request_params
away from a list of tuples.
- Split CI tests GitHub actions into two jobs to support python 3.4 on Ubuntu 18 and modern versions with Ubuntu 20.
- Run CI tests once per day to identify issues quicker.
- Set Scout core agent default version to v1.4.0. (Issue 700)
- Instrument Flask for Error Monitoring.
- Properly handle querystring parameters in error monitoring service by passing them as a list of tuples rather than a dictionary. When there were multiple params with the same key, it was keeping the last value.
- Added support for Django 4.0 and Python 3.10.
- Make
module_filepath
more robust avoiding throwing exceptions. (Issue 691)
- Reverted - Rework release Github action to utilize newer versions of cibuildwheel when available.
- Rework release Github action to utilize newer versions of cibuildwheel when available.
- Added
search_mvt
instrumentation for ElasticSearch 7.15.0. - Default core agent version to v1.3.1. Support ARM64 core agent architecture. (Issue #683)
- Convert objtrace to use PEP 489 multi-phase initialization. (Issue #661)
- Enable error monitoring by default.
- Disconnect receiver from celery task_failure signal. (Issue #678)
- Prevent a TrackedRequest from being sent more than once. Additional logging was added to identify cases when this is occurring.
- Define TrackedRequest ContextVar at module level and ignore tokens. (Issue #675)
- Added
terms_enum
instrumentation for ElasticSearch 7.14.0. (Issue #671)
- Switch to storing TrackedRequest in a ContextVar for Python3.6+ rather than in a thread local.
- Support instrumenting Jinja v3
render_async
function. (Issue #646)
- Handle case of namespace packages when capturing backtraces. (Issue #667)
- Support Error Monitoring. See integration docs. (PR #651)
- Deprecate
backtrace.capture
in favor ofbacktrace.capture_backtrace
- Setup metadata keywords now contains an array of strings.
- Remove non-project paths from traces. (Issue #416)
- Removed parsing queue time from Amazon ALB header, X-Amzn-Trace-Id. The time portion of the header only has the truncated seconds which appears as about 500ms for queue time constantly. (Issue #631)
- Added Celery's
priority
delivery info to the set of tags. - Changed max spans reached log level from warning to debug. (Issue #653)
- Improved debug logging for requests. It now includes some summary information about the request. (Issue #654)
- Set
TrackedRequest.tags("error", "true")
when Celery tasks fail. (Issue #649)
- Tested with Django 3.2. Only define
default_app_config
when using a version of Django earlier than 3.2. - Support instrumentation and transaction decorators for asynchronous
functions via
@instrument.async_
,@WebTransaction.async_
and@BackgroundTransaction.async_
. (PR #633)
- Exclude python library paths from backtraces. (PR #514)
- Preserve tracked request across asyncio tasks. (PR #469)
-
Instrument new Elasticsearch methods
close_point_in_time()
andopen_point_in_time()
. (PR #602) -
The release now includes binary wheels for Linux ARM and Python 3.9.
- Support hex timestamp in Amazon headers (PR #598)
- Fix a socket resource leak when downloading the core agent. (PR #609)
- Fix Starlette with ASGI apps that are class instances (Issue #596)
- Support Python 3.9. (PR #583)
- Moved core agent on Linux to default to the musl version, rather than try detect whether to use the musl or GNU libc version. (PR #585)
- Added a cast to string of query parameters, to work around cases where
application code changes them to non-strings. Fixes a possible exception:
AttributeError: 'int' object has no attribute 'encode'
inscout.core.web_requests
.
- Changed default agent connection to use TCP rather than a unix socket. By
default the agent will be run on 127.0.0.1, port 6590. This should resolve
a number of connection issues. To continue using a socket connection,
configure
core_agent_socket_path
. (Issue #553) - Tested with Django 3.1. No compatibility changes were required, but this is the first release to be tagged as supporting it.
- Fixed validation check on length of key. (Issue #563)
- Update Core Agent to version 1.3.0, fixing several bugs and opening the ability to run with only a TCP socket. (Issue #567)
- On Django, only track the current user ID if
request.user
was accessed by application code. This stops aVary: Cookie
header being injected due to session data access. (Issue #544)
- Always convert
collect_remote_ip
to boolean. (Issue #542)
- Extended RQ integration with
HerokuWorker
class for use in the RQ Heroku pattern. (Issue #529) - Added the
collect_remote_ip
/SCOUT_COLLECT_REMOTE_IP
setting which can be set toFalse
to disable storing user IP addresses in Scout traces. (Issue #535)
- Don't log the Scout key during startup. (Issue #297)
- Fix crash when scanning packages that have a Name or Version that is
None
. (Issue #522)
- Update Core Agent to version 1.2.9, fixing several bugs. (Issue #516)
- Support Django's
BASE_DIR
setting being apathlib.Path
, as the default template in Django 3.1 will set. (Issue #503) - Instrument new Elasticsearch methods
get_script_context()
andget_script_languages()
. (PR #507) - Prevent output from the core agent when starting it. (Issue #510)
- Added config value
shutdown_message_enabled
/SCOUT_SHUTDOWN_MESSAGE_ENABLED
which can be set to "false" to disable the shutdown message "Scout draining N events..."that was added in version 2.11.0. (Issue #498) - Renamed
config_file
,log_file
, andsocket_path
to have thecore_agent_
prefix. This is to clarify that they apply only to the core agent process. The old names continue to work as aliases. (Issue #497) - Improved some log messages and levels around instrumentation. (Issue #502)
- Added ability to read configuration from your Celery app. This can help share
configuration between Django and Celery. Pass your application as
app
to have the configuration copied:scout_apm.celery.install(app=app)
. (Issue #477) - Added maximum span limit of 1500. This prevents memory exhaustion when tracing long running tasks as Scout no longer tries to record everything. (Issue #472)
- Made installation of the objtrace C extension optional, so that if it fails due to your C compiler being old, Scout can still install. (Issue #488)
- Removed warning for setting the
SCOUT_LOG_LEVEL
setting, since this is set by default by the Heroku add-on. (Issue #486)
- Improve Falcon integration: tracing is automatically disabled if installation fails, track middleware, and support class-based responders. (PR #453, PR #460)
- Add Hug integration. (PR #460)
- Limit size of recorded tracebacks to reduce memory usage. (PR #476)
- Scout now flushes any queued commands to the core agent at shutdown, with a
configurable timeout
shutdown_timeout_seconds
, defaulting to 2 seconds. This ensures that all traces are recorded, rather than lost, especially useful for single-run background commands. (Issue # 473) - Move from requests to underlying urllib3 for downloads to reduce dependency footprint. (PR #480)
- Retry downloading the core agent a few times, and use a timeout to prevent startup hangs. (PR #480)
- Moved some user-facing warnings, such as for deprecated features, from
logging
towarnings
, so they can be caught during testing. (PR #468) - Fix Jinja2 asynchronous rendering instrumentation for Jinja2 2.11.0+. (PR #462)
- Stop patching
elasticsearch
'sscripts_painless_context()
, because it has been removed in version 7.5.1. (Issue #454) - Fix for
elasticsearch
version 7.5.1's change of positional argument order. (Issue #456)
- Use Python 3.8's standard library
importlib.metadata.distributions()
to determine package versions, rather thanpkg_resources
. The backport packageimportlib_metadata
is required on older Python versions. (PR #430) - Add CherryPy integration. (PR #431)
- Add tracking for missing PyMongo Collection methods. (PR #436)
- Add tracking for missing Elasticsearch client methods. (PR #438)
- Remove the "name" context tag from Flask requests - it only duplicated the request name. (PR #432)
-
Update Core Agent to version 1.2.6, fixing several bugs:
- Improve SQL statement names in Timeline Traces
- Standardize on a
language_version
key in metadata - Autoclose spans that are still running when a Request completes
(PR #415)
- Fix recording of path for unicode query parameters on Python 2.7. (PR #419)
- Add RQ integration. (PR #375)
- Track 5XX responses as errors from all web frameworks. (Issue #383)
- Track Flask's request preprocessors as a span
PreprocessRequest
. (PR #390) - Track Jinja2 asynchronous template rendering. (PR #398)
- Add Django-Huey integration. (PR #401)
- Track better names for Django REST Framework
ViewSet
s. (PR #380) - Always capture SQL tracebacks for
executemany
queries going over the built-in count threshold. (PR #409) - Don't capture internal traceback function's frame in tracebacks. (PR #410)
- Fixed memory allocation tracking, which has been broken since a refactor in version 2.7.0.
- Move all decorators to the
wrapt
library which is more transparent. (PR #324) - Move context tracking to be async-compatble with
asgiref
'sLocal
. (PR #349) - Add Starlette integration for Python 3.6+. (PR #349)
- Add Huey integration. (PR #367)
- Track SQL Alchemy
executemany
calls as multi-queries. (PR #340) - Track Elasticsearch index name when it's not passed as a keyword argument. (PR #348)
- Increase core agent socket timeout to reduce reconnections. (PR #247)
- Fix the
RemovedInDjango20Warning
fordjango.core.urlresolvers
on Django 1.11. (PR #359) - Correctly disable Bottle if the agent fails to launch. (PR #364)
- Python 3.8 testing and PyPI trove classifier - no code changes were required so older versions should work too. (PR #263)
- Capture better operation names for Django Tastypie resources, e.g.
myapp.api.UserResource.get_list
. (PR #332)
- Change
scout_apm.api.install()
signature to not take*args, **kwargs
but justconfig
as a keyword argument. (PR #304) - Rewrite background samplers thread to avoid some rare race conditions. (PR #307)
- Fix warning emitted from using deprecated 'warn' method (PR #283).
- Improve warning message for deprecated
log_level
configuration option (PR #288). - Track errors on Pyramid (PR #298).
- Don't start on Windows which is currently not supported (request support on Issue #101) (PR #299).
- The
log_level
configuration option is deprecated. Please use the new namecore_agent_log_level
instead (PR #273).
- Change default "path" tag on web requests to capture query parameters as
well. This can be disabled by setting the config value
uri_reporting
to"path"
(PR #268, PR #269). - Track the
urlconf
on Django, for multi-domain support (PR #276). - Track request queue time from the
X-Amzn-Trace-Id
header, which is sent by AWS ALB's (PR #279). - Updated Core Agent version to 1.2.4 to support new features (PR #280).
- Fix Bottle path tagging to use path from URL rather than controller name (PR #267).
- Support the
hostname
setting (PR #251). - Support timeline trace view (PR #252).
- Add API function
rename_transaction()
(PR #129). - Updated Core Agent version to 1.2.0 to support new features (PR #253).
- Use the same default socket name that the core agent uses when launched alone
(
core-agent.sock
->scout-agent.sock
) (PR #240). - Fix CPU statistics to work when the CPU count cannot be determined (PR #245).
- Improved logging for debugging customer problems (PR #234).
- Fixed Flask to not monitor requests when
SCOUT_MONITOR
is set toFalse
(PR #235). - Fixed Django to stop monitoring requests when
SCOUT_MONITOR
is set toFalse
during runtime (PR #236).
- Add Dramatiq integration (PR #223).
- Add Nameko integration (PR #212).
- Track Celery task
is_eager
,exchange
,routing_key
andqueue
tags (PR #205). - Track Celery task time in queue with context tag
queue_time
(PR #206). - Track Celery task ID with context tag
task_id
, and parent task's ID (for chains, chords, etc.) with context tagparent_task_id
(PR #227). - Improve Django admin views' traced names. Before all admin classes' traces
would be merged by function name such as
django.contrib.admin.options.changelist_view
. Now traces appear per admin class, for exampledjango.contrib.auth.admin.UserAdmin.changelist_view
(PR #226).
- Updated Core Agent version to 1.1.11. This fixes the
scm_subdirectory
configuration option.
- Use Django's native DB instrumentation on Django 2.0+, rather than monkey patching the database cursor. (PR #218).
- Fix tracking of path on Flask. (PR #221).
- Close file descriptors when launching the core agent process. This fixes a bug where uwsgi's HTTP ports would be held by the it on Python 2.7. (PR #219).
- Track user IP on Flask (PR #190).
- Make user IP tracking on Bottle and Pyramid use the same algorithm as other
integrations, checking for the
client-ip
header (PR #192, PR #195). - Add support to Bottle, Falcon, Flask and Pyramid integrations for tracking request queue timing (PR #199, PR #201).
- Track path and user IP on Django < 1.10 (PR #190).
- Fix the undocumented
core-agent-manager
CLI command (PR #202). - Consistently track view responses on Django between different versions (PR #203).
- Avoid unbalanced request tracking in certain cases on Django < 1.10 (PR #203).
- Clarified contents of public API by moving some stuff out of it and setting
scout_apm.api.__all__
(PR #204).
- Add support to Django integration for tracking request queue timing from the
value of the
X-Queue-Start
orX-Request-Start
header - Add Falcon integration
- Tested on Django 2.2
- Added PyPI Trove classifiers for frameworks
- Track usernames on Django < 1.10
- Stop warnings from using deprecated method
logger.warn
- Track some missed requests on Flask such as automatic
OPTIONS
responses
- Fix 'ignore' functionality on Django < 1.10
- Add 'scm_subdirectory' config option (PR #155)
- Fixed Elasticsearch integration for queries passing 'index' to
elasticsearch-py
as a list (PR #156) - Fixes "Registering with app" log message not using configured logger (PR #154)
- Add platform triple to config (PR #151)
- Adds
core_agent_permissions
configuration option. (PR #147)
- Remove unused dependency on PyYAML (PR #146)
- Python 2.7 support
- Ability to 'ignore' requests via configuration option and
scout_apm.api
(PR #144)
- Updated Core Agent version to support Database Addon
- Multi threading lock fix in ThreadLocalSingleton (#127)
- Update Core Agent
- Enable Memory Bloat and Allocation tracking.
- More reliable socket communication with Core Agent (#126)
- settings.BASE_DIR is optional in Django (#123)
- Fix issue when
MIDDLEWARE
andMIDDLEWARE_CLASSES
are both defined in Django 1.x apps (PR #122)
- Fix issue detecting
MIDDLEWARE_CLASSES
in Django apps (#119)
- Packaging changes only
- Track object allocations for every span (Objtrace module)
- Track RSS increase during a TrackedRequest.
- Compatibility with old style Django middleware/settings
- Alpine Linux support (Musl based distro) (#108, PR #110)
- Configuration not integrated into derived values (#112)
- Flask Instruments: init_app captures app variable (#104)
- Look up 'user_ip' context from request headers (PR #90)
- Improved locking/sync around CoreAgentSocket (#91)
- DO not collect backtraces on Controller or Middleware layers (#88)
- Better Elasticsearch naming (#84)
- Flask transactions that throw exceptions don't appear (#29)
- Log configuration options to DEBUG on install
- Add Context, Config, and install() to scout_apm.api
- Instrumentation API marks TrackedRequest as real request
- Spans can ignore children (#85)
- Determine Application Root
- Deploy Detection
- Additional Instruments:
- PyMongo
- UrlLib3
- Redis
- Elasticsearch
- Jinja2
- Instrumentation API
- Python 3.7 compatibility.
- Python 3.7 makes 'async' a reserved word.
- Remove python 2.7 from supported versions in setup.py while we work to ensure 2.7 compatibility.
- Typo in sqlalchemy for NPlusOneCallSet capture (#73)
- Tuple as logging argument for tagging logger (#74)
- Pyramid Support (#58)
- Bottle Support (#64)
- Deploy Tracking Support (#65)
- N+1 Backtrace Capture (#62)
- A few fixes for 2.7 support
- Custom instrumentation with a Context Manager or Decorator (#50)
- Enhanced Test Coverage (#53)
- In error conditions that cause unfinished spans, don't raise exceptions (#52)
- Several Python 2.7 Incompatibilities (#56, #57)
- Handle Flask OPTIONS requests (#41)
- Fix incorrect default argument to cursor.execute (#42)
- Remove debugging message for spans that could raise an error
- Prevent span mismatch from raising on
stop_span
- Log INFO message if SCOUT_MONITOR is false
- Except OSError instead of ConnectionRefusedError (python 2.7 compatibility)
- Fix CLI command module import
- Basic Celery support
- Capture Tracebacks on spans over 500ms
- Register as Python with APM (previously was not noted explicitly)
- Fix CLI commands
- Capture the current user's username correctly when using custom User model
- Catch IOError when reading core-agent's manifest.json (#24)
- Reworked Django instrumentation (#19)
- Initial Flask Support (#18)
- Initial SQLAlchemy Support (#18)
- Add Request Context Support (#17)
- Correct the default
socket_path
- Clearer archive download name
- Fix mismatched archive download location
Initial public release
- Django View, Template and SQL instrumentation
- Periodic CPU & Memory Readings
- Automatic management of "core agent" binary.
- Configuration settable via ENV, or Django's settings.py