3333 DEFAULT_METRICS_EXPORT_PATH ,
3434 DEFAULT_TIMEOUT ,
3535 OTLPMetricExporter ,
36+ _get_split_resource_metrics_pb2 ,
3637)
3738from opentelemetry .exporter .otlp .proto .http .version import __version__
3839from opentelemetry .proto .common .v1 .common_pb2 import (
@@ -655,9 +656,7 @@ def test_get_split_resource_metrics_pb2_one_of_each(self):
655656 }
656657 ]
657658
658- result = OTLPMetricExporter ()._get_split_resource_metrics_pb2 (
659- split_resource_metrics
660- )
659+ result = _get_split_resource_metrics_pb2 (split_resource_metrics )
661660 self .assertEqual (len (result ), 1 )
662661 self .assertIsInstance (result [0 ], pb2 .ResourceMetrics )
663662 self .assertEqual (result [0 ].schema_url , "http://foo-bar" )
@@ -755,9 +754,7 @@ def test_get_split_resource_metrics_pb2_multiples(self):
755754 },
756755 ]
757756
758- result = OTLPMetricExporter ()._get_split_resource_metrics_pb2 (
759- split_resource_metrics
760- )
757+ result = _get_split_resource_metrics_pb2 (split_resource_metrics )
761758 self .assertEqual (len (result ), 2 )
762759 self .assertEqual (result [0 ].schema_url , "http://foo-bar-1" )
763760 self .assertEqual (result [1 ].schema_url , "http://foo-bar-2" )
@@ -801,9 +798,7 @@ def test_get_split_resource_metrics_pb2_unsupported_metric_type(self):
801798 ]
802799
803800 with self .assertLogs (level = "WARNING" ) as log :
804- result = OTLPMetricExporter ()._get_split_resource_metrics_pb2 (
805- split_resource_metrics
806- )
801+ result = _get_split_resource_metrics_pb2 (split_resource_metrics )
807802 self .assertEqual (len (result ), 1 )
808803 self .assertIn (
809804 "Tried to split and export an unsupported metric type" ,
@@ -813,28 +808,290 @@ def test_get_split_resource_metrics_pb2_unsupported_metric_type(self):
813808 @patch .object (OTLPMetricExporter , "_export" )
814809 @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.random" )
815810 @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.time" )
816- @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.sleep" )
817811 @patch (
818812 "opentelemetry.exporter.otlp.proto.http.metric_exporter.encode_metrics"
819813 )
820- def test_export_retries_with_batching (
814+ def test_export_retries_with_batching_success (
815+ self ,
816+ mock_encode_metrics ,
817+ mock_time ,
818+ mock_random ,
819+ mock_export ,
820+ ):
821+ mock_time .return_value = 0
822+ mock_random .uniform .return_value = 1
823+ mock_export .side_effect = [
824+ # Success
825+ MagicMock (ok = True ),
826+ MagicMock (ok = True ),
827+ ]
828+ mock_encode_metrics .return_value = pb2 .MetricsData (
829+ resource_metrics = [
830+ _resource_metrics (
831+ index = 1 ,
832+ scope_metrics = [
833+ _scope_metrics (
834+ index = 1 ,
835+ metrics = [
836+ _gauge (
837+ index = 1 ,
838+ data_points = [
839+ _number_data_point (11 ),
840+ _number_data_point (12 ),
841+ _number_data_point (13 ),
842+ ],
843+ ),
844+ ],
845+ ),
846+ ],
847+ ),
848+ ]
849+ )
850+ batch_1 = pb2 .MetricsData (
851+ resource_metrics = [
852+ _resource_metrics (
853+ index = 1 ,
854+ scope_metrics = [
855+ _scope_metrics (
856+ index = 1 ,
857+ metrics = [
858+ _gauge (
859+ index = 1 ,
860+ data_points = [
861+ _number_data_point (11 ),
862+ _number_data_point (12 ),
863+ ],
864+ ),
865+ ],
866+ ),
867+ ],
868+ ),
869+ ]
870+ )
871+ batch_2 = pb2 .MetricsData (
872+ resource_metrics = [
873+ _resource_metrics (
874+ index = 1 ,
875+ scope_metrics = [
876+ _scope_metrics (
877+ index = 1 ,
878+ metrics = [
879+ _gauge (
880+ index = 1 ,
881+ data_points = [
882+ _number_data_point (13 ),
883+ ],
884+ ),
885+ ],
886+ ),
887+ ],
888+ ),
889+ ]
890+ )
891+
892+ exporter = OTLPMetricExporter (max_export_batch_size = 2 )
893+ result = exporter .export ("foo" )
894+ self .assertEqual (result , MetricExportResult .SUCCESS )
895+ self .assertEqual (mock_export .call_count , 2 )
896+ mock_export .assert_has_calls (
897+ [
898+ call (batch_1 .SerializeToString (), 10 ),
899+ call (batch_2 .SerializeToString (), 10 ),
900+ ]
901+ )
902+
903+ @patch .object (OTLPMetricExporter , "_export" )
904+ @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.random" )
905+ @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.time" )
906+ @patch (
907+ "opentelemetry.exporter.otlp.proto.http.metric_exporter.encode_metrics"
908+ )
909+ def test_export_retries_with_batching_failure_first (
910+ self ,
911+ mock_encode_metrics ,
912+ mock_time ,
913+ mock_random ,
914+ mock_export ,
915+ ):
916+ mock_time .return_value = 0
917+ mock_random .uniform .return_value = 1
918+ mock_export .side_effect = [
919+ # Non-retryable
920+ MagicMock (ok = False , status_code = 400 , reason = "bad request" ),
921+ ]
922+ mock_encode_metrics .return_value = pb2 .MetricsData (
923+ resource_metrics = [
924+ _resource_metrics (
925+ index = 1 ,
926+ scope_metrics = [
927+ _scope_metrics (
928+ index = 1 ,
929+ metrics = [
930+ _gauge (
931+ index = 1 ,
932+ data_points = [
933+ _number_data_point (11 ),
934+ _number_data_point (12 ),
935+ _number_data_point (13 ),
936+ ],
937+ ),
938+ ],
939+ ),
940+ ],
941+ ),
942+ ]
943+ )
944+ batch_1 = pb2 .MetricsData (
945+ resource_metrics = [
946+ _resource_metrics (
947+ index = 1 ,
948+ scope_metrics = [
949+ _scope_metrics (
950+ index = 1 ,
951+ metrics = [
952+ _gauge (
953+ index = 1 ,
954+ data_points = [
955+ _number_data_point (11 ),
956+ _number_data_point (12 ),
957+ ],
958+ ),
959+ ],
960+ ),
961+ ],
962+ ),
963+ ]
964+ )
965+
966+ exporter = OTLPMetricExporter (max_export_batch_size = 2 )
967+ result = exporter .export ("foo" )
968+ self .assertEqual (result , MetricExportResult .FAILURE )
969+ self .assertEqual (mock_export .call_count , 1 )
970+ mock_export .assert_has_calls (
971+ [
972+ call (batch_1 .SerializeToString (), 10 ),
973+ ]
974+ )
975+
976+ @patch .object (OTLPMetricExporter , "_export" )
977+ @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.random" )
978+ @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.time" )
979+ @patch (
980+ "opentelemetry.exporter.otlp.proto.http.metric_exporter.encode_metrics"
981+ )
982+ def test_export_retries_with_batching_failure_last (
821983 self ,
822984 mock_encode_metrics ,
823- mock_sleep ,
824985 mock_time ,
825986 mock_random ,
826987 mock_export ,
827988 ):
828989 mock_time .return_value = 0
829990 mock_random .uniform .return_value = 1
830991 mock_export .side_effect = [
992+ # Success
993+ MagicMock (ok = True ),
831994 # Non-retryable
832995 MagicMock (ok = False , status_code = 400 , reason = "bad request" ),
996+ ]
997+ mock_encode_metrics .return_value = pb2 .MetricsData (
998+ resource_metrics = [
999+ _resource_metrics (
1000+ index = 1 ,
1001+ scope_metrics = [
1002+ _scope_metrics (
1003+ index = 1 ,
1004+ metrics = [
1005+ _gauge (
1006+ index = 1 ,
1007+ data_points = [
1008+ _number_data_point (11 ),
1009+ _number_data_point (12 ),
1010+ _number_data_point (13 ),
1011+ ],
1012+ ),
1013+ ],
1014+ ),
1015+ ],
1016+ ),
1017+ ]
1018+ )
1019+ batch_1 = pb2 .MetricsData (
1020+ resource_metrics = [
1021+ _resource_metrics (
1022+ index = 1 ,
1023+ scope_metrics = [
1024+ _scope_metrics (
1025+ index = 1 ,
1026+ metrics = [
1027+ _gauge (
1028+ index = 1 ,
1029+ data_points = [
1030+ _number_data_point (11 ),
1031+ _number_data_point (12 ),
1032+ ],
1033+ ),
1034+ ],
1035+ ),
1036+ ],
1037+ ),
1038+ ]
1039+ )
1040+ batch_2 = pb2 .MetricsData (
1041+ resource_metrics = [
1042+ _resource_metrics (
1043+ index = 1 ,
1044+ scope_metrics = [
1045+ _scope_metrics (
1046+ index = 1 ,
1047+ metrics = [
1048+ _gauge (
1049+ index = 1 ,
1050+ data_points = [
1051+ _number_data_point (13 ),
1052+ ],
1053+ ),
1054+ ],
1055+ ),
1056+ ],
1057+ ),
1058+ ]
1059+ )
1060+
1061+ exporter = OTLPMetricExporter (max_export_batch_size = 2 )
1062+ result = exporter .export ("foo" )
1063+ self .assertEqual (result , MetricExportResult .FAILURE )
1064+ self .assertEqual (mock_export .call_count , 2 )
1065+ mock_export .assert_has_calls (
1066+ [
1067+ call (batch_1 .SerializeToString (), 10 ),
1068+ call (batch_2 .SerializeToString (), 10 ),
1069+ ]
1070+ )
1071+
1072+ @patch .object (OTLPMetricExporter , "_export" )
1073+ @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.random" )
1074+ @patch ("opentelemetry.exporter.otlp.proto.http.metric_exporter.time" )
1075+ @patch (
1076+ "opentelemetry.exporter.otlp.proto.http.metric_exporter.encode_metrics"
1077+ )
1078+ def test_export_retries_with_batching_failure_retryable (
1079+ self ,
1080+ mock_encode_metrics ,
1081+ mock_time ,
1082+ mock_random ,
1083+ mock_export ,
1084+ ):
1085+ mock_time .return_value = 0
1086+ mock_random .uniform .return_value = 1
1087+ mock_export .side_effect = [
1088+ # Success
1089+ MagicMock (ok = True ),
8331090 # Retryable
8341091 MagicMock (
8351092 ok = False , status_code = 500 , reason = "internal server error"
8361093 ),
837- # Success
1094+ # Then success
8381095 MagicMock (ok = True ),
8391096 ]
8401097 mock_encode_metrics .return_value = pb2 .MetricsData (
0 commit comments