@@ -613,7 +613,7 @@ def cloud_function(functionhandler, event):
613613 + FUNCTIONS_PRELUDE
614614 + dedent (
615615 """
616- init_sdk(traces_sample_rate=1.0, send_default_pii=True )
616+ init_sdk(traces_sample_rate=1.0, data_collection={} )
617617 gcp_functions.worker_v1.FunctionHandler.invoke_user_function(functionhandler, event)
618618 """
619619 )
@@ -633,131 +633,53 @@ def cloud_function(functionhandler, event):
633633 assert attrs ["faas.entry_point" ] == "cloud_function"
634634
635635
636- def test_no_query_string_without_pii (run_cloud_function ):
637- _ , _ , span_items = run_cloud_function (
638- dedent (
639- """
640- functionhandler = None
641-
642- from collections import namedtuple
643- GCPEvent = namedtuple("GCPEvent", ["headers", "method", "query_string"])
644- event = GCPEvent(
645- headers={},
646- method="GET",
647- query_string=b"secret=hunter2",
648- )
649-
650- def cloud_function(functionhandler, event):
651- return "ok"
652- """
653- )
654- + FUNCTIONS_PRELUDE
655- + dedent (
656- """
657- init_sdk(traces_sample_rate=1.0, send_default_pii=False)
658- gcp_functions.worker_v1.FunctionHandler.invoke_user_function(functionhandler, event)
659- """
660- )
661- )
662-
663- assert len (span_items ) == 1
664- segment_span = span_items [0 ]
665- attrs = segment_span ["attributes" ]
666-
667- assert "url.query" not in attrs
668- assert attrs ["http.request.method" ] == "GET"
669- assert attrs ["faas.name" ] == "Google Cloud function"
670- assert attrs ["gcp.project.id" ] == "serverless_project"
671- assert attrs ["faas.identity" ] == "func_ID"
672- assert attrs ["faas.entry_point" ] == "cloud_function"
673-
674-
675- # Each case is (send_default_pii, data_collection, expected_event, expected_span).
676- # ``send_default_pii`` / ``data_collection`` of None means the option is omitted.
677- # The two paths only diverge for the legacy (no ``data_collection``) rows: the
678- # event processor always records the raw query string, while the span-streaming
679- # path gates the ``url.query`` attribute on ``send_default_pii``.
636+ # Each case is (data_collection, expected_span). ``data_collection`` of None
637+ # means the option is omitted.
680638_QUERY_STRING_DATA_COLLECTION_CASES = [
681639 pytest .param (
682- True ,
683- None ,
684- "toy=tennisball&color=red&auth=secret" ,
685- "toy=tennisball&color=red&auth=secret" ,
686- id = "send_default_pii_true" ,
687- ),
688- pytest .param (
689- False ,
690- None ,
691- "toy=tennisball&color=red&auth=secret" ,
692- None ,
693- id = "send_default_pii_false" ,
694- ),
695- pytest .param (
696- None ,
697- None ,
698- "toy=tennisball&color=red&auth=secret" ,
699- None ,
700- id = "defaults" ,
701- ),
702- # data_collection configured: query string is routed through filtering.
703- # Spec defaults -> denylist: only the sensitive ``auth`` is redacted.
704- pytest .param (
705- None ,
706640 {},
707641 "toy=tennisball&color=red&auth=%5BFiltered%5D" ,
708- "toy=tennisball&color=red&auth=%5BFiltered%5D" ,
709642 id = "data_collection_denylist_default" ,
710643 ),
711644 pytest .param (
712- None ,
713645 {"url_query_params" : {"mode" : "denylist" , "terms" : ["toy" ]}},
714646 "toy=%5BFiltered%5D&color=red&auth=%5BFiltered%5D" ,
715- "toy=%5BFiltered%5D&color=red&auth=%5BFiltered%5D" ,
716647 id = "data_collection_denylist_custom_terms" ,
717648 ),
718649 # allowlist with only ``toy`` allowed: ``color`` is redacted even though it
719650 # is not sensitive, proving the redaction comes from the allowlist.
720651 pytest .param (
721- None ,
722652 {"url_query_params" : {"mode" : "allowlist" , "terms" : ["toy" ]}},
723653 "toy=tennisball&color=%5BFiltered%5D&auth=%5BFiltered%5D" ,
724- "toy=tennisball&color=%5BFiltered%5D&auth=%5BFiltered%5D" ,
725654 id = "data_collection_allowlist" ,
726655 ),
727656 pytest .param (
728- None ,
729657 {"url_query_params" : {"mode" : "off" }},
730658 None ,
731- None ,
732659 id = "data_collection_off" ,
733660 ),
734661]
735662
736663
737- def _build_init_kwargs (send_default_pii , data_collection ):
664+ def _build_init_kwargs (data_collection ):
738665 """Render the keyword-argument string passed to ``init_sdk`` in the
739666 subprocess."""
740- kwargs = []
741- if send_default_pii is not None :
742- kwargs .append ("send_default_pii=%r" % send_default_pii )
743- if data_collection is not None :
744- kwargs .append ("data_collection=%r" % (data_collection ,))
667+ if data_collection is None :
668+ return ""
745669
746- return ", " . join ( kwargs )
670+ return "data_collection=%r" % ( data_collection , )
747671
748672
749673@pytest .mark .parametrize (
750- "send_default_pii, data_collection, expected_event , expected_span" ,
674+ "data_collection, expected_span" ,
751675 _QUERY_STRING_DATA_COLLECTION_CASES ,
752676)
753677def test_query_string_data_collection (
754678 run_cloud_function ,
755- send_default_pii ,
756679 data_collection ,
757- expected_event ,
758680 expected_span ,
759681):
760- init_kwargs = _build_init_kwargs (send_default_pii , data_collection )
682+ init_kwargs = _build_init_kwargs (data_collection )
761683 _ , _ , span_items = run_cloud_function (
762684 dedent (
763685 """
@@ -793,71 +715,37 @@ def cloud_function(functionhandler, event):
793715 assert attrs ["url.query" ] == expected_span
794716
795717
796- # Each case is (send_default_pii, data_collection, expected_data, expected_meta).
797- # ``send_default_pii`` / ``data_collection`` of None means the option is omitted;
798- # ``expected_data`` of None means the body is not attached to the event at all.
718+ # Each case is (data_collection, expected_data, expected_meta).
799719@pytest .mark .parametrize (
800- "send_default_pii, data_collection, expected_data, expected_meta" ,
720+ "data_collection, expected_data, expected_meta" ,
801721 [
802722 pytest .param (
803- True ,
804- None ,
805- '{"toy": "tennisball"}' ,
806- None ,
807- id = "send_default_pii_true_attaches_body" ,
808- ),
809- pytest .param (
810- False ,
811- None ,
812- "" ,
813- {"" : {"rem" : [["!raw" , "x" ]]}},
814- id = "send_default_pii_false_annotates_body_as_raw" ,
815- ),
816- pytest .param (
817- None ,
818723 {},
819724 '{"toy": "tennisball"}' ,
820725 None ,
821726 id = "http_bodies_default_attaches_body" ,
822727 ),
823728 pytest .param (
824- None ,
825729 {"http_bodies" : ["incoming_request" ]},
826730 '{"toy": "tennisball"}' ,
827731 None ,
828732 id = "http_bodies_incoming_request_attaches_body" ,
829733 ),
830734 pytest .param (
831- None ,
832- {"http_bodies" : []},
833- None ,
834- None ,
835- id = "http_bodies_empty_omits_body" ,
836- ),
837- pytest .param (
838- False ,
839- {"http_bodies" : ["incoming_request" ]},
840- '{"toy": "tennisball"}' ,
841- None ,
842- id = "http_bodies_incoming_request_attaches_body_despite_send_default_pii_false" ,
843- ),
844- pytest .param (
845- True ,
846735 {"http_bodies" : []},
847- None ,
848- None ,
849- id = "http_bodies_empty_omits_body_despite_send_default_pii_true " ,
736+ "" ,
737+ { "" : { "rem" : [[ "!raw" , "x" ]]}} ,
738+ id = "http_bodies_empty_annotates_body_as_raw " ,
850739 ),
851740 ],
852741)
853742def test_request_body_data_collection_event_processor (
854743 run_cloud_function ,
855- send_default_pii ,
856744 data_collection ,
857745 expected_data ,
858746 expected_meta ,
859747):
860- init_kwargs = _build_init_kwargs (send_default_pii , data_collection )
748+ init_kwargs = _build_init_kwargs (data_collection )
861749 envelope_items , _ , _ = run_cloud_function (
862750 dedent (
863751 """
0 commit comments