def parse_response(self, url: str, status_code: int, headers: dict, body: bytes) -> dict: max_size = Configuration.get_max_entry_size( has_error=is_error_code(status_code)) if Configuration.verbose and not should_scrub_domain(url): additional_info = { "headers": lumigo_dumps(headers, max_size), "body": lumigo_dumps(body, max_size) if body else "", "statusCode": status_code, } else: additional_info = { "statusCode": status_code, "body": "The data is not available" } return { "type": HTTP_TYPE, "info": { "httpInfo": { "host": url, "response": additional_info } }, "ended": get_current_ms_time(), }
def dump_event(event: Dict, handlers: List[EventParseHandler] = None, has_error: bool = False) -> str: max_size = Configuration.get_max_entry_size(has_error) if should_use_tracer_extension(): return aws_dump(event) handlers = handlers or [ ApiGWHandler(), SNSHandler(), SQSHandler(), S3Handler(), CloudfrontHandler(), DDBHandler(), ] event_obj = Event(event) for handler in handlers: try: if handler.is_supported(event_obj): return lumigo_dumps( handler.parse(event), max_size, omit_skip_path=handler.get_omit_skip_path(), ) except Exception as e: get_logger().debug( f"Error while trying to parse with handler {handler.__class__.__name__} event {event}", exc_info=e, ) return lumigo_dumps(event, max_size)
def parse_request(self, parse_params: HttpRequest) -> dict: if Configuration.verbose and parse_params and not should_scrub_domain( parse_params.host): HttpState.omit_skip_path = self.get_omit_skip_path() additional_info = { "headers": lumigo_dumps(parse_params.headers), "body": lumigo_dumps(parse_params.body, omit_skip_path=HttpState.omit_skip_path) if parse_params.body else "", "method": parse_params.method, "uri": parse_params.uri, } else: additional_info = { "method": parse_params.method if parse_params else "", "body": "The data is not available", } return { "id": str(uuid.uuid4()), "type": HTTP_TYPE, "info": { "httpInfo": { "host": parse_params.host if parse_params else "", "request": additional_info, } }, "started": get_current_ms_time(), }
def _update_request_data_increased_size_limit(http_info: dict, max_size: int) -> None: if not HttpState.previous_request or not http_info.get("request"): return http_info["request"].update({ "body": lumigo_dumps( HttpState.previous_request.body, max_size, omit_skip_path=HttpState.omit_skip_path, ) if HttpState.previous_request.body else "", "headers": lumigo_dumps(HttpState.previous_request.headers, max_size), })
def test_lumigo_dumps_with_omit_skip_and_should_scrub_known_services( monkeypatch): monkeypatch.setenv("LUMIGO_SCRUB_KNOWN_SERVICES", "true") config() assert lumigo_dumps({"key": "v"}, omit_skip_path=["key"]) == '{"key": "****"}'
def test_parse_cloudfront_event(cloudfront_event): ordered_cloudfront_event = EventDumper.dump_event(event=cloudfront_event) assert ordered_cloudfront_event == lumigo_dumps( OrderedDict({ "Records": [{ "cf": { "config": { "distributionDomainName": "d3f1hyel7d5adt.cloudfront.net", "distributionId": "E8PDQHVQH1V0Q", "eventType": "origin-request", "requestId": "hnql0vH8VDvTTLGwmKn337OH08mMiV5sTPsYGyBqCKgCXPZbfNqYlw==", }, "request": { "body": { "action": "read-only", "data": "", "encoding": "base64", "inputTruncated": False, }, "clientIp": "176.12.196.206", "method": "GET", "querystring": "", "uri": "/favicon.ico", }, } }] }))
def test_parse_event_not_api_gw(): event = {"a": 1} new_event = EventDumper.dump_event(event=event, handlers=[ExceptionHandler()]) assert new_event == lumigo_dumps(event)
def started(self, event): with lumigo_safe_execute("pymongo started"): span_id = str(uuid.uuid4()) LumigoMongoMonitoring.request_to_span_id[ event.request_id] = span_id SpansContainer.get_span().add_span({ "id": span_id, "type": self.MONGO_SPAN, "started": get_current_ms_time(), "databaseName": event.database_name, "commandName": event.command_name, "request": lumigo_dumps(event.command), "mongoRequestId": event.request_id, "mongoOperationId": event.operation_id, "mongoConnectionId": event.connection_id, })
def _before_cursor_execute(conn, cursor, statement, parameters, context, executemany): with lumigo_safe_execute("handle sqlalchemy before execute"): SpansContainer.get_span().add_span( { "id": str(uuid.uuid4()), "type": SQL_SPAN, "started": get_current_ms_time(), "connectionParameters": { "host": conn.engine.url.host or conn.engine.url.database, "port": conn.engine.url.port, "database": conn.engine.url.database, "user": conn.engine.url.username, }, "query": lumigo_dumps(statement), "values": lumigo_dumps(parameters), } )
def _update_request_data_increased_size_limit(http_info: dict, max_size: int) -> None: if not HttpState.previous_request or not http_info.get("request"): return if not HttpState.previous_request.body.startswith(http_info["request"].get( "body", "").encode()[:len(TRUNCATE_SUFFIX)]): return # this is a different request (non-sync case) http_info["request"].update({ "body": lumigo_dumps( HttpState.previous_request.body, max_size, omit_skip_path=HttpState.omit_skip_path, ) if HttpState.previous_request.body else "", "headers": lumigo_dumps(HttpState.previous_request.headers, max_size), })
def command_finished(ret_val: Dict): with lumigo_safe_execute("redis command finished"): span = SpansContainer.get_span().get_last_span() if not span: get_logger().warning( "Redis span ended without a record on its start") return span.update({ "ended": get_current_ms_time(), "response": lumigo_dumps(copy.deepcopy(ret_val)) })
def execute_wrapper(func, instance, args, kwargs): with lumigo_safe_execute("redis start"): commands = instance.command_stack command = [cmd[0] for cmd in commands if cmd] or None request_args = [cmd[1:] for cmd in commands if cmd and len(cmd) > 1] connection_options = instance.connection_pool.connection_kwargs command_started(lumigo_dumps(command), request_args, connection_options) try: ret_val = func(*args, **kwargs) command_finished(ret_val) return ret_val except Exception as e: command_failed(e) raise
def failed(self, event): with lumigo_safe_execute("pymongo failed"): if event.request_id not in LumigoMongoMonitoring.request_to_span_id: get_logger().warning( "Mongo span ended without a record on its start") return span_id = LumigoMongoMonitoring.request_to_span_id.pop( event.request_id) span = SpansContainer.get_span().get_span_by_id(span_id) span.update({ "ended": span["started"] + (event.duration_micros / 1000), "error": lumigo_dumps(event.failure), })
def _handle_error(context): with lumigo_safe_execute("handle sqlalchemy error"): span = SpansContainer.get_span().get_span_by_id(_last_span_id) if not span: get_logger().warning( "Redis span ended without a record on its start") return span.update({ "ended": get_current_ms_time(), "error": lumigo_dumps({ "type": context.original_exception.__class__.__name__, "args": context.original_exception.args, }), })
def end(self, ret_val=None, event: Optional[dict] = None, context=None) -> Optional[int]: TimeoutMechanism.stop() reported_rtt = None self.previous_request = None self.function_span.update({"ended": get_current_ms_time()}) if Configuration.is_step_function: self.add_step_end_event(ret_val) parsed_ret_val = None if Configuration.verbose: try: if ret_val is not None: parsed_ret_val = lumigo_dumps(ret_val, enforce_jsonify=True, decimal_safe=True) except Exception as err: suffix = "" if err.args: suffix = f'Original message: "{err.args[0]}"' self.function_span["error"] = self._create_exception_event( "ReturnValueError", "The lambda will probably fail due to bad return value. " + suffix, ) self.function_span.update({"return_value": parsed_ret_val}) if _is_span_has_error(self.function_span): self._set_error_extra_data(event) spans_contain_errors: bool = any( _is_span_has_error(s) for s in self.spans + [self.function_span]) if (not Configuration.send_only_if_error) or spans_contain_errors: to_send = [self.function_span] + [ s for s in self.spans if s["id"] in self.span_ids_to_send ] reported_rtt = lumigo_utils.report_json(region=self.region, msgs=to_send) else: get_logger().debug( "No Spans were sent, `Configuration.send_only_if_error` is on and no span has error" ) return reported_rtt
def command_started(command: str, request_args: Union[Dict, List[Dict]], connection_options: Optional[Dict]): span_id = str(uuid.uuid4()) host = (connection_options or {}).get("host") port = (connection_options or {}).get("port") SpansContainer.get_span().add_span({ "id": span_id, "type": REDIS_SPAN, "started": get_current_ms_time(), "requestCommand": command, "requestArgs": lumigo_dumps(copy.deepcopy(request_args)), "connectionOptions": { "host": host, "port": port }, })
def test_lumigo_dumps_enforce_jsonify_raise_error(): with pytest.raises(TypeError): assert lumigo_dumps({"a": set()}, max_size=100, enforce_jsonify=True)
def test_parse_event_not_api_gw_none_check(): new_event = EventDumper.dump_event(event=None) assert new_event == lumigo_dumps(None)
def test_parse_event_api_gw_v2(): not_order_api_gw_event = { "version": "2.0", "routeKey": "ANY /nodejs-apig-function-1G3XMPLZXVXYI", "rawPath": "/default/nodejs-apig-function-1G3XMPLZXVXYI", "rawQueryString": "", "cookies": ["s_fid=7AABXMPL1AFD9BBF-0643XMPL09956DE2", "regStatus=pre-register"], "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "accept-encoding": "gzip, deflate, br", "accept-language": "en-US,en;q=0.9", "content-length": "0", "host": "r3pmxmplak.execute-api.us-east-2.amazonaws.com", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "cross-site", "sec-fetch-user": "******", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", "x-amzn-trace-id": "Root=1-5e6722a7-cc56xmpl46db7ae02d4da47e", "x-forwarded-for": "205.255.255.176", "x-forwarded-port": "443", "x-forwarded-proto": "https", }, "requestContext": { "accountId": "123456789012", "apiId": "r3pmxmplak", "domainName": "r3pmxmplak.execute-api.us-east-2.amazonaws.com", "domainPrefix": "r3pmxmplak", "http": { "method": "GET", "path": "/default/nodejs-apig-function-1G3XMPLZXVXYI", "protocol": "HTTP/1.1", "sourceIp": "205.255.255.176", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", }, "requestId": "JKJaXmPLvHcESHA=", "routeKey": "ANY /nodejs-apig-function-1G3XMPLZXVXYI", "stage": "default", "time": "10/Mar/2020:05:16:23 +0000", "timeEpoch": 1583817383220, }, "isBase64Encoded": True, } order_api_gw_event = EventDumper.dump_event(event=not_order_api_gw_event) assert order_api_gw_event == lumigo_dumps( OrderedDict({ "version": "2.0", "routeKey": "ANY /nodejs-apig-function-1G3XMPLZXVXYI", "rawPath": "/default/nodejs-apig-function-1G3XMPLZXVXYI", "requestContext": { "http": { "method": "GET", "path": "/default/nodejs-apig-function-1G3XMPLZXVXYI", "protocol": "HTTP/1.1", "sourceIp": "205.255.255.176", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", }, "requestId": "JKJaXmPLvHcESHA=", }, "headers": { "content-length": "0", "host": "r3pmxmplak.execute-api.us-east-2.amazonaws.com", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36", }, "cookies": [ "s_fid=7AABXMPL1AFD9BBF-0643XMPL09956DE2", "regStatus=pre-register" ], "isBase64Encoded": True, }))
def _get_envs_for_span(has_error: bool = False) -> str: return lumigo_dumps(dict(os.environ), Configuration.get_max_entry_size(has_error))
def test_lumigo_dumps(value, output): assert lumigo_dumps(value, max_size=100) == output
def test_parse_event_sqs(): not_order_sns_event = { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message1", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185", }, "messageAttributes": { "a": 1 }, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2", }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message2", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649", }, "messageAttributes": { "b": 2 }, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2", }, ] } order_sns_event = EventDumper.dump_event(event=not_order_sns_event) assert order_sns_event == lumigo_dumps( OrderedDict({ "Records": [ { "body": "Test message1", "messageAttributes": { "a": 1 }, "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", }, { "body": "Test message2", "messageAttributes": { "b": 2 }, "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", }, ] }))
def test_parse_event_sns(): not_order_sns_event = { "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "2019-01-02T12:45:07.000Z", "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS1!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" }, }, "Type": "Notification", "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "TopicArn": "arn:aws:sns:us-east-2:123456789012:sns-lambda", "Subject": "TestInvoke", }, }, { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "2019-01-02T12:45:07.000Z", "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message": "Hello from SNS2!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" }, }, "Type": "Notification", "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "TopicArn": "arn:aws:sns:us-east-2:123456789012:sns-lambda", "Subject": "TestInvoke", }, }, ] } order_sns_event = EventDumper.dump_event(event=not_order_sns_event) assert order_sns_event == lumigo_dumps( OrderedDict({ "Records": [ { "Sns": { "Message": "Hello from SNS1!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" }, }, "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", } }, { "Sns": { "Message": "Hello from SNS2!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" }, }, "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", } }, ] }))
def test_lumigo_dumps_with_omit_skip(value, omit_skip_path, output): assert lumigo_dumps(value, omit_skip_path=omit_skip_path) == output
def test_parse_event_api_gw_v1(): not_order_api_gw_event = { "resource": "/add-user", "path": "/add-user", "httpMethod": "POST", "headers": { "Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "he-IL,he;q=0.9,en-US;q=0.8,en;q=0.7", "Authorization": "auth", "CloudFront-Forwarded-Proto": "https", "CloudFront-Is-Desktop-Viewer": "true", "CloudFront-Is-Mobile-Viewer": "false", "CloudFront-Is-SmartTV-Viewer": "false", "CloudFront-Is-Tablet-Viewer": "false", "CloudFront-Viewer-Country": "IL", "content-type": "application/json;charset=UTF-8", "customer_id": "c_1111", "Host": "aaaa.execute-api.us-west-2.amazonaws.com", "origin": "https://aaa.io", "Referer": "https://aaa.io/users", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36", "Via": "2.0 59574f77a7cf2d23d64904db278e5711.cloudfront.net (CloudFront)", "X-Amz-Cf-Id": "J4KbOEUrZCnUQSLsDq1PyYXmfpVy8x634huSeBX0HCbscgH-N2AtVA==", "X-Amzn-Trace-Id": "Root=1-5e9bf868-1c53a38cfe070266db0bfbd9", "X-Forwarded-For": "5.102.206.161, 54.182.243.106", "X-Forwarded-Port": "443", "X-Forwarded-Proto": "https", }, "multiValueHeaders": { "Accept": ["application/json, text/plain, */*"], "Accept-Encoding": ["gzip, deflate, br"], "Accept-Language": ["he-IL,he;q=0.9,en-US;q=0.8,en;q=0.7"], "Authorization": ["auth"], "CloudFront-Forwarded-Proto": ["https"], "CloudFront-Is-Desktop-Viewer": ["true"], "CloudFront-Is-Mobile-Viewer": ["false"], "CloudFront-Is-SmartTV-Viewer": ["false"], "CloudFront-Is-Tablet-Viewer": ["false"], "CloudFront-Viewer-Country": ["IL"], "content-type": ["application/json;charset=UTF-8"], "customer_id": ["c_1111"], "Host": ["a.execute-api.us-west-2.amazonaws.com"], "origin": ["https://aaa.io"], "Referer": ["https://aaa.io/users"], "sec-fetch-dest": ["empty"], "sec-fetch-mode": ["cors"], "sec-fetch-site": ["cross-site"], "User-Agent": [ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" ], "Via": [ "2.0 59574f77a7cf2d23d64904db278e5711.cloudfront.net (CloudFront)" ], "X-Amz-Cf-Id": ["J4KbOEUrZCnUQSLsDq1PyYXmfpVy8x634huSeBX0HCbscgH-N2AtVA=="], "X-Amzn-Trace-Id": ["Root=1-5e9bf868-1c53a38cfe070266db0bfbd9"], "X-Forwarded-For": ["5.102.206.161, 54.182.243.106"], "X-Forwarded-Port": ["443"], "X-Forwarded-Proto": ["https"], }, "queryStringParameters": "1", "multiValueQueryStringParameters": "1", "pathParameters": "1", "stageVariables": None, "requestContext": { "resourceId": "ua33sn", "authorizer": { "claims": { "sub": "a87005bb-3030-4962-bae8-48cd629ba20b", "custom:customer": "c_1111", "iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2", "custom:customer-name": "a", "cognito:username": "******", "aud": "4lidcnek50hi18996gadaop8j0", "event_id": "9fe80735-f265-41d5-a7ca-04b88c2a4a4c", "token_use": "id", "auth_time": "1587038744", "exp": "Sun Apr 19 08:06:14 UTC 2020", "custom:role": "admin", "iat": "Sun Apr 19 07:06:14 UTC 2020", "email": "*****@*****.**", } }, "resourcePath": "/add-user", "httpMethod": "POST", "extendedRequestId": "LOPAXFcuvHcFUKg=", "requestTime": "19/Apr/2020:07:06:16 +0000", "path": "/prod/add-user", "accountId": "114300393969", "protocol": "HTTP/1.1", "stage": "prod", "domainPrefix": "psqn7b0ev2", "requestTimeEpoch": 1587279976628, "requestId": "78542821-ca17-4e83-94ec-96993a9d451d", "identity": { "cognitoIdentityPoolId": None, "accountId": None, "cognitoIdentityId": None, "caller": None, "sourceIp": "5.102.206.161", "principalOrgId": None, "accessKey": None, "cognitoAuthenticationType": None, "cognitoAuthenticationProvider": None, "userArn": None, "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36", "user": None, }, "domainName": "psqn7b0ev2.execute-api.us-west-2.amazonaws.com", "apiId": "psqn7b0ev2", }, "body": '{"email":"*****@*****.**"}', "isBase64Encoded": False, } order_api_gw_event = EventDumper.dump_event(event=not_order_api_gw_event) assert order_api_gw_event == lumigo_dumps( OrderedDict({ "resource": "/add-user", "path": "/add-user", "httpMethod": "POST", "queryStringParameters": "1", "pathParameters": "1", "body": '{"email":"*****@*****.**"}', "requestContext": { "authorizer": { "claims": { "sub": "a87005bb-3030-4962-bae8-48cd629ba20b", "custom:customer": "c_1111", "iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2", "custom:customer-name": "a", "cognito:username": "******", "aud": "4lidcnek50hi18996gadaop8j0", "event_id": "9fe80735-f265-41d5-a7ca-04b88c2a4a4c", "token_use": "id", "auth_time": "1587038744", "exp": "Sun Apr 19 08:06:14 UTC 2020", "custom:role": "admin", "iat": "Sun Apr 19 07:06:14 UTC 2020", "email": "*****@*****.**", } }, "requestId": "78542821-ca17-4e83-94ec-96993a9d451d", }, "headers": { "Authorization": "auth", "content-type": "application/json;charset=UTF-8", "customer_id": "c_1111", "Host": "aaaa.execute-api.us-west-2.amazonaws.com", "origin": "https://aaa.io", "Referer": "https://aaa.io/users", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36", }, "stageVariables": None, "isBase64Encoded": False, }))
def test_lumigo_dumps_no_regexes(monkeypatch): monkeypatch.setenv(LUMIGO_SECRET_MASKING_REGEX, "[]") result = lumigo_dumps({"key": "123"}, max_size=100, enforce_jsonify=True) assert result == '{"key": "123"}'
def test_concat_old_body_to_new(old, new, expected, monkeypatch): monkeypatch.setattr(Configuration, "max_entry_size", 5) assert concat_old_body_to_new(lumigo_dumps(old), new) == lumigo_dumps(expected)
def test_lumigo_dumps_omit_keys_environment(monkeypatch): monkeypatch.setenv(LUMIGO_SECRET_MASKING_REGEX, '[".*evilPlan.*"]') value = {"password": "******", "evilPlan": {"take": "over", "the": "world"}} assert lumigo_dumps( value, max_size=100) == '{"password": "******", "evilPlan": "****"}'