Amazon X-Ray
- Allow developer debugging the production and distributed application and micro services
- For cost effective performance,
- Enable x-ray sampling
- The sampling rate should be low, so
- Get significant number of request statistically
- Optimum traces
Properties
Segments: Used to break down the data in sub segments.
Sub Segments: Provides, timings, other aws service/resource calls in downstream forms.
Inferred Segment: Allow display timings and calls to all services, even the services who does not support x-ray or tracing
annotations
and metadata
do not trace the calls of other aws services and resources. Instead these annotations
and metadata
are included in the segments
and sub-segments
.
sub-segments
fields,
namespace
: Can beaws
orremote
aws
for AWS SDK callsremote
for other downstream callshttp
: Outgoing HTTP callannotations
: Key-value for index searchmetadata
: Additional data for debugging
annotations
can be used to filter the traced data from console. Also can trace by groups.
metadata
can include some additional key value data, that can be helpful during the debugging and tracing.
Segment Document
- Add custom attributes as
annotation
to use as filter expression - Add custom attributes as
metadata
to store custom data during trace - Add custom attributes as
segment field
to use ::::TODO Sampling Rule
to create a representative sampling of tracing- With default sampling
one request per sec and 5% additional requests per host
Segment Properties
Mandatory:
- Name
- id
- Trace_id
- Start_time
- End_time
-
In_progress Optional:
-
Service
- User
- Origin
- Parent_id
- http
- aws
- error, throttle, cause
- annotations
- metadata
- subsegments
Sending data to x-ray
Two ways,
- Use putSegmentTrace to uploda data directly to x-ray
- Put multiple request to x-ray-daemon and later using buffer, the x-ray-daemon will buffer these to the x-ray
X Ray Daemon
X-Ray sdk does not send data directly to X-Ray. Instead it sends data for multiple request in the daemon and then sends these to the X-Ray service.
X-Ray Daemon listens to traffic to UDP 2000 port,
Service Map
- Create dependency trees between services
- Detect latency between services
Elastic Beanstalk Integration
X-Ray is already installed in the elastic beanstalk. To enable the x-ray, update/create a config under the beanstalk extensions, .ebextensions/x-ray-daemon.config
. This can also be done using by management console.
max-age
To get trace data, code must instrumented wit the x-ray sdk
ECS Integration
To use,
- Create a docker image, runs x-ray daemon
- Put the image in docker repository
- Launch in the ecs cluster
ECS can integrate x-ray by x-ray daemon
and side-car
pattern
- As Daemon Pattern: x-ray daemin in ec2 instance. To use x-ray in ecs, we need to use the x-ray daemon container for each of the ecs instances. In this case, the x-ray daemon acts as the x-ray agents.
- As Side Car Pattern: x-ray daemin in container. In this case, each of the container in the ecs will have x-ray daemon inside it.
When we need to use x-ray in the fargate, we have to use the side-car
pattern. Because, we do not have control over the ec2 instances in fargate.
To set up
- Run x-ray daemon according to the suited pattern
- Make port mapping to allows UDP 2000 for x-ray daemon
Lambda Integration
To implement the X-ray tracing, we need to implement the followings,
- Enable
Active Tracing
from the lambda function configuration. This will run the x-ray daemon for the function - The attached policy should have write access to the x-ray daemon
- Following environment policies will require to communicate with x-ray
_X_AMZN_TRACE_ID
: tracing headerAWS_XRAY_DAEMON_ADDRESS
: IP_ADDRESS:PORT- Others are,
AWS_XRAY_CONTEXT_MISSING
: default: LOG_ERRORAWS_XRAY_TRACING_NAME
: set service nameAUTO_INSTRUMENT
: applicable for django framework
EC2 Integration
To use x-ray we need the x-ray daemon in the ec2 instance. We can install this manually or update the user script to install the daemon.
Also we have to make sure the sg allow UDP of port 2000 for the x-ray daemon
- Inatall daemon in ec2 instance
- Enable UDP 2000 port
On Premise Server Integration
- Install x-ray daemon
- For data, relay on x-ray service
- The UDP 2000 port should be open for x-ray daemon
API
After X-Ray collects the data, it use to combine abd summarize the trace data.
GetTraceSummaries
: Can get the trace summaries, ids and annotations. Use traceId or event time to get the summariesBatchGetTraces
: Get the full tracesGetGroup
: A group resourcesGetServiceGraph
: Return info of which service handle the incoming request
To make a custom debug tool,
- First get all trace ids by
GetTraceSummaries
- From each id, get full traces by
BatchGetTraces