statsig-python-core 0.16.2rc2602202152__tar.gz → 0.16.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/Cargo.lock +6 -6
  2. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/Cargo.toml +1 -1
  3. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/PKG-INFO +1 -1
  4. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_observability_client.py +9 -6
  5. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/Cargo.toml +1 -1
  6. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +3 -0
  7. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/http_types.rs +2 -0
  8. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/network_client.rs +71 -15
  9. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/observability/ops_stats.rs +14 -1
  10. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/proto_specs.rs +20 -7
  11. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/proto_stream_reader.rs +42 -22
  12. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig.rs +8 -0
  13. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_metadata.rs +1 -1
  14. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/utils/mod.rs +6 -0
  15. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/observability_client_usage_tests.rs +22 -2
  16. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/__init__.py +0 -0
  17. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/data_store.py +0 -0
  18. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/error_boundary.py +0 -0
  19. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/observability_client.py +0 -0
  20. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  21. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/persistent_storage.py +0 -0
  22. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/py.typed +0 -0
  23. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/requirements.txt +0 -0
  24. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/statsig.py +0 -0
  25. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  26. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/py_src/statsig_python_core/statsig_types.py +0 -0
  27. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/pyproject.toml +0 -0
  28. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/Cargo.toml +0 -0
  29. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/README.md +0 -0
  30. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/build.rs +0 -0
  31. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/src/lib.rs +0 -0
  32. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  33. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  34. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  35. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  36. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  37. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  38. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/.gitignore +0 -0
  39. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/Cargo.toml +0 -0
  40. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/README.md +0 -0
  41. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/__init__.py +0 -0
  42. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/data_store.py +0 -0
  43. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/error_boundary.py +0 -0
  44. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/observability_client.py +0 -0
  45. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/output_logger_provider.py +0 -0
  46. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/persistent_storage.py +0 -0
  47. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/py.typed +0 -0
  48. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/requirements.txt +0 -0
  49. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/statsig.py +0 -0
  50. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  51. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/py_src/statsig_python_core/statsig_types.py +0 -0
  52. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  53. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  54. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/interned_store_py.rs +0 -0
  55. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/lib.rs +0 -0
  56. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  57. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  58. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/pyo_utils.rs +0 -0
  59. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/safe_gil.rs +0 -0
  60. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/statsig_base_py.rs +0 -0
  61. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  62. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/statsig_options_py.rs +0 -0
  63. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +0 -0
  64. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  65. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  66. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/unit_id_py.rs +0 -0
  67. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  68. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/fork_runner.py +0 -0
  69. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  70. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  71. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_data_store.py +0 -0
  72. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  73. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_experiment_serialization.py +0 -0
  74. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  75. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_feature_gate_serialization.py +0 -0
  76. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_forking.py +0 -0
  77. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_get_dynamic_config.py +0 -0
  78. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  79. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_layer_serialization.py +0 -0
  80. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  81. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  82. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_performance.py +0 -0
  83. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  84. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_shutdown.py +0 -0
  85. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_statsig.py +0 -0
  86. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_statsig_options.py +0 -0
  87. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  88. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  89. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  90. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/test_user_exposure_e2e.py +0 -0
  91. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-pyo3/tests/utils.py +0 -0
  92. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/build.rs +0 -0
  93. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/resources/ip_supalite.table +0 -0
  94. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  95. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  96. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  97. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/__tests__/mod.rs +0 -0
  98. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/__tests__/spec_store_tests.rs +0 -0
  99. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/compression/compression_helper.rs +0 -0
  100. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/compression/mod.rs +0 -0
  101. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  102. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  103. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  104. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  105. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/console_capture/mod.rs +0 -0
  106. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/data_store_interface.rs +0 -0
  107. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/dcs_str.rs +0 -0
  108. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  109. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  110. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/cmab_evaluator.rs +0 -0
  111. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  112. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  113. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  114. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +0 -0
  115. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  116. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  117. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  118. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  119. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  120. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  121. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  122. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  123. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluation_types.rs +0 -0
  124. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +0 -0
  125. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluation_types_v2.rs +0 -0
  126. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluator.rs +0 -0
  127. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluator_context.rs +0 -0
  128. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluator_result.rs +0 -0
  129. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  130. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  131. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/mod.rs +0 -0
  132. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  133. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  134. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  135. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  136. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  137. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  138. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  139. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  140. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  141. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  142. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  143. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  144. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  145. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  146. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  147. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_logger.rs +0 -0
  148. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  149. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  150. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  151. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  152. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  153. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  154. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queued_event.rs +0 -0
  155. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  156. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +0 -0
  157. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +0 -0
  158. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +0 -0
  159. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  160. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  161. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  162. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  163. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  164. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/mod.rs +0 -0
  165. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  166. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging/statsig_event_internal.rs +0 -0
  167. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  168. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  169. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  170. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  171. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  172. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/dynamic_configs_processor.rs +0 -0
  173. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -0
  174. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/gcir_formatter.rs +0 -0
  175. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/gcir_options.rs +0 -0
  176. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/gcir_process_iter.rs +0 -0
  177. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -0
  178. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/mod.rs +0 -0
  179. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  180. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  181. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  182. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/global_configs.rs +0 -0
  183. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/hashing/ahash.rs +0 -0
  184. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/hashing/djb2.rs +0 -0
  185. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/hashing/hash_util.rs +0 -0
  186. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  187. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/hashing/mod.rs +0 -0
  188. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  189. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  190. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  191. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/init_details.rs +0 -0
  192. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  193. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/initialize_response.rs +0 -0
  194. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/initialize_v2_response.rs +0 -0
  195. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/instance_registry.rs +0 -0
  196. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/interned_string.rs +0 -0
  197. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  198. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +0 -0
  199. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +0 -0
  200. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  201. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/interned_values/interned_store.rs +0 -0
  202. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/interned_values/mod.rs +0 -0
  203. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/lib.rs +0 -0
  204. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/logging_utils.rs +0 -0
  205. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/macros.rs +0 -0
  206. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  207. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  208. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/mod.rs +0 -0
  209. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/network_error.rs +0 -0
  210. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/providers/mod.rs +0 -0
  211. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  212. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  213. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  214. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/networking/proxy_config.rs +0 -0
  215. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  216. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  217. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/observability/mod.rs +0 -0
  218. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  219. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  220. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/output_logger.rs +0 -0
  221. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/override_adapter/mod.rs +0 -0
  222. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  223. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +0 -0
  224. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  225. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  226. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  227. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  228. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +0 -0
  229. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  230. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  231. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  232. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  233. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +0 -0
  234. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  235. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  236. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  237. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/spec_store.rs +0 -0
  238. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  239. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  240. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  241. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  242. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  243. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  244. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  245. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  246. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  247. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  248. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  249. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  250. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  251. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  252. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/explicit_params.rs +0 -0
  253. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/mod.rs +0 -0
  254. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  255. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/spec_types.rs +0 -0
  256. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/specs_hash_map.rs +0 -0
  257. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/specs_response/statsig_config_specs.rs +0 -0
  258. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  259. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_err.rs +0 -0
  260. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_global.rs +0 -0
  261. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_options.rs +0 -0
  262. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_runtime.rs +0 -0
  263. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_type_factories.rs +0 -0
  264. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_types.rs +0 -0
  265. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/statsig_types_raw.rs +0 -0
  266. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/into_optional.rs +0 -0
  267. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/mod.rs +0 -0
  268. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/statsig_user.rs +0 -0
  269. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  270. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  271. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  272. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/unit_id.rs +0 -0
  273. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/src/user/user_data.rs +0 -0
  274. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/check_gate_tests.rs +0 -0
  275. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  276. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  277. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  278. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/company_id_list +0 -0
  279. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/dcs_error.json +0 -0
  280. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  281. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/dcs_non_case_sensitive.json +0 -0
  282. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/dcs_user_agent_versions.json +0 -0
  283. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  284. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  285. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  286. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  287. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  288. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  289. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  290. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/get_id_lists.json +0 -0
  291. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  292. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  293. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  294. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  295. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  296. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  297. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  298. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  299. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  300. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  301. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  302. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  303. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/direct_gcir_tests.rs +0 -0
  304. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  305. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  306. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  307. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  308. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  309. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  310. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  311. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  312. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  313. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  314. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/exposure_tests.rs +0 -0
  315. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/flushing_tests.rs +0 -0
  316. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  317. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/gcir_tests.rs +0 -0
  318. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/global_configs_test.rs +0 -0
  319. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  320. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  321. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  322. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  323. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  324. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  325. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/list_methods_tests.rs +0 -0
  326. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  327. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/network_client_tests.rs +0 -0
  328. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/network_failure_tests.rs +0 -0
  329. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/output_logger_tests.rs +0 -0
  330. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  331. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/perf_tests.rs +0 -0
  332. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/proto_specs_usage_tests.rs +0 -0
  333. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/spec_store_lock_tests.rs +0 -0
  334. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/spec_types_tests.rs +0 -0
  335. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  336. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  337. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  338. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  339. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  340. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  341. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  342. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  343. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_tests.rs +0 -0
  344. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  345. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  346. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  347. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  348. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  349. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  350. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  351. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  352. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  353. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/user_json_tests.rs +0 -0
  354. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/helpers.rs +0 -0
  355. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  356. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  357. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  358. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  359. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  360. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  361. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  362. {statsig_python_core-0.16.2rc2602202152 → statsig_python_core-0.16.3}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -2553,7 +2553,7 @@ dependencies = [
2553
2553
 
2554
2554
  [[package]]
2555
2555
  name = "sigstat-grpc"
2556
- version = "0.16.2-rc.2602202152"
2556
+ version = "0.16.3"
2557
2557
  dependencies = [
2558
2558
  "async-trait",
2559
2559
  "chrono",
@@ -2627,7 +2627,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
2627
2627
 
2628
2628
  [[package]]
2629
2629
  name = "statsig-node"
2630
- version = "0.16.2-rc.2602202152"
2630
+ version = "0.16.3"
2631
2631
  dependencies = [
2632
2632
  "async-trait",
2633
2633
  "napi",
@@ -2641,7 +2641,7 @@ dependencies = [
2641
2641
 
2642
2642
  [[package]]
2643
2643
  name = "statsig-pyo3"
2644
- version = "0.16.2-rc.2602202152"
2644
+ version = "0.16.3"
2645
2645
  dependencies = [
2646
2646
  "async-trait",
2647
2647
  "lazy_static",
@@ -2655,7 +2655,7 @@ dependencies = [
2655
2655
 
2656
2656
  [[package]]
2657
2657
  name = "statsig-rust"
2658
- version = "0.16.2-rc.2602202152"
2658
+ version = "0.16.3"
2659
2659
  dependencies = [
2660
2660
  "ahash",
2661
2661
  "arc-swap",
@@ -2701,7 +2701,7 @@ dependencies = [
2701
2701
 
2702
2702
  [[package]]
2703
2703
  name = "statsig_elixir"
2704
- version = "0.16.2-rc.2602202152"
2704
+ version = "0.16.3"
2705
2705
  dependencies = [
2706
2706
  "async-trait",
2707
2707
  "parking_lot",
@@ -2714,7 +2714,7 @@ dependencies = [
2714
2714
 
2715
2715
  [[package]]
2716
2716
  name = "statsig_ffi"
2717
- version = "0.16.2-rc.2602202152"
2717
+ version = "0.16.3"
2718
2718
  dependencies = [
2719
2719
  "async-trait",
2720
2720
  "cbindgen",
@@ -19,7 +19,7 @@ exclude = [
19
19
  [workspace.package]
20
20
  edition = "2021"
21
21
  license = "ISC"
22
- version = "0.16.2-rc.2602202152"
22
+ version = "0.16.3"
23
23
  homepage = "https://statsig.com/"
24
24
  authors = ["Statsig", "Daniel Loomb <daniel@statsig.com>"]
25
25
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: statsig_python_core
3
- Version: 0.16.2rc2602202152
3
+ Version: 0.16.3
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -115,12 +115,15 @@ def test_observability_client_usage(statsig_setup):
115
115
  )
116
116
  assert dist_event is not None, "distribution() should have been called"
117
117
  assert isinstance(dist_event[2], float)
118
- assert dist_event[3] == {
119
- "init_success": "true",
120
- "store_populated": "true",
121
- "source": "Network",
122
- "init_source_api": f"http://{httpserver.host}:{httpserver.port}/v2",
123
- }
118
+ tags = dist_event[3]
119
+ assert tags is not None
120
+ assert tags["init_success"] == "true"
121
+ assert tags["store_populated"] == "true"
122
+ assert tags["source"] == "Network"
123
+ assert tags["sdk_key"] == "secret-key"
124
+ assert tags["sdk_type"] == "statsig-server-core-python"
125
+ assert tags["sdk_version"]
126
+ assert tags["init_source_api"] == f"http://{httpserver.host}:{httpserver.port}/v2"
124
127
 
125
128
 
126
129
  def test_error_callback_usage():
@@ -38,7 +38,7 @@ serde_json = { version = "1.0.143", features = [
38
38
  ] }
39
39
  serde_with = "3.4.0"
40
40
  sha2 = "0.10.8"
41
- sigstat-grpc = { path = "../statsig-grpc", version = "0.16.2-rc.2602202152", optional = true }
41
+ sigstat-grpc = { path = "../statsig-grpc", version = "0.16.3", optional = true }
42
42
  simple_logger = { version = "5.0.0" }
43
43
  tempfile = "3.8.1"
44
44
  tokio = { version = "1.39.1", features = ["full"] }
@@ -127,6 +127,7 @@ impl StatsigHttpIdListsAdapter {
127
127
  &self,
128
128
  list_url: &str,
129
129
  list_size: u64,
130
+ id_list_file_id: Option<String>,
130
131
  ) -> Result<String, StatsigErr> {
131
132
  let (headers, query_params) = if list_url.starts_with(STATSIG_CDN_URL) {
132
133
  (
@@ -149,6 +150,7 @@ impl StatsigHttpIdListsAdapter {
149
150
  url: list_url.to_string(),
150
151
  headers,
151
152
  query_params,
153
+ id_list_file_id,
152
154
  diagnostics_key: Some(KeyType::GetIDList),
153
155
  ..RequestArgs::new()
154
156
  })
@@ -407,6 +409,7 @@ impl StatsigHttpIdListsAdapter {
407
409
  .fetch_individual_id_list_changes_from_network(
408
410
  &new_metadata.url,
409
411
  changeset.range_start,
412
+ new_metadata.file_id.clone(),
410
413
  )
411
414
  .await;
412
415
 
@@ -17,6 +17,7 @@ pub struct RequestArgs {
17
17
  pub retries: u32, // 1 initial + N 'retries'
18
18
  pub headers: Option<HashMap<String, String>>,
19
19
  pub query_params: Option<HashMap<String, String>>,
20
+ pub id_list_file_id: Option<String>, // for logging
20
21
  pub deltas_enabled: bool,
21
22
  pub accept_gzip_response: bool,
22
23
  pub timeout_ms: u64,
@@ -41,6 +42,7 @@ impl RequestArgs {
41
42
  retries: 0,
42
43
  headers: None,
43
44
  query_params: None,
45
+ id_list_file_id: None,
44
46
  deltas_enabled: false,
45
47
  accept_gzip_response: false,
46
48
  timeout_ms: 0,
@@ -8,7 +8,9 @@ use crate::observability::observability_client_adapter::{MetricType, Observabili
8
8
  use crate::observability::ops_stats::{OpsStatsForInstance, OPS_STATS};
9
9
  use crate::observability::ErrorBoundaryEvent;
10
10
  use crate::sdk_diagnostics::marker::{ActionType, Marker, StepType};
11
- use crate::utils::{is_version_segment, split_host_and_path, strip_query_and_fragment};
11
+ use crate::utils::{
12
+ get_loggable_sdk_key, is_version_segment, split_host_and_path, strip_query_and_fragment,
13
+ };
12
14
  use crate::{log_d, log_i, log_w, StatsigOptions};
13
15
  use std::collections::HashMap;
14
16
  use std::sync::atomic::{AtomicBool, Ordering};
@@ -26,7 +28,6 @@ const NON_RETRY_CODES: [u16; 6] = [
26
28
  const SHUTDOWN_ERROR: &str = "Request was aborted because the client is shutting down";
27
29
 
28
30
  const MAX_REQUEST_PATH_LENGTH: usize = 64;
29
- const LOGGABLE_KEY_PREFIX_LENGTH: usize = 13;
30
31
  const DOWNLOAD_CONFIG_SPECS_ENDPOINT: &str = "download_config_specs";
31
32
  const GET_ID_LISTS_ENDPOINT: &str = "get_id_lists";
32
33
  const DOWNLOAD_ID_LIST_FILE_ENDPOINT: &str = "download_id_list_file";
@@ -36,6 +37,7 @@ const STATUS_CODE_TAG: &str = "status_code";
36
37
  const IS_SUCCESS_TAG: &str = "is_success";
37
38
  const SDK_KEY_TAG: &str = "sdk_key";
38
39
  const SOURCE_SERVICE_TAG: &str = "source_service";
40
+ const ID_LIST_FILE_ID_TAG: &str = "id_list_file_id";
39
41
 
40
42
  const TAG: &str = stringify!(NetworkClient);
41
43
 
@@ -189,7 +191,7 @@ impl NetworkClient {
189
191
  .and_then(|data| data.get_header_ref("x-statsig-region").cloned());
190
192
  let success = (200..300).contains(&status.unwrap_or(0));
191
193
  let duration_ms = request_start.elapsed().as_millis() as f64;
192
- self.log_network_request_latency_to_ob(&request_args.url, status, success, duration_ms);
194
+ self.log_network_request_latency_to_ob(&request_args, status, success, duration_ms);
193
195
 
194
196
  if let Some(key) = request_args.diagnostics_key {
195
197
  let mut end_marker =
@@ -294,11 +296,12 @@ impl NetworkClient {
294
296
  // ------------------------------------------------------------
295
297
  fn log_network_request_latency_to_ob(
296
298
  &self,
297
- url: &str,
299
+ request_args: &RequestArgs,
298
300
  status: Option<u16>,
299
301
  success: bool,
300
302
  duration_ms: f64,
301
303
  ) {
304
+ let url = request_args.url.as_str();
302
305
  if !should_log_network_request_latency(url) {
303
306
  return;
304
307
  }
@@ -306,24 +309,45 @@ impl NetworkClient {
306
309
  let status_code = status
307
310
  .map(|code| code.to_string())
308
311
  .unwrap_or("none".to_string());
309
- let (source_service, request_path) = get_source_service_and_request_path(url);
312
+ let tags = get_network_request_latency_tags(
313
+ request_args,
314
+ status_code,
315
+ success,
316
+ self.loggable_sdk_key.clone(),
317
+ );
318
+
310
319
  self.ops_stats.log(ObservabilityEvent::new_event(
311
320
  MetricType::Dist,
312
321
  NETWORK_REQUEST_LATENCY_METRIC.to_string(),
313
322
  duration_ms,
314
- Some(HashMap::from([
315
- (REQUEST_PATH_TAG.to_string(), request_path),
316
- (STATUS_CODE_TAG.to_string(), status_code),
317
- (IS_SUCCESS_TAG.to_string(), success.to_string()),
318
- (SDK_KEY_TAG.to_string(), self.loggable_sdk_key.clone()),
319
- (SOURCE_SERVICE_TAG.to_string(), source_service),
320
- ])),
323
+ Some(tags),
321
324
  ));
322
325
  }
323
326
  }
324
327
 
325
- fn get_loggable_sdk_key(sdk_key: &str) -> String {
326
- sdk_key.chars().take(LOGGABLE_KEY_PREFIX_LENGTH).collect()
328
+ fn get_network_request_latency_tags(
329
+ request_args: &RequestArgs,
330
+ status_code: String,
331
+ success: bool,
332
+ loggable_sdk_key: String,
333
+ ) -> HashMap<String, String> {
334
+ let (source_service, request_path) = get_source_service_and_request_path(&request_args.url);
335
+ let mut tags = HashMap::from([
336
+ (REQUEST_PATH_TAG.to_string(), request_path),
337
+ (STATUS_CODE_TAG.to_string(), status_code),
338
+ (IS_SUCCESS_TAG.to_string(), success.to_string()),
339
+ (SDK_KEY_TAG.to_string(), loggable_sdk_key),
340
+ (SOURCE_SERVICE_TAG.to_string(), source_service),
341
+ ]);
342
+ if let Some(id_list_file_id) = request_args
343
+ .id_list_file_id
344
+ .as_ref()
345
+ .filter(|id| !id.is_empty())
346
+ {
347
+ tags.insert(ID_LIST_FILE_ID_TAG.to_string(), id_list_file_id.clone());
348
+ }
349
+
350
+ tags
327
351
  }
328
352
 
329
353
  fn is_latency_loggable_endpoint(endpoint: &str) -> bool {
@@ -461,8 +485,10 @@ fn get_error_message_for_status(
461
485
  #[cfg(test)]
462
486
  mod tests {
463
487
  use super::{
464
- get_request_path, get_source_service_and_request_path, should_log_network_request_latency,
488
+ get_network_request_latency_tags, get_request_path, get_source_service_and_request_path,
489
+ should_log_network_request_latency, ID_LIST_FILE_ID_TAG, REQUEST_PATH_TAG,
465
490
  };
491
+ use crate::networking::RequestArgs;
466
492
 
467
493
  #[test]
468
494
  fn test_get_request_path_with_sample_urls() {
@@ -511,4 +537,34 @@ mod tests {
511
537
  assert_eq!(source_service, "http://127.0.0.1:12345/mock-uuid");
512
538
  assert_eq!(request_path, "/v2/download_config_specs");
513
539
  }
540
+
541
+ #[test]
542
+ fn test_network_latency_tags_include_id_list_file_id_only_when_present() {
543
+ let mut request_args = RequestArgs {
544
+ url: "https://api.statsigcdn.com/v1/download_id_list_file/file-123".to_string(),
545
+ id_list_file_id: Some("file-123".to_string()),
546
+ ..RequestArgs::new()
547
+ };
548
+
549
+ let tags = get_network_request_latency_tags(
550
+ &request_args,
551
+ "200".to_string(),
552
+ true,
553
+ "client-key-123".to_string(),
554
+ );
555
+ assert_eq!(tags.get(ID_LIST_FILE_ID_TAG), Some(&"file-123".to_string()));
556
+ assert_eq!(
557
+ tags.get(REQUEST_PATH_TAG),
558
+ Some(&"/v1/download_id_list_file".to_string())
559
+ );
560
+
561
+ request_args.id_list_file_id = Some(String::new());
562
+ let tags_without_id = get_network_request_latency_tags(
563
+ &request_args,
564
+ "200".to_string(),
565
+ true,
566
+ "client-key-123".to_string(),
567
+ );
568
+ assert!(!tags_without_id.contains_key(ID_LIST_FILE_ID_TAG));
569
+ }
514
570
  }
@@ -1,5 +1,6 @@
1
1
  use super::{
2
- observability_client_adapter::ObservabilityEvent, sdk_errors_observer::ErrorBoundaryEvent,
2
+ observability_client_adapter::{MetricType, ObservabilityEvent},
3
+ sdk_errors_observer::ErrorBoundaryEvent,
3
4
  DiagnosticsEvent,
4
5
  };
5
6
  use crate::user::StatsigUserLoggable;
@@ -131,6 +132,18 @@ impl OpsStatsForInstance {
131
132
  self.log(OpsStatsEvent::SDKError(error));
132
133
  }
133
134
 
135
+ pub fn log_checksum_validation_result(&self, is_success: bool) {
136
+ self.log(ObservabilityEvent::new_event(
137
+ MetricType::Increment,
138
+ "deltas_checksum_validation.count".to_string(),
139
+ 1.0,
140
+ Some(HashMap::from([(
141
+ "result".to_string(),
142
+ if is_success { "success" } else { "failure" }.to_string(),
143
+ )])),
144
+ ));
145
+ }
146
+
134
147
  pub fn add_marker(&self, marker: Marker, context: Option<ContextType>) {
135
148
  self.log(OpsStatsEvent::Diagnostics(DiagnosticsEvent {
136
149
  marker: Some(marker),
@@ -33,6 +33,8 @@ pub fn deserialize_protobuf(
33
33
  next_specs: &mut SpecsResponseFull,
34
34
  data: &mut ResponseData,
35
35
  ) -> Result<(), StatsigErr> {
36
+ let mut parsed_envelopes_count = 0;
37
+
36
38
  let mut reader = ProtoStreamReader::new(data);
37
39
 
38
40
  if !next_specs.is_empty() {
@@ -45,14 +47,21 @@ pub fn deserialize_protobuf(
45
47
 
46
48
  loop {
47
49
  let proto_msg_bytes = reader.read_next_delimited_proto().map_err(|e| {
50
+ let sample = reader.sample_current_buf();
48
51
  let err = StatsigErr::ProtobufParseError(
49
52
  "SpecsEnvelope".to_string(),
50
- format!("Error reading next delimited proto: {}", e),
53
+ format!(
54
+ "Error reading next delimited proto: {e}
55
+ \n Previous Parsed Envelope Count: {parsed_envelopes_count}
56
+ \n Current Buffer Sample: {sample}"
57
+ ),
51
58
  );
52
59
  log_error_to_statsig_and_console!(ops_stats, TAG, err);
53
60
  err
54
61
  })?;
55
62
 
63
+ parsed_envelopes_count += 1;
64
+
56
65
  let env: pb::SpecsEnvelope =
57
66
  match prost::Message::decode_length_delimited(proto_msg_bytes.as_ref()) {
58
67
  Ok(env) => env,
@@ -105,13 +114,17 @@ pub fn deserialize_protobuf(
105
114
  pb::SpecsEnvelopeKind::Deletions => {
106
115
  consume_errors(ops_stats, || next_specs.handle_deletions_update(env));
107
116
  }
108
- pb::SpecsEnvelopeKind::Checksums => {
109
- next_specs.handle_checksums_update(env).map_err(|e| {
110
- StatsigErr::ChecksumFailure(format!(
117
+ pb::SpecsEnvelopeKind::Checksums => match next_specs.handle_checksums_update(env) {
118
+ Ok(()) => {
119
+ ops_stats.log_checksum_validation_result(true);
120
+ }
121
+ Err(e) => {
122
+ ops_stats.log_checksum_validation_result(false);
123
+ return Err(StatsigErr::ChecksumFailure(format!(
111
124
  "Failed to apply protobuf checksums update: {e}"
112
- ))
113
- })?;
114
- }
125
+ )));
126
+ }
127
+ },
115
128
  pb::SpecsEnvelopeKind::CopyPrev => {
116
129
  consume_errors(ops_stats, || {
117
130
  next_specs.handle_copy_prev_update(current_specs)
@@ -40,7 +40,10 @@ impl<'a> ProtoStreamReader<'a> {
40
40
  self.buf.extend_from_slice(&self.scratch[..n]);
41
41
  }
42
42
  Err(e) => {
43
- return Err(new_parse_err(e));
43
+ return Err(StatsigErr::ProtobufParseError(
44
+ "BrotliDecompressorRead".to_string(),
45
+ e.to_string(),
46
+ ));
44
47
  }
45
48
  }
46
49
  }
@@ -48,32 +51,49 @@ impl<'a> ProtoStreamReader<'a> {
48
51
  Ok(self.buf.split_to(required_len))
49
52
  }
50
53
 
51
- fn read_length_delimiter(&mut self) -> Result<usize, StatsigErr> {
52
- let len_buf = &mut [0u8; 10];
53
-
54
- let read_len = self
55
- .brotli_decompressor
56
- .read(len_buf)
57
- .map_err(new_parse_err)?;
54
+ pub fn sample_current_buf(&self) -> String {
55
+ let len = std::cmp::min(self.buf.len(), 100);
56
+ let slice = &self.buf.as_ref()[..len];
57
+ String::from_utf8(slice.to_vec()).unwrap_or_default()
58
+ }
58
59
 
59
- if read_len > 0 {
60
- self.buf.extend_from_slice(&len_buf[..read_len]);
60
+ fn read_length_delimiter(&mut self) -> Result<usize, StatsigErr> {
61
+ loop {
62
+ match prost::decode_length_delimiter(self.buf.as_ref()) {
63
+ Ok(data_len) => {
64
+ return Ok(prost::length_delimiter_len(data_len) + data_len);
65
+ }
66
+ Err(e) if self.buf.len() >= 10 => {
67
+ return Err(StatsigErr::ProtobufParseError(
68
+ "DecodeLengthDelimiter".to_string(),
69
+ e.to_string(),
70
+ ));
71
+ }
72
+ Err(_) => {
73
+ let read_len =
74
+ self.brotli_decompressor
75
+ .read(&mut self.scratch)
76
+ .map_err(|e| {
77
+ StatsigErr::ProtobufParseError(
78
+ "ReadLengthDelimiter".to_string(),
79
+ e.to_string(),
80
+ )
81
+ })?;
82
+
83
+ if read_len == 0 {
84
+ return Err(StatsigErr::ProtobufParseError(
85
+ "ReadLengthDelimiter".to_string(),
86
+ "unexpected EOF while reading length delimiter".to_string(),
87
+ ));
88
+ }
89
+
90
+ self.buf.extend_from_slice(&self.scratch[..read_len]);
91
+ }
92
+ }
61
93
  }
62
-
63
- let data_len = prost::decode_length_delimiter(self.buf.as_ref()).map_err(new_parse_err)?;
64
- let required_len = prost::length_delimiter_len(data_len) + data_len;
65
-
66
- Ok(required_len)
67
94
  }
68
95
  }
69
96
 
70
- fn new_parse_err<E>(err_string: E) -> StatsigErr
71
- where
72
- E: std::fmt::Display,
73
- {
74
- StatsigErr::ProtobufParseError("BrotliDecompressor".to_string(), err_string.to_string())
75
- }
76
-
77
97
  struct StreamBorrower<'a> {
78
98
  stream: &'a mut dyn ResponseDataStream,
79
99
  }
@@ -57,6 +57,7 @@ use crate::statsig_type_factories::{
57
57
  };
58
58
  use crate::statsig_types::{DynamicConfig, Experiment, FeatureGate, Layer, ParameterStore};
59
59
  use crate::user::StatsigUserInternal;
60
+ use crate::utils::get_loggable_sdk_key;
60
61
  use crate::{
61
62
  dyn_value, log_d, log_e, log_w, read_lock_or_else, ClientInitResponseOptions,
62
63
  GCIRResponseFormat, IdListsAdapter, InitializeDetails, ObservabilityClient,
@@ -2503,6 +2504,7 @@ impl Statsig {
2503
2504
  ) {
2504
2505
  let is_store_populated = specs_info.source != SpecsSource::NoValues;
2505
2506
  let source_str = specs_info.source.to_string();
2507
+ let metadata = StatsigMetadata::get_metadata();
2506
2508
 
2507
2509
  let event = ObservabilityEvent::new_event(
2508
2510
  MetricType::Dist,
@@ -2512,6 +2514,12 @@ impl Statsig {
2512
2514
  ("init_success".to_owned(), success.to_string()),
2513
2515
  ("source".to_owned(), source_str.clone()),
2514
2516
  ("store_populated".to_owned(), is_store_populated.to_string()),
2517
+ (
2518
+ "sdk_key".to_owned(),
2519
+ get_loggable_sdk_key(self.sdk_key.as_str()),
2520
+ ),
2521
+ ("sdk_type".to_owned(), metadata.sdk_type),
2522
+ ("sdk_version".to_owned(), metadata.sdk_version),
2515
2523
  (
2516
2524
  "init_source_api".to_owned(),
2517
2525
  specs_info.source_api.clone().unwrap_or_default(),
@@ -10,7 +10,7 @@ lazy_static! {
10
10
  static ref STATSIG_METADATA: RwLock<StatsigMetadata> = RwLock::new(StatsigMetadata::new());
11
11
  }
12
12
 
13
- pub const SDK_VERSION: &str = "0.16.2-rc.2602202152";
13
+ pub const SDK_VERSION: &str = "0.16.3";
14
14
 
15
15
  const TAG: &str = stringify!(StatsigMetadata);
16
16
 
@@ -28,6 +28,12 @@ pub fn try_release_unused_heap_memory() {
28
28
  // No-op only glibc supports malloc_trim function
29
29
  }
30
30
 
31
+ const LOGGABLE_KEY_PREFIX_LENGTH: usize = 13;
32
+
33
+ pub(crate) fn get_loggable_sdk_key(sdk_key: &str) -> String {
34
+ sdk_key.chars().take(LOGGABLE_KEY_PREFIX_LENGTH).collect()
35
+ }
36
+
31
37
  pub(crate) fn split_host_and_path(url: &str) -> (String, &str) {
32
38
  if let Some((scheme, after_scheme)) = url.split_once("://") {
33
39
  let (host, path) = after_scheme.split_once('/').unwrap_or((after_scheme, ""));
@@ -16,8 +16,16 @@ use crate::utils::helpers::load_contents;
16
16
  use utils::mock_scrapi::{Endpoint, EndpointStub, Method, MockScrapi, StubData};
17
17
 
18
18
  const SDK_KEY: &str = "secret-key";
19
+ const LONG_SDK_KEY: &str = "secret-key-123456789";
19
20
 
20
21
  async fn setup(observability_client: &Arc<MockObservabilityClient>) -> (MockScrapi, Statsig) {
22
+ setup_with_sdk_key(observability_client, SDK_KEY).await
23
+ }
24
+
25
+ async fn setup_with_sdk_key(
26
+ observability_client: &Arc<MockObservabilityClient>,
27
+ sdk_key: &str,
28
+ ) -> (MockScrapi, Statsig) {
21
29
  std::env::set_var("STATSIG_RUNNING_TESTS", "true");
22
30
  let mock_scrapi = MockScrapi::new().await;
23
31
 
@@ -45,7 +53,7 @@ async fn setup(observability_client: &Arc<MockObservabilityClient>) -> (MockScra
45
53
 
46
54
  let weak_obs_client = Arc::downgrade(observability_client) as Weak<dyn ObservabilityClient>;
47
55
  let statsig = Statsig::new(
48
- SDK_KEY,
56
+ sdk_key,
49
57
  Some(Arc::new(StatsigOptions {
50
58
  observability_client: Some(weak_obs_client),
51
59
  log_event_url: Some(mock_scrapi.url_for_endpoint(Endpoint::LogEvent)),
@@ -301,7 +309,7 @@ async fn test_sdk_initialization_dist_recorded() {
301
309
  calls: Mutex::new(Vec::new()),
302
310
  });
303
311
 
304
- let (_, statsig) = setup(&obs_client).await;
312
+ let (_, statsig) = setup_with_sdk_key(&obs_client, LONG_SDK_KEY).await;
305
313
 
306
314
  statsig.initialize().await.unwrap();
307
315
  statsig.check_gate(&StatsigUser::with_user_id("test_user"), "test_gate");
@@ -331,6 +339,12 @@ async fn test_sdk_initialization_dist_recorded() {
331
339
  assert_eq!(tags.get("source"), Some(&"Network".to_string()));
332
340
  assert_eq!(tags.get("init_success"), Some(&"true".to_string()));
333
341
  assert_eq!(tags.get("store_populated"), Some(&"true".to_string()));
342
+ assert_eq!(tags.get("sdk_key"), Some(&"secret-key-12".to_string()));
343
+ assert_eq!(
344
+ tags.get("sdk_type"),
345
+ Some(&"statsig-server-core".to_string())
346
+ );
347
+ assert!(tags.get("sdk_version").is_some_and(|v| !v.is_empty()));
334
348
  }
335
349
 
336
350
  #[tokio::test]
@@ -670,6 +684,12 @@ async fn test_init_from_network() {
670
684
  assert_eq!(tags.get("source"), Some(&"Network".to_string()));
671
685
  assert_eq!(tags.get("init_success"), Some(&"true".to_string()));
672
686
  assert_eq!(tags.get("store_populated"), Some(&"true".to_string()));
687
+ assert_eq!(tags.get("sdk_key"), Some(&SDK_KEY.to_string()));
688
+ assert_eq!(
689
+ tags.get("sdk_type"),
690
+ Some(&"statsig-server-core".to_string())
691
+ );
692
+ assert!(tags.get("sdk_version").is_some_and(|v| !v.is_empty()));
673
693
  assert_eq!(
674
694
  tags.get("init_source_api"),
675
695
  Some(&mock_scrapi.get_server_api())