[role="xpack"]
[[apm-bottlenecks]]
== Visualizing Application Bottlenecks

Elastic APM captures different types of information from within instrumented applications:

* {apm-overview-ref-v}/transaction-spans.html[*Spans*] contain information about a specific code path that has been executed.
They measure from the start to end of an activity,
and they can have a parent/child relationship with other spans.
* {apm-overview-ref-v}/transactions.html[*Transactions*] are a special kind of span that have extra metadata associated with them.
You can think of transactions as the highest level of work you’re measuring within a service.
As an example, a transaction could be a request to your server, a batch job, or a custom transaction type.
* {apm-overview-ref-v}/errors.html[*Errors*] contain information about the original exception that occurred or about a log created when the exception occurred.

Each of these information types have a specific page associated with them in the APM app.
These various pages display the captured data in curated charts and tables that allow you to easily compare and debug your applications.

For example, you can see information about response times, requests per minute, and status codes per endpoint.
You can even dive into a specific request sample and get a complete waterfall view of what your application is spending its time on.
You might see that your bottlenecks are in database queries, cache calls, or external requests.
For each incoming request and each application error,
you can also see contextual information such as the request header, user information,
system values, or custom data that you manually attached to the request.

Having access to application-level insights with just a few clicks can drastically decrease the time you spend debugging errors, slow response times, and crashes.
