moto/moto/xray/responses.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

180 lines
5.8 KiB
Python
Raw Normal View History

2017-09-22 23:36:26 +01:00
import json
import datetime
from moto.core.responses import BaseResponse
from moto.core.exceptions import AWSError
2021-07-26 07:40:39 +01:00
from urllib.parse import urlsplit
2017-09-22 23:36:26 +01:00
from .models import xray_backends
from .exceptions import BadSegmentException
2017-09-22 23:36:26 +01:00
class XRayResponse(BaseResponse):
2022-08-13 09:49:43 +00:00
def __init__(self):
super().__init__(service_name="xray")
2017-09-22 23:36:26 +01:00
def _error(self, code, message):
return json.dumps({"__type": code, "message": message}), dict(status=400)
@property
def xray_backend(self):
2022-08-13 09:49:43 +00:00
return xray_backends[self.current_account][self.region]
2017-09-22 23:36:26 +01:00
@property
def request_params(self):
try:
return json.loads(self.body)
except ValueError:
return {}
def _get_param(self, param_name, if_none=None):
return self.request_params.get(param_name, if_none)
2017-09-22 23:36:26 +01:00
2017-09-23 11:02:25 +01:00
def _get_action(self):
2017-09-22 23:36:26 +01:00
# Amazon is just calling urls like /TelemetryRecords etc...
2017-09-23 11:02:25 +01:00
# This uses the value after / as the camalcase action, which then
# gets converted in call_action to find the following methods
return urlsplit(self.uri).path.lstrip("/")
2017-09-22 23:36:26 +01:00
# PutTelemetryRecords
def telemetry_records(self):
2022-03-15 15:42:46 -01:00
self.xray_backend.add_telemetry_records(self.request_params)
2017-09-22 23:36:26 +01:00
return ""
# PutTraceSegments
def trace_segments(self):
docs = self._get_param("TraceSegmentDocuments")
if docs is None:
msg = "Parameter TraceSegmentDocuments is missing"
return (
json.dumps({"__type": "MissingParameter", "message": msg}),
dict(status=400),
)
# Raises an exception that contains info about a bad segment,
# the object also has a to_dict() method
bad_segments = []
for doc in docs:
try:
self.xray_backend.process_segment(doc)
except BadSegmentException as bad_seg:
bad_segments.append(bad_seg)
except Exception as err:
return (
json.dumps({"__type": "InternalFailure", "message": str(err)}),
dict(status=500),
)
result = {"UnprocessedTraceSegments": [x.to_dict() for x in bad_segments]}
return json.dumps(result)
# GetTraceSummaries
def trace_summaries(self):
start_time = self._get_param("StartTime")
end_time = self._get_param("EndTime")
if start_time is None:
msg = "Parameter StartTime is missing"
return (
json.dumps({"__type": "MissingParameter", "message": msg}),
dict(status=400),
)
if end_time is None:
msg = "Parameter EndTime is missing"
return (
json.dumps({"__type": "MissingParameter", "message": msg}),
dict(status=400),
)
filter_expression = self._get_param("FilterExpression")
try:
start_time = datetime.datetime.fromtimestamp(int(start_time))
end_time = datetime.datetime.fromtimestamp(int(end_time))
except ValueError:
msg = "start_time and end_time are not integers"
return (
json.dumps({"__type": "InvalidParameterValue", "message": msg}),
dict(status=400),
)
except Exception as err:
return (
json.dumps({"__type": "InternalFailure", "message": str(err)}),
dict(status=500),
)
try:
result = self.xray_backend.get_trace_summary(
start_time, end_time, filter_expression
2017-09-22 23:36:26 +01:00
)
except AWSError as err:
2022-03-15 15:42:46 -01:00
raise err
2017-09-22 23:36:26 +01:00
except Exception as err:
return (
json.dumps({"__type": "InternalFailure", "message": str(err)}),
dict(status=500),
)
return json.dumps(result)
# BatchGetTraces
def traces(self):
2017-09-23 11:02:25 +01:00
trace_ids = self._get_param("TraceIds")
if trace_ids is None:
msg = "Parameter TraceIds is missing"
return (
json.dumps({"__type": "MissingParameter", "message": msg}),
dict(status=400),
)
2017-09-22 23:36:26 +01:00
2017-09-23 11:02:25 +01:00
try:
result = self.xray_backend.get_trace_ids(trace_ids)
2017-09-23 11:02:25 +01:00
except AWSError as err:
2022-03-15 15:42:46 -01:00
raise err
2017-09-23 11:02:25 +01:00
except Exception as err:
return (
json.dumps({"__type": "InternalFailure", "message": str(err)}),
dict(status=500),
)
return json.dumps(result)
# GetServiceGraph - just a dummy response for now
2017-09-22 23:36:26 +01:00
def service_graph(self):
2017-09-23 11:02:25 +01:00
start_time = self._get_param("StartTime")
end_time = self._get_param("EndTime")
# next_token = self._get_param('NextToken') # not implemented yet
2017-09-22 23:36:26 +01:00
2017-09-23 11:02:25 +01:00
if start_time is None:
msg = "Parameter StartTime is missing"
return (
json.dumps({"__type": "MissingParameter", "message": msg}),
dict(status=400),
)
if end_time is None:
msg = "Parameter EndTime is missing"
return (
json.dumps({"__type": "MissingParameter", "message": msg}),
dict(status=400),
)
2019-10-31 08:44:26 -07:00
2017-09-23 11:02:25 +01:00
result = {"StartTime": start_time, "EndTime": end_time, "Services": []}
return json.dumps(result)
# GetTraceGraph - just a dummy response for now
2017-09-22 23:36:26 +01:00
def trace_graph(self):
2017-09-23 11:02:25 +01:00
trace_ids = self._get_param("TraceIds")
# next_token = self._get_param('NextToken') # not implemented yet
if trace_ids is None:
msg = "Parameter TraceIds is missing"
return (
json.dumps({"__type": "MissingParameter", "message": msg}),
dict(status=400),
)
result = {"Services": []}
return json.dumps(result)