ifdef::env-github[]
NOTE: Release notes are best read in our documentation at
https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes.html[elastic.co]
endif::[]

////
Notes:
1. When adding a changelog entry, if the "Unreleased" section doesn't yet exist,
   please add the following under the "=== Node.js Agent version 3.x" header:

        ==== Unreleased

        [float]
        ===== Breaking changes

        [float]
        ===== Features

        [float]
        ===== Bug fixes

2. When making a release, change the "==== Unreleased" section header to:

        [[release-notes-x.x.x]]
        ==== x.x.x - YYYY/MM/DD
////

[[release-notes-3.x]]
=== Node.js Agent version 3.x


[[release-notes-3.31.0]]
==== 3.31.0 2022/03/23

[float]
===== Features

* Add `captureBody` support for Hapi. ({issues}1905[#1905])

* If a SNS or SQS single event trigger to an instrumented Lambda function
  includes message attributes with the name "traceparent" (and "tracestate"),
  case-insensitive, then those are used to continue the trace. This was already
  being done for API Gateway event headers.

[float]
===== Bug fixes

* Fix a bug with Lambda instrumentation where the APM agent would result in
  an otherwise working Lambda function to respond with `null` if the Lambda
  was missing the https://github.com/elastic/apm-aws-lambda[Elastic APM Lambda Extension].
  ({issues}2598[#2598])

* Fix a bug in Lambda instrumentation in the capturing of SNS and SQS event
  message attributes. ({issues}2605[#2605])


[[release-notes-3.30.0]]
==== 3.30.0 2022/03/10

[float]
===== Breaking changes

* Added a new config option <<span-stack-trace-min-duration,`spanStackTraceMinDuration`>>
  that replaces both <<capture-span-stack-traces,`captureSpanStackTraces`>>
  and <<span-frames-min-duration,`spanFramesMinDuration`>>. The latter two are
  now deprecated, but still supported. If `spanStackTraceMinDuration` is
  specified, then any value for the deprecated two options will be ignored.
+
There is a significant change in _default_ behavior of the APM agent. If none
of these configuration options is specified, then the default
(`spanStackTraceMinDuration: -1`) is that stack traces are *not* collected
and reported for any spans. This change in default behavior was made because
the CPU performance impact of collecting span stack traces was found to be
too high in practice for busy and/or complex applications. This is mentioned
in the "Breaking changes" section to highlight the change, but it is not
considered breaking in general. The impact is that the "Stack Trace" tab in
the "Span details" view in the Kibana APM app will be empty. This was already
the case for some spans based on span duration. ({pull}2565[#2565])

* Implement the explicit signaling of Lambda invocation completion to the
  Elastic AWS Lambda Extension. This improves data flushing in a Lambda
  environment to ensure tracing data is only sent when the Lambda is active.
  This avoids possible tracing data loss while a Lambda VM is frozen.
  ({issues}2485[#2485])
+
However, because this change triggers a bug in the extension, this version of
the APM Node.js Agent must only be used with versions of the
https://www.elastic.co/guide/en/apm/guide/current/aws-lambda-extension.html[AWS Lambda Extension]
after v0.0.3.

[float]
===== Features

* Add `faas.name` and `faas.version` fields to Lambda transactions. ({issues}2587[#2587])
* Added automatic wrapping of AWS Lambda handlers ({pull}2577[#2577])
* Improvements to AWS Lambda instrumentation: Better `transaction.name` for
  API Gateway-triggered lambdas. Respect explicitly set `serviceName`,
  `serviceVersion`, and `usePathAsTransactionName` config settings. Default
  `cloudProvider: none` and `centralConfig: false` to reduce required
  environment variables for setting up APM instrumentation of Lambdas.
  ({issues}2531[#2531])


[[release-notes-3.29.0]]
==== 3.29.0 2022/02/10

* Fix a bug in instrumentation of `@elastic/elasticsearch` that caused a
  memory leak. ({issues}2569[#2569])


[[release-notes-3.28.0]]
==== 3.28.0 2022/02/08

Known issue: This release includes a memory leak in instrumentation of the
`@elastic/elasticsearch` package. If you use that package, you should not
use v3.28.0 of this APM agent. ({issues}2569[#2569])

[float]
===== Breaking changes

The following changes are not considered *breaking*. However, they result in
a change in behavior and trace output that might impact some users, so they
are highlighted here.

* Change the `redis` and `mysql` instrumentations to not patch at all if
  they are listed in <<disable-instrumentations, `disableInstrumentations`>>.
  This means that an application that uses one of these packages *and* lists
  that package in `disableInstrumentations` could see changes in the async
  run-context of callbacks.  See {issues}2498[#2498] and the
  <<release-notes-3.26.0,v3.26.0 release notes>> which has a similar change.

* Elasticsearch spans (from `elasticsearch`, `@elastic/elasticsearch`, and
  `@elastic/elasticsearch-canary` instrumentation) will no longer have an HTTP
  child span(s) for the underlying HTTP request. This is listed in this section
  to provide awareness in case some users have custom analysis of APM trace
  data that expects those HTTP spans.
+
Per https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans.md#exit-spans[the APM Agent spec for exit spans],
Elasticsearch spans are now marked as exit spans and as a result, HTTP child
spans are suppressed. ({issues}2000[#2000])
+
As part of this change, some HTTP context has been added to Elasticsearch
spans, when available: the HTTP response `status_code`, and the size of the
response body (`encoded_body_size`). ({issues}2484[#2484])

[float]
===== Features

* Drop unsampled transactions when sending to APM Server v8.0+. ({issues}2455[#2455])

* The default <<service-name, `serviceName`>> string (when it is not configured
  and cannot be inferred from a "package.json" file) has been changed from
  "nodejs_service" to "unknown-nodejs-service". This is a standardized pattern
  used across Elastic APM agents to allow the Kibana APM app to recognize when
  to provide help to the user on configuring the service name.
  ({issues}2491[#2491])

* Add `transaction.name` to captured APM errors. This will allow the Kibana APM
  app to correlate error groups and transaction groups. ({issues}2456[#2456])

* Mark S3 spans (from 'aws-sdk' instrumentation) as exit spans (per
  https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans.md#exit-spans).
  The result is that HTTP child spans of S3 spans are no longer captured.
  ({issues}2125[#2125])

[float]
===== Bug fixes

* Fixes for run context handling for '@elastic/elasticsearch' instrumentation.
  ({issues}2430[#2430])

* Fixes for run context handling for 'cassandra-driver' instrumentation.
  ({issues}2430[#2430])

* Fixes for run context handling for 'mongodb-core' instrumentation.
  ({issues}2430[#2430])

* Fixes for run context handling for 'elasticsearch' instrumentation.
  ({issues}2430[#2430])


[[release-notes-3.27.0]]
==== 3.27.0 2022/01/17

[float]
===== Features

* Add support for express-graphql 0.10.0 - 0.12.0 inclusive. ({pull}2511[#2511])

[float]
===== Bug fixes

* Fix an issue where the agent's async task tracking could cause the user's
  application to use too much memory. In cases where an application is under
  sustained load and is running in a memory constrained container, this looked
  like a memory leak.
+
This high memory usage could happen when application code starts async tasks
(e.g. Promises, setTimeouts, async I/O) that outlive the APM Transaction
(typically an HTTP request handler). The agent's async task tracking keeps a
reference to the APM Transaction (and any APM Spans) until the async task
ends, thus extending the lifetime of those APM objects and the references
they hold -- in particular, HTTP request and response objects. This could lead
to higher memory usage.
+
With this change, those references are removed when APM Transactions and Spans
are ended, and agent memory usage is now the same as what it was before
v3.24.0 when this issue was introduced. ({pull}2528[#2528], {issues}2489[#2489])

* Fixes for run context handling for 'graphql' instrumentation.
  ({issues}2430[#2430])

* Fixes for run context handling for DynamoDB instrumentation ('aws-sdk'
  package) so that a span created after an AWS client command (in the same
  tick, in the command callback, or promise) is not a child of the automatic
  AWS span. This change also ensures captured errors from failing client
  commands are a child of the AWS span. ({issues}2430[#2430])

* Fixes for run context handling for 'pg' instrumentation. ({issues}2430[#2430])

* Fixes for run context handling for 'mongodb' instrumentation. ({issues}2512[#2512])


[[release-notes-3.26.0]]
==== 3.26.0 2021/12/07

[float]
===== Breaking changes

* In earlier versions, the agent would propagate run context in some packages
  *even if instrumentation for that package was disabled via
  <<disable-instrumentations, `disableInstrumentations`>>*. Recent versions
  change the semantics of `disableInstrumentations` to mean the agent should
  not touch the listed packages at all. This means that an application that
  uses one of these packages *and* lists that package in
  `disableInstrumentations` could see changes in the async run-context of
  callbacks. This affects: `pg` (v3.24.0), `redis` (v3.25.0), `mysql`
  (v3.25.0), `ioredis` (v3.26.0), `mysql2` (v3.26.0).  See {issues}2498[#2498]
  for details.

[float]
===== Features

* Add `*auth*` pattern to default value for `sanitizeFieldNames` config var, so
  that it is more likely to redact authentication/authorization-related HTTP
  headers and form fields. This pattern replaces the `authorization` pattern
  in the set of defaults. ({issues}2427[#2427])

[float]
===== Bug fixes

* Fix run-context handling for 'tedious' instrumentation so that automatically
  created 'mssql' spans are never the `currentSpan` in user code.
  ({issues}2430[#2430])

* Fix 'http2' instrumentation for outgoing requests to not have the created
  HTTP span context be active in user code. ({issues}2430[#2430])

* Fix run-context handling in 'ws' instrumentation so that the span created
  for a `ws.send(...)` isn't the "current span" in subsequent code in the
  same tick. ({pull}2481[#2481])

* Fix run-context handling for 'memcached' instrumentation so that the
  automatically created Memcached span is never the `currentSpan` in user
  code. ({issues}2430[#2430])

* Fix a possible crash when serializing a Transaction if the incoming
  `req.socket` is null (possible if the socket has been destroyed).
  ({issues}2479[#2479])

* Fixes for run context handling for 'aws-sdk' instrumentation (S3, SQS, SNS)
  so that a span created after an AWS client command (in the same tick, in
  the command callback, or promise) is not a child of the automatic AWS
  span. This change also ensures captured errors from failing client commands
  are a child of the AWS span. ({issues}2430[#2430])

* Fix 'http' and 'https' instrumentation for outgoing requests to not have the
  'http' span context be active in user code. ({pull}2470[#2470])

* Fixes for 'ioredis' instrumentation ({pull}2460[#2460]):
+
**  Fix run-context so that a span created in the same tick as an ioredis
    client command will no longer be a child of the redis span.
**  Capture an APM error and correctly set span.outcome to "failure" when
    a redis client command calls back with an error.
**  Avoid a rare possible double-instrumentation of redis commands
    internally-queued before the RedisClient is "ready". ({issues}2459[#2459])
**  Add destination context so Redis shows up on the Service Map.

* Fix run-context handling for 'mysql2' instrumentation to avoid accidental
  creation of *child* spans of the automatic mysql spans.
  ({issues}2430[#2430]})


[[release-notes-3.25.0]]
==== 3.25.0 2021/11/24

[float]
===== Bug fixes

* Fixes for 'redis' instrumentation:
+
**  Fix run-context so that a span created in the same tick as a redis client
    command will no longer be a child of the redis span. ({issues}2430[#2430])
**  Capture an APM error and correctly set span.outcome to "failure" when
    a redis client command calls back with an error.
**  Avoid a rare possible double-instrumentation of redis commands
    internally-queued before the RedisClient is "ready". ({pull}2446[#2446])

* Avoid setting the `tracestate` header for outgoing HTTP requests to the empty
  string. This can happen for non-trace-root transactions. While the HTTP spec
  allows empty header values, some servers do not. ({issues}2405[#2405])

* Deprecate `transaction.subtype` and `transaction.action`. These fields
  were never used by APM server. This also deprecates the
  `apm.startTransaction(...)` call signatures that take `subtype` and `action`
  arguments. In the next major version these two fields will be removed.
  ({issues}2356[#2356])

* Fix run-context handling for 'mysql' instrumentation to avoid accidental
  creation of *child* spans of the automatic 'mysql' spans.
  ({issues}2430[#2430]})


[[release-notes-3.24.0]]
==== 3.24.0 2021/11/09

[float]
===== Breaking changes

* Change <<disable-send, `disableSend`>> to no longer skip internal processing
  work. It now *only* disables communication with APM Server. Use
  <<context-propagation-only, `contextPropagationOnly`>> if your use case is
  to limit the APM agent's processing to the minimum to support context
  propagation and log correlation.
+
This is listed under "Breaking changes" as a heads-up. The only possible
negative result of this `disableSend` change is some extra CPU processing time
by the agent. There is no outward functionality change.

[float]
===== Features

* Gather https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-aws-lambda.md#overwriting-metadata[AWS Lambda-specific metadata]
  on first function invocation and ensure no intake requests to APM Server are
  started before that metadata is available. ({issues}2404[#2404])

* Add <<context-propagation-only, `contextPropagationOnly`>> configuration
  option. This supports the use case of using the APM agent to propagate HTTP
  trace-context and to support log-correlation (adding `trace.id` et al fields
  to log records) **without** an APM server, and to otherwise reduce the
  processing time of the agent. ({issues}2393[#2393])
+
This is similar to <<disable-send, `disableSend`>>, but differs in that
`contextPropagationOnly: true` tells the agent to skip unnecessary work.

* The User-Agent header used for communication with APM Server now includes
  the `serviceName` and `serviceVersion`. For some users this can be
  https://github.com/elastic/apm/issues/509[helpful for APM Server log analysis].
  ({issues}2364[#2364])

* In a Lambda enviornment we now collect a number of additional data fields
  on the Transaction object.  See the spec for more information on fields collected.
  https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-aws-lambda.md
  ({issues}2156[#2156])

* Zero configuration support. The only required agent configuration option
  is <<service-name, `serviceName`>>. Normally the agent will attempt to
  infer `serviceName` for the "name" field in a package.json file. However,
  that could fail. With this version, the agent will cope with: a scoped
  package name (`@scope/name` is normalized to `scope-name`), a "name" that
  isn't a valid `serviceName`, not being able to find a "package.json" file,
  etc. Ultimately it will fallback to "nodejs_service". ({issues}1944[#1944])
+
One consequence of this change is that `apm.getServiceName()` will return
`undefined` until the agent is started (check with `apm.isStarted()`).

[float]
===== Bug fixes

* Stop collecting transaction breakdown metrics (`transaction.breakdown.count`,
  `transaction.duration.sum.us`, `transaction.duration.count`), as they are not
  being used in APM UI. ({issues}2370[#2370])

* Wrap `fs.realpath.native` when configured with `asyncHooks=false`. This
  fixes using that function (which was undefined before this fix) and a
  crash when importing fs-extra@10. ({issues}2401[#2401])

* A significant change was made to internal run context tracking (a.k.a. async
  context tracking). There are no configuration changes or API changes for
  custom instrumentation. ({pull}2181[#2181])
+
One behavior change is that multiple spans created synchronously (in the same
async task) will form parent/child relationships; before this change they would
all be siblings. This fixes HTTP child spans of Elasticsearch and aws-sdk
automatic spans to properly be children. ({issues}1889[#1889])
+
Another behavior change is that a span B started after having ended span A in
the same async task will *no longer* be a child of span A. ({pull}1964[#1964])
+
This fixes an issue with context binding of EventEmitters, where
`removeListener` would fail to actually remove if the same handler function was
added to multiple events.

* Fix pino's deprecation warning when using a custom logger with pino@6 ({issues}2332[#2332])


[[release-notes-3.23.0]]
==== 3.23.0 2021/10/25

[float]
===== Breaking changes

* Remove support for instrumenting versions of fastify earlier than 1.0.0.
  This instrumentation might still work, but is no longer supported.
  Fastify v1.0.0 was released in 2018. All current users should be using
  fastify v2 or v3 at least. See https://www.fastify.io/docs/latest/LTS/
  ({pull}2387[#2387])

[float]
===== Features

* Add initial support for version 8 of `@elastic/elasticsearch`, which is
  still in pre-release. ({pull}2385[#2385])


[[release-notes-3.22.0]]
==== 3.22.0 2021/10/21

[float]
===== Features

* Add support for node v17.

* When an error is captured, the APM agent will only immediately flush it to
  APM server if it is an "unhandled" error. Unhandled errors are typically those
  captured via the `uncaughtException` process event. Before this change, a
  captured error (e.g. for a 4xx or 5xx response from an HTTP server) was
  always immediately flushed. This could negatively impact performance for
  a service that was generating *frequent* errors. ({issues}686[#686])

[float]
===== Bug fixes

* Improve <<apm-flush,`apm.flush([cb])`>> to wait for inflight spans and errors
  before flushing data to APM server. Before this change, a recently ended span
  or recently <<apm-capture-error,captured error>> might not yet have completed
  processing (for example, stacktrace collection is asynchronous) and might
  not be included in the flush call. ({issues}2294[#2294])

* AWS Lambda changes: Disable metrics collection during the experimental phase
  of (re)implementing Lambda support ({pull}2363[#2363]). Some fixes for better
  flushing of data at the end of a Lambda invocation.

* <<span-to-string,`span.toString()`>> and <<transaction-to-string,`transaction.toString()`>>
  have been *deprecated*. The exact string output may change in v4 of the
  agent.

* Add `Span.ids` and `Transaction.ids` to TypeScript types. ({pull}2347[#2347])

* Improve `span.sync` determination (fixes {issues}1996[#1996]) and stop
  reporting `transaction.sync` which was never used ({issues}2292[#2292]).
  A minor semantic change is that `span.sync` is not set to a final value
  until `span.end()` is called. Before `span.end()` the value will always
  by `true`.

* Guard against a negative value of `metricsInterval`, which can lead to
  high CPU usage as metrics are collected as fast as possible. Also ensure
  no metrics collection can happen if `metricsInterval="0s"` as intended.
  Before this change it was possible for some metric collection to still
  happen, even though none would be reported. ({pull}2330[#2330])
+
This change also guards against negative and invalid values in the following
configuration options: `abortedErrorThreshold`, `apiRequestTime`, and
`serverTimeout`. If an invalid value is given, then will fallback to their
default value.


[[release-notes-3.21.1]]
==== 3.21.1 2021/09/16

[float]
===== Bug fixes

* Update types to avoid imports of `@types/...` modules (other than
  `@types/node`), so that TypeScript users of elastic-apm-node need not
  manually `npm install @types/connect @types/pino @types/aws-lambda` to
  compile. ({issues}2331[#2331])


[[release-notes-3.21.0]]
==== 3.21.0 2021/09/15

[float]
===== Features

* Add the `longFieldMaxLength` integer configuration option (default `10000`).
  Specific transaction/span/error fields (see the list below) will be truncated
  at this number of unicode characters. ({pull}2193[#2193], {issues}1921[#1921])
+
The `errorMessageMaxLength` configuration option is now *deprecated*, but
still supported. Users should switch to using `longFieldMaxLength`. If
`errorMessageMaxLength` is not specified, truncation of error messages will
now use the `longFieldMaxLength` value.
+
Note that ultimately the maximum length of any tracing field is limited by the
{apm-guide-ref}/configuration-process.html#max_event_size[`max_event_size`]
configured for the receiving APM server.
+
The fields affected by `longFieldMaxLength` are:
+
** `transaction.context.request.body`, `error.context.request.body` - Before
   this change these fields were not truncated.
** `transaction.context.message.body`, `span.context.message.body`,
   `error.context.message.body` - Before this change these fields were not
   truncated.
** `span.context.db.statement` - Before this change this field was truncated
   at 10000 *bytes*. Truncation is now a number of unicode characters.
** `error.exception.message`, `error.log.message` - Before this change, the
   default 2kB `errorMessageMaxLength` would apply.

* Improve the TypeScript types by exporting more of interfaces:
  `AgentConfigOptions`, `Transaction`, `Span`, `TransactionOptions`,
  `SpanOptions`. ({issues}2118[#2118])

[float]
===== Bug fixes

* Fix a bug in `apm.removePatch(module, aHandler)` that would remove the
  last registered handler if `aHandler` did not match any currently
  registered handlers. ({pull}2315[#2315])

* Fix a crash in instrumentation of the old Elasticsearch client
  (`elasticsearch`) for some rarer cases of client options -- for example
  passing multiple hosts. ({pull}2312[#2312])

* Ensure the internal HTTP(S) client requests made by the APM agent to APM
  server are not themselves traced. ({issues}1168[#1168], {issues}1136[#1136])

* Fix crashing error with `agent.registerMetric` and `active:false` configuration. ({issues}1799[#1799], {pull}2290[#2290])


[[release-notes-3.20.0]]
==== 3.20.0 2021/08/12

[float]
===== Bug fixes

* Fix failing tests and a possible runtime crash in
  `@elastic/elasticsearch@7.14.0` instrumentation. ({issues}2187[#2187])


[[release-notes-3.19.0]]
==== 3.19.0 2021/08/05

[float]
===== Features

* The agent now supports the 3.x branch of apollo-server-express. ({pull}2155[#2155])

* Add instrumentation support for mongodb@4.x. ({pull}2171[#2171])

[float]
===== Bug fixes

* The agent will no longer report counting metrics with a value of zero, and will
  remove these metrics from the registry. ({pull}2163[#2163])


[[release-notes-3.18.0]]
==== 3.18.0 2021/07/20

[float]
===== Features

* Trace an incoming HTTP/1.1 request to an HTTP/2 server using the
  https://nodejs.org/api/http2.html#http2_http2_createsecureserver_options_onrequesthandler[allowHTTP1]
  option. Before this change only incoming requests supporting HTTP/2 would
  be traced. ({pull}2143[#2143])

* Add instrumentation of the AWS SNS publish method when using the
  https://www.npmjs.com/package/aws-sdk[JavaScript AWS SDK v2] (`aws-sdk`). ({pull}2157[#2157])

[float]
===== Bug fixes

* Fixed naming for outgoing HTTP spans to comply with the spec.
  https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-http.md#http-client-spans
  Span names no longer include the path portion of the URL. ({pull}2161[#2161])

* Fix a header object re-use bug that prevented propagation of trace-context
  headers (`traceparent` et al) in AWS requests using AWS v4 signature auth.
  ({issues}2134[#2134])

* Fix a possible infinite loop in `captureError` when handling uncaught
  exceptions and the process is at or near its file descriptor limit
  (receiving EMFILE errors).  ({issues}2148[#2148])


[[release-notes-3.17.0]]
==== 3.17.0 2021/07/05

[float]
===== Features

* Add instrumentation of all AWS S3 methods when using the
  https://www.npmjs.com/package/aws-sdk[JavaScript AWS SDK v2] (`aws-sdk`).

* Add <<disable-send, `disableSend`>> configuration option. This supports some
  use cases using the APM agent **without** an APM server. ({issues}2101[#2101])

* Add instrumentation of all DynamoDB methods when using the
  https://www.npmjs.com/package/aws-sdk[JavaScript AWS SDK v2] (`aws-sdk`).

[float]
===== Bug fixes

* Fix inconsistencies in HTTP spans from other APM agents.
  <<span-subtype, `span.subtype`>> will now be "http" for HTTP, HTTPS, and
  HTTP/2 outgoing spans -- previously it was "http", "https", "http2",
  respectively. As well, <<span-action, `span.action`>> will now be the HTTP
  method (e.g. "GET", "PUT", "POST"), rather than "http". ({pull}2075[#2075])

* Fixed error where SQS messages sent without an active transactions could
  crash the agent. ({issues}2113[#2113])

* Fixed support for proxies in destination context ({issues}1770[#1770])

[[release-notes-3.16.0]]
==== 3.16.0 - 2021/06/14

[float]
===== Features

* Added <<span-frames-min-duration, `spanFramesMinDuration`>>
  configuration field, allowing users to set a time threshold value that spans
  must reach before the agent will add a stack trace to the span. As a result,
  many short spans that previously included stack traces by default no longer
  will.

* Prefer W3C "traceparent" header over "elastic-apm-traceparent" for incoming
  requests. {pull}2079[#2079]

[float]
===== Bug fixes

* Fix a crash (`TypeError: lastPrepareStackTrace`) in the agent when used with
  React v17 and later ({issues}1980[#1980]).

* Performance improvements have been made in error and stacktrace capture ({pull}2094[#2094]).
  This also included in two bug fixes:
+
** Before this change, some captured errors (for example a `next(new Error('boom')` from
   an Express handler) would mark the error as "unhandled" incorrectly. "Unhandled"
   exceptions are those caught by an `uncaughtException` handler.
** Before this change, source context lines for a stacktrace would not properly
   use the "sourcesContext" field of a file's source map.


[[release-notes-3.15.0]]
==== 3.15.0 - 2021/05/19

[float]
===== Features

* Add support for Node.js v16. (This also drops testing of Node.js v13
  releases.) {pull}2055[#2055]

[float]
===== Bug fixes

* Update TypeScript typings for `Agent.setLabel` and `Agent.addLabels` to
  include the `stringify` argument that was added in v3.11.0.


[[release-notes-3.14.0]]
==== 3.14.0 - 2021/04/19

[float]
===== Features

* Add `apm.addMetadataFilter(fn)` for filtering the
  https://www.elastic.co/guide/en/apm/server/current/metadata-api.html[metadata object]
  sent to APM server.

* The handling of sending events (transactions, spans, errors) to APM server
  has improved in a few ways. During temporary spikes in load and/or an APM
  server that is unresponsive, the agent will buffer a number of events and
  *drop* them above a certain limit (configurable via <<max-queue-size>>).
  This helps ensure the agent does not overly consume memory and CPU. As well,
  the agent will now https://github.com/elastic/apm/blob/main/specs/agents/transport.md#transport-errors[backoff]
  when the APM server errors. Finally, improved error handling means it will
  terminate failing requests to the APM server more quickly.
+
Note: v1 of this agent (EOL'd 2 years ago), included a `maxQueueSize` config
variable with a different meaning. If you have a lingering usage of that
setting (also possibly as the `ELASTIC_APM_MAX_QUEUE_SIZE` environment
variable), then it should be removed.

* Adds support for Amazon SQS queues via `aws-sdk` instrumentation that
  partially implements the https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-messaging.md[APM messaging spec],
  and adds `queue.latency.min.ms`, `queue.latency.max.ms`, and `queue.latency.avg.ms`
  metrics for SQS queues.

[float]
===== Bug fixes

* Fixed bug where the URL property for outgoing HTTP request spans was set
  with the server's IP address rather than its hostname. The Agent now sets
  this property with the actual URL requested by Node.js. {issues}2035[#2035]

* Fixed bug where external services were not listed under Dependencies on the
  APM Service Overview page due to the trace-context propagated `sample_rate`
  value not being set on either transactions or spans.

[[release-notes-3.13.0]]
==== 3.13.0 - 2021/04/06

[float]
===== Features

* The APM agent's own internal logging now uses structured JSON logging using
  the https://getpino.io/#/docs/api?id=logger[pino API], and formatted in
  {ecs-logging-ref}/intro.html[ecs-logging] format. The log records on stdout
  are now single-line JSON objects. For example:
+
[source,bash]
----
# Before
APM Server transport error (ECONNREFUSED): connect ECONNREFUSED 127.0.0.1:8200

# After
{"log.level":"error","@timestamp":"2021-03-19T00:21:17.571Z","log":{"logger":"elastic-apm-node"},
"ecs":{"version":"1.6.0"},"message":"APM Server transport error (ECONNREFUSED): connect ECONNREFUSED 127.0.0.1:8200"}
----
+
Pretty formatting (and filtering) on the console may be done via the
https://github.com/trentm/go-ecslog[`ecslog`] tool.
+
A custom <<logger>> is still supported as before. However, a non-pino custom
logger will only receive the "message" field, and not structured log fields
as they are added over time.

* Add support for setting the `ELASTIC_APM_LOGGER=false` environment variable
  to disable/ignore a given custom <<logger>>. This is to support easier
  <<debug-mode>> for troubleshooting.

[float]
===== Bug fixes

* Lock package dependency "elastic-apm-http-client@9.6.0" to avoid using
  v9.7.0 for now, because it is breaking tests. A coming release will get back
  on the latest of this dependency. {issues}2032[#2032]

* Remove the "ancestors" field from a log.trace message on startup. Its info
  is a duplicate of info in the "startTrace" field in the same log record.
  {pull}2005[#2005]

* Remove the accidental `nodejs.eventloop.delay.ns` metric that was always
  reporting a zero value. The existing `nodejs.eventloop.delay.avg.ms` is
  the intended metric. {pull}1993[#1993]


[[release-notes-3.12.1]]
==== 3.12.1 - 2021/02/25

[float]
===== Bug fixes

* fix: Update https://github.com/elastic/apm-nodejs-http-client/blob/main/CHANGELOG.md#v951[apm-server client]
  to fix a {issues}1749[possible crash] when polling for central config.


[[release-notes-3.12.0]]
==== 3.12.0 - 2021/02/21

[float]
===== Features

* feat: Set span outcome to success or failure depending on whether an error
  was captured during when the span was active. {issues}1814[#1814]

* feat: Adds public `setOutcome` method to span and transaction APIs, and
  adds a top level `setTransactionOutcome` and `setSpanOutcome` to set
  outcome values for the current active transaction or active span.
* Limit the `transactionSampleRate` value to 4 decimal places of precision
  according to the shared https://github.com/elastic/apm/blob/main/specs/agents/tracing-sampling.md#transaction_sample_rate-configuration[APM spec]. This ensures that propagated sampling rate
  in the `tracestate` header is short and consistent. {pull}1979[#1979]

[float]
===== Bug fixes

* fix: It was possible for fetching central config to result in the
  `cloudProvider` config value being reset to its default. {issues}1976[#1976]

* fix: fixes bug where tedious could crash the agent on bulk inserts {pull}1935[#1935] +
  Reported https://discuss.elastic.co/t/apm-agent-crashes-nodejs-after-reporting-exception-in-tedious-instrumentation-code/259851[via the forum].
  The error symptom was: `Cannot read property 'statement' of undefined`

[[release-notes-3.11.0]]
==== 3.11.0 - 2021/02/08

[float]
===== Features

* feat: add `apm.getServiceName()` {pull}1949[#1949] +
  This will be used by https://github.com/elastic/ecs-logging-nodejs[ecs-logging packages]
  to integrate with APM.

* feat: support numeric and boolean labels {pull}1909[#1909] +
  Add an optional `stringify` option to `apm.setLabel(name, version, stringify = true)`
  and `apm.addLabels(labels, stringify = true)`, which can be set `false` to
  allow numeric and boolean labels. Stringify defaults to true for backwards
  compatibility -- stringification will be removed in a future major version.

* feat: added support for cloud metadata fetching {pull}1937[#1937] +
  Agent now collects information about its cloud environment and includes this
  data in the APM Server's metadata payload. See
  https://github.com/elastic/apm/blob/3acd10afa0a9d3510e819229dfce0764133083d3/specs/agents/metadata.md#cloud-provider-metadata[the spec]
  for more information.

[[release-notes-3.10.0]]
==== 3.10.0 - 2021/01/11

[float]
===== Features

* feat: Improve handling of raw body parsing
  The agent will now report raw/`Buffer` encoded post bodies as '<Buffer>'.

* feat: Add support for api keys {pull}1818[#1818] +
  This allows the usage of API keys for authentication to the APM server

* feat: Add automatic instrumentation of the https://github.com/elastic/elasticsearch-js[@elastic/elasticsearch] package {pull}1877[#1870]
+
The instrumentation of the legacy "elasticsearch" package has also changed
slightly to commonalize:
+
** "span.context.destination" is set on all Elasticsearch spans, not just a
   subset of query-like API endpoints.
** For query-like API endpoints (e.g. `/_search`), the capturing of query details
   on "span.context.db.statement" has changed (a) to include *both* the
   query params and the request body if both exist (separated by `\n\n`) and
   (b) to *URL encode* the query params, rather than JSON encoding.

* feat: Add `captureAttributes` boolean option to `apm.captureError()` to
  allow *disabling* the automatic capture of Error object properties. This
  is useful for cases where those properties should not be sent to the APM
  Server, e.g. for performance (large string fields) or security (PII data).
  {pull}1912[#1912]

* feat: Add `log_level` central config support. {pull}1908[#1908] +
  Spec: https://github.com/elastic/apm/blob/main/specs/agents/logging.md

* feat: Add `sanitize_field_names` configuration option. +
  Allows users to configure a list of wildcard patterns to _remove_ items
  from the agent's HTTP header and `application/x-www-form-urlencoded` payloads.
  {pull}1898[#1898]
  ** https://github.com/elastic/apm/blob/main/specs/agents/sanitization.md[spec]
  ** https://github.com/elastic/apm-agent-nodejs/blob/main/docs/configuration.asciidoc#sanitize-field-names[docs]

[float]
===== Bug fixes

* fix: Fix parsing of comma-separated strings for relevant config vars to allow
  whitespace around the commas. E.g.:
+
----
export ELASTIC_APM_TRANSACTION_IGNORE_URLS='/ping, /metrics*'
----
+
Config vars affected are: `disableInstrumentations`, `transactionIgnoreUrls`
`addPatch`, and `globalLabels`.
* fix: Correct the environment variable for setting `transactionIgnoreUrl`
  (added in v3.9.0) from `ELASTIC_TRANSACTION_IGNORE_URLS` to
  `ELASTIC_APM_TRANSACTION_IGNORE_URLS`.


[[release-notes-3.9.0]]
==== 3.9.0 - 2020/11/30

[float]
===== Features

* feat: support fastify 3 {pull}1891[#1891] +
  Adds .default and .fastify module.exports to instrumented fastify function
  for 3.x line, and prefers req.routerMethod and req.routerPath for
  transaction name
* feat: Set "destination" context on spans for "mongodb". {pull}1893[#1893] +
  This allows Kibana APM Service Maps to show a "mongodb" node for services using
  the https://www.npmjs.com/package/mongodb[mongodb] package (which includes
  mongoose and mongojs).
* feat: transactionIgnoreUrl wildcard matching {pull}1870[#1870] +
  Allows users to ignore URLs using simple wildcard matching patterns that behave
  the same across language agents. See https://github.com/elastic/apm/issues/144

[float]
===== Bug fixes

* fix: treat set-cookie in response headers as sensitive data {pull}1886[#1886]
* fix: Synchronous spans would never have `span.sync == true`. {pull}1879[#1879]


[[release-notes-3.8.0]]
==== 3.8.0 - 2020/11/09

[float]
===== Features

* feat: expand k8s pod ID discovery regex {pull}1863[#1863]
* feat: implements tracestate {pull}1828[#1828] +
  Expands support for the W3C Trace Context specification by adding a tracestate
  header implementation, and uses this new header to track the Elastic
  transaction sample rate across a trace's service boundaries.
* feat: add span and transaction outcome {pull}1824[#1824] +
  This adds an "outcome" field to HTTP(S)
  https://github.com/elastic/apm/blob/main/specs/agents/tracing-transactions.md#transaction-outcome[transactions]
  and https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans.md#span-outcome[spans].

[float]
===== Bug fixes

* fix(pg): prevent unhandled promise rejection {pull}1846[#1846]
* fix: redis@2.x instrumentation was broken {pull}1852[#1852]
* A number of fixes to the test suite.

[[release-notes-3.7.0]]
==== 3.7.0 - 2020/8/10

* feat(knex): add support for 0.21.x {pull}1801[#1801]
* feat(redis): add support for v3.x {pull}1641[#1641]
* feat(graphql): add support for 15.x {pull}1795[#1795]
* feat(koa-router): add support for 9.x {pull}1772[#1772]
* fix(elasticsearch): ensure requests can be aborted {pull}1566[#1566]
* fix: end span if outgoing http request ends prematurely {pull}1583[#1583]
* fix: don't throw on invalid URL {pull}1771[#1771]
* fix: patch apollo-server-core > 2.14 correctly {pull}1796[#1796]
* fix: add currentTraceIds to typings {pull}1733[#1733]

[[release-notes-3.6.1]]
==== 3.6.1 - 2020/5/20

* fix(package): bump elastic-apm-http-client to ^9.4.0 {pull}1756[#1756]

[[release-notes-3.6.0]]
==== 3.6.0 - 2020/5/18

* feat: add destination metadata for db spans {pull}1687[#1687]
* feat: add support for Node.js 14 {pull}1742[#1742]
* feat(pg): add support for pg v8.x {pull}1743[#1743]
* feat: add metrics for external memory {pull}1724[#1724]
* feat: enrich spans with destination info {pull}1685[#1685]
* fix(instrumentation): add .js to module path {pull}1711[#1711]

[[release-notes-3.5.0]]
==== 3.5.0 - 2020/3/9

* feat(error): get stack trace from Error-like objects {pull}1613[#1613]
* fix: add logUncaughtExceptions conf option to TypeScript typings {pull}1668[#1668]

[[release-notes-3.4.0]]
==== 3.4.0 - 2020/2/21

* feat: support W3C TraceContext traceparent header {pull}1587[#1587]
* feat: add custom metrics API (experimental) {pull}1571[#1571]
* feat(koa-router): add support for v8.x {pull}1642[#1642]
* fix(cassandra): improve support for cassandra-driver v4.4.0+ {pull}1636[#1636]
* fix: support promisifying setTimeout and friends {pull}1636[#1636]

[[release-notes-3.3.0]]
==== 3.3.0 - 2019/12/13

* feat(config): add serverCaCertFile config {pull}1560[#1560]
* feat(config): add central config support for transactionMaxSpans and captureBody {pull}1555[#1555]

[[release-notes-3.2.0]]
==== 3.2.0 - 2019/11/19

* fix(metrics): only register collectors if enabled {pull}1520[#1520]
* fix(ioredis): prevent unhandled promise rejection {pull}1523[#1523]
* chore: add Node 13 to supported engines {pull}1524[#1524]

[[release-notes-3.1.0]]
==== 3.1.0 - 2019/10/16

[float]
===== Features
* feat(mongodb): instrumentation {pull}1423[#1423]
* fix(package): update elastic-apm-http-client to version 9.0.0 {pull}1419[#1419]
* perf: cache 'ids' value of transactions and spans {pull}1434[#1434]

[float]
===== Bug fixes
* fix: always end transaction when socket is closed prematurely {pull}1439[#1439]
* fix: change logUncaughtExceptions default to false {pull}1432[#1432]
* fix: write stack trace of uncaught exceptions to STDERR {pull}1429[#1429]

[[release-notes-3.0.0]]
==== 3.0.0 - 2019/9/30

[float]
===== Breaking changes
* feat: allow manual instrumentation with `instrument: false` {pull}1114[#1114]
* feat: allow setting span/transaction `type`, `subtype`, and `action` separately (the behavior of the old `type` has changed) {pull}1292[#1292]
* feat: use `external` as span type instead of `ext` {pull}1291[#1291]
* refactor(graphql): use custom transaction type `graphql` for graphql requests instead of `request` {pull}1245[#1245]
* feat(http): add `instrumentIncomingHTTPRequests` config (`disableInstrumentations` now behaves differently) {pull}1298[#1298]
* chore: remove deprecated APIs {pull}1413[#1413]
* chore: drop support for older Node.js versions {pull}1383[#1383]

[[release-notes-2.x]]
=== Node.js Agent version 2.x

[[release-notes-2.17.3]]
==== 2.17.3 - 2020/2/27

[float]
===== Bug fixes
* fix: support promisifying setTimeout and friends {pull}1649[#1649]
* fix(cassandra): improve support for cassandra-driver v4.4.0+ {pull}1649[#1649]
* fix(knex): make stack traces work in 0.18+ {pull}1500[#1500]
* fix(tedious): ensure shimmed module exposes same API {pull}1496[#1496]
* fix(metrics): do not send transaction breakdowns when disabled {pull}1489[#1489]
* fix(tedious): support 6.5+ {pull}1488[#1488]
* fix: always end transaction when socket is closed prematurely {pull}1445[#1445]
* perf: cache 'ids' value of transactions and spans {pull}1438[#1438]

[[release-notes-2.17.2]]
==== 2.17.2 - 2019/10/2

[float]
===== Bug fixes
* chore(http): workaround(s) to suppress DEP0066 warnings {pull}1424[#1424]

[[release-notes-2.17.1]]
==== 2.17.1 - 2019/9/26

[float]
===== Bug fixes
* fix: support all falsy return values from error filters {pull}1394[#1394]
* fix: capture all non-string http bodies {pull}1381[#1381]

[[release-notes-2.17.0]]
==== 2.17.0 - 2019/9/19

[float]
===== Features
* feat: add support for @koa/router {pull}1346[#1346]
* feat: add methods for logging trace information {pull}1335[#1335]

[float]
===== Bug fixes
* fix: improve debug output when detecting incoming http request {pull}1357[#1357]
* fix(http): response context propagation on Node.js 12.0 - 12.2 {pull}1339[#1339]

[[release-notes-2.16.2]]
==== 2.16.2 - 2019/9/3

[float]
===== Bug fixes
* fix(lambda): handle traceparent case-insensitively {pull}1319[#1319]

[[release-notes-2.16.1]]
==== 2.16.1 - 2019/8/28

[float]
===== Bug fixes
* fix: avoid throwing when agent is in active: false mode {pull}1278[#1278]

[[release-notes-2.16.0]]
==== 2.16.0 - 2019/8/26

[float]
===== Features
* feat(memcached): instrument memcached v2.2.0 and above {pull}1144[#1144]
* feat(config): add configFile config option {pull}1303[#1303]

[float]
===== Bug fixes
* fix: bug where spans sometimes wouldn't have stack traces {pull}1299[#1299]
* fix(async_hooks): properly update sync flag {pull}1306[#1306]
* fix: change agent active status log message to debug level {pull}1300[#1300]

[[release-notes-2.15.0]]
==== 2.15.0 - 2019/8/15

[float]
===== Features
* feat(express-graphql): add support for v0.9 {pull}1255[#1255]
* feat(metrics): add metricsLimit option {pull}1273[#1273]

[[release-notes-2.14.0]]
==== 2.14.0 - 2019/8/12

[float]
===== Features
* feat(hapi): support new @hapi/hapi module {pull}1246[#1246]
* feat: allow agent.clearPatches to be called with array of names {pull}1262[#1262]

[float]
===== Bug fixes
* fix: be less chatty if span stack traces cannot be parsed {pull}1274[#1274]
* perf: use for-of instead of forEach {pull}1275[#1275]

[[release-notes-2.13.0]]
==== 2.13.0 - 2019/7/30

[float]
===== Bug fixes
* fix: standardize user-agent header {pull}1238[#1238]

[float]
===== Features
* feat: add support for APM Agent Configuration via Kibana {pull}1197[#1197]
* feat(metrics): breakdown graphs {pull}1219[#1219]
* feat(config): default serviceVersion to package version {pull}1237[#1237]

[[release-notes-2.12.1]]
==== 2.12.1 - 2019/7/7

[float]
===== Bug fixes
* fix(knex): abort early on unsupported version of knex {pull}1189[#1189]

[[release-notes-2.12.0]]
==== 2.12.0 - 2019/7/2

[float]
===== Features
* feat(metrics): add runtime metrics {pull}1021[#1021]
* feat(config): add environment option {pull}1106[#1106]

[[release-notes-2.11.6]]
==== 2.11.6 - 2019/6/11

[float]
===== Bug fixes
* fix(express): don't swallow error handling middleware {pull}1111[#1111]

[[release-notes-2.11.5]]
==== 2.11.5 - 2019/5/27

[float]
===== Bug fixes
* fix(metrics): report correct CPU usage on Linux {pull}1092[#1092]
* fix(express): improve names for routes added via app.use() {pull}1013[#1013]

[[release-notes-2.11.4]]
==== 2.11.4 - 2019/5/27

[float]
===== Bug fixes
* fix: don't add traceparent header to signed AWS requests {pull}1089[#1089]

[[release-notes-2.11.3]]
==== 2.11.3 - 2019/5/22

[float]
===== Bug fixes
* fix(span): use correct logger location {pull}1081[#1081]

[[release-notes-2.11.2]]
==== 2.11.2 - 2019/5/21

[float]
===== Bug fixes
* fix: url.parse expects req.url not req {pull}1074[#1074]
* fix(express-slash): expose express handle properties {pull}1070[#1070]

[[release-notes-2.11.1]]
==== 2.11.1 - 2019/5/10

[float]
===== Bug fixes
* fix(instrumentation): explicitly use `require` {pull}1059[#1059]
* chore: add Node.js 12 to package.json engines field {pull}1057[#1057]

[[release-notes-2.11.0]]
==== 2.11.0 - 2019/5/3

[float]
===== Bug fixes
* chore: rename tags to labels {pull}1019[#1019]

[float]
===== Features
* feat(config): support global labels {pull}1020[#1020]

[float]
===== Bug fixes
* fix(config): do not use ELASTIC_APM_ prefix for k8s {pull}1041[#1041]
* fix(instrumentation): prevent handler leak in bindEmitter {pull}1044[#1044]

[[release-notes-2.10.0]]
==== 2.10.0 - 2019/4/15

[float]
===== Features
* feat(express-graphql): add support for version ^0.8.0 {pull}1010[#1010]

[float]
===== Bug fixes
* fix(package): bump elastic-apm-http-client to ^7.2.2 so Kubernetes metadata gets corrected recorded {pull}1011[#1011]
* fix(ts): add TypeScript typings for new traceparent API {pull}1001[#1001]

[[release-notes-2.9.0]]
==== 2.9.0 - 2019/4/10

[float]
===== Features
* feat: add traceparent getter to agent, span and transaction {pull}969[#969]
* feat(template): add support for jade and pug {pull}914[#914]
* feat(elasticsearch): capture more types of queries {pull}967[#967]
* feat: sync flag on spans and transactions {pull}980[#980]

[float]
===== Bug fixes
* fix(agent): init config/logger before usage {pull}956[#956]
* fix: don't add response listener to outgoing requests {pull}974[#974]
* fix(agent): fix basedir in debug mode when starting agent with -r {pull}981[#981]
* fix: ensure Kubernetes/Docker container info is captured {pull}995[#995]

[[release-notes-2.8.0]]
==== 2.8.0 - 2019/4/2

[float]
===== Features
* feat: add agent.setFramework() method {pull}966[#966]
* feat(config): add usePathAsTransactionName config option {pull}907[#907]
* feat(debug): output configuration if logLevel is trace {pull}972[#972]

[float]
===== Bug fixes
* fix(express): transaction default name is incorrect {pull}938[#938]

[[release-notes-2.7.1]]
==== 2.7.1 - 2019/3/28

[float]
===== Bug fixes
* fix: instrument http/https.get requests {pull}954[#954]
* fix: don't add traceparent header to S3 requests {pull}952[#952]

[[release-notes-2.7.0]]
==== 2.7.0 - 2019/3/26

[float]
===== Features
* feat: add patch registry {pull}803[#803]
* feat: allow sub-modules to be patched {pull}920[#920]
* feat: add TypeScript typings {pull}926[#926]

[float]
===== Bug fixes
* fix: update measured-reporting to fix Windows installation issue {pull}933[#933]
* fix(lambda): do not wrap context {pull}931[#931]
* fix(lambda): fix cloning issues of context {pull}947[#947]
* fix(metrics): use noop logger in metrics reporter {pull}912[#912]
* fix(transaction): don't set transaction result if it's null {pull}936[#936]
* fix(agent): allow flush callback to be undefined {pull}934[#934]
* fix: handle promise rejection in case Elasticsearch client throws {pull}870[#870]
* chore: change 'npm run' command namespaces {pull}944[#944]

[[release-notes-2.6.0]]
==== 2.6.0 - 2019/3/5

[float]
===== Features
* feat: add support for Fastify framework {pull}594[#594]
* feat(lambda): accept parent span in lambda wrapper {pull}881[#881]
* feat(lambda): support promise form {pull}871[#871]

[float]
===== Bug fixes
* fix: ensure http headers are always recorded as strings {pull}895[#895]
* fix(metrics): prevent 0ms timers from being created {pull}872[#872]
* fix(config): apiRequestSize should be 768kb {pull}848[#848]
* fix(express): ensure correct transaction names {pull}842[#842]

[[release-notes-2.5.1]]
==== 2.5.1 - 2019/2/4

[float]
===== Bug fixes
* fix(metrics): ensure NaN becomes 0, not null {pull}837[#837]

[[release-notes-2.5.0]]
==== 2.5.0 - 2019/1/29

[float]
===== Features
* feat(metrics): added basic metrics gathering {pull}731[#731]

[[release-notes-2.4.0]]
==== 2.4.0 - 2019/1/24

[float]
===== Features
* feat: add ability to set custom log message for errors {pull}824[#824]
* feat: add ability to set custom timestamp for errors {pull}823[#823]
* feat: add support for custom start/end times {pull}818[#818]

[[release-notes-2.3.0]]
==== 2.3.0 - 2019/1/22

[float]
===== Bug fixes
* fix(parsers): move port fix into parser {pull}820[#820]
* fix(mongo): support 3.1.10+ {pull}793[#793]

[float]
===== Features
* feat(config): add captureHeaders config {pull}788[#788]
* feat(config): add container info options {pull}766[#766]

[[release-notes-2.2.1]]
==== 2.2.1 - 2019/1/21

[float]
===== Bug fixes
* fix: ensure request.url.port is a string on transactions {pull}814[#814]

[[release-notes-2.2.0]]
==== 2.2.0 - 2019/1/21

[float]
===== Features
* feat(koa): record framework name and version {pull}810[#810]
* feat(cassandra): support 4.x {pull}784[#784]
* feat(config): validate serverUrl port {pull}795[#795]
* feat: add transaction.type to errors {pull}805[#805]

[float]
===== Bug fixes
* fix: filter outgoing http headers with any case {pull}799[#799]
* fix: we don't support mongodb-core v3.1.10+ {pull}792[#792]

[[release-notes-2.1.0]]
==== 2.1.0 - 2019/1/15

[float]
===== Features
* feat(error): include sampled flag on errors {pull}767[#767]
* feat(span): add tags to spans {pull}757[#757]

[float]
===== Bug fixes
* fix(tedious): don't fail on newest tedious v4.1.3 {pull}775[#775]
* fix(graphql): fix span name for unknown queries {pull}756[#756]

[[release-notes-2.0.6]]
==== 2.0.6 - 2018/12/18

[float]
===== Bug fixes
* fix(graphql): don't throw on invalid query {pull}747[#747]
* fix(koa-router): support more complex routes {pull}749[#749]

[[release-notes-2.0.5]]
==== 2.0.5 - 2018/12/12

[float]
===== Bug fixes
* fix: don't create spans for APM Server requests {pull}735[#735]

[[release-notes-2.0.4]]
==== 2.0.4 - 2018/12/7
* chore: update engines field in package.json {pull}727[#727]
* chore(package): bump random-poly-fill to ^1.0.1 {pull}726[#726]

[[release-notes-2.0.3]]
==== 2.0.3 - 2018/12/7

[float]
===== Bug fixes
* fix(restify): support an array of handlers {pull}709[#709]
* fix: don't throw on older versions of Node.js 6 {pull}711[#711]

[[release-notes-2.0.2]]
==== 2.0.2 - 2018/12/4

[float]
===== Bug fixes
* fix: use randomFillSync polyfill on Node.js <6.13.0 {pull}702[#702]
* fix(hapi): ignore internal events channel {pull}700[#700]

[[release-notes-2.0.1]]
==== 2.0.1 - 2018/11/26

[float]
===== Bug fixes
* fix: log APM Server API errors correctly {pull}692[#692]

[[release-notes-2.0.0]]
==== 2.0.0 - 2018/11/14

[float]
===== Breaking changes
* chore: remove support for Node.js 4 and 9
* chore: remove deprecated buildSpan function {pull}642[#642]
* feat: support APM Server intake API version 2 {pull}465[#465]
* feat: improved filtering function API {pull}579[#579]
* feat: replace double-quotes with underscores in tag names {pull}666[#666]
* feat(config): change config order {pull}604[#604]
* feat(config): support time suffixes {pull}602[#602]
* feat(config): stricter boolean parsing {pull}613[#613]

[float]
===== Features
  * feat: add support for Distributed Tracing {pull}538[#538]
  * feat(transaction): add transaction.ensureParentId function {pull}661[#661]
  * feat(config): support byte suffixes {pull}601[#601]
  * feat(transaction): restructure span_count and include total {pull}553[#553]
  * perf: improve Async Hooks implementation {pull}679[#679]

[[release-notes-1.x]]
=== Node.js Agent version 1.x

[[release-notes-1.14.3]]
==== 1.14.3 - 2018/11/13
  * fix(async_hooks): more reliable cleanup {pull}674[#674]

[[release-notes-1.14.2]]
==== 1.14.2 - 2018/11/10
  * fix: prevent memory leak due to potential reference cycle {pull}667[#667]

[[release-notes-1.14.1]]
==== 1.14.1 - 2018/11/8
  * fix: promise.then() resolve point {pull}663[#663]

[[release-notes-1.14.0]]
==== 1.14.0 - 2018/11/6
  * feat(agent): return uuid in captureError callback {pull}636[#636]
  * feat(apollo-server-express): set custom GraphQL transaction names {pull}648[#648]
  * feat(finalhandler): improve capturing of errors in Express {pull}629[#629]
  * fix(http): bind writeHead to transaction {pull}637[#637]
  * fix(shimmer): safely handle property descriptors {pull}634[#634]

[[release-notes-1.13.0]]
==== 1.13.0 - 2018/10/19
  * feat(ioredis): add support for ioredis version 4.x {pull}516[#516]
  * fix(ws): allow disabling WebSocket instrumentation {pull}599[#599]
  * fix: allow flushInterval to be set from env {pull}568[#568]
  * fix: default transactionMaxSpans to 500 {pull}567[#567]

[[release-notes-1.12.0]]
==== 1.12.0 - 2018/8/31
  * feat(restify): add Restify instrumentation {pull}517[#517]
  * feat(config): default serviceName to package name {pull}508[#508]
  * fix: always call agent.flush() callback {pull}537[#537]

[[release-notes-1.11.0]]
==== 1.11.0 - 2018/8/15
  * feat(filters): filter set-cookie headers {pull}485[#485]
  * fix(express): cannot create property symbol {pull}510[#510]

[[release-notes-1.10.2]]
==== 1.10.2 - 2018/8/8
  * fix: ensure logger config can update {pull}503[#503]
  * perf: improve request body parsing speed {pull}492[#492]

[[release-notes-1.10.1]]
==== 1.10.1 - 2018/7/31
  * fix(graphql): handle execute args object {pull}484[#484]

[[release-notes-1.10.0]]
==== 1.10.0 - 2018/7/30
  * feat(cassandra): instrument Cassandra queries {pull}437[#437]
  * feat(mssql): instrument SQL Server queries {pull}444[#444]

[[release-notes-1.9.0]]
==== 1.9.0 - 2018/7/25
  * fix(parsers): use basic-auth rather than req.auth {pull}475[#475]
  * feat(agent): add currentTransaction getter {pull}462[#462]
  * feat: add support for ws 6.x {pull}464[#464]

[[release-notes-1.8.3]]
==== 1.8.3 - 2018/7/11
  * perf: don't patch newer versions of mimic-response {pull}442[#442]

[[release-notes-1.8.2]]
==== 1.8.2 - 2018/7/4
  * fix: ensure correct streaming when using mimic-response {pull}429[#429]

[[release-notes-1.8.1]]
==== 1.8.1 - 2018/6/27
  * fix: improve ability to run in an environment with muliple APM vendors {pull}417[#417]

[[release-notes-1.8.0]]
==== 1.8.0 - 2018/6/23
  * feat: truncate very long error messages {pull}413[#413]
  * fix: be unicode aware when truncating body {pull}412[#412]

[[release-notes-1.7.1]]
==== 1.7.1 - 2018/6/20
  * fix(express-queue): retain continuity through express-queue {pull}396[#396]

[[release-notes-1.7.0]]
==== 1.7.0 - 2018/6/18
  * feat(mysql): support mysql2 module {pull}298[#298]
  * feat(graphql): add support for the upcoming GraphQL v14.x {pull}399[#399]
  * feat(config): add option to disable certain instrumentations {pull}353[#353]
  * feat(http2): instrument client requests {pull}326[#326]
  * fix: get remoteAddress before HTTP request close event {pull}384[#384]
  * fix: improve capture of spans when EventEmitter is in use {pull}371[#371]

[[release-notes-1.6.0]]
==== 1.6.0 - 2018/5/28
  * feat(http2): instrument incoming http2 requests {pull}205[#205]
  * fix(agent): allow agent.endTransaction() to set result {pull}350[#350]

[[release-notes-1.5.4]]
==== 1.5.4 - 2018/5/15
  * chore: allow Node.js 10 in package.json engines field {pull}345[#345]

[[release-notes-1.5.3]]
==== 1.5.3 - 2018/5/14
  * fix: guard against non string err.message

[[release-notes-1.5.2]]
==== 1.5.2 - 2018/5/11
  * fix(express): string errors should not be reported

[[release-notes-1.5.1]]
==== 1.5.1 - 2018/5/10
  * fix: don't throw if span callsites can't be collected

[[release-notes-1.5.0]]
==== 1.5.0 - 2018/5/9
  * feat: add agent.addTags() method {pull}313[#313]
  * feat: add agent.isStarted() method {pull}311[#311]
  * feat: allow calling transaction.end() with transaction result {pull}328[#328]
  * fix: encode spans even if their stack trace can't be captured {pull}321[#321]
  * fix(config): restore custom logger feature {pull}299[#299]
  * fix(doc): lambda getting started had old argument {pull}296[#296]

[[release-notes-1.4.0]]
==== 1.4.0 - 2018/4/9
  * feat(lambda): implement manual lambda instrumentation {pull}234[#234]

[[release-notes-1.3.0]]
==== 1.3.0 - 2018/3/22
  * feat(request): include ppid {pull}286[#286]

[[release-notes-1.2.1]]
==== 1.2.1 - 2018/3/15
  * fix(span): Do not pass stack frames into promises (memory leak fix) {pull}269[#269]

[[release-notes-1.2.0]]
==== 1.2.0 - 2018/3/13
  * feat(config): add serverTimeout {pull}238[#238]
  * fix(config): set default maxQueueSize to 100 {pull}270[#270]
  * feat(ws): add support for ws v5 {pull}267[#267]

[[release-notes-1.1.1]]
==== 1.1.1 - 2018/3/4
  * fix(mongodb): don't throw if span cannot be built {pull}265[#265]

[[release-notes-1.1.0]]
==== 1.1.0 - 2018/2/28
  * feat: add agent.startSpan() function {pull}262[#262]
  * feat(debug): output more debug info on start {pull}254[#254]

[[release-notes-1.0.3]]
==== 1.0.3 - 2018/2/14
  * fix: ensure context.url.full property is truncated if too long {pull}242[#242]

[[release-notes-1.0.2]]
==== 1.0.2 - 2018/2/13
  * fix(express): prevent invalid errors from crashing {pull}240[#240]

[[release-notes-1.0.1]]
==== 1.0.1 - 2018/2/9
  * fix: don't add req/res to unsampled transactions {pull}236[#236]

[[release-notes-1.0.0]]
==== 1.0.0 - 2018/2/6
  * feat(instrumentation): support sampling {pull}154[#154]
  * feat(transaction): add `transactionMaxSpans` config option {pull}170[#170]
  * feat(errors): add captureError call location stack trace {pull}181[#181]
  * feat: allow setting of framework name and version {pull}228[#228]
  * feat(protcol): add `url.full` to intake API payload {pull}166[#166]
  * refactor(config): replace `logBody` with `captureBody` {pull}214[#214]
  * refactor(config): unify config options with python {pull}213[#213]
  * fix: don't collect source code for in-app span frames by default {pull}229[#229]
  * fix(protocol): report dropped span counts in intake API payload {pull}172[#172]
  * refactor(protocol): always include handled flag in intake API payload {pull}191[#191]
  * refactor(protocol): move process fields to own namespace in intake API payload {pull}155[#155]
  * refactor(protocol): rename `uncaught` to `handled` in intake API payload {pull}140[#140]
  * refactor(protocol): rename `in_app` to `library_frame` in intake API payload {pull}96[#96]
  * refactor: rename app to service {pull}93[#93]
  * refactor: rename trace to span {pull}92[#92]

[[release-notes-0.x]]
=== Node.js Agent version 0.x

[[release-notes-0.12.0]]
==== 0.12.0 - 2018/1/24
  * feat(*): control amount of source context lines collected using new config options {pull}196[#196]
  * feat(agent): add public flush function to force flush of transaction queue: agent.flush([callback]) {pull}187[#187]
  * feat(mongodb): add support for mongodb-core 3.x {pull}190[#190]
  * refactor(config): update default flushInterval to 10 seconds (lower memory usage) {pull}186[#186]
  * chore(*): drop support for Node.js 5 and 7 {pull}169[#169]
  * refactor(instrumentation): encode transactions as they are added to the queue (lower memory usage) {pull}184[#184]

[[release-notes-0.11.0]]
==== 0.11.0 - 2018/1/11
  * feat(*): Set default stack trace limit to 50 frames {pull}171[#171]
  * feat(ws): add support for ws@4.x {pull}164[#164]
  * feat(errors): associate errors with active transaction

[[release-notes-0.10.0]]
==== 0.10.0 - 2018/1/3
  * feat(express): auto-track errors (BREAKING CHANGE: removed express middleware) {pull}127[#127]
  * feat(hapi): add hapi 17 support {pull}146[#146]
  * fix(*): fix Node.js 8 support using async_hooks {pull}77[#77]
  * fix(graphql): support sync execute {pull}139[#139]
  * refactor(agent): make all config properties private (BREAKING CHANGE) {pull}107[#107]

[[release-notes-0.9.0]]
==== 0.9.0 - 2017/12/15
  * feat(conf): allow serverUrl to contain a sub-path {pull}116[#116]
  * refactor(*): better format of error messages from the APM Server {pull}108[#108]

[[release-notes-0.8.1]]
==== 0.8.1 - 2017/12/13
  * docs(*): we're now in beta! {pull}103[#103]

[[release-notes-0.8.0]]
==== 0.8.0 - 2017/12/13
  * feat(handlebars): instrument handlebars {pull}98[#98]

[[release-notes-0.7.0]]
==== 0.7.0 - 2017/12/6
  * feat(parser): add sourceContext config option to control if code snippets are sent to the APM Server {pull}87[#87]
  * fix(*): move https-pem to list of devDependencies

[[release-notes-0.6.0]]
==== 0.6.0 - 2017/11/17
  * feat(queue): add maxQueueSize config option {pull}56[#56]

[[release-notes-0.5.0]]
==== 0.5.0 - 2017/11/17
  * refactor(*): drop support for Node.js <4 {pull}65[#65]
  * refactor(*): rename module to elastic-apm-node {pull}71[#71]
  * feat(queue): add fuzziness to flushInterval {pull}63[#63]

[[release-notes-0.4.0]]
==== 0.4.0 - 2017/11/15
  * fix(https): instrument https.request in Node.js v9
  * refactor(http): log HTTP results in groups of 100 {pull}68[#68]
  * fix(api): add language to APM Server requests {pull}64[#64]
  * refactor(trans): set default transaction.result to success {pull}67[#67]
  * refactor(config): rename timeout config options {pull}59[#59]

[[release-notes-0.3.1]]
==== 0.3.1 - 2017/10/3
  * fix(parsers): don't log context.request.url.search as null {pull}48[#48]
  * fix(parsers): separate hostname and port when parsing Host header {pull}47[#47]

[[release-notes-0.3.0]]
==== 0.3.0 - 2017/9/20
  * fix(instrumentation): don't sample transactions {pull}40[#40]
  * feat(graphql): include GraphQL operation name in trace and transaction names {pull}27[#27]
  * feat(tls): add validateServerCert config option {pull}32[#32]
  * feat(parser): support http requests with full URI's {pull}26[#26]
  * refactor(*): remove appGitRef config option
  * fix(instrumentation): fix setting of custom flushInterval
  * feat(elasticsearch): add simple Elasticsearch instrumentation
  * fix(*): don't start agent if appName is invalid

[[release-notes-0.2.0]]
==== 0.2.0 - 2017/8/28
  * refactor(*): support new default port 8200 in APM Server
  * refactor(*): support new context.response status code format

[[release-notes-0.1.1]]
==== 0.1.1 - 2017/8/17
  * fix(instrumentation): don't fail when sending transactions to APM Server

[[release-notes-0.1.0]]
==== 0.1.0 - 2017/8/17
  * Initial release
