From 51659f70316eaefd8ad7162c368c3b54987d964c Mon Sep 17 00:00:00 2001 From: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> Date: Tue, 28 Jan 2025 16:17:51 +0100 Subject: [PATCH 01/63] ci(tracer): make serverless test unrequired (#12122) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .gitlab/benchmarks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/benchmarks.yml b/.gitlab/benchmarks.yml index e922d315444..692a61ea93f 100644 --- a/.gitlab/benchmarks.yml +++ b/.gitlab/benchmarks.yml @@ -96,6 +96,7 @@ benchmark-serverless: tags: ["arch:amd64"] when: on_success needs: [ "benchmark-serverless-trigger" ] + allow_failure: true script: - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ddbuild.io/DataDog/serverless-tools.git ./serverless-tools && cd ./serverless-tools - ./ci/check_trigger_status.sh From 8a5477a9ee1732695f646f108470d2f38fcef775 Mon Sep 17 00:00:00 2001 From: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:26:39 +0100 Subject: [PATCH 02/63] feat(asm): meta struct enable by default for 3.0 (#12117) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/settings/asm.py | 2 +- releasenotes/notes/msgpack_for_appsec-e09c17e9cb568379.yaml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/msgpack_for_appsec-e09c17e9cb568379.yaml diff --git a/ddtrace/settings/asm.py b/ddtrace/settings/asm.py index 16937399501..651fd387dc1 100644 --- a/ddtrace/settings/asm.py +++ b/ddtrace/settings/asm.py @@ -73,7 +73,7 @@ class ASMConfig(Env): _iast_propagation_debug = Env.var(bool, IAST.ENV_PROPAGATION_DEBUG, default=False, private=True) _iast_telemetry_report_lvl = Env.var(str, IAST.ENV_TELEMETRY_REPORT_LVL, default=TELEMETRY_INFORMATION_NAME) _appsec_standalone_enabled = Env.var(bool, APPSEC.STANDALONE_ENV, default=False) - _use_metastruct_for_triggers = False + _use_metastruct_for_triggers = True _automatic_login_events_mode = Env.var(str, APPSEC.AUTOMATIC_USER_EVENTS_TRACKING, default="", parser=str.lower) # Deprecation phase, to be removed in ddtrace 3.0.0 diff --git a/releasenotes/notes/msgpack_for_appsec-e09c17e9cb568379.yaml b/releasenotes/notes/msgpack_for_appsec-e09c17e9cb568379.yaml new file mode 100644 index 00000000000..6a231eeee12 --- /dev/null +++ b/releasenotes/notes/msgpack_for_appsec-e09c17e9cb568379.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + ASM: This introduces use of meta struct for appsec event reports. This will improve performances. + ASM will now require at least agent version 7.35.0 to work as expected. From c630fbb3609e0b6a0e486aa509f512a4a2d67c2d Mon Sep 17 00:00:00 2001 From: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:34:55 +0100 Subject: [PATCH 03/63] chore(asm): remove deprecated env var (#12120) remove deprecated env var DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING for 3.0 release. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/appsec/_constants.py | 3 -- ddtrace/settings/asm.py | 34 ------------------- ...USER_EVENTS_TRACKING-c1b4d2141ee92add.yaml | 5 +++ tests/telemetry/test_writer.py | 1 - 4 files changed, 5 insertions(+), 38 deletions(-) create mode 100644 releasenotes/notes/removal_of_DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING-c1b4d2141ee92add.yaml diff --git a/ddtrace/appsec/_constants.py b/ddtrace/appsec/_constants.py index 92b9e239900..8fd812a888b 100644 --- a/ddtrace/appsec/_constants.py +++ b/ddtrace/appsec/_constants.py @@ -92,9 +92,6 @@ class APPSEC(metaclass=Constant_Class): ] = "_dd.appsec.events.users.login.failure.auto.mode" BLOCKED: Literal["appsec.blocked"] = "appsec.blocked" EVENT: Literal["appsec.event"] = "appsec.event" - AUTOMATIC_USER_EVENTS_TRACKING: Literal[ - "DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING" - ] = "DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING" AUTO_USER_INSTRUMENTATION_MODE: Literal[ "DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE" ] = "DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE" diff --git a/ddtrace/settings/asm.py b/ddtrace/settings/asm.py index 651fd387dc1..0dac1ba5981 100644 --- a/ddtrace/settings/asm.py +++ b/ddtrace/settings/asm.py @@ -16,9 +16,7 @@ from ddtrace.appsec._constants import LOGIN_EVENTS_MODE from ddtrace.appsec._constants import TELEMETRY_INFORMATION_NAME from ddtrace.constants import APPSEC_ENV -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning from ddtrace.settings._core import report_telemetry as _report_telemetry -from ddtrace.vendor.debtcollector import deprecate def _validate_non_negative_int(r: int) -> None: @@ -75,34 +73,6 @@ class ASMConfig(Env): _appsec_standalone_enabled = Env.var(bool, APPSEC.STANDALONE_ENV, default=False) _use_metastruct_for_triggers = True - _automatic_login_events_mode = Env.var(str, APPSEC.AUTOMATIC_USER_EVENTS_TRACKING, default="", parser=str.lower) - # Deprecation phase, to be removed in ddtrace 3.0.0 - if _automatic_login_events_mode is not None: - if _automatic_login_events_mode == "extended": - deprecate( - "Using DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING=extended is deprecated", - message="Please use 'DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE=identification instead", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - _automatic_login_events_mode = LOGIN_EVENTS_MODE.IDENT - elif _automatic_login_events_mode == "safe": - deprecate( - "Using DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING=safe is deprecated", - message="Please use 'DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE=anonymisation instead", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - _automatic_login_events_mode = LOGIN_EVENTS_MODE.ANON - elif _automatic_login_events_mode == "disabled": - deprecate( - "Using DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING=disabled is deprecated", - message="Please use 'DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE=disabled" - " instead or DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING_ENABLED=false" - " to disable the feature and bypass Remote Config", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) _auto_user_instrumentation_local_mode = Env.var( str, APPSEC.AUTO_USER_INSTRUMENTATION_MODE, @@ -209,7 +179,6 @@ class ASMConfig(Env): "_iast_telemetry_report_lvl", "_ep_enabled", "_use_metastruct_for_triggers", - "_automatic_login_events_mode", "_auto_user_instrumentation_local_mode", "_auto_user_instrumentation_rc_mode", "_auto_user_instrumentation_enabled", @@ -250,9 +219,6 @@ def __init__(self): super().__init__() # Is one click available? self._eval_asm_can_be_enabled() - # Only for deprecation phase - if self._automatic_login_events_mode and APPSEC.AUTO_USER_INSTRUMENTATION_MODE not in os.environ: - self._auto_user_instrumentation_local_mode = self._automatic_login_events_mode if not self._asm_libddwaf_available: self._asm_enabled = False self._asm_can_be_enabled = False diff --git a/releasenotes/notes/removal_of_DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING-c1b4d2141ee92add.yaml b/releasenotes/notes/removal_of_DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING-c1b4d2141ee92add.yaml new file mode 100644 index 00000000000..f292f61bf60 --- /dev/null +++ b/releasenotes/notes/removal_of_DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING-c1b4d2141ee92add.yaml @@ -0,0 +1,5 @@ +--- +deprecations: + - | + ASM: deprecated env var DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING is now removed. + Please use the new env var DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE instead. \ No newline at end of file diff --git a/tests/telemetry/test_writer.py b/tests/telemetry/test_writer.py index 52d0f763df9..39d672a1c01 100644 --- a/tests/telemetry/test_writer.py +++ b/tests/telemetry/test_writer.py @@ -291,7 +291,6 @@ def test_app_started_event_configuration_override(test_agent_session, run_python {"name": "DD_API_SECURITY_ENABLED", "origin": "default", "value": True}, {"name": "DD_API_SECURITY_PARSE_RESPONSE_BODY", "origin": "default", "value": True}, {"name": "DD_API_SECURITY_SAMPLE_DELAY", "origin": "default", "value": 30.0}, - {"name": "DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING", "origin": "default", "value": ""}, {"name": "DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING_ENABLED", "origin": "default", "value": True}, {"name": "DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE", "origin": "default", "value": "identification"}, {"name": "DD_APPSEC_ENABLED", "origin": "env_var", "value": True}, From 03e8375268463a39b5041e6aaf4cf2226983cba5 Mon Sep 17 00:00:00 2001 From: Federico Mon Date: Tue, 28 Jan 2025 19:16:28 +0100 Subject: [PATCH 04/63] fix(iast): fix import loop (#12095) Co-authored-by: Brett Langdon --- ddtrace/appsec/_iast/_ast/ast_patching.py | 3 +-- ddtrace/internal/packages.py | 2 +- ...sm-package-distributions-import-loop-11693f2a26032774.yaml | 4 ++++ 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/fix-asm-package-distributions-import-loop-11693f2a26032774.yaml diff --git a/ddtrace/appsec/_iast/_ast/ast_patching.py b/ddtrace/appsec/_iast/_ast/ast_patching.py index 44bef969bff..bb954970df0 100644 --- a/ddtrace/appsec/_iast/_ast/ast_patching.py +++ b/ddtrace/appsec/_iast/_ast/ast_patching.py @@ -17,6 +17,7 @@ from ddtrace.appsec._python_info.stdlib import _stdlib_for_python_version from ddtrace.internal.logger import get_logger from ddtrace.internal.module import origin +from ddtrace.internal.packages import get_package_distributions from ddtrace.internal.utils.formats import asbool from .visitor import AstVisitor @@ -462,8 +463,6 @@ def _is_first_party(module_name: str): return False if not _IMPORTLIB_PACKAGES: - from ddtrace.internal.packages import get_package_distributions - _IMPORTLIB_PACKAGES = set(get_package_distributions()) return module_name.split(".")[0] not in _IMPORTLIB_PACKAGES diff --git a/ddtrace/internal/packages.py b/ddtrace/internal/packages.py index ab4023d93dd..9f276025aad 100644 --- a/ddtrace/internal/packages.py +++ b/ddtrace/internal/packages.py @@ -45,7 +45,7 @@ def get_distributions(): return pkgs -@callonce +@cached(maxsize=1) def get_package_distributions() -> t.Mapping[str, t.List[str]]: """a mapping of importable package names to their distribution name(s)""" try: diff --git a/releasenotes/notes/fix-asm-package-distributions-import-loop-11693f2a26032774.yaml b/releasenotes/notes/fix-asm-package-distributions-import-loop-11693f2a26032774.yaml new file mode 100644 index 00000000000..ca11c747477 --- /dev/null +++ b/releasenotes/notes/fix-asm-package-distributions-import-loop-11693f2a26032774.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Code security (IAST): This fix resolves an issue where the usage of `callonce` decorator could trigger an import loop From bf15c9053b70d1e817dd2fbf4873cd3cfbc6c009 Mon Sep 17 00:00:00 2001 From: ncybul <124532568+ncybul@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:12:02 -0500 Subject: [PATCH 05/63] chore(llmobs): [MLOB-2093] remove deprecated parameters arg from annotate method (#12085) Deprecates the `parameters` arg for the LLMObs annotation method in favor of `metadata`. I verified this change by running the following code: ``` @workflow def run(): LLMObs.annotate( input_data="hello", output_data="bye", parameters={"example": True}, ) return None run() ``` Which produced the following error as expected: `TypeError: LLMObs.annotate() got an unexpected keyword argument 'parameters'`. Replacing `parameters` with `metadata` resolves the issue: ![image](https://github.com/user-attachments/assets/c6858362-43d6-4647-99a9-db4356cab539) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> --- ddtrace/llmobs/_constants.py | 1 - ddtrace/llmobs/_llmobs.py | 20 +------------------ ...arameters-annotation-97406f9cece3fac4.yaml | 4 ++++ tests/llmobs/_utils.py | 12 ++--------- tests/llmobs/test_llmobs.py | 8 -------- tests/llmobs/test_llmobs_decorators.py | 8 ++++---- tests/llmobs/test_llmobs_service.py | 16 +++------------ 7 files changed, 14 insertions(+), 55 deletions(-) create mode 100644 releasenotes/notes/remove-llmobs-parameters-annotation-97406f9cece3fac4.yaml diff --git a/ddtrace/llmobs/_constants.py b/ddtrace/llmobs/_constants.py index 3c61053df68..1f1fbaa3eee 100644 --- a/ddtrace/llmobs/_constants.py +++ b/ddtrace/llmobs/_constants.py @@ -13,7 +13,6 @@ INPUT_DOCUMENTS = "_ml_obs.meta.input.documents" INPUT_MESSAGES = "_ml_obs.meta.input.messages" INPUT_VALUE = "_ml_obs.meta.input.value" -INPUT_PARAMETERS = "_ml_obs.meta.input.parameters" INPUT_PROMPT = "_ml_obs.meta.input.prompt" OUTPUT_DOCUMENTS = "_ml_obs.meta.output.documents" diff --git a/ddtrace/llmobs/_llmobs.py b/ddtrace/llmobs/_llmobs.py index 768f4bdb292..91fd7959b50 100644 --- a/ddtrace/llmobs/_llmobs.py +++ b/ddtrace/llmobs/_llmobs.py @@ -35,7 +35,6 @@ from ddtrace.llmobs._constants import ANNOTATIONS_CONTEXT_ID from ddtrace.llmobs._constants import INPUT_DOCUMENTS from ddtrace.llmobs._constants import INPUT_MESSAGES -from ddtrace.llmobs._constants import INPUT_PARAMETERS from ddtrace.llmobs._constants import INPUT_PROMPT from ddtrace.llmobs._constants import INPUT_VALUE from ddtrace.llmobs._constants import METADATA @@ -148,8 +147,6 @@ def _llmobs_span_event(cls, span: Span) -> Dict[str, Any]: meta["model_name"] = span._get_ctx_item(MODEL_NAME) meta["model_provider"] = (span._get_ctx_item(MODEL_PROVIDER) or "custom").lower() meta["metadata"] = span._get_ctx_item(METADATA) or {} - if span._get_ctx_item(INPUT_PARAMETERS): - meta["input"]["parameters"] = span._get_ctx_item(INPUT_PARAMETERS) if span_kind == "llm" and span._get_ctx_item(INPUT_MESSAGES) is not None: meta["input"]["messages"] = span._get_ctx_item(INPUT_MESSAGES) if span._get_ctx_item(INPUT_VALUE) is not None: @@ -710,7 +707,6 @@ def retrieval( def annotate( cls, span: Optional[Span] = None, - parameters: Optional[Dict[str, Any]] = None, prompt: Optional[dict] = None, input_data: Optional[Any] = None, output_data: Optional[Any] = None, @@ -720,7 +716,7 @@ def annotate( _name: Optional[str] = None, ) -> None: """ - Sets parameters, inputs, outputs, tags, and metrics as provided for a given LLMObs span. + Sets metadata, inputs, outputs, tags, and metrics as provided for a given LLMObs span. Note that with the exception of tags, this method will override any existing values for the provided fields. :param Span span: Span to annotate. If no span is provided, the current active span will be used. @@ -747,7 +743,6 @@ def annotate( {"name": str, "id": str, "text": str, "score": float}, or a list of dictionaries with the same signature. - other: any JSON serializable type. - :param parameters: (DEPRECATED) Dictionary of JSON serializable key-value pairs to set as input parameters. :param metadata: Dictionary of JSON serializable key-value metadata pairs relevant to the input/output operation described by the LLMObs span. :param tags: Dictionary of JSON serializable key-value tag pairs to set or update on the LLMObs span @@ -773,9 +768,6 @@ def annotate( if tags is not None: cls._tag_span_tags(span, tags) span_kind = span._get_ctx_item(SPAN_KIND) - if parameters is not None: - log.warning("Setting parameters is deprecated, please set parameters and other metadata as tags instead.") - cls._tag_params(span, parameters) if _name is not None: span.name = _name if prompt is not None: @@ -803,16 +795,6 @@ def _tag_prompt(span, prompt: dict) -> None: log.warning("Failed to validate prompt with error: ", exc_info=True) return - @staticmethod - def _tag_params(span: Span, params: Dict[str, Any]) -> None: - """Tags input parameters for a given LLMObs span. - Will be mapped to span's `meta.input.parameters` field. - """ - if not isinstance(params, dict): - log.warning("parameters must be a dictionary of key-value pairs.") - return - span._set_ctx_item(INPUT_PARAMETERS, params) - @classmethod def _tag_llm_io(cls, span, input_messages=None, output_messages=None): """Tags input/output messages for LLM-kind spans. diff --git a/releasenotes/notes/remove-llmobs-parameters-annotation-97406f9cece3fac4.yaml b/releasenotes/notes/remove-llmobs-parameters-annotation-97406f9cece3fac4.yaml new file mode 100644 index 00000000000..4f92056ce53 --- /dev/null +++ b/releasenotes/notes/remove-llmobs-parameters-annotation-97406f9cece3fac4.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + LLM Observability: Removes the deprecated ``parameters`` argument from ``LLMObs annotate()``. Use ``metadata`` instead. diff --git a/tests/llmobs/_utils.py b/tests/llmobs/_utils.py index 8343aee530e..f9cff969c8a 100644 --- a/tests/llmobs/_utils.py +++ b/tests/llmobs/_utils.py @@ -62,7 +62,6 @@ def _expected_llmobs_llm_span_event( input_documents=None, output_messages=None, output_value=None, - parameters=None, metadata=None, token_metrics=None, model_name=None, @@ -78,7 +77,6 @@ def _expected_llmobs_llm_span_event( span_kind: either "llm" or "agent" or "embedding" input_messages: list of input messages in format {"content": "...", "optional_role", "..."} output_messages: list of output messages in format {"content": "...", "optional_role", "..."} - parameters: dict of input parameters metadata: dict of metadata key value pairs token_metrics: dict of token metrics (e.g. prompt_tokens, completion_tokens, total_tokens) model_name: name of the model @@ -112,8 +110,6 @@ def _expected_llmobs_llm_span_event( if model_provider is not None: meta_dict.update({"model_provider": model_provider}) meta_dict.update({"metadata": metadata or {}}) - if parameters is not None: - meta_dict["input"].update({"parameters": parameters}) span_event["meta"].update(meta_dict) if token_metrics is not None: span_event["metrics"].update(token_metrics) @@ -126,7 +122,6 @@ def _expected_llmobs_non_llm_span_event( input_value=None, output_value=None, output_documents=None, - parameters=None, metadata=None, token_metrics=None, tags=None, @@ -140,7 +135,6 @@ def _expected_llmobs_non_llm_span_event( span_kind: one of "workflow", "task", "tool", "retrieval" input_value: input value string output_value: output value string - parameters: dict of input parameters metadata: dict of metadata key value pairs token_metrics: dict of token metrics (e.g. prompt_tokens, completion_tokens, total_tokens) tags: dict of tags to add/override on span @@ -160,8 +154,6 @@ def _expected_llmobs_non_llm_span_event( meta_dict["output"].update({"value": output_value}) if input_value is not None: meta_dict["input"].update({"value": input_value}) - if parameters is not None: - meta_dict["input"].update({"parameters": parameters}) meta_dict.update({"metadata": metadata or {}}) if output_value is not None: meta_dict["output"].update({"value": output_value}) @@ -275,7 +267,6 @@ def _completion_event(): "model_provider": "openai", "input": { "messages": [{"content": "who broke enigma?"}], - "parameters": {"temperature": 0, "max_tokens": 256}, }, "output": { "messages": [ @@ -284,6 +275,7 @@ def _completion_event(): } ] }, + "metadata": {"temperature": 0, "max_tokens": 256}, }, "metrics": {"input_tokens": 64, "output_tokens": 128, "total_tokens": 192}, } @@ -312,7 +304,6 @@ def _chat_completion_event(): }, {"role": "user", "content": "I am a hobbit looking to go to Mordor"}, ], - "parameters": {"temperature": 0.9, "max_tokens": 256}, }, "output": { "messages": [ @@ -322,6 +313,7 @@ def _chat_completion_event(): }, ] }, + "metadata": {"temperature": 0.9, "max_tokens": 256}, }, "metrics": {"input_tokens": 64, "output_tokens": 128, "total_tokens": 192}, } diff --git a/tests/llmobs/test_llmobs.py b/tests/llmobs/test_llmobs.py index 004b77b5764..086e867c787 100644 --- a/tests/llmobs/test_llmobs.py +++ b/tests/llmobs/test_llmobs.py @@ -114,14 +114,6 @@ def test_input_messages_are_set(tracer, llmobs_events): assert llmobs_events[0]["meta"]["input"]["messages"] == [{"content": "message", "role": "user"}] -def test_input_parameters_are_set(tracer, llmobs_events): - """Test that input parameters are set on the span event if they are present on the span.""" - with tracer.trace("root_llm_span", span_type=SpanTypes.LLM) as llm_span: - llm_span._set_ctx_item(const.SPAN_KIND, "llm") - llm_span._set_ctx_item(const.INPUT_PARAMETERS, {"key": "value"}) - assert llmobs_events[0]["meta"]["input"]["parameters"] == {"key": "value"} - - def test_output_messages_are_set(tracer, llmobs_events): """Test that output messages are set on the span event if they are present on the span.""" with tracer.trace("root_llm_span", span_type=SpanTypes.LLM) as llm_span: diff --git a/tests/llmobs/test_llmobs_decorators.py b/tests/llmobs/test_llmobs_decorators.py index 056de72ee96..c293c4ca46d 100644 --- a/tests/llmobs/test_llmobs_decorators.py +++ b/tests/llmobs/test_llmobs_decorators.py @@ -271,7 +271,7 @@ def test_llm_annotate(llmobs, llmobs_events): @llm(model_name="test_model", model_provider="test_provider", name="test_function", session_id="test_session_id") def f(): llmobs.annotate( - parameters={"temperature": 0.9, "max_tokens": 50}, + metadata={"temperature": 0.9, "max_tokens": 50}, input_data=[{"content": "test_prompt"}], output_data=[{"content": "test_response"}], tags={"custom_tag": "tag_value"}, @@ -287,7 +287,7 @@ def f(): model_provider="test_provider", input_messages=[{"content": "test_prompt"}], output_messages=[{"content": "test_response"}], - parameters={"temperature": 0.9, "max_tokens": 50}, + metadata={"temperature": 0.9, "max_tokens": 50}, token_metrics={"input_tokens": 10, "output_tokens": 20, "total_tokens": 30}, tags={"custom_tag": "tag_value"}, session_id="test_session_id", @@ -298,7 +298,7 @@ def test_llm_annotate_raw_string_io(llmobs, llmobs_events): @llm(model_name="test_model", model_provider="test_provider", name="test_function", session_id="test_session_id") def f(): llmobs.annotate( - parameters={"temperature": 0.9, "max_tokens": 50}, + metadata={"temperature": 0.9, "max_tokens": 50}, input_data="test_prompt", output_data="test_response", tags={"custom_tag": "tag_value"}, @@ -314,7 +314,7 @@ def f(): model_provider="test_provider", input_messages=[{"content": "test_prompt"}], output_messages=[{"content": "test_response"}], - parameters={"temperature": 0.9, "max_tokens": 50}, + metadata={"temperature": 0.9, "max_tokens": 50}, token_metrics={"input_tokens": 10, "output_tokens": 20, "total_tokens": 30}, tags={"custom_tag": "tag_value"}, session_id="test_session_id", diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py index de428999147..deac267fac0 100644 --- a/tests/llmobs/test_llmobs_service.py +++ b/tests/llmobs/test_llmobs_service.py @@ -13,7 +13,6 @@ from ddtrace.llmobs import LLMObs as llmobs_service from ddtrace.llmobs._constants import INPUT_DOCUMENTS from ddtrace.llmobs._constants import INPUT_MESSAGES -from ddtrace.llmobs._constants import INPUT_PARAMETERS from ddtrace.llmobs._constants import INPUT_PROMPT from ddtrace.llmobs._constants import INPUT_VALUE from ddtrace.llmobs._constants import IS_EVALUATION_SPAN @@ -356,33 +355,24 @@ def test_embedding_span(llmobs, llmobs_events): def test_annotate_no_active_span_logs_warning(llmobs, mock_llmobs_logs): - llmobs.annotate(parameters={"test": "test"}) + llmobs.annotate(metadata={"test": "test"}) mock_llmobs_logs.warning.assert_called_once_with("No span provided and no active LLMObs-generated span found.") def test_annotate_non_llm_span_logs_warning(llmobs, mock_llmobs_logs): dummy_tracer = DummyTracer() with dummy_tracer.trace("root") as non_llmobs_span: - llmobs.annotate(span=non_llmobs_span, parameters={"test": "test"}) + llmobs.annotate(span=non_llmobs_span, metadata={"test": "test"}) mock_llmobs_logs.warning.assert_called_once_with("Span must be an LLMObs-generated span.") def test_annotate_finished_span_does_nothing(llmobs, mock_llmobs_logs): with llmobs.llm(model_name="test_model", name="test_llm_call", model_provider="test_provider") as span: pass - llmobs.annotate(span=span, parameters={"test": "test"}) + llmobs.annotate(span=span, metadata={"test": "test"}) mock_llmobs_logs.warning.assert_called_once_with("Cannot annotate a finished span.") -def test_annotate_parameters(llmobs, mock_llmobs_logs): - with llmobs.llm(model_name="test_model", name="test_llm_call", model_provider="test_provider") as span: - llmobs.annotate(span=span, parameters={"temperature": 0.9, "max_tokens": 50}) - assert span._get_ctx_item(INPUT_PARAMETERS) == {"temperature": 0.9, "max_tokens": 50} - mock_llmobs_logs.warning.assert_called_once_with( - "Setting parameters is deprecated, please set parameters and other metadata as tags instead." - ) - - def test_annotate_metadata(llmobs): with llmobs.llm(model_name="test_model", name="test_llm_call", model_provider="test_provider") as span: llmobs.annotate(span=span, metadata={"temperature": 0.5, "max_tokens": 20, "top_k": 10, "n": 3}) From 33375605780f036c13f548d595377fffa2c9d334 Mon Sep 17 00:00:00 2001 From: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:55:03 -0500 Subject: [PATCH 06/63] chore(openai): drop openai v0 patching and testing (#12112) This PR officially drops tracing support for OpenAI's 0.x release line. If a user tries to use ddtrace with openai < 1.0, then we'll log a warning and stop patching to avoid hard crashing. This PR removes testing for v0, and removes patching for v0 methods. Things left to do (which can be done in a future PR): - Remove tests for v0 (test_openai_v0.py, test_openai_llmobs.py) - Remove cassette files for v0 - Refactor endpoint hooks (automatic arg tagging is now redundant, v1 response attributes are also different) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .riot/requirements/1825740.txt | 49 --- .riot/requirements/1c1f9ea.txt | 54 +++ .riot/requirements/222519c.txt | 54 +++ .riot/requirements/26381f8.txt | 52 +++ .riot/requirements/e648105.txt | 50 +++ ddtrace/contrib/internal/openai/patch.py | 230 ++++------- docs/index.rst | 2 +- .../drop-openai-v0-1a317eafbc7fcb00.yaml | 5 + riotfile.py | 13 +- tests/contrib/langchain/test_langchain.py | 73 ---- tests/contrib/openai/test_openai_llmobs.py | 3 + tests/contrib/openai/test_openai_patch.py | 384 ++++++------------ tests/contrib/openai/test_openai_v1.py | 1 + .../test_llmobs_span_agentless_writer.py | 3 +- 14 files changed, 428 insertions(+), 545 deletions(-) delete mode 100644 .riot/requirements/1825740.txt create mode 100644 .riot/requirements/1c1f9ea.txt create mode 100644 .riot/requirements/222519c.txt create mode 100644 .riot/requirements/26381f8.txt create mode 100644 .riot/requirements/e648105.txt create mode 100644 releasenotes/notes/drop-openai-v0-1a317eafbc7fcb00.yaml diff --git a/.riot/requirements/1825740.txt b/.riot/requirements/1825740.txt deleted file mode 100644 index d1ef7a92bc0..00000000000 --- a/.riot/requirements/1825740.txt +++ /dev/null @@ -1,49 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1825740.in -# -aiohttp==3.8.6 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==24.2.0 -certifi==2024.12.14 -charset-normalizer==3.4.1 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -joblib==1.3.2 -mock==5.1.0 -multidict==6.0.5 -numpy==1.21.6 -openai==0.26.5 -opentracing==2.4.0 -packaging==24.0 -pillow==9.5.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pyyaml==6.0.1 -requests==2.31.0 -scikit-learn==1.0.2 -scipy==1.7.3 -six==1.17.0 -sortedcontainers==2.4.0 -threadpoolctl==3.1.0 -tomli==2.0.1 -tqdm==4.67.1 -typing-extensions==4.7.1 -urllib3==1.26.20 -vcrpy==4.2.1 -wrapt==1.16.0 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/1c1f9ea.txt b/.riot/requirements/1c1f9ea.txt new file mode 100644 index 00000000000..69974431395 --- /dev/null +++ b/.riot/requirements/1c1f9ea.txt @@ -0,0 +1,54 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1c1f9ea.in +# +annotated-types==0.7.0 +anyio==3.7.1 +attrs==25.1.0 +certifi==2024.12.14 +coverage[toml]==7.6.10 +distro==1.9.0 +exceptiongroup==1.2.2 +h11==0.14.0 +httpcore==1.0.7 +httpx==0.27.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.0.0 +mock==5.1.0 +multidict==6.1.0 +numpy==2.0.2 +openai[datalib,embeddings]==1.0.0 +opentracing==2.4.0 +packaging==24.2 +pandas==2.2.3 +pandas-stubs==2.2.2.240807 +pillow==9.5.0 +pluggy==1.5.0 +propcache==0.2.1 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +pytz==2024.2 +pyyaml==6.0.2 +six==1.17.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +tomli==2.2.1 +tqdm==4.67.1 +types-pytz==2024.2.0.20241221 +typing-extensions==4.12.2 +tzdata==2025.1 +urllib3==1.26.20 +vcrpy==4.2.1 +wrapt==1.17.2 +yarl==1.18.3 +zipp==3.21.0 diff --git a/.riot/requirements/222519c.txt b/.riot/requirements/222519c.txt new file mode 100644 index 00000000000..4bf34296b39 --- /dev/null +++ b/.riot/requirements/222519c.txt @@ -0,0 +1,54 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/222519c.in +# +annotated-types==0.7.0 +anyio==3.7.1 +attrs==25.1.0 +certifi==2024.12.14 +coverage[toml]==7.6.1 +distro==1.9.0 +exceptiongroup==1.2.2 +h11==0.14.0 +httpcore==1.0.7 +httpx==0.27.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +mock==5.1.0 +multidict==6.1.0 +numpy==1.24.4 +openai[datalib,embeddings]==1.0.0 +opentracing==2.4.0 +packaging==24.2 +pandas==2.0.3 +pandas-stubs==2.0.3.230814 +pillow==9.5.0 +pluggy==1.5.0 +propcache==0.2.0 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +python-dateutil==2.9.0.post0 +pytz==2024.2 +pyyaml==6.0.2 +six==1.17.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +tomli==2.2.1 +tqdm==4.67.1 +types-pytz==2024.2.0.20241221 +typing-extensions==4.12.2 +tzdata==2025.1 +urllib3==1.26.20 +vcrpy==4.2.1 +wrapt==1.17.2 +yarl==1.15.2 +zipp==3.20.2 diff --git a/.riot/requirements/26381f8.txt b/.riot/requirements/26381f8.txt new file mode 100644 index 00000000000..7e7511ac652 --- /dev/null +++ b/.riot/requirements/26381f8.txt @@ -0,0 +1,52 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/26381f8.in +# +annotated-types==0.7.0 +anyio==3.7.1 +attrs==25.1.0 +certifi==2024.12.14 +coverage[toml]==7.6.10 +distro==1.9.0 +exceptiongroup==1.2.2 +h11==0.14.0 +httpcore==1.0.7 +httpx==0.27.2 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.0.0 +mock==5.1.0 +multidict==6.1.0 +numpy==2.2.2 +openai[datalib,embeddings]==1.0.0 +opentracing==2.4.0 +packaging==24.2 +pandas==2.2.3 +pandas-stubs==2.2.3.241126 +pillow==9.5.0 +pluggy==1.5.0 +propcache==0.2.1 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +pytz==2024.2 +pyyaml==6.0.2 +six==1.17.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +tomli==2.2.1 +tqdm==4.67.1 +types-pytz==2024.2.0.20241221 +typing-extensions==4.12.2 +tzdata==2025.1 +urllib3==1.26.20 +vcrpy==4.2.1 +wrapt==1.17.2 +yarl==1.18.3 diff --git a/.riot/requirements/e648105.txt b/.riot/requirements/e648105.txt new file mode 100644 index 00000000000..c7802cb3b38 --- /dev/null +++ b/.riot/requirements/e648105.txt @@ -0,0 +1,50 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/e648105.in +# +annotated-types==0.7.0 +anyio==3.7.1 +attrs==25.1.0 +certifi==2024.12.14 +coverage[toml]==7.6.10 +distro==1.9.0 +h11==0.14.0 +httpcore==1.0.7 +httpx==0.27.2 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.0.0 +mock==5.1.0 +multidict==6.1.0 +numpy==2.2.2 +openai[datalib,embeddings]==1.0.0 +opentracing==2.4.0 +packaging==24.2 +pandas==2.2.3 +pandas-stubs==2.2.3.241126 +pillow==9.5.0 +pluggy==1.5.0 +propcache==0.2.1 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +pytz==2024.2 +pyyaml==6.0.2 +six==1.17.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +tqdm==4.67.1 +types-pytz==2024.2.0.20241221 +typing-extensions==4.12.2 +tzdata==2025.1 +urllib3==1.26.20 +vcrpy==4.2.1 +wrapt==1.17.2 +yarl==1.18.3 diff --git a/ddtrace/contrib/internal/openai/patch.py b/ddtrace/contrib/internal/openai/patch.py index 39f79d13795..3696314acc4 100644 --- a/ddtrace/contrib/internal/openai/patch.py +++ b/ddtrace/contrib/internal/openai/patch.py @@ -10,7 +10,6 @@ from ddtrace.contrib.trace_utils import with_traced_module from ddtrace.contrib.trace_utils import wrap from ddtrace.internal.logger import get_logger -from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.utils.formats import asbool from ddtrace.internal.utils.formats import deep_getattr from ddtrace.internal.utils.version import parse_version @@ -41,80 +40,43 @@ def get_version(): OPENAI_VERSION = parse_version(get_version()) -if OPENAI_VERSION >= (1, 0, 0): - _RESOURCES = { - "models.Models": { - "list": _endpoint_hooks._ModelListHook, - "retrieve": _endpoint_hooks._ModelRetrieveHook, - "delete": _endpoint_hooks._ModelDeleteHook, - }, - "completions.Completions": { - "create": _endpoint_hooks._CompletionHook, - }, - "chat.Completions": { - "create": _endpoint_hooks._ChatCompletionHook, - }, - "images.Images": { - "generate": _endpoint_hooks._ImageCreateHook, - "edit": _endpoint_hooks._ImageEditHook, - "create_variation": _endpoint_hooks._ImageVariationHook, - }, - "audio.Transcriptions": { - "create": _endpoint_hooks._AudioTranscriptionHook, - }, - "audio.Translations": { - "create": _endpoint_hooks._AudioTranslationHook, - }, - "embeddings.Embeddings": { - "create": _endpoint_hooks._EmbeddingHook, - }, - "moderations.Moderations": { - "create": _endpoint_hooks._ModerationHook, - }, - "files.Files": { - "create": _endpoint_hooks._FileCreateHook, - "retrieve": _endpoint_hooks._FileRetrieveHook, - "list": _endpoint_hooks._FileListHook, - "delete": _endpoint_hooks._FileDeleteHook, - "retrieve_content": _endpoint_hooks._FileDownloadHook, - }, - } -else: - _RESOURCES = { - "model.Model": { - "list": _endpoint_hooks._ModelListHook, - "retrieve": _endpoint_hooks._ModelRetrieveHook, - "delete": _endpoint_hooks._ModelDeleteHook, - }, - "completion.Completion": { - "create": _endpoint_hooks._CompletionHook, - }, - "chat_completion.ChatCompletion": { - "create": _endpoint_hooks._ChatCompletionHook, - }, - "image.Image": { - "create": _endpoint_hooks._ImageCreateHook, - "create_edit": _endpoint_hooks._ImageEditHook, - "create_variation": _endpoint_hooks._ImageVariationHook, - }, - "audio.Audio": { - "transcribe": _endpoint_hooks._AudioTranscriptionHook, - "translate": _endpoint_hooks._AudioTranslationHook, - }, - "embedding.Embedding": { - "create": _endpoint_hooks._EmbeddingHook, - }, - "moderation.Moderation": { - "create": _endpoint_hooks._ModerationHook, - }, - "file.File": { - "list": _endpoint_hooks._FileListHook, - "retrieve": _endpoint_hooks._FileRetrieveHook, - "create": _endpoint_hooks._FileCreateHook, - "delete": _endpoint_hooks._FileDeleteHook, - "download": _endpoint_hooks._FileDownloadHook, - }, - } +_RESOURCES = { + "models.Models": { + "list": _endpoint_hooks._ModelListHook, + "retrieve": _endpoint_hooks._ModelRetrieveHook, + "delete": _endpoint_hooks._ModelDeleteHook, + }, + "completions.Completions": { + "create": _endpoint_hooks._CompletionHook, + }, + "chat.Completions": { + "create": _endpoint_hooks._ChatCompletionHook, + }, + "images.Images": { + "generate": _endpoint_hooks._ImageCreateHook, + "edit": _endpoint_hooks._ImageEditHook, + "create_variation": _endpoint_hooks._ImageVariationHook, + }, + "audio.Transcriptions": { + "create": _endpoint_hooks._AudioTranscriptionHook, + }, + "audio.Translations": { + "create": _endpoint_hooks._AudioTranslationHook, + }, + "embeddings.Embeddings": { + "create": _endpoint_hooks._EmbeddingHook, + }, + "moderations.Moderations": { + "create": _endpoint_hooks._ModerationHook, + }, + "files.Files": { + "create": _endpoint_hooks._FileCreateHook, + "retrieve": _endpoint_hooks._FileRetrieveHook, + "list": _endpoint_hooks._FileListHook, + "delete": _endpoint_hooks._FileDeleteHook, + "retrieve_content": _endpoint_hooks._FileDownloadHook, + }, +} def patch(): @@ -124,43 +86,32 @@ def patch(): if getattr(openai, "__datadog_patch", False): return + if OPENAI_VERSION < (1, 0, 0): + log.warning("openai version %s is not supported, please upgrade to openai version 1.0 or later", OPENAI_VERSION) + return + Pin().onto(openai) integration = OpenAIIntegration(integration_config=config.openai, openai=openai) openai._datadog_integration = integration - if OPENAI_VERSION >= (1, 0, 0): - if OPENAI_VERSION >= (1, 8, 0): - wrap(openai, "_base_client.SyncAPIClient._process_response", patched_convert(openai)) - wrap(openai, "_base_client.AsyncAPIClient._process_response", patched_convert(openai)) - else: - wrap(openai, "_base_client.BaseClient._process_response", patched_convert(openai)) - wrap(openai, "OpenAI.__init__", patched_client_init(openai)) - wrap(openai, "AsyncOpenAI.__init__", patched_client_init(openai)) - wrap(openai, "AzureOpenAI.__init__", patched_client_init(openai)) - wrap(openai, "AsyncAzureOpenAI.__init__", patched_client_init(openai)) - - for resource, method_hook_dict in _RESOURCES.items(): - if deep_getattr(openai.resources, resource) is None: - continue - for method_name, endpoint_hook in method_hook_dict.items(): - sync_method = "resources.{}.{}".format(resource, method_name) - async_method = "resources.{}.{}".format(".Async".join(resource.split(".")), method_name) - wrap(openai, sync_method, _patched_endpoint(openai, endpoint_hook)) - wrap(openai, async_method, _patched_endpoint_async(openai, endpoint_hook)) + if OPENAI_VERSION >= (1, 8, 0): + wrap(openai, "_base_client.SyncAPIClient._process_response", patched_convert(openai)) + wrap(openai, "_base_client.AsyncAPIClient._process_response", patched_convert(openai)) else: - import openai.api_requestor - - wrap(openai, "api_requestor._make_session", _patched_make_session) - wrap(openai, "util.convert_to_openai_object", patched_convert(openai)) - - for resource, method_hook_dict in _RESOURCES.items(): - if deep_getattr(openai.api_resources, resource) is None: - continue - for method_name, endpoint_hook in method_hook_dict.items(): - sync_method = "api_resources.{}.{}".format(resource, method_name) - async_method = "api_resources.{}.a{}".format(resource, method_name) - wrap(openai, sync_method, _patched_endpoint(openai, endpoint_hook)) - wrap(openai, async_method, _patched_endpoint_async(openai, endpoint_hook)) + wrap(openai, "_base_client.BaseClient._process_response", patched_convert(openai)) + wrap(openai, "OpenAI.__init__", patched_client_init(openai)) + wrap(openai, "AsyncOpenAI.__init__", patched_client_init(openai)) + wrap(openai, "AzureOpenAI.__init__", patched_client_init(openai)) + wrap(openai, "AsyncAzureOpenAI.__init__", patched_client_init(openai)) + + for resource, method_hook_dict in _RESOURCES.items(): + if deep_getattr(openai.resources, resource) is None: + continue + for method_name, endpoint_hook in method_hook_dict.items(): + sync_method = "resources.{}.{}".format(resource, method_name) + async_method = "resources.{}.{}".format(".Async".join(resource.split(".")), method_name) + wrap(openai, sync_method, _patched_endpoint(openai, endpoint_hook)) + wrap(openai, async_method, _patched_endpoint_async(openai, endpoint_hook)) openai.__datadog_patch = True @@ -171,40 +122,30 @@ def unpatch(): if not getattr(openai, "__datadog_patch", False): return + if OPENAI_VERSION < (1, 0, 0): + log.warning("openai version %s is not supported, please upgrade to openai version 1.0 or later", OPENAI_VERSION) + return + openai.__datadog_patch = False - if OPENAI_VERSION >= (1, 0, 0): - if OPENAI_VERSION >= (1, 8, 0): - unwrap(openai._base_client.SyncAPIClient, "_process_response") - unwrap(openai._base_client.AsyncAPIClient, "_process_response") - else: - unwrap(openai._base_client.BaseClient, "_process_response") - unwrap(openai.OpenAI, "__init__") - unwrap(openai.AsyncOpenAI, "__init__") - unwrap(openai.AzureOpenAI, "__init__") - unwrap(openai.AsyncAzureOpenAI, "__init__") - - for resource, method_hook_dict in _RESOURCES.items(): - if deep_getattr(openai.resources, resource) is None: - continue - for method_name, _ in method_hook_dict.items(): - sync_resource = deep_getattr(openai.resources, resource) - async_resource = deep_getattr(openai.resources, ".Async".join(resource.split("."))) - unwrap(sync_resource, method_name) - unwrap(async_resource, method_name) + if OPENAI_VERSION >= (1, 8, 0): + unwrap(openai._base_client.SyncAPIClient, "_process_response") + unwrap(openai._base_client.AsyncAPIClient, "_process_response") else: - import openai.api_requestor - - unwrap(openai.api_requestor, "_make_session") - unwrap(openai.util, "convert_to_openai_object") - - for resource, method_hook_dict in _RESOURCES.items(): - if deep_getattr(openai.api_resources, resource) is None: - continue - for method_name, _ in method_hook_dict.items(): - resource_obj = deep_getattr(openai.api_resources, resource) - unwrap(resource_obj, method_name) - unwrap(resource_obj, "a{}".format(method_name)) + unwrap(openai._base_client.BaseClient, "_process_response") + unwrap(openai.OpenAI, "__init__") + unwrap(openai.AsyncOpenAI, "__init__") + unwrap(openai.AzureOpenAI, "__init__") + unwrap(openai.AsyncAzureOpenAI, "__init__") + + for resource, method_hook_dict in _RESOURCES.items(): + if deep_getattr(openai.resources, resource) is None: + continue + for method_name, _ in method_hook_dict.items(): + sync_resource = deep_getattr(openai.resources, resource) + async_resource = deep_getattr(openai.resources, ".Async".join(resource.split("."))) + unwrap(sync_resource, method_name) + unwrap(async_resource, method_name) delattr(openai, "_datadog_integration") @@ -225,19 +166,6 @@ def patched_client_init(openai, pin, func, instance, args, kwargs): return -def _patched_make_session(func, instance, args, kwargs): - """Patch for `openai.api_requestor._make_session` which sets the service name on the - requests session so that spans from the requests integration will use the service name openai. - This is done so that the service break down will include OpenAI time spent querying the OpenAI backend. - - This should technically be a ``peer.service`` but this concept doesn't exist yet. - """ - session = func(*args, **kwargs) - service = schematize_service_name("openai") - Pin.override(session, service=service) - return session - - def _traced_endpoint(endpoint_hook, integration, instance, pin, args, kwargs): span = integration.trace(pin, endpoint_hook.OPERATION_ID) openai_api_key = _format_openai_api_key(kwargs.get("api_key")) diff --git a/docs/index.rst b/docs/index.rst index 23c0cd48a06..7517008b6da 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -128,7 +128,7 @@ contacting support. +--------------------------------------------------+---------------+----------------+ | :ref:`mysql-connector` | >= 8.0.5 | No | +--------------------------------------------------+---------------+----------------+ -| :ref:`openai` | >= 0.26.5 | Yes | +| :ref:`openai` | >= 1.0 | Yes | +--------------------------------------------------+---------------+----------------+ | :ref:`opensearch-py ` | >= 1.1 | Yes | +--------------------------------------------------+---------------+----------------+ diff --git a/releasenotes/notes/drop-openai-v0-1a317eafbc7fcb00.yaml b/releasenotes/notes/drop-openai-v0-1a317eafbc7fcb00.yaml new file mode 100644 index 00000000000..697825b2769 --- /dev/null +++ b/releasenotes/notes/drop-openai-v0-1a317eafbc7fcb00.yaml @@ -0,0 +1,5 @@ +--- +upgrade: + - | + openai: Drops tracing and LLM Observability support for OpenAI 0.x versions. + To maintain support, upgrade to ``openai>=1.0``. \ No newline at end of file diff --git a/riotfile.py b/riotfile.py index bf3e0eede96..e266d2a09a6 100644 --- a/riotfile.py +++ b/riotfile.py @@ -2492,17 +2492,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "pytest-randomly": latest, }, venvs=[ - Venv( - # openai[embeddings] broken install with sklearn was never fixed on 0.26 - # https://github.com/openai/openai-python/issues/210 - pys="3.7", - env={"SKLEARN_ALLOW_DEPRECATED_SKLEARN_PACKAGE_INSTALL": "True"}, - pkgs={ - "openai": "==0.26.5", - "scikit-learn": "==1.0.2", - "pillow": "==9.5.0", - }, - ), Venv( pys="3.7", pkgs={ @@ -2513,7 +2502,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( pys=select_pys(min_version="3.8", max_version="3.11"), pkgs={ - "openai[embeddings,datalib]": "==1.30.1", + "openai[embeddings,datalib]": ["==1.0.0", "==1.30.1"], "pillow": "==9.5.0", "httpx": "==0.27.2", }, diff --git a/tests/contrib/langchain/test_langchain.py b/tests/contrib/langchain/test_langchain.py index ee7918d920d..57cb6139db4 100644 --- a/tests/contrib/langchain/test_langchain.py +++ b/tests/contrib/langchain/test_langchain.py @@ -924,79 +924,6 @@ def test_vectorstore_logs(langchain, ddtrace_config_langchain, request_vcr, mock mock_metrics.count.assert_not_called() -@pytest.mark.skipif(PY39, reason="Requires unnecessary cassette file for Python 3.9") -@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost", "resource"]) -def test_openai_integration(langchain, request_vcr, ddtrace_run_python_code_in_subprocess): - env = os.environ.copy() - pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] - if "PYTHONPATH" in env: - pypath.append(env["PYTHONPATH"]) - env.update( - { - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_LANGCHAIN_METRICS_ENABLED": "false", - "DD_OPENAI_METRICS_ENABLED": "false", - "OPENAI_API_KEY": "", - } - ) - out, err, status, pid = ddtrace_run_python_code_in_subprocess( - """ -from langchain.llms import OpenAI -import ddtrace -from tests.contrib.langchain.test_langchain import get_request_vcr -llm = OpenAI() -with get_request_vcr(subdirectory_name="langchain").use_cassette("openai_completion_sync.yaml"): - llm("Can you explain what Descartes meant by 'I think, therefore I am'?") -""", - env=env, - ) - assert status == 0, err - assert out == b"" - assert err == b"" - - -@pytest.mark.skipif(PY39, reason="Requires unnecessary cassette file for Python 3.9") -@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost", "resource"]) -@pytest.mark.parametrize("schema_version", [None, "v0", "v1"]) -@pytest.mark.parametrize("service_name", [None, "mysvc"]) -def test_openai_service_name( - langchain, request_vcr, ddtrace_run_python_code_in_subprocess, schema_version, service_name -): - env = os.environ.copy() - pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] - if "PYTHONPATH" in env: - pypath.append(env["PYTHONPATH"]) - env.update( - { - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_LANGCHAIN_METRICS_ENABLED": "false", - "DD_OPENAI_METRICS_ENABLED": "false", - "OPENAI_API_KEY": "", - } - ) - if service_name: - env["DD_SERVICE"] = service_name - if schema_version: - env["DD_TRACE_SPAN_ATTRIBUTE_SCHEMA"] = schema_version - out, err, status, pid = ddtrace_run_python_code_in_subprocess( - # TODO: need to correct this - """ -from langchain.llms import OpenAI -import ddtrace -from tests.contrib.langchain.test_langchain import get_request_vcr -llm = OpenAI() -with get_request_vcr(subdirectory_name="langchain").use_cassette("openai_completion_sync.yaml"): - llm("Can you explain what Descartes meant by 'I think, therefore I am'?") -""", - env=env, - ) - assert status == 0, err - assert out == b"" - assert err == b"" - - @pytest.mark.parametrize( "ddtrace_config_langchain", [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], diff --git a/tests/contrib/openai/test_openai_llmobs.py b/tests/contrib/openai/test_openai_llmobs.py index 4c15b1ffad3..bf18abd3f04 100644 --- a/tests/contrib/openai/test_openai_llmobs.py +++ b/tests/contrib/openai/test_openai_llmobs.py @@ -651,6 +651,9 @@ def test_chat_completion_function_call(self, openai, ddtrace_global_config, mock ) ) + @pytest.mark.skipif( + parse_version(openai_module.version.VERSION) < (1, 1), reason="Tool calls available after v1.1.0" + ) def test_chat_completion_tool_call(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): """Test that tool call chat completion calls are recorded as LLMObs events correctly.""" with get_openai_vcr(subdirectory_name="v1").use_cassette("chat_completion_tool_call.yaml"): diff --git a/tests/contrib/openai/test_openai_patch.py b/tests/contrib/openai/test_openai_patch.py index 6a995213180..6b3bdcf6503 100644 --- a/tests/contrib/openai/test_openai_patch.py +++ b/tests/contrib/openai/test_openai_patch.py @@ -18,268 +18,136 @@ class TestOpenaiPatch(PatchTestCase.Base): __get_version__ = get_version def assert_module_patched(self, openai): - if OPENAI_VERSION >= (1, 0, 0): - if OPENAI_VERSION >= (1, 8, 0): - self.assert_wrapped(openai._base_client.SyncAPIClient._process_response) - self.assert_wrapped(openai._base_client.AsyncAPIClient._process_response) - else: - self.assert_wrapped(openai._base_client.BaseClient._process_response) - self.assert_wrapped(openai.OpenAI.__init__) - self.assert_wrapped(openai.AsyncOpenAI.__init__) - self.assert_wrapped(openai.AzureOpenAI.__init__) - self.assert_wrapped(openai.AsyncAzureOpenAI.__init__) - self.assert_wrapped(openai.resources.models.Models.list) - self.assert_wrapped(openai.resources.models.Models.retrieve) - self.assert_wrapped(openai.resources.models.Models.delete) - self.assert_wrapped(openai.resources.models.AsyncModels.list) - self.assert_wrapped(openai.resources.models.AsyncModels.retrieve) - self.assert_wrapped(openai.resources.models.AsyncModels.delete) - self.assert_wrapped(openai.resources.completions.Completions.create) - self.assert_wrapped(openai.resources.chat.Completions.create) - self.assert_wrapped(openai.resources.completions.AsyncCompletions.create) - self.assert_wrapped(openai.resources.chat.AsyncCompletions.create) - self.assert_wrapped(openai.resources.images.Images.generate) - self.assert_wrapped(openai.resources.images.Images.edit) - self.assert_wrapped(openai.resources.images.Images.create_variation) - self.assert_wrapped(openai.resources.images.AsyncImages.generate) - self.assert_wrapped(openai.resources.images.AsyncImages.edit) - self.assert_wrapped(openai.resources.images.AsyncImages.create_variation) - self.assert_wrapped(openai.resources.audio.Transcriptions.create) - self.assert_wrapped(openai.resources.audio.Translations.create) - self.assert_wrapped(openai.resources.audio.AsyncTranscriptions.create) - self.assert_wrapped(openai.resources.audio.AsyncTranslations.create) - self.assert_wrapped(openai.resources.embeddings.Embeddings.create) - self.assert_wrapped(openai.resources.moderations.Moderations.create) - self.assert_wrapped(openai.resources.embeddings.AsyncEmbeddings.create) - self.assert_wrapped(openai.resources.moderations.AsyncModerations.create) - self.assert_wrapped(openai.resources.files.Files.create) - self.assert_wrapped(openai.resources.files.Files.retrieve) - self.assert_wrapped(openai.resources.files.Files.list) - self.assert_wrapped(openai.resources.files.Files.delete) - self.assert_wrapped(openai.resources.files.Files.retrieve_content) - self.assert_wrapped(openai.resources.files.AsyncFiles.create) - self.assert_wrapped(openai.resources.files.AsyncFiles.retrieve) - self.assert_wrapped(openai.resources.files.AsyncFiles.list) - self.assert_wrapped(openai.resources.files.AsyncFiles.delete) - self.assert_wrapped(openai.resources.files.AsyncFiles.retrieve_content) + if OPENAI_VERSION >= (1, 8, 0): + self.assert_wrapped(openai._base_client.SyncAPIClient._process_response) + self.assert_wrapped(openai._base_client.AsyncAPIClient._process_response) else: - self.assert_wrapped(openai.api_resources.completion.Completion.create) - self.assert_wrapped(openai.api_resources.completion.Completion.acreate) - self.assert_wrapped(openai.api_requestor._make_session) - self.assert_wrapped(openai.util.convert_to_openai_object) - self.assert_wrapped(openai.api_resources.embedding.Embedding.create) - self.assert_wrapped(openai.api_resources.embedding.Embedding.acreate) - if hasattr(openai, "Model"): - self.assert_wrapped(openai.api_resources.model.Model.list) - self.assert_wrapped(openai.api_resources.model.Model.retrieve) - self.assert_wrapped(openai.api_resources.model.Model.delete) - self.assert_wrapped(openai.api_resources.model.Model.alist) - self.assert_wrapped(openai.api_resources.model.Model.aretrieve) - self.assert_wrapped(openai.api_resources.model.Model.adelete) - if hasattr(openai, "ChatCompletion"): - self.assert_wrapped(openai.api_resources.chat_completion.ChatCompletion.create) - self.assert_wrapped(openai.api_resources.chat_completion.ChatCompletion.acreate) - if hasattr(openai, "Image"): - self.assert_wrapped(openai.api_resources.image.Image.create) - self.assert_wrapped(openai.api_resources.image.Image.acreate) - self.assert_wrapped(openai.api_resources.image.Image.create_edit) - self.assert_wrapped(openai.api_resources.image.Image.acreate_edit) - self.assert_wrapped(openai.api_resources.image.Image.create_variation) - self.assert_wrapped(openai.api_resources.image.Image.acreate_variation) - if hasattr(openai, "Audio"): - self.assert_wrapped(openai.api_resources.audio.Audio.transcribe) - self.assert_wrapped(openai.api_resources.audio.Audio.atranscribe) - self.assert_wrapped(openai.api_resources.audio.Audio.translate) - self.assert_wrapped(openai.api_resources.audio.Audio.atranslate) - if hasattr(openai, "Moderation"): - self.assert_wrapped(openai.api_resources.moderation.Moderation.create) - self.assert_wrapped(openai.api_resources.moderation.Moderation.acreate) - if hasattr(openai, "File"): - self.assert_wrapped(openai.api_resources.file.File.create) - self.assert_wrapped(openai.api_resources.file.File.retrieve) - self.assert_wrapped(openai.api_resources.file.File.list) - self.assert_wrapped(openai.api_resources.file.File.delete) - self.assert_wrapped(openai.api_resources.file.File.download) - self.assert_wrapped(openai.api_resources.file.File.acreate) - self.assert_wrapped(openai.api_resources.file.File.aretrieve) - self.assert_wrapped(openai.api_resources.file.File.alist) - self.assert_wrapped(openai.api_resources.file.File.adelete) - self.assert_wrapped(openai.api_resources.file.File.adownload) + self.assert_wrapped(openai._base_client.BaseClient._process_response) + self.assert_wrapped(openai.OpenAI.__init__) + self.assert_wrapped(openai.AsyncOpenAI.__init__) + self.assert_wrapped(openai.AzureOpenAI.__init__) + self.assert_wrapped(openai.AsyncAzureOpenAI.__init__) + self.assert_wrapped(openai.resources.models.Models.list) + self.assert_wrapped(openai.resources.models.Models.retrieve) + self.assert_wrapped(openai.resources.models.Models.delete) + self.assert_wrapped(openai.resources.models.AsyncModels.list) + self.assert_wrapped(openai.resources.models.AsyncModels.retrieve) + self.assert_wrapped(openai.resources.models.AsyncModels.delete) + self.assert_wrapped(openai.resources.completions.Completions.create) + self.assert_wrapped(openai.resources.chat.Completions.create) + self.assert_wrapped(openai.resources.completions.AsyncCompletions.create) + self.assert_wrapped(openai.resources.chat.AsyncCompletions.create) + self.assert_wrapped(openai.resources.images.Images.generate) + self.assert_wrapped(openai.resources.images.Images.edit) + self.assert_wrapped(openai.resources.images.Images.create_variation) + self.assert_wrapped(openai.resources.images.AsyncImages.generate) + self.assert_wrapped(openai.resources.images.AsyncImages.edit) + self.assert_wrapped(openai.resources.images.AsyncImages.create_variation) + self.assert_wrapped(openai.resources.audio.Transcriptions.create) + self.assert_wrapped(openai.resources.audio.Translations.create) + self.assert_wrapped(openai.resources.audio.AsyncTranscriptions.create) + self.assert_wrapped(openai.resources.audio.AsyncTranslations.create) + self.assert_wrapped(openai.resources.embeddings.Embeddings.create) + self.assert_wrapped(openai.resources.moderations.Moderations.create) + self.assert_wrapped(openai.resources.embeddings.AsyncEmbeddings.create) + self.assert_wrapped(openai.resources.moderations.AsyncModerations.create) + self.assert_wrapped(openai.resources.files.Files.create) + self.assert_wrapped(openai.resources.files.Files.retrieve) + self.assert_wrapped(openai.resources.files.Files.list) + self.assert_wrapped(openai.resources.files.Files.delete) + self.assert_wrapped(openai.resources.files.Files.retrieve_content) + self.assert_wrapped(openai.resources.files.AsyncFiles.create) + self.assert_wrapped(openai.resources.files.AsyncFiles.retrieve) + self.assert_wrapped(openai.resources.files.AsyncFiles.list) + self.assert_wrapped(openai.resources.files.AsyncFiles.delete) + self.assert_wrapped(openai.resources.files.AsyncFiles.retrieve_content) def assert_not_module_patched(self, openai): - if OPENAI_VERSION >= (1, 0, 0): - if OPENAI_VERSION >= (1, 8, 0): - self.assert_not_wrapped(openai._base_client.SyncAPIClient._process_response) - self.assert_not_wrapped(openai._base_client.AsyncAPIClient._process_response) - else: - self.assert_not_wrapped(openai._base_client.BaseClient._process_response) - self.assert_not_wrapped(openai.OpenAI.__init__) - self.assert_not_wrapped(openai.AsyncOpenAI.__init__) - self.assert_not_wrapped(openai.AzureOpenAI.__init__) - self.assert_not_wrapped(openai.AsyncAzureOpenAI.__init__) - self.assert_not_wrapped(openai.resources.models.Models.list) - self.assert_not_wrapped(openai.resources.models.Models.retrieve) - self.assert_not_wrapped(openai.resources.models.Models.delete) - self.assert_not_wrapped(openai.resources.models.AsyncModels.list) - self.assert_not_wrapped(openai.resources.models.AsyncModels.retrieve) - self.assert_not_wrapped(openai.resources.models.AsyncModels.delete) - self.assert_not_wrapped(openai.resources.completions.Completions.create) - self.assert_not_wrapped(openai.resources.chat.Completions.create) - self.assert_not_wrapped(openai.resources.completions.AsyncCompletions.create) - self.assert_not_wrapped(openai.resources.chat.AsyncCompletions.create) - self.assert_not_wrapped(openai.resources.images.Images.generate) - self.assert_not_wrapped(openai.resources.images.Images.edit) - self.assert_not_wrapped(openai.resources.images.Images.create_variation) - self.assert_not_wrapped(openai.resources.images.AsyncImages.generate) - self.assert_not_wrapped(openai.resources.images.AsyncImages.edit) - self.assert_not_wrapped(openai.resources.images.AsyncImages.create_variation) - self.assert_not_wrapped(openai.resources.audio.Transcriptions.create) - self.assert_not_wrapped(openai.resources.audio.Translations.create) - self.assert_not_wrapped(openai.resources.audio.AsyncTranscriptions.create) - self.assert_not_wrapped(openai.resources.audio.AsyncTranslations.create) - self.assert_not_wrapped(openai.resources.embeddings.Embeddings.create) - self.assert_not_wrapped(openai.resources.moderations.Moderations.create) - self.assert_not_wrapped(openai.resources.embeddings.AsyncEmbeddings.create) - self.assert_not_wrapped(openai.resources.moderations.AsyncModerations.create) - self.assert_not_wrapped(openai.resources.files.Files.create) - self.assert_not_wrapped(openai.resources.files.Files.retrieve) - self.assert_not_wrapped(openai.resources.files.Files.list) - self.assert_not_wrapped(openai.resources.files.Files.delete) - self.assert_not_wrapped(openai.resources.files.AsyncFiles.retrieve_content) - self.assert_not_wrapped(openai.resources.files.AsyncFiles.create) - self.assert_not_wrapped(openai.resources.files.AsyncFiles.retrieve) - self.assert_not_wrapped(openai.resources.files.AsyncFiles.list) - self.assert_not_wrapped(openai.resources.files.AsyncFiles.delete) - self.assert_not_wrapped(openai.resources.files.AsyncFiles.retrieve_content) + if OPENAI_VERSION >= (1, 8, 0): + self.assert_not_wrapped(openai._base_client.SyncAPIClient._process_response) + self.assert_not_wrapped(openai._base_client.AsyncAPIClient._process_response) else: - self.assert_not_wrapped(openai.api_resources.completion.Completion.create) - self.assert_not_wrapped(openai.api_resources.completion.Completion.acreate) - self.assert_not_wrapped(openai.api_requestor._make_session) - self.assert_not_wrapped(openai.util.convert_to_openai_object) - self.assert_not_wrapped(openai.api_resources.embedding.Embedding.create) - self.assert_not_wrapped(openai.api_resources.embedding.Embedding.acreate) - if hasattr(openai, "Model"): - self.assert_not_wrapped(openai.api_resources.model.Model.list) - self.assert_not_wrapped(openai.api_resources.model.Model.retrieve) - self.assert_not_wrapped(openai.api_resources.model.Model.delete) - self.assert_not_wrapped(openai.api_resources.model.Model.alist) - self.assert_not_wrapped(openai.api_resources.model.Model.aretrieve) - self.assert_not_wrapped(openai.api_resources.model.Model.adelete) - if hasattr(openai, "ChatCompletion"): - self.assert_not_wrapped(openai.api_resources.chat_completion.ChatCompletion.create) - self.assert_not_wrapped(openai.api_resources.chat_completion.ChatCompletion.acreate) - if hasattr(openai, "Image"): - self.assert_not_wrapped(openai.api_resources.image.Image.create) - self.assert_not_wrapped(openai.api_resources.image.Image.acreate) - self.assert_not_wrapped(openai.api_resources.image.Image.create_edit) - self.assert_not_wrapped(openai.api_resources.image.Image.acreate_edit) - self.assert_not_wrapped(openai.api_resources.image.Image.create_variation) - self.assert_not_wrapped(openai.api_resources.image.Image.acreate_variation) - if hasattr(openai, "Audio"): - self.assert_not_wrapped(openai.api_resources.audio.Audio.transcribe) - self.assert_not_wrapped(openai.api_resources.audio.Audio.atranscribe) - self.assert_not_wrapped(openai.api_resources.audio.Audio.translate) - self.assert_not_wrapped(openai.api_resources.audio.Audio.atranslate) - if hasattr(openai, "Moderation"): - self.assert_not_wrapped(openai.api_resources.moderation.Moderation.create) - self.assert_not_wrapped(openai.api_resources.moderation.Moderation.acreate) - if hasattr(openai, "File"): - self.assert_not_wrapped(openai.api_resources.file.File.create) - self.assert_not_wrapped(openai.api_resources.file.File.retrieve) - self.assert_not_wrapped(openai.api_resources.file.File.list) - self.assert_not_wrapped(openai.api_resources.file.File.delete) - self.assert_not_wrapped(openai.api_resources.file.File.download) - self.assert_not_wrapped(openai.api_resources.file.File.acreate) - self.assert_not_wrapped(openai.api_resources.file.File.aretrieve) - self.assert_not_wrapped(openai.api_resources.file.File.alist) - self.assert_not_wrapped(openai.api_resources.file.File.adelete) - self.assert_not_wrapped(openai.api_resources.file.File.adownload) + self.assert_not_wrapped(openai._base_client.BaseClient._process_response) + self.assert_not_wrapped(openai.OpenAI.__init__) + self.assert_not_wrapped(openai.AsyncOpenAI.__init__) + self.assert_not_wrapped(openai.AzureOpenAI.__init__) + self.assert_not_wrapped(openai.AsyncAzureOpenAI.__init__) + self.assert_not_wrapped(openai.resources.models.Models.list) + self.assert_not_wrapped(openai.resources.models.Models.retrieve) + self.assert_not_wrapped(openai.resources.models.Models.delete) + self.assert_not_wrapped(openai.resources.models.AsyncModels.list) + self.assert_not_wrapped(openai.resources.models.AsyncModels.retrieve) + self.assert_not_wrapped(openai.resources.models.AsyncModels.delete) + self.assert_not_wrapped(openai.resources.completions.Completions.create) + self.assert_not_wrapped(openai.resources.chat.Completions.create) + self.assert_not_wrapped(openai.resources.completions.AsyncCompletions.create) + self.assert_not_wrapped(openai.resources.chat.AsyncCompletions.create) + self.assert_not_wrapped(openai.resources.images.Images.generate) + self.assert_not_wrapped(openai.resources.images.Images.edit) + self.assert_not_wrapped(openai.resources.images.Images.create_variation) + self.assert_not_wrapped(openai.resources.images.AsyncImages.generate) + self.assert_not_wrapped(openai.resources.images.AsyncImages.edit) + self.assert_not_wrapped(openai.resources.images.AsyncImages.create_variation) + self.assert_not_wrapped(openai.resources.audio.Transcriptions.create) + self.assert_not_wrapped(openai.resources.audio.Translations.create) + self.assert_not_wrapped(openai.resources.audio.AsyncTranscriptions.create) + self.assert_not_wrapped(openai.resources.audio.AsyncTranslations.create) + self.assert_not_wrapped(openai.resources.embeddings.Embeddings.create) + self.assert_not_wrapped(openai.resources.moderations.Moderations.create) + self.assert_not_wrapped(openai.resources.embeddings.AsyncEmbeddings.create) + self.assert_not_wrapped(openai.resources.moderations.AsyncModerations.create) + self.assert_not_wrapped(openai.resources.files.Files.create) + self.assert_not_wrapped(openai.resources.files.Files.retrieve) + self.assert_not_wrapped(openai.resources.files.Files.list) + self.assert_not_wrapped(openai.resources.files.Files.delete) + self.assert_not_wrapped(openai.resources.files.AsyncFiles.retrieve_content) + self.assert_not_wrapped(openai.resources.files.AsyncFiles.create) + self.assert_not_wrapped(openai.resources.files.AsyncFiles.retrieve) + self.assert_not_wrapped(openai.resources.files.AsyncFiles.list) + self.assert_not_wrapped(openai.resources.files.AsyncFiles.delete) + self.assert_not_wrapped(openai.resources.files.AsyncFiles.retrieve_content) def assert_not_module_double_patched(self, openai): - if OPENAI_VERSION >= (1, 0, 0): - if OPENAI_VERSION >= (1, 8, 0): - self.assert_not_double_wrapped(openai._base_client.SyncAPIClient._process_response) - self.assert_not_double_wrapped(openai._base_client.AsyncAPIClient._process_response) - else: - self.assert_not_double_wrapped(openai._base_client.BaseClient._process_response) - self.assert_not_double_wrapped(openai.OpenAI.__init__) - self.assert_not_double_wrapped(openai.AsyncOpenAI.__init__) - self.assert_not_double_wrapped(openai.AzureOpenAI.__init__) - self.assert_not_double_wrapped(openai.AsyncAzureOpenAI.__init__) - self.assert_not_double_wrapped(openai.resources.models.Models.list) - self.assert_not_double_wrapped(openai.resources.models.Models.retrieve) - self.assert_not_double_wrapped(openai.resources.models.Models.delete) - self.assert_not_double_wrapped(openai.resources.models.AsyncModels.list) - self.assert_not_double_wrapped(openai.resources.models.AsyncModels.retrieve) - self.assert_not_double_wrapped(openai.resources.models.AsyncModels.delete) - self.assert_not_double_wrapped(openai.resources.completions.Completions.create) - self.assert_not_double_wrapped(openai.resources.chat.Completions.create) - self.assert_not_double_wrapped(openai.resources.completions.AsyncCompletions.create) - self.assert_not_double_wrapped(openai.resources.chat.AsyncCompletions.create) - self.assert_not_double_wrapped(openai.resources.images.Images.generate) - self.assert_not_double_wrapped(openai.resources.images.Images.edit) - self.assert_not_double_wrapped(openai.resources.images.Images.create_variation) - self.assert_not_double_wrapped(openai.resources.images.AsyncImages.generate) - self.assert_not_double_wrapped(openai.resources.images.AsyncImages.edit) - self.assert_not_double_wrapped(openai.resources.images.AsyncImages.create_variation) - self.assert_not_double_wrapped(openai.resources.audio.Transcriptions.create) - self.assert_not_double_wrapped(openai.resources.audio.Translations.create) - self.assert_not_double_wrapped(openai.resources.audio.AsyncTranscriptions.create) - self.assert_not_double_wrapped(openai.resources.audio.AsyncTranslations.create) - self.assert_not_double_wrapped(openai.resources.embeddings.Embeddings.create) - self.assert_not_double_wrapped(openai.resources.moderations.Moderations.create) - self.assert_not_double_wrapped(openai.resources.embeddings.AsyncEmbeddings.create) - self.assert_not_double_wrapped(openai.resources.moderations.AsyncModerations.create) - self.assert_not_double_wrapped(openai.resources.files.Files.create) - self.assert_not_double_wrapped(openai.resources.files.Files.retrieve) - self.assert_not_double_wrapped(openai.resources.files.Files.list) - self.assert_not_double_wrapped(openai.resources.files.Files.delete) - self.assert_not_double_wrapped(openai.resources.files.Files.retrieve_content) - self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.create) - self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.retrieve) - self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.list) - self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.delete) - self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.retrieve_content) + if OPENAI_VERSION >= (1, 8, 0): + self.assert_not_double_wrapped(openai._base_client.SyncAPIClient._process_response) + self.assert_not_double_wrapped(openai._base_client.AsyncAPIClient._process_response) else: - self.assert_not_double_wrapped(openai.api_resources.completion.Completion.create) - self.assert_not_double_wrapped(openai.api_resources.completion.Completion.acreate) - self.assert_not_double_wrapped(openai.api_requestor._make_session) - self.assert_not_double_wrapped(openai.util.convert_to_openai_object) - self.assert_not_double_wrapped(openai.api_resources.embedding.Embedding.create) - self.assert_not_double_wrapped(openai.api_resources.embedding.Embedding.acreate) - if hasattr(openai, "Model"): - self.assert_not_double_wrapped(openai.api_resources.model.Model.list) - self.assert_not_double_wrapped(openai.api_resources.model.Model.retrieve) - self.assert_not_double_wrapped(openai.api_resources.model.Model.delete) - self.assert_not_double_wrapped(openai.api_resources.model.Model.alist) - self.assert_not_double_wrapped(openai.api_resources.model.Model.aretrieve) - self.assert_not_double_wrapped(openai.api_resources.model.Model.adelete) - if hasattr(openai, "ChatCompletion"): - self.assert_not_double_wrapped(openai.api_resources.chat_completion.ChatCompletion.create) - self.assert_not_double_wrapped(openai.api_resources.chat_completion.ChatCompletion.acreate) - if hasattr(openai, "Image"): - self.assert_not_double_wrapped(openai.api_resources.image.Image.create) - self.assert_not_double_wrapped(openai.api_resources.image.Image.acreate) - self.assert_not_double_wrapped(openai.api_resources.image.Image.create_edit) - self.assert_not_double_wrapped(openai.api_resources.image.Image.acreate_edit) - self.assert_not_double_wrapped(openai.api_resources.image.Image.create_variation) - self.assert_not_double_wrapped(openai.api_resources.image.Image.acreate_variation) - if hasattr(openai, "Audio"): - self.assert_not_double_wrapped(openai.api_resources.audio.Audio.transcribe) - self.assert_not_double_wrapped(openai.api_resources.audio.Audio.atranscribe) - self.assert_not_double_wrapped(openai.api_resources.audio.Audio.translate) - self.assert_not_double_wrapped(openai.api_resources.audio.Audio.atranslate) - if hasattr(openai, "Moderation"): - self.assert_not_double_wrapped(openai.api_resources.moderation.Moderation.create) - self.assert_not_double_wrapped(openai.api_resources.moderation.Moderation.acreate) - if hasattr(openai, "File"): - self.assert_not_double_wrapped(openai.api_resources.file.File.create) - self.assert_not_double_wrapped(openai.api_resources.file.File.retrieve) - self.assert_not_double_wrapped(openai.api_resources.file.File.list) - self.assert_not_double_wrapped(openai.api_resources.file.File.delete) - self.assert_not_double_wrapped(openai.api_resources.file.File.download) - self.assert_not_double_wrapped(openai.api_resources.file.File.acreate) - self.assert_not_double_wrapped(openai.api_resources.file.File.aretrieve) - self.assert_not_double_wrapped(openai.api_resources.file.File.alist) - self.assert_not_double_wrapped(openai.api_resources.file.File.adelete) - self.assert_not_double_wrapped(openai.api_resources.file.File.adownload) + self.assert_not_double_wrapped(openai._base_client.BaseClient._process_response) + self.assert_not_double_wrapped(openai.OpenAI.__init__) + self.assert_not_double_wrapped(openai.AsyncOpenAI.__init__) + self.assert_not_double_wrapped(openai.AzureOpenAI.__init__) + self.assert_not_double_wrapped(openai.AsyncAzureOpenAI.__init__) + self.assert_not_double_wrapped(openai.resources.models.Models.list) + self.assert_not_double_wrapped(openai.resources.models.Models.retrieve) + self.assert_not_double_wrapped(openai.resources.models.Models.delete) + self.assert_not_double_wrapped(openai.resources.models.AsyncModels.list) + self.assert_not_double_wrapped(openai.resources.models.AsyncModels.retrieve) + self.assert_not_double_wrapped(openai.resources.models.AsyncModels.delete) + self.assert_not_double_wrapped(openai.resources.completions.Completions.create) + self.assert_not_double_wrapped(openai.resources.chat.Completions.create) + self.assert_not_double_wrapped(openai.resources.completions.AsyncCompletions.create) + self.assert_not_double_wrapped(openai.resources.chat.AsyncCompletions.create) + self.assert_not_double_wrapped(openai.resources.images.Images.generate) + self.assert_not_double_wrapped(openai.resources.images.Images.edit) + self.assert_not_double_wrapped(openai.resources.images.Images.create_variation) + self.assert_not_double_wrapped(openai.resources.images.AsyncImages.generate) + self.assert_not_double_wrapped(openai.resources.images.AsyncImages.edit) + self.assert_not_double_wrapped(openai.resources.images.AsyncImages.create_variation) + self.assert_not_double_wrapped(openai.resources.audio.Transcriptions.create) + self.assert_not_double_wrapped(openai.resources.audio.Translations.create) + self.assert_not_double_wrapped(openai.resources.audio.AsyncTranscriptions.create) + self.assert_not_double_wrapped(openai.resources.audio.AsyncTranslations.create) + self.assert_not_double_wrapped(openai.resources.embeddings.Embeddings.create) + self.assert_not_double_wrapped(openai.resources.moderations.Moderations.create) + self.assert_not_double_wrapped(openai.resources.embeddings.AsyncEmbeddings.create) + self.assert_not_double_wrapped(openai.resources.moderations.AsyncModerations.create) + self.assert_not_double_wrapped(openai.resources.files.Files.create) + self.assert_not_double_wrapped(openai.resources.files.Files.retrieve) + self.assert_not_double_wrapped(openai.resources.files.Files.list) + self.assert_not_double_wrapped(openai.resources.files.Files.delete) + self.assert_not_double_wrapped(openai.resources.files.Files.retrieve_content) + self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.create) + self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.retrieve) + self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.list) + self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.delete) + self.assert_not_double_wrapped(openai.resources.files.AsyncFiles.retrieve_content) diff --git a/tests/contrib/openai/test_openai_v1.py b/tests/contrib/openai/test_openai_v1.py index 438b980d5b5..a081583b4d1 100644 --- a/tests/contrib/openai/test_openai_v1.py +++ b/tests/contrib/openai/test_openai_v1.py @@ -365,6 +365,7 @@ def test_chat_completion_function_calling(openai, openai_vcr, snapshot_tracer): ) +@pytest.mark.skipif(parse_version(openai_module.version.VERSION) < (1, 1), reason="Tool calls available after v1.1.0") @pytest.mark.snapshot( token="tests.contrib.openai.test_openai.test_chat_completion_function_calling", ignores=[ diff --git a/tests/llmobs/test_llmobs_span_agentless_writer.py b/tests/llmobs/test_llmobs_span_agentless_writer.py index 8a1a0697752..a4fc7b9b162 100644 --- a/tests/llmobs/test_llmobs_span_agentless_writer.py +++ b/tests/llmobs/test_llmobs_span_agentless_writer.py @@ -50,7 +50,8 @@ def test_flush_queue_when_event_cause_queue_to_exceed_payload_limit( [ mock.call("flushing queue because queuing next event will exceed EVP payload limit"), mock.call("encode %d LLMObs span events to be sent", 5), - ] + ], + any_order=True, ) From 18db08ec2682deb2c025fed1751cc8f3993f3a25 Mon Sep 17 00:00:00 2001 From: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:18:06 -0500 Subject: [PATCH 07/63] chore(openai): remove tests, cassettes for openai v0 (#12146) Follow up on #12112 to completely remove all test files and cassettes for openai v0 testing, which we no longer support. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .../cassettes/v0/azure_chat_completion.yaml | 68 - .../v0/azure_chat_completion_async.yaml | 61 - .../openai/cassettes/v0/azure_completion.yaml | 68 - .../cassettes/v0/azure_completion_async.yaml | 61 - .../openai/cassettes/v0/azure_embedding.yaml | 57 - .../cassettes/v0/azure_embedding_async.yaml | 50 - .../openai/cassettes/v0/chat_completion.yaml | 90 - .../cassettes/v0/chat_completion_async.yaml | 79 - .../cassettes/v0/chat_completion_error.yaml | 66 - .../v0/chat_completion_function_call.yaml | 97 - ...hat_completion_function_call_streamed.yaml | 208 - .../v0/chat_completion_image_input.yaml | 87 - .../v0/chat_completion_sample_rate.yaml | 78 - .../v0/chat_completion_streamed.yaml | 129 - .../v0/chat_completion_streamed_async.yaml | 217 - .../v0/chat_completion_tool_call.yaml | 99 - .../v0/chat_completion_truncation.yaml | 96 - .../openai/cassettes/v0/completion.yaml | 86 - .../openai/cassettes/v0/completion_async.yaml | 86 - .../v0/completion_async_streamed.yaml | 151 - .../openai/cassettes/v0/completion_error.yaml | 63 - .../cassettes/v0/completion_sample_rate.yaml | 82 - .../v0/completion_stream_wrong_api_key.yaml | 57 - .../cassettes/v0/completion_streamed.yaml | 160 - .../cassettes/v0/completion_truncation.yaml | 97 - .../openai/cassettes/v0/embedding.yaml | 180 - .../v0/embedding_array_of_token_arrays.yaml | 390 - .../openai/cassettes/v0/embedding_async.yaml | 71 - .../cassettes/v0/embedding_string_array.yaml | 286 - .../cassettes/v0/embedding_token_array.yaml | 181 - .../openai/cassettes/v0/file_create.yaml | 85 - .../cassettes/v0/file_create_async.yaml | 77 - .../openai/cassettes/v0/file_delete.yaml | 61 - .../cassettes/v0/file_delete_async.yaml | 53 - .../openai/cassettes/v0/file_download.yaml | 61 - .../cassettes/v0/file_download_async.yaml | 1932 ---- .../openai/cassettes/v0/file_list.yaml | 123 - .../openai/cassettes/v0/file_list_async.yaml | 419 - .../openai/cassettes/v0/file_retrieve.yaml | 61 - .../cassettes/v0/file_retrieve_async.yaml | 55 - .../openai/cassettes/v0/image_create.yaml | 70 - .../cassettes/v0/image_create_async.yaml | 57 - .../cassettes/v0/image_create_b64_json.yaml | 2401 ---- .../openai/cassettes/v0/image_edit.yaml | 9867 ----------------- .../openai/cassettes/v0/image_edit_async.yaml | 9854 ---------------- .../openai/cassettes/v0/image_variation.yaml | 5235 --------- .../cassettes/v0/image_variation_async.yaml | 5222 --------- .../openai/cassettes/v0/model_delete.yaml | 61 - .../cassettes/v0/model_delete_async.yaml | 53 - .../openai/cassettes/v0/model_list.yaml | 152 - .../openai/cassettes/v0/model_list_async.yaml | 1098 -- .../openai/cassettes/v0/model_retrieve.yaml | 61 - .../cassettes/v0/model_retrieve_async.yaml | 57 - .../openai/cassettes/v0/moderation.yaml | 73 - .../openai/cassettes/v0/moderation_async.yaml | 72 - .../openai/cassettes/v0/transcribe.yaml | 882 -- .../openai/cassettes/v0/transcribe_async.yaml | 870 -- .../openai/cassettes/v0/translate.yaml | 1115 -- .../openai/cassettes/v0/translate_async.yaml | 1101 -- tests/contrib/openai/conftest.py | 10 +- tests/contrib/openai/test_openai_llmobs.py | 293 - tests/contrib/openai/test_openai_v0.py | 1874 ---- 62 files changed, 1 insertion(+), 46905 deletions(-) delete mode 100644 tests/contrib/openai/cassettes/v0/azure_chat_completion.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/azure_chat_completion_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/azure_completion.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/azure_completion_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/azure_embedding.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/azure_embedding_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_error.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_function_call.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_function_call_streamed.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_image_input.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_sample_rate.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_streamed.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_streamed_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_tool_call.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/chat_completion_truncation.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion_async_streamed.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion_error.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion_sample_rate.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion_stream_wrong_api_key.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion_streamed.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/completion_truncation.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/embedding.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/embedding_array_of_token_arrays.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/embedding_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/embedding_string_array.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/embedding_token_array.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_create.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_create_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_delete.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_delete_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_download.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_download_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_list.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_list_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_retrieve.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/file_retrieve_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/image_create.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/image_create_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/image_create_b64_json.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/image_edit.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/image_edit_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/image_variation.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/image_variation_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/model_delete.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/model_delete_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/model_list.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/model_list_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/model_retrieve.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/model_retrieve_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/moderation.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/moderation_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/transcribe.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/transcribe_async.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/translate.yaml delete mode 100644 tests/contrib/openai/cassettes/v0/translate_async.yaml delete mode 100644 tests/contrib/openai/test_openai_v0.py diff --git a/tests/contrib/openai/cassettes/v0/azure_chat_completion.yaml b/tests/contrib/openai/cassettes/v0/azure_chat_completion.yaml deleted file mode 100644 index 09b1f0c93f8..00000000000 --- a/tests/contrib/openai/cassettes/v0/azure_chat_completion.yaml +++ /dev/null @@ -1,68 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "user", "content": "What''s the weather like in - NYC right now?"}], "temperature": 0, "n": 1, "max_tokens": 20, "user": "ddtrace-test"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '156' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.5.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 - PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://test-openai.openai.azure.com//openai/deployments/gpt-35-turbo/chat/completions?api-version=2023-05-15 - response: - body: - string: '{"id":"chatcmpl-80yf1zsO83O6QA4OlMV9aHRIkSk2G","object":"chat.completion","created":1695243871,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":"length","message":{"role":"assistant","content":"I''m - sorry, as an AI language model, I do not have real-time information. Please - check"}}],"usage":{"completion_tokens":20,"prompt_tokens":18,"total_tokens":38}} - - ' - headers: - Cache-Control: - - no-cache, must-revalidate - Content-Length: - - '367' - Content-Type: - - application/json - Date: - - Wed, 20 Sep 2023 21:04:30 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - access-control-allow-origin: - - '*' - apim-request-id: - - e52ab32a-7f2a-4440-8a29-c0e290a70505 - azureml-model-group: - - online - azureml-model-session: - - turbo-669058-2 - openai-model: - - gpt-35-turbo - openai-processing-ms: - - '488.6886' - x-accel-buffering: - - 'no' - x-content-type-options: - - nosniff - x-ms-client-request-id: - - e52ab32a-7f2a-4440-8a29-c0e290a70505 - x-ms-region: - - East US - x-request-id: - - 89cabfaf-9e3a-4106-88b6-0b9508cf15d4 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/azure_chat_completion_async.yaml b/tests/contrib/openai/cassettes/v0/azure_chat_completion_async.yaml deleted file mode 100644 index 68b0a4ce515..00000000000 --- a/tests/contrib/openai/cassettes/v0/azure_chat_completion_async.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "user", "content": "What''s the weather like in - NYC right now?"}], "temperature": 0, "n": 1, "max_tokens": 20, "user": "ddtrace-test"}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.5.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 - PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://test-openai.openai.azure.com//openai/deployments/gpt-35-turbo/chat/completions?api-version=2023-05-15 - response: - body: - string: '{"id":"chatcmpl-80yf1zsO83O6QA4OlMV9aHRIkSk2G","object":"chat.completion","created":1695243871,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":"length","message":{"role":"assistant","content":"I''m - sorry, as an AI language model, I do not have real-time information. Please - check"}}],"usage":{"completion_tokens":20,"prompt_tokens":18,"total_tokens":38}} - - ' - headers: - Access-Control-Allow-Origin: - - '*' - Cache-Control: - - no-cache, must-revalidate - Content-Length: - - '367' - Content-Type: - - application/json - Date: - - Wed, 20 Sep 2023 21:05:13 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - apim-request-id: - - f058df0b-515d-40f3-a02d-45528022452d - azureml-model-group: - - online - azureml-model-session: - - turbo-669058-2 - openai-model: - - gpt-35-turbo - openai-processing-ms: - - '442.068' - x-accel-buffering: - - 'no' - x-content-type-options: - - nosniff - x-ms-client-request-id: - - f058df0b-515d-40f3-a02d-45528022452d - x-ms-region: - - East US - x-request-id: - - c9cb7e13-0524-44d6-bd62-9411088886e5 - status: - code: 200 - message: OK - url: https://test-openai.openai.azure.com//openai/deployments/gpt-35-turbo/chat/completions?api-version=2023-05-15 -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/azure_completion.yaml b/tests/contrib/openai/cassettes/v0/azure_completion.yaml deleted file mode 100644 index 41ddcb9b45e..00000000000 --- a/tests/contrib/openai/cassettes/v0/azure_completion.yaml +++ /dev/null @@ -1,68 +0,0 @@ -interactions: -- request: - body: '{"prompt": "why do some languages have words that can''t directly be translated - to other languages?", "temperature": 0, "n": 1, "max_tokens": 20, "user": "ddtrace-test"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '168' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.5.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 - PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://test-openai.openai.azure.com//openai/deployments/gpt-35-turbo/completions?api-version=2023-05-15 - response: - body: - string: '{"id":"cmpl-80yXLPWze5qul39qHFOlO1j7VViFv","object":"text_completion","created":1695243395,"model":"gpt-35-turbo","choices":[{"text":"\". - The answer is that languages are not just a collection of words, but also - a collection of cultural","index":0,"finish_reason":"length","logprobs":null}],"usage":{"completion_tokens":20,"prompt_tokens":16,"total_tokens":36}} - - ' - headers: - Cache-Control: - - no-cache, must-revalidate - Content-Length: - - '362' - Content-Type: - - application/json - Date: - - Wed, 20 Sep 2023 20:56:35 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - access-control-allow-origin: - - '*' - apim-request-id: - - ed4be02e-308b-4a27-b0f0-fd8d91881ab3 - azureml-model-group: - - online - azureml-model-session: - - turbo-669058-5 - openai-model: - - gpt-35-turbo - openai-processing-ms: - - '467.3238' - x-accel-buffering: - - 'no' - x-content-type-options: - - nosniff - x-ms-client-request-id: - - ed4be02e-308b-4a27-b0f0-fd8d91881ab3 - x-ms-region: - - East US - x-request-id: - - 7881365d-1f1f-41c9-972e-7949acd99bcb - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/azure_completion_async.yaml b/tests/contrib/openai/cassettes/v0/azure_completion_async.yaml deleted file mode 100644 index c8e22c9760e..00000000000 --- a/tests/contrib/openai/cassettes/v0/azure_completion_async.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: '{"prompt": "why do some languages have words that can''t directly be translated - to other languages?", "temperature": 0, "n": 1, "max_tokens": 20, "user": "ddtrace-test"}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.5.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 - PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://test-openai.openai.azure.com//openai/deployments/gpt-35-turbo/completions?api-version=2023-05-15 - response: - body: - string: '{"id":"cmpl-80yXLPWze5qul39qHFOlO1j7VViFv","object":"text_completion","created":1695243395,"model":"gpt-35-turbo","choices":[{"text":"\". - The answer is that languages are not just a collection of words, but also - a collection of cultural","index":0,"finish_reason":"length","logprobs":null}],"usage":{"completion_tokens":20,"prompt_tokens":16,"total_tokens":36}} - - ' - headers: - Access-Control-Allow-Origin: - - '*' - Cache-Control: - - no-cache, must-revalidate - Content-Length: - - '362' - Content-Type: - - application/json - Date: - - Wed, 20 Sep 2023 20:58:52 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - apim-request-id: - - dfbaf25c-d578-477b-b726-4c486fc724c4 - azureml-model-group: - - online - azureml-model-session: - - turbo-669058-7 - openai-model: - - gpt-35-turbo - openai-processing-ms: - - '393.9019' - x-accel-buffering: - - 'no' - x-content-type-options: - - nosniff - x-ms-client-request-id: - - dfbaf25c-d578-477b-b726-4c486fc724c4 - x-ms-region: - - East US - x-request-id: - - 2dacf213-d95a-40ab-880e-58b1d22fc4b6 - status: - code: 200 - message: OK - url: https://test-openai.openai.azure.com//openai/deployments/gpt-35-turbo/completions?api-version=2023-05-15 -version: 1 \ No newline at end of file diff --git a/tests/contrib/openai/cassettes/v0/azure_embedding.yaml b/tests/contrib/openai/cassettes/v0/azure_embedding.yaml deleted file mode 100644 index 70838b44ca5..00000000000 --- a/tests/contrib/openai/cassettes/v0/azure_embedding.yaml +++ /dev/null @@ -1,57 +0,0 @@ -interactions: -- request: - body: '{"input": "Hello world", "temperature": 0, "user": "ddtrace-test", "encoding_format": - "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '95' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.5.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 - PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://test-openai.openai.azure.com//openai/deployments/text-embedding-ada-002/embeddings?api-version=2023-05-15 - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"embedding\",\n \"index\": 0,\n \"embedding\": \"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\"\n - \ }\n ],\n \"model\": \"ada\",\n \"usage\": {\n \"prompt_tokens\": - 2,\n \"total_tokens\": 2\n }\n}\n" - headers: - Content-Length: - - '8395' - Content-Type: - - application/json - Date: - - Wed, 20 Sep 2023 20:40:33 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - access-control-allow-origin: - - '*' - apim-request-id: - - 791aa016-ef4e-4b18-8502-a178a1319697 - openai-processing-ms: - - '32.6942' - x-content-type-options: - - nosniff - x-ms-client-request-id: - - 791aa016-ef4e-4b18-8502-a178a1319697 - x-ms-region: - - East US - x-request-id: - - d8f6ccce-f97f-4a1c-9635-2dcd7063426d - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/azure_embedding_async.yaml b/tests/contrib/openai/cassettes/v0/azure_embedding_async.yaml deleted file mode 100644 index 83ad0ccad81..00000000000 --- a/tests/contrib/openai/cassettes/v0/azure_embedding_async.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: '{"input": "Hello world", "temperature": 0, "user": "ddtrace-test", "encoding_format": - "base64"}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.5.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 - PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://test-openai.openai.azure.com//openai/deployments/text-embedding-ada-002/embeddings?api-version=2023-05-15 - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"embedding\",\n \"index\": 0,\n \"embedding\": \"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\"\n - \ }\n ],\n \"model\": \"ada\",\n \"usage\": {\n \"prompt_tokens\": - 2,\n \"total_tokens\": 2\n }\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - Content-Length: - - '8395' - Content-Type: - - application/json - Date: - - Wed, 20 Sep 2023 20:48:28 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - apim-request-id: - - d60c7e46-d9c8-43c9-a11a-4e4e684adf27 - openai-processing-ms: - - '197.7319' - x-content-type-options: - - nosniff - x-ms-client-request-id: - - d60c7e46-d9c8-43c9-a11a-4e4e684adf27 - x-ms-region: - - East US - x-request-id: - - 7772235a-2044-461a-9ee6-5b96cc691b77 - status: - code: 200 - message: OK - url: https://test-openai.openai.azure.com//openai/deployments/text-embedding-ada-002/embeddings?api-version=2023-05-15 -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion.yaml b/tests/contrib/openai/cassettes/v0/chat_completion.yaml deleted file mode 100644 index 53d18307938..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion.yaml +++ /dev/null @@ -1,90 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "system", "content": "You - are a helpful assistant."}, {"role": "user", "content": "Who won the world series - in 2020?"}, {"role": "assistant", "content": "The Los Angeles Dodgers won the - World Series in 2020."}, {"role": "user", "content": "Where was it played?"}], - "top_p": 0.9, "n": 2}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '335' - Content-Type: - - application/json - Cookie: - - _cfuvid=z_X6itPJxPTjTduN0U3MMsBzJjHeKT9Fdq0egODXUAA-1681852797547-0-604800000 - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.8.13", "platform": "macOS-13.2-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.3.0 Darwin Kernel Version 22.3.0: Thu Jan 5 20:48:54 - PST 2023; root:xnu-8792.81.2~2/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA6zOsW7CMBSF4b1PYd3ZQQlpAnjrAgtbqVqpqpCxL4lbx9eyL4IK5d0rpJYuDB26 - /tI5+s7gLCgwvWYzRF/M2tD0mOjppW0t18cVH2PJyyXa9foAEmj3joa/FxNDQ/TIjgJIMAk1owVV - tfNq3tTldCFhIIseFHSRi3rSFHxIOyrKuqxAwiHrDkGdISYaIm+ZPjBkUM1Mwu/1Ndf3EphY+2tZ - VKME05MzmEG9nmHA/POZyCMo0Dm7zDrwRUiBMVz0mx7FtJyW4pmSt+IRk8MsjjqL6PUnWuGCeEje - hY4pSLHBk85Cs1h52qFYuz2KpUNvJzBK2Lvgcr9NqDMFUJCZIkhwweIJVDnKf3TdMNyy/sFVjW/j - 3RcAAAD//wMAYmTRJv8BAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7b9ff89aaf7a4350-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 18 Apr 2023 21:23:50 GMT - Server: - - cloudflare - Set-Cookie: - - _cfuvid=rivrQHfY2JgyNPaGS5BuAQSWVT_3vQbN5A2pkVcwXT0-1681853030671-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1070' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '15000' - x-ratelimit-limit-tokens: - - '2000000' - x-ratelimit-remaining-requests: - - '14999' - x-ratelimit-remaining-tokens: - - '1999929' - x-ratelimit-reset-requests: - - 17ms - x-request-id: - - 6eabc80b7d44ae16e36dfd9a4ce83f73 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_async.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_async.yaml deleted file mode 100644 index 3d6899ebeb1..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_async.yaml +++ /dev/null @@ -1,79 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "system", "content": "You - are a helpful assistant."}, {"role": "user", "content": "Who won the world series - in 2020?"}, {"role": "assistant", "content": "The Los Angeles Dodgers won the - World Series in 2020."}, {"role": "user", "content": "Where was it played?"}], - "top_p": 0.9, "n": 2}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.8.13", "platform": "macOS-13.2-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.3.0 Darwin Kernel Version 22.3.0: Thu Jan 5 20:48:54 - PST 2023; root:xnu-8792.81.2~2/RELEASE_ARM64_T6000 arm64 arm"}' - method: post - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: '{"id":"chatcmpl-76n5heroUX66dt3wGtwp0tFFedLLu","object":"chat.completion","created":1681853029,"model":"gpt-3.5-turbo-0301","usage":{"prompt_tokens":57,"completion_tokens":34,"total_tokens":91},"choices":[{"message":{"role":"assistant","content":"The - 2020 World Series was played in Arlington, Texas at Globe Life Field."},"finish_reason":"stop","index":0},{"message":{"role":"assistant","content":"The - 2020 World Series was played at Globe Life Field in Arlington, Texas."},"finish_reason":"stop","index":1}]} - - ' - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7b9ff8a2a832438d-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 18 Apr 2023 21:23:51 GMT - Server: - - cloudflare - Set-Cookie: - - _cfuvid=P_8pTyk85r7Xtj6D27yDxfaPNVoS0urVVbv01pfRgNs-1681853031895-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1008' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '15000' - x-ratelimit-limit-tokens: - - '2000000' - x-ratelimit-remaining-requests: - - '14999' - x-ratelimit-remaining-tokens: - - '1999929' - x-ratelimit-reset-requests: - - 17ms - x-request-id: - - 53dc155a61f84eddf2a862ac7d871b52 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/chat/completions -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_error.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_error.yaml deleted file mode 100644 index a249baac799..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_error.yaml +++ /dev/null @@ -1,66 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "system", "content": "You - are a helpful assistant."}, {"role": "user", "content": "Who won the world series - in 2020?"}, {"role": "assistant", "content": "The Los Angeles Dodgers won the - World Series in 2020."}, {"role": "user", "content": "Where was it played?"}], - "top_p": 0.9, "n": 2, "user": "ddtrace-test"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '359' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-14.2.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:18 - PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"error\": {\n \"message\": \"Incorrect API key provided: - \\u003cnot-a-r****key\\u003e. You can find your API key at https://platform.openai.com/account/api-keys.\",\n - \ \"type\": \"invalid_request_error\",\n \"param\": null,\n \"code\": - \"invalid_api_key\"\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 84dc66fac89d78dc-EWR - Connection: - - keep-alive - Content-Length: - - '276' - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 30 Jan 2024 20:18:07 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=OiLS3tKjz9XxqK97lspfjy8SEemYO.FSyHEscEv37x4-1706645887-1-Abvroq3TLP0fQvldum1JNrXGaQE7uA8X7altI99oZcsPLUVlIl0aLHgIT9HadRlIcbEMsINHPPTfhsplIYsq7yw=; - path=/; expires=Tue, 30-Jan-24 20:48:07 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=BQjhnHvr3q_ASqPjdGlApNUKWjsokgL.ZxIrTj1LKpU-1706645887262-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - alt-svc: - - h3=":443"; ma=86400 - strict-transport-security: - - max-age=15724800; includeSubDomains - vary: - - Origin - x-request-id: - - ea4a8fa6b519e94d46d5fa0f79b7e3ba - status: - code: 401 - message: Unauthorized -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_function_call.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_function_call.yaml deleted file mode 100644 index 1d7726fb636..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_function_call.yaml +++ /dev/null @@ -1,97 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "\n David - Nguyen is a sophomore majoring in computer science at Stanford University and - has a GPA of 3.8.\n David is an active member of the university''s Chess - Club and the South Asian Student Association.\n He hopes to pursue a career - in software engineering after graduating.\n "}], "functions": [{"name": "extract_student_info", - "description": "Get the student information from the body of the input text", - "parameters": {"type": "object", "properties": {"name": {"type": "string", "description": - "Name of the person"}, "major": {"type": "string", "description": "Major subject."}, - "school": {"type": "string", "description": "The university name."}, "grades": - {"type": "integer", "description": "GPA of the student."}, "clubs": {"type": - "array", "description": "School clubs for extracurricular activities. ", "items": - {"type": "string", "description": "Name of School Club"}}}}}], "function_call": - "auto", "user": "ddtrace-test"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1014' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.6-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Fri Sep 15 13:41:28 - PDT 2023; root:xnu-8796.141.3.700.8~1/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA1RSS2/iMBC+8ytGcwZESoE2t5bdK3tASCs1FTLOQFyccWSPu60Q/33lBEK5WNb3 - 8jx8GgCgKTEH1JUSXTd29DSdVdXqWL0+/3n9V69XR7/8y9ptYhl+b3CYHG73QVqurrF2dWNJjOOO - 1p6UUErN5s+zxeNiPslaonYl2WQ7NDKajmcjiX7nRpN5Nr04K2c0BczhbQAAcGrPVCOX9IU5TIZX - pKYQ1IEw70UA6J1NCKoQTBDFgsMbqR0LcSqbo7U/iH1knarfamXtXSAAsqrbSPoSr7Rsg8SSWLaG - 9+5HOgAqf4g1saTy8VQwQNG6C8yhwF/q05SwOsRv4gKHHV2rD+c7Pg0xCnkI2hBr6jVBV87ZTrQW - xXvnS9iw+SQfjHz3uoNXJYWkm46fLpi2cddCbwUuKwoBljbuChymLBelgpdgFMO6awpeQnDaqDSM - At8LPmPf4PlyO/cb2Bs2odp6UsFx6vl+joOr671dbbzbFjbe1Y1sxR2J08Cy2aILxttvurE9KU6U - veEP2eMgPXIe/AcAAP//AwB/irZaygIAAA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 80cd0f8a0c8241f5-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 26 Sep 2023 17:00:01 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0613 - openai-organization: - - datadog-4 - openai-processing-ms: - - '692' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999910' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 5ms - x-request-id: - - 3b5828ba018e216550b170f2c77f88f3 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_function_call_streamed.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_function_call_streamed.yaml deleted file mode 100644 index 934addd2873..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_function_call_streamed.yaml +++ /dev/null @@ -1,208 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "\n David - Nguyen is a sophomore majoring in computer science at Stanford University and - has a GPA of 3.8.\n David is an active member of the university''s Chess - Club and the South Asian Student Association.\n He hopes to pursue a career - in software engineering after graduating.\n "}], "functions": [{"name": "extract_student_info", - "description": "Get the student information from the body of the input text", - "parameters": {"type": "object", "properties": {"name": {"type": "string", "description": - "Name of the person"}, "major": {"type": "string", "description": "Major subject."}, - "school": {"type": "string", "description": "The university name."}, "grades": - {"type": "integer", "description": "GPA of the student."}, "clubs": {"type": - "array", "description": "School clubs for extracurricular activities. ", "items": - {"type": "string", "description": "Name of School Club"}}}}}], "function_call": - "auto", "stream": true, "user": "ddtrace-test"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1030' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-14.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 23.3.0 Darwin Kernel Version 23.3.0: Wed Dec 20 21:30:44 - PST 2023; root:xnu-10002.81.5~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"role":"assistant","content":null,"function_call":{"name":"extract_student_info","arguments":""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"{\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"name"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\":\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"David"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":" - Nguyen"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\",\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"major"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\":\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"Computer"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":" - Science"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\",\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"school"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\":\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"Stan"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"ford"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":" - University"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\",\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"grades"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\":"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"3"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"."}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"8"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":",\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"clubs"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\":[\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"Chess"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":" - Club"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\",\""}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"South"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":" - Asian"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":" - Student"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":" - Association"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{"function_call":{"arguments":"\"]}"}},"logprobs":null,"finish_reason":null}]} - - - data: {"id":"chatcmpl-8waNET2jegFyrhdKCchfPE5LYJjf1","object":"chat.completion.chunk","created":1708973536,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_86156a94a0","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"function_call"}]} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 85ba6258da7a0ca5-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Type: - - text/event-stream - Date: - - Mon, 26 Feb 2024 18:52:16 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=VKLKFuDxERPWqWLGbEc1Q0uW4hX41Uz7nuY5xKcr1ts-1708973536-1.0-AXfKF+lIVC8YJtJes8KJ2f6ZONIe9hBxETwXgyPqg/AhOz9q4qsy2tLRRaBsDkXEqh0Y7L3ME1/I1a9A6lxdqZs=; - path=/; expires=Mon, 26-Feb-24 19:22:16 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=6OhUfkQsUiBfhhOIPLcGqcaf5F6mji6Y7nsqM_7QvSQ-1708973536661-0.0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0125 - openai-organization: - - datadog-4 - openai-processing-ms: - - '340' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '15000' - x-ratelimit-limit-tokens: - - '2000000' - x-ratelimit-remaining-requests: - - '14999' - x-ratelimit-remaining-tokens: - - '1999911' - x-ratelimit-reset-requests: - - 4ms - x-ratelimit-reset-tokens: - - 2ms - x-request-id: - - req_aaed0dc9012715cd3ba99087cd89be22 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_image_input.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_image_input.yaml deleted file mode 100644 index 242103c7e53..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_image_input.yaml +++ /dev/null @@ -1,87 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-4-vision-preview", "messages": [{"role": "user", "content": - [{"type": "text", "text": "What\u2019s in this image?"}, {"type": "image_url", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"}]}]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '332' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.11.1", "platform": "macOS-14.1.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 23.1.0 Darwin Kernel Version 23.1.0: Mon Oct 9 21:27:24 - PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA0yPQWvDMAyF/4rweRkJLW3pfbuMwWCDjY1R1FiJvdiWsZWmpfS/DwdaehPSe5/e - Oyur1RZUa1BaH121efteP73arqZaf+HmdHoe34euHvzn9BLVAyje/1ErV89jyz46EsuhHNtEKFSI - zbpumnqxWa8eQHnW5Iqlj1Itq6apV9XBZsuhiokOlqZiHjP2pLZwVjGxj7ITHijkAmuaTaHfft2d - Cl9Y0N3LF8tL0Ru2LZXNz1l5yjd+YlcGhTnbLBhkzs5BKMzNPgyB9dgTZMNTBoRMiQJBQBkTOnAY - dG4xErQcCsOGHrgDhIlZU4A9Y9ITugHEoAAdhYLOICbx2BtV0nU22Gx2mgSty3MuOcU5l8fjtU1R - 2qDpqLZQX34v/wAAAP//AwBzg8RBsQEAAA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 82cbdfefb813436e-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 27 Nov 2023 16:51:18 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=d6ov6YwrqemojSGt8iO9_0Qf3UJhwlgQMcoKdnoRbwg-1701103878-0-ASEB1DDqa/JLbWcuxqNOaYCngY4tGk9Q8m3aVpU4jAjGua7OpatkiSrzIPI9rRMHQUqGKdiJYa52zH3JS1iq5Wk=; - path=/; expires=Mon, 27-Nov-23 17:21:18 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=ALaEbe03egqFuF8IP_iPjk4QMdgVjcdkH1QEiSb2ric-1701103878609-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-4-1106-vision-preview - openai-organization: - - datadog-4 - openai-processing-ms: - - '4003' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '100' - x-ratelimit-limit-tokens: - - '150000' - x-ratelimit-remaining-requests: - - '98' - x-ratelimit-remaining-tokens: - - '149977' - x-ratelimit-reset-requests: - - 25m47.91s - x-ratelimit-reset-tokens: - - 9ms - x-request-id: - - fed91798d778620c33cc96e1c49f0300 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_sample_rate.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_sample_rate.yaml deleted file mode 100644 index 2808aecbe01..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_sample_rate.yaml +++ /dev/null @@ -1,78 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "what - is your name?"}]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '91' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.4 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.4", "httplib": "requests", "lang": "python", "lang_version": - "3.9.11", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA1yOzWrCQBRG932Ky924mYgajXZ2oYsipVqkhdpSZEyuJjUzd5i5aSviuxf7Y6Hb - 8/EdzgHrEjUWlZHC+iYZT96Xi3SWP1zdtqNWBo95tbsZPm3ms0U7RoW8fqVCfh7dgq1vSGp2qLAI - ZIRK1P1sMkizrJelCi2X1KDGrZck7Y4SacOak17a66PCNpotoT6gD2y9rIR35CLqfqrwT33GaaZQ - WExzJsPLo8Ki4rqgiPr5gJbirzNwQ6jRxFhHMU5OheyE3Kk+j2Ac5FNojNu2ZkvwFapgCiW7jkBl - 3ggMeAqRnWnAGUtdWHIL1uwh0IYCCIMlMBHmnlw+7US4vrtP0n9O4ACxtr7Zf89dPCrc1K6O1SqQ - iexQYxT2qLB2JX2g7h1fjhefAAAA//8DANk7OYmaAQAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7bd0e5da0af2ec00-BOS - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 24 Apr 2023 19:54:26 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '3052' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3500' - x-ratelimit-remaining-requests: - - '3499' - x-ratelimit-reset-requests: - - 17ms - x-request-id: - - 1dccce71268701c6f0a32795aa967088 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_streamed.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_streamed.yaml deleted file mode 100644 index fdace653783..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_streamed.yaml +++ /dev/null @@ -1,129 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Who - won the world series in 2020?"}], "stream": true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '122' - Content-Type: - - application/json - Cookie: - - _cfuvid=rivrQHfY2JgyNPaGS5BuAQSWVT_3vQbN5A2pkVcwXT0-1681853030671-0-604800000 - User-Agent: - - OpenAI/v1 PythonBindings/0.27.4 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.4", "httplib": "requests", "lang": "python", "lang_version": - "3.9.11", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"The"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - Los"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - Angeles"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - Dodgers"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - won"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - the"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - World"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - Series"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - in"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - "},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"202"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"0"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"."},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-77HaPClCxqCQhWCNKcdWAJlHsnAiD","object":"chat.completion.chunk","created":1681970253,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{},"index":0,"finish_reason":"stop"}]} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7bab26813cf6ff84-BOS - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Type: - - text/event-stream - Date: - - Thu, 20 Apr 2023 05:57:33 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '417' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3' - x-ratelimit-remaining-requests: - - '2' - x-ratelimit-reset-requests: - - 20s - x-request-id: - - 7a143c3472e3a24b2dee24eaae3bb7b0 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_streamed_async.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_streamed_async.yaml deleted file mode 100644 index 15a607ea30b..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_streamed_async.yaml +++ /dev/null @@ -1,217 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Who - is the captain of the toronto maple leafs?"}], "stream": true}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.6 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.6", "httplib": "requests", "lang": "python", "lang_version": - "3.10.3", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: 'data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"As"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - an"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - AI"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - language"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - model"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":","},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - I"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - do"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - not"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - have"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - access"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - to"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - real"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"-time"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - information"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - but"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - as"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - of"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - the"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - "},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"202"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"1"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - season"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":","},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - the"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - captain"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - of"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - the"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - Toronto"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - Maple"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - Leafs"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - is"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - John"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":" - T"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"ava"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"res"},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"."},"index":0,"finish_reason":null}]} - - - data: {"id":"chatcmpl-7CIrjpHzy1lBX552SIFeRg4qC7a92","object":"chat.completion.chunk","created":1683166811,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{},"index":0,"finish_reason":"stop"}]} - - - data: [DONE] - - - ' - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7c1d435d7c64ff80-BOS - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Type: - - text/event-stream - Date: - - Thu, 04 May 2023 02:20:12 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '217' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3500' - x-ratelimit-limit-tokens: - - '90000' - x-ratelimit-remaining-requests: - - '3499' - x-ratelimit-remaining-tokens: - - '89971' - x-ratelimit-reset-requests: - - 17ms - x-ratelimit-reset-tokens: - - 19ms - x-request-id: - - ae37625587fbd4f3417dcd7d042f8d3d - status: - code: 200 - message: OK - url: https://api.openai.com/v1/chat/completions -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_tool_call.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_tool_call.yaml deleted file mode 100644 index c3ed91a4d77..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_tool_call.yaml +++ /dev/null @@ -1,99 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "\n David - Nguyen is a sophomore majoring in computer science at Stanford University and - has a GPA of 3.8.\n David is an active member of the university''s Chess - Club and the South Asian Student Association.\n He hopes to pursue a career - in software engineering after graduating.\n "}], "tools": [{"type": "function", - "function": {"name": "extract_student_info", "description": "Get the student - information from the body of the input text", "parameters": {"type": "object", - "properties": {"name": {"type": "string", "description": "Name of the person"}, - "major": {"type": "string", "description": "Major subject."}, "school": {"type": - "string", "description": "The university name."}, "grades": {"type": "integer", - "description": "GPA of the student."}, "clubs": {"type": "array", "description": - "School clubs for extracurricular activities. ", "items": {"type": "string", - "description": "Name of School Club"}}}}}}], "tool_choice": "auto", "user": - "ddtrace-test"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1042' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.6-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Fri Sep 15 13:41:28 - PDT 2023; root:xnu-8796.141.3.700.8~1/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAACl1SX2/aMBB/76ew/AwIRoHSt5ZNk/oA2hDStAZFxjGJi2Mj+0xBiO++sw0hXR4i - 3+/P+e585wdCqCzoM6G8YsDrveo+DUdVNd9Vr9PF62e9nO/s7I/mZuUL92NFO8FhNh+Cw83V4wZ9 - AqTRieZWMBAh62A8HU0eJ+P+IBK1KYQKtnIP3WFv1AVvN6bbHw+GV2dlJBcOJe8YEnKO/1CjLsQR - 4X7nhtTCOVYKxG4iBK1RAaHMOemAaYhpryQ3GgRCz0R7pVoEGKNyzpS6X5y+e+ZURBoUCnO/+3zj - b24Bk3JhD9Pjz98vGnZ/f7XuS6lP+1jQ1mveDKjFN3i7jSunWR294giWccgd+ALrz6Xemv/yoJrZ - 0tdIhx7oOdOEZDFDhnFGv7ODLMi89CehM9pJdM0+jE18eEIPwhLHpdBcNBqHT2JUEi1xoltjC7LS - 8iCsk3BqdKVlhXBBN+w9XTGu/CZC7xmdVfheZIYIWkIu46EiL04yTZapMYyc4ZKFeWR0nekL/dLk - pRXdz+vr6dJsxlZq6aocl9DFwbbfN2qCeR33zX9ZIbq3OAbIweyEDnMcjCYpa5xPWvE725BggKk7 - /m3wiPjl4fIPzKdghV4DAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 82211407cc544304-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 06 Nov 2023 23:22:24 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0613 - openai-organization: - - datadog-4 - openai-processing-ms: - - '846' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999910' - x-ratelimit-reset-requests: - - 4ms - x-ratelimit-reset-tokens: - - 2ms - x-request-id: - - ad932c1690647aa484d20352135b9df7 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/chat_completion_truncation.yaml b/tests/contrib/openai/cassettes/v0/chat_completion_truncation.yaml deleted file mode 100644 index 7830624984e..00000000000 --- a/tests/contrib/openai/cassettes/v0/chat_completion_truncation.yaml +++ /dev/null @@ -1,96 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Count - from 1 to 100"}]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '92' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.4 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.4", "httplib": "requests", "lang": "python", "lang_version": - "3.9.11", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - traceparent: - - 00-000000000000000076be63f0f4b3fd9f-852a9fcb84dc7420-01 - tracestate: - - dd=s:1;t.dm:-0 - x-datadog-parent-id: - - '9595657652522480672' - x-datadog-sampling-priority: - - '1' - x-datadog-tags: - - _dd.p.dm=-0 - x-datadog-trace-id: - - '8556386228599258527' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA0SQTWvcQBBE/0rR51qjnpmeD91CwBBCSPAlhwSCVivb62g1ymp8WvLfgyBxrgX9 - 6lXf5HySXsbnoY2XdT6kVD7N748Pj/fj+tF9ebBy+nX6XO+/vju+fBBKPb5MY/t7cTfWyzpP7VwX - oYzXaWjTSXqNWYvP0Yxyqadpll6e1nbwd3Zor9djPXS+U6G8bsPTJP1N1mu9rO1Hqz+nZZNejfIf - /Ra7YpRW2zC/RV6735TxuZ7HaZP+200u0/aPeq3zJL0M23be2rC03bEubVp2fyUc4YlAGBGJRGSi - ENoRqoQ6Qj2hgVAjNBKaCM2EFsJ1/L64HeQI5wkXCGeEi4RLhMuEK4TvCK+E3xs94QPhjfCR8Inw - mfCFCDswKBEcEXa3QAQjQiRCIkImQiGsI0wJc4R5wvYRRlgkLBGWCStE3IFRieiI6IkYiLjPjURM - RMxELETqiKREckTyRApEMiLtf0lEykQqRN6BWYnsiOyJHIhsfziggxQGYSgIoHtPMfz1UFK1MeNd - igimNJtEjItucvei7wiPCJ4I12Agggg5Qk9CPaGB0EjoRcgTmghd1fe1e1ijfVJO9bscca0l22z1 - LLvRUt7iz2bX3q37AwAA//8DAKi1IzmrAgAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7ba823104a1b3b94-BOS - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Wed, 19 Apr 2023 21:11:02 GMT - Server: - - cloudflare - Set-Cookie: - - _cfuvid=E1tN4caUu3fcFrU6XpNP4JD4cGywQhBQcZbow_XfOCQ-1681938662549-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - user-f23xvdxbrssd56y1ghcjdcue - openai-processing-ms: - - '7709' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3' - x-ratelimit-remaining-requests: - - '2' - x-ratelimit-reset-requests: - - 20s - x-request-id: - - 58704ef4e831db66d15984462cd9f01e - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion.yaml b/tests/contrib/openai/cassettes/v0/completion.yaml deleted file mode 100644 index de094f6d68a..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion.yaml +++ /dev/null @@ -1,86 +0,0 @@ -interactions: -- request: - body: '{"model": "ada", "prompt": "Hello world", "temperature": 0.8, "n": 2, "stop": - ".", "max_tokens": 10}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '100' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.26.5 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.26.5", "httplib": "requests", "lang": "python", "lang_version": - "3.8.13", "platform": "macOS-13.2-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.3.0 Darwin Kernel Version 22.3.0: Thu Jan 5 20:48:54 - PST 2023; root:xnu-8792.81.2~2/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA4TPTU7DMBQE4D2nMLNiYSQcStL6BOVnhcQKochNXhMXx8+y3SpVFImLcDlOgsqi - XbIdjb7RTLAtNJohuNuq9Gp8Obw+H+6H7W6s+qeFelvH9XFlYgkJ3uyoydDINOa64SE4ypY9JJpI - JlMLrcqlWj4U1aqSGLglBw3TmlOlZ9tQgn6f/gBoSBHJmfH65+tbPIpkbCsyi+EonAmZAySsb2mE - vpNw3IXImwTt985JbK23qa8jmcQeGo58l3vM8qyLG3UR1P9COk3OHxL7ZDqCnhAiDyHXmT/JJ+hC - 4nL6nKpCInM27pIs5vnqFwAA//8DANlu5JlZAQAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7b9ff2ef3f5443da-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 18 Apr 2023 21:19:57 GMT - Server: - - cloudflare - Set-Cookie: - - _cfuvid=z_X6itPJxPTjTduN0U3MMsBzJjHeKT9Fdq0egODXUAA-1681852797547-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - ada - openai-organization: - - datadog-4 - openai-processing-ms: - - '170' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249979' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 4ms - x-request-id: - - 20067421be7baf021bd0bace17858229 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion_async.yaml b/tests/contrib/openai/cassettes/v0/completion_async.yaml deleted file mode 100644 index 6814f762a8b..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion_async.yaml +++ /dev/null @@ -1,86 +0,0 @@ -interactions: -- request: - body: '{"model": "curie", "prompt": "As Descartes said, I think, therefore", "temperature": - 0.8, "n": 1, "max_tokens": 150}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.26.5 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.26.5", "httplib": "requests", "lang": "python", "lang_version": - "3.8.13", "platform": "macOS-13.2-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.3.0 Darwin Kernel Version 22.3.0: Thu Jan 5 20:48:54 - PST 2023; root:xnu-8792.81.2~2/RELEASE_ARM64_T6000 arm64 arm"}' - method: post - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\"id\":\"cmpl-76n1xq0xOyZWMQ8h6FQ89lgWjPz12\",\"object\":\"text_completion\"\ - ,\"created\":1681852797,\"model\":\"curie\",\"choices\":[{\"text\":\" I am;\ - \ and I am in a sense a non-human entity woven together from memories, desires\ - \ and emotions. But, who is to say that I am not an artificial intelligence.\ - \ The brain is a self-organising, self-aware, virtual reality computer \u2026\ - \ so how is it, who exactly is it, this thing that thinks, feels, loves and\ - \ believes? Are we not just software running on hardware?\\n\\nRecently, I\ - \ have come to take a more holistic view of my identity, not as a series of\ - \ fleeting moments, but as a long-term, ongoing process. The key question\ - \ for me is not that of \u2018who am I?\u2019 but rather, \u2018how am I?\u2019\ - \ \u2013 a question\",\"index\":0,\"logprobs\":null,\"finish_reason\":\"length\"\ - }],\"usage\":{\"prompt_tokens\":10,\"completion_tokens\":150,\"total_tokens\"\ - :160}}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7b9ff2f19cbc4233-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 18 Apr 2023 21:19:59 GMT - Server: - - cloudflare - Set-Cookie: - - _cfuvid=LbsGQgt0EhyyM2BTkVBOkV1poQJcx8CC0yWaD81WRRw-1681852799013-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - curie - openai-organization: - - datadog-4 - openai-processing-ms: - - '1241' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249850' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 36ms - x-request-id: - - 50366a767f40ba73d4a84848e615e298 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/completions -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion_async_streamed.yaml b/tests/contrib/openai/cassettes/v0/completion_async_streamed.yaml deleted file mode 100644 index e91485fb155..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion_async_streamed.yaml +++ /dev/null @@ -1,151 +0,0 @@ -interactions: -- request: - body: '{"model": "ada", "prompt": "Hello world", "stream": true}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.4 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.4", "httplib": "requests", "lang": "python", "lang_version": - "3.9.11", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/completions - response: - body: - string: 'data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": "\"", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " and", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " just", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " start", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " creating", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " stuff", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": ".", "index": 0, "logprobs": null, - "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " Don", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": "''t", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " expect", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " it", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " to", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " draw", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " like", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": " this", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77kvdgMYRZdMCSAJnftEdUjBg493z", "object": "text_completion", - "created": 1682083045, "choices": [{"text": ".", "index": 0, "logprobs": null, - "finish_reason": "length"}], "model": "ada"} - - - data: [DONE] - - - ' - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7bb5e83b7dcc4245-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Type: - - text/event-stream - Date: - - Fri, 21 Apr 2023 13:17:25 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - ada - openai-organization: - - datadog-4 - openai-processing-ms: - - '6' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249983' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 3ms - x-request-id: - - 26678171e2426c7e6b03d3b31f04a585 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/completions -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion_error.yaml b/tests/contrib/openai/cassettes/v0/completion_error.yaml deleted file mode 100644 index 97c9c155f3d..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion_error.yaml +++ /dev/null @@ -1,63 +0,0 @@ -interactions: -- request: - body: '{"model": "babbage-002", "prompt": "Hello world", "temperature": 0.8, "n": - 2, "stop": ".", "max_tokens": 10, "user": "ddtrace-test"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '132' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-14.2.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:18 - PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"error\": {\n \"message\": \"Incorrect API key provided: - \\u003cnot-a-r****key\\u003e. You can find your API key at https://platform.openai.com/account/api-keys.\",\n - \ \"type\": \"invalid_request_error\",\n \"param\": null,\n \"code\": - \"invalid_api_key\"\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 84dc406a8f5843bc-EWR - Connection: - - keep-alive - Content-Length: - - '276' - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 30 Jan 2024 19:51:47 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=N_8bL.CIpOrFPgxaMnGudrWqGaGv_J0DSur5Me.KsnY-1706644307-1-Ack8u6RCnU6DolpS1mWWYjMoWVudcy+bq5/eY9DZUV3MoSlgMruJyDgb5V1ahAMM4EVn1u8FRVizsWFbeioDMQw=; - path=/; expires=Tue, 30-Jan-24 20:21:47 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=OrYEyzgeYd2XAs33rEBm98NbcQDEuzOW3QaUri1YOfs-1706644307709-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - alt-svc: - - h3=":443"; ma=86400 - strict-transport-security: - - max-age=15724800; includeSubDomains - vary: - - Origin - x-request-id: - - 2dcfd0b428e319a865fd1abab253ae0a - status: - code: 401 - message: Unauthorized -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion_sample_rate.yaml b/tests/contrib/openai/cassettes/v0/completion_sample_rate.yaml deleted file mode 100644 index 4ccad7865bf..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion_sample_rate.yaml +++ /dev/null @@ -1,82 +0,0 @@ -interactions: -- request: - body: '{"model": "ada", "prompt": "hello world"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '41' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.26.5 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.26.5", "httplib": "requests", "lang": "python", "lang_version": - "3.8.13", "platform": "macOS-13.2-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.3.0 Darwin Kernel Version 22.3.0: Thu Jan 5 20:48:54 - PST 2023; root:xnu-8792.81.2~2/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA0SPMU/DMBQGd36F9c1uRVooqbdOHZDogJgQihz7xXXr+AXbgVRV/juCga6n00l3 - hbdQMP0QFk91+o77/fPOVVX8itvtJRlKJ3tI49sECW5PZAoUCk2lMdwPgYrnCAmTSBeyUNWmXq0f - 6vXjWqJnSwEK2upf5cjeUIZ6v/4FoCD6MXsjOBudRKLeT+IzCcOWRHsRQbcUxHK5FIeu88brIF59 - dD468ULmHLShBSR8tDRB3UsEdkPiNkPFMQSJzkefj00inTlCIVB05Yj5Q2LM2hHUFUPifihN4TPF - DLWSuH3902ojUbjocCP1PN/9AAAA//8DAJqFuhw8AQAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7bcf357ae8860f3e-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 24 Apr 2023 14:59:13 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - ada - openai-organization: - - datadog-4 - openai-processing-ms: - - '112' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249983' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 3ms - x-request-id: - - 7fe9234d4f9e911154bc0fbb3700bf34 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion_stream_wrong_api_key.yaml b/tests/contrib/openai/cassettes/v0/completion_stream_wrong_api_key.yaml deleted file mode 100644 index bf747194d4b..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion_stream_wrong_api_key.yaml +++ /dev/null @@ -1,57 +0,0 @@ -interactions: -- request: - body: '{"model": "text-curie-001", "prompt": "how does openai tokenize prompts?", - "temperature": 0.8, "n": 1, "max_tokens": 150, "stream": true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '137' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.5.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 - PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"error\": {\n \"message\": \"Incorrect API key provided: - sk-wrong****-key. You can find your API key at https://platform.openai.com/account/api-keys.\",\n - \ \"type\": \"invalid_request_error\",\n \"param\": null,\n \"code\": - \"invalid_api_key\"\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 80599159bdd94288-EWR - Connection: - - keep-alive - Content-Length: - - '266' - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 12 Sep 2023 16:36:09 GMT - Server: - - cloudflare - alt-svc: - - h3=":443"; ma=86400 - strict-transport-security: - - max-age=15724800; includeSubDomains - vary: - - Origin - x-request-id: - - 912bc0d688b018590ad4644213b9c72f - status: - code: 401 - message: Unauthorized -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion_streamed.yaml b/tests/contrib/openai/cassettes/v0/completion_streamed.yaml deleted file mode 100644 index 6c598349ee5..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion_streamed.yaml +++ /dev/null @@ -1,160 +0,0 @@ -interactions: -- request: - body: '{"model": "ada", "prompt": "Hello world", "stream": true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '57' - Content-Type: - - application/json - Cookie: - - _cfuvid=rivrQHfY2JgyNPaGS5BuAQSWVT_3vQbN5A2pkVcwXT0-1681853030671-0-604800000 - User-Agent: - - OpenAI/v1 PythonBindings/0.27.4 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.4", "httplib": "requests", "lang": "python", "lang_version": - "3.9.11", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: 'data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": "!", "index": 0, "logprobs": null, - "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " ...", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " A", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " page", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " layouts", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " page", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " drawer", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": "?", "index": 0, "logprobs": null, - "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " ...", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " Interesting", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": ".", "index": 0, "logprobs": null, - "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " The", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " \"", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": "Tools", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": "\"", "index": 0, "logprobs": - null, "finish_reason": null}], "model": "ada"} - - - data: {"id": "cmpl-77HaOi08g0u94sH0MNxN07pXHBJ2i", "object": "text_completion", - "created": 1681970252, "choices": [{"text": " is", "index": 0, "logprobs": - null, "finish_reason": "length"}], "model": "ada"} - - - data: [DONE] - - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7bab267faac73010-BOS - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Type: - - text/event-stream - Date: - - Thu, 20 Apr 2023 05:57:32 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - ada - openai-organization: - - datadog-4 - openai-processing-ms: - - '6' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '60' - x-ratelimit-limit-tokens: - - '150000' - x-ratelimit-remaining-requests: - - '59' - x-ratelimit-remaining-tokens: - - '149984' - x-ratelimit-reset-requests: - - 1s - x-ratelimit-reset-tokens: - - 6ms - x-request-id: - - 02ae3cd575e6645db262fdbeac9f6592 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/completion_truncation.yaml b/tests/contrib/openai/cassettes/v0/completion_truncation.yaml deleted file mode 100644 index c826e1120d6..00000000000 --- a/tests/contrib/openai/cassettes/v0/completion_truncation.yaml +++ /dev/null @@ -1,97 +0,0 @@ -interactions: -- request: - body: '{"model": "ada", "prompt": "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '59' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.4 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.4", "httplib": "requests", "lang": "python", "lang_version": - "3.9.11", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - traceparent: - - 00-00000000000000006c5f04125c7764b4-5d77a6a1f142da39-01 - tracestate: - - dd=s:1;t.dm:-0 - x-datadog-parent-id: - - '6735034982223501881' - x-datadog-sampling-priority: - - '1' - x-datadog-tags: - - _dd.p.dm=-0 - x-datadog-trace-id: - - '7808964755790980276' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA0SOvWrDMBRG9z6F+OZbsOL6T1uXbiVThlKKke1bW42s61pKCBi/e2mHZj0cDmeD - G2DQz4t/rKrmdQzDi2TPXXV9O/G5PJ6OMR06uX6DIN0X9wkGiW+p7WVePCcnAYR+ZZt4gNFlrZu8 - LouMMMvAHgZ2sL/KJK7nCPO+/QVgQEprUvpASuek9BMpXZDSJSldkdI1CC4MfIPJCF7GZZUuwoSL - 94RPF1yc2pVtlAADz2FME/YPwiXakWE2LKvMS2qTnDlEGN0Q7tt3XBKSJOv/SV7s+8MPAAAA//8D - AKIxLcsbAQAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7ba822f51b3f3b93-BOS - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Wed, 19 Apr 2023 21:10:50 GMT - Server: - - cloudflare - Set-Cookie: - - _cfuvid=ByzP6Ns2Q96ZDmmfvVjIwvydOCn55ADMlJargXEF6ec-1681938650684-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-model: - - ada - openai-organization: - - user-f23xvdxbrssd56y1ghcjdcue - openai-processing-ms: - - '102' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '60' - x-ratelimit-limit-tokens: - - '150000' - x-ratelimit-remaining-requests: - - '59' - x-ratelimit-remaining-tokens: - - '149983' - x-ratelimit-reset-requests: - - 1s - x-ratelimit-reset-tokens: - - 6ms - x-request-id: - - fe476b17ad579c2f9a4cb629e0f5a8af - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/embedding.yaml b/tests/contrib/openai/cassettes/v0/embedding.yaml deleted file mode 100644 index 3f1a7d83a64..00000000000 --- a/tests/contrib/openai/cassettes/v0/embedding.yaml +++ /dev/null @@ -1,180 +0,0 @@ -interactions: -- request: - body: '{"input": "hello world", "model": "text-embedding-ada-002", "encoding_format": - "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '88' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.26.5 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.26.5", "httplib": "requests", "lang": "python", "lang_version": - "3.8.13", "platform": "macOS-13.2-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.3.0 Darwin Kernel Version 22.3.0: Thu Jan 5 20:48:54 - PST 2023; root:xnu-8792.81.2~2/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/embeddings - response: - body: - string: !!binary | - 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 - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7b7cac9f999b8c51-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 14 Apr 2023 14:35:16 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '177' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '999997' - x-ratelimit-reset-requests: - - 20ms - x-request-id: - - 55063999463e3fa8edefdff40696da1c - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/embedding_array_of_token_arrays.yaml b/tests/contrib/openai/cassettes/v0/embedding_array_of_token_arrays.yaml deleted file mode 100644 index e4c45f73fc6..00000000000 --- a/tests/contrib/openai/cassettes/v0/embedding_array_of_token_arrays.yaml +++ /dev/null @@ -1,390 +0,0 @@ -interactions: -- request: - body: '{"input": [[1111, 2222, 3333], [4444, 5555, 6666], [7777, 8888, 9999]], - "model": "text-embedding-ada-002", "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '135' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/embeddings - response: - body: - string: !!binary | - H4sIAAAAAAAAA1RZyxKqvJaen6fY9U/pKgGBLM6Mm4iACYoX7JEoKqByTYCcl+/CXdVdPXGAUJBk - re+2/vOvP3/+qdIiu/X//PvPP++86//5r/na/dpf//n3n//+158/f/785/f7/+7MPml2v+ff5+/2 - 35/5956N//z7j/i/V/7vpn//+ef62ubMjpgXVKVfH9ACIonhIlFb+khGgCu5BmzjZdd0iNIUNFtc - MxaoTWFzXl49UMzWx5xuy4Kbx9ZB5qU9UVQUUEyHMkhAOjxeeHQ5s7v6/tkDetgp8ZbdrhhzvsZw - QQamyljcUz42VgKX223P9hy/7B4tCgGuabgkWzh76XOJlnvYfk93FpBgkXJ9XWngpvseo3gZp+Nx - PZTI/lQncg2lN+cfJDfwyGWVPtFrDMapl1xU2seeONb7hfhJDHzwp85lu/4qxTTbigBPM5Gozqoa - MXsTWVCTjcVc+bEMqHnvBRDpfktMlVUp9RNnQNZT32KY3A/qzQe20KO3lhQF4iYYBWeY0JNMa7aR - D2JAJ92PkOOKC/o1dk3BF6ZSQb6+R8w+uELMsFMnMCaHhi6mIwn4wksz9Clpw4xJ0m02Dn0IDt71 - DMf7VcCl7KVp12LYkNCItvb0NRUBrqwU8fQ80ba79JYIAc5HujBzP2XP8vyE/IqfJHh1Y8CzohOQ - M26/WA7CG2fRaROiN7OfzLPB5NOa5hH6rRdPUZgObVXsoTNojZ9m1QdjsxxuqD0dTJIyhRTjV3Vz - 9N6VHjF6pvMhXg6TTnafLW7KUk2HA+E3WN1yj3Ie24hrZY1BxdzE2g697WkVNBX0e5wx6+QTPhwI - usFKVgY8actn0NdO8AFxvTGYs2/leNqwgwiX4MywooaQ9pVeUaAdp8QY9ve2kgto0Mk6p1SrG6Ud - 3ff2pM37QfzvYLVjUNYy+JonMo8Z92KsDooIay95E2fzPtsMoBAB6d8z7rAso3fOSajlK7FgqwpL - vAr7cwQLrfHYarUt44lIBx+2dy9jgRH46RQZOwzFKz+TzYhFxMtkYUDA1wkJw0Wbjv3rKiCpNyay - IhcLiYO0TRCGdUeCXz2bD2zA4uaGxH3FdszvQX6ClawNWDrf+mBA+1ZDH9X5Mot6Jupf/vkA7k29 - EuvzsJDYqEmOymcEmC3Nwq6CdHlDnXU+sfBO62Lob1EImliJBG+eI+raXYwXRnGz2dXbjHwiVD3B - VMsPYtlkj/h5YXgQ9G5P0UnM0i6nzg2UMrmy1Xoo+HSSCozkIThS8aUf0kFCDoWKChfiyfWtHR/f - c4WEhhuUi5ciHWjRlwjfiwEvH2TX8oUX36AZpBczpnTHp7S8ZvBYhjLzRFe3+8ybsO6M5EuwId4R - D6swR2z1qklmGN/0Vy+a3lkpMYpNzAeq6RUIz6/FtoGAi1EVxgSq23aDl+fwGzMchCGKKsUmISvW - 9jBJCwEt7p3KSDzyoJMLqGA+Dyr0ZZJOwfrx1PpLHbJV3cr2EB1GD47PfEW2DzCKaS1tXbS/fl7E - fhxHNJXvmwtLvsLE9aexZUdnyHSzSz7Efkq3lirKwlO8BXKIowtDMeghauCa4iWd7hxzfgziPayQ - 62Bd0NZocos+QtrJVej4bM/2eNQ/Lsq/tcosP3MLvlcNUacud5htH45FDyqiAKqTM29xjNoBTKEC - L1wEhHRS2XLzE530GZ9wnQ6K3et50UAcv1YEG8Y3niIZUyj9aIcV33u2PBJUB7J3bzJnlXeIbYTG - gPfGkhluvn3M1dhM9HrICCMBrdBH1S8nMO2mY/7cfyx8vTro8mLB/BHMlD+35KYA1Qribhm0wyYN - FeC3ISHueV0W/BHeFHTukhfzb2ubD147+SCf0ytd8KQMRjdr8l/94xafPTSG8qaC6JC7VD6UK1sy - 90YCF2gQsbSlEdDH4BuA7lfKvOD9RFP3bn2oO3eHhYi9i+F7QxThM2PMcN5JMGZj4yC15B0VnpJm - 91p0idBmGSI8ZPcF4vIWKliO2QtDLlZoel3KHNqCX9m6TqN0/Ko4B5+BhKc1+vBxBfcrKPe7ROwq - Q0VTjUEDwuli0+XWqPhoDb2M8GbD2aZ8yAX94ccjqTQSlGTgU/fwTkgbHk8sv+IiHZfOi0J+f2h4 - OTSOPcQ9PSC9rz281OS8Zd+Slui7XIbEkkaDj8nVB6RxY00ux23Sjsv+UmoKLRPmdNLXnq5Dn6Os - dA9YONVpytdpc0V03HTMQK+dPTnGu0Hc+lxp/nlYXHLX1wzKl1oT7Nm7gr+bTITuxGIW3D4j/5Sy - edDqztmR4/m2tdn7vgtB2ovizF/vYAgFJ1ecNATileLD5ivf+iCVLhqyWSGtGDeDqKi3VxwzL935 - 9mRGzwPYwVHEE5x9NKx06QZmYtTMunPKx7Q7HhDeBJwFLCtTXpoUEFonDknkGorvc7u+ofSi34hT - h1XQprvrB12qvUAwi1/pIMfrBB1OmUBc19WLQc0EgF9/qHG/5Rw7r0R/9U5Ftm5W2lyXUfmrH6q+ - PCOdlEOdgRfqAcF3hdjTedtrcEenC3FX3T7m94QBYpmjEfNzfdpdpGIRVHc7ULSli6Dy9Z2AgrNr - 46PtEM4dJacIv1SKx/vhidiHqgbcDySkklJUfOLd0dIkJ1KYfykde+xOdwBt+/rgRcvedjdV2gFU - NajxW6+9QJaeJuhndalhEZnvdjhsogZWJ7qmewpKSl/NZYIoEETiv7aFzca1foBsoSxoNfPjXF8n - FH5rgcJp1RR8q3YnmPsTv+fz5Z/YHaC7vQ5Yq2QrmE5Z6qPDwyLEq588qBen5APB2bHZfZepKQsW - h49mLCKKF7DO21ryLwAXcdVQbh+kthYcZQCIDhUzsvuDj6CiDkraYLYJGrvl0+Xu//gIS6FcxGMm - fDv9Ex164ux3QcBaUzYg2b8lKnj3Gxo6/twDWZZLZpwMP21I+dFA+dhr3G9Mmw+6G4l6u55WdHlh - X5t3pe0gl2Qm8ZvYSsVfvc14Sqeoecfcfj4d5IsHjutX3hbj8SBjhGI8MLLDccFe0vKEXt/oy+yP - MKAh7M97KM3eIPiKyqA7H40QTFVa0MWPb7abzQehdDLxD7/ExLkK8Kxyi3bKftU2xsK4QTzcDixr - vn3aRd0GQwunFmvTKSx4IkoUVYcpZcHyRYsZLz1Y3Z4eCZX9qsjWq+kKRcnHHz+iOoTuht7b0Gf+ - d8hbVgbqFVo4tMzQMrC7Ro1ymOuduTwPg9E0Yx/OdvWl3C/qdAoGkvz6ixEzb9JxXw6abj0XW9zH - 3207aFqNURhUNVkRjoNJepoCVKLukOQi1nzSjjcLbS3hiatZv439V5pAkj4OMbylgYadYyuQgy1T - vcn9dtDvlQL6ucpYcBKzeFwGYY52dtTSaiUvEQ33hye8+DrG6vJcB+yuSRZqTyeT4G9jpcvejTB8 - /IPFTJcTu8tPkKDl3SmYQ2ibsnz9wLBJmgVWwvYZ982xvQJojNBL+Ti1409/zvhMfvqU5dk3Ave8 - ujDHWmyD8bvhMhhL2WBOteH2MBr+DXwyhMw9I2SP5GKeYCvoIh2hi+MpcsFA24wHtK2Qw8dXGn7+ - +g0n9GQ0PG9dg+634c5ut90mHsLnpVEpJhPzFw85oHc4uvDeGDIxpOSGqudpI/74iIX9deKVmCwr - 8NNSYVZ1Ufis1zP0fsOKYGuX2eN4O0bIa4s187p7FkzQnxoYFN9k9j37xJN0XDyh7qlAXMGTf+fv - gWJYd+IflCgYJ6E5wEWIK2bwzEXdyX5e9WwdrEiwpQubf5BQIW933Mx8gmJalHWO7OOLM5MXddEp - JcNwC9Uj2xpHgsQoTQWY64Hma/RB0wmwhe7ocCEWhSSdJrv3YOf3F3pZrUt7eASOCO/+yvFSiQt7 - 3L5vCcz4RNar8wbRpk2vWjBmLfOMU5/SHKkfrbLMABdyhDlfjMEB5n5nuFsnQX9uFAxDDxa5DmoX - 95PQnJCVvzUqj5cl4nEVf+ARiph5F7FGw0tQKbAqUkkYvo2Ak363B+a5EXGsRR9wQ6+uMFzKFa7m - 91dKyUKQDvcXW8nGxp76ofIAjUPHiFpaaK7nJ+j2/oW/dF2m03i4JshwlDVdrsZj0G+aqwuNm6nE - G4t7PLVykqBLjEyG12c9HmzdUmDrvLdk439xy4th7UKmZDu2obuacybfM0WyqoCEy8+Y8mWiNjDj - F1vN+MndSct+/pUEX+mdNsLL/mhzvVF0C912umcNRtQXElwz2tj0xIxEV+gnYe7Dx+ivPuukmBDD - xC9e6SGv4L2+bhh+IzUeFkb1gX4fZsSS38t4StgkaPYgH4nx7uK2KVrngOJzd2FGK33RdDoPJ+05 - dSaWdCObn39+IGzCN3H35jsd34IwIPngGRTW2yUabLsfUEkrzPZv+RJwr7cwRE0+4N7NymDGy/Cv - PlR/+krYoCcqX6hmmBiQMlc97sGUyzdzLfZNuby+iOjQiIhOBRTBcIo+Boxd92UrqynbaV/z5scv - WBdXj2K48HcDIuo/zK6cKC73xFNgdnYEB/Un4O0Fu6CU1yvmm+chHQRmUKSYtU82cZy3/ev1TdQZ - L/Hn/GKcl8nSgBV0I/MG5qI+2Rw7jdXoQ/7q5/m84KB/AvrTg9P2vstBqP2YWLP/5/qB5mjON/AE - 48me1uirgLTEI3ELOeds5fufn79k4Wo4t7/61Wf9hZX6ye26egk32GvcJ5vAVNGwPxYUOrSOyM9v - itFLHlB5Zg2V9+Y7niRPVUAk3Y6Yp4cSt69q7PSR8IRe05QUg3WVZMiE/Z45L/0QUys3fN2S9SVV - 80WLOr5+yJAsXjbzjt6Rj9/OUH77y9bb68Hm+ygRYDG5S7ZWepxOS9usIPjuOwp3umnH0wOFoG9v - D+aS7N3yWnuWsBRUlaysxin6Kk0rtH9+Q6zEVRt03nQAyHctYUF8r+xOM0NXy4XPnd7Mvo8HE6KT - bg/ikZ7nvKaKDqoP7itO6DBJepCzpZTDTz+nHhaLckq2DpIPvsHMZikV/VNZZsA8J/rlC+3wvXEK - 3VX7zsbUL/hjv6Sw+GoKMZKisWm2BQFtly+XBPUxCmorTDxEBn/DZj3cUnJ+RYBPK4ttYYzbn3/S - zGJ5ZJvLw0xFVSYGkkJ5g4VLmNrz93rQx1JA6n20badurUSQYLIkK6QJaMy8KYSHsiyIfxFIPNB+ - sMDMcUXWmeTG4m1xxJq2LT6MOI9jOizOQ/XLK5gtyXa7NI+ti46BXdKXtU4D/lhpjoYNN2HbyFTt - JjIuGC41akng0g2qlVt3ghur3vN5lAU/1thD7eNyY7/3dV60VmDZFIAL894Ek3fXLZDPlysLFySK - p71WaarztStiDdaZ06g2XX3Oe+b8CtAwuu894tXXIfgolYjfzYeifF9yzlaEU5ufT8keOrSK2HbZ - ivZoJm0IRaKvSDjaO87tZ+VAISwYff/V1+8pBOUapsQf42Ux74+BZn7DfFhrLdty86lvQxOx9epc - o/aXNy71Xcg24VDY4+v1vQLmxo7N+QrnVW1MelR2jCUzfg9yTBIo9LNFvFlXdXhUM/SuyQPzfA+c - fc9PgK1LNBZkdz39y7/H+CPjL98W7bTovI/qpx+FVj9/r7uJiLRK9liQavdiEPcHEX56X3kcxHjw - bGsPq/zJmbuW3HaplXUIw/E6khDLMv9+YneCwt1KMx7zopukJUB5cnS2qQO/GPD3a0FqnVbMpdar - mDjOfWBPOcDnWzcFXfi8VKBu/cPsJ9fB8OY7/MN75s541hPv4MBDkQri6cqQDq2vXGHWi2x1eORp - ud2YpWZclZEOkdYG403XfagnF7CiZ++g2vmUorkfycEbjZaXwZho/COcmfk+t3ab0L0CUihumPkR - g3g0zdSHTr0V+NVqzS/vE2GS6oCEZr9NB1+/CKAW/oJ5B+q345uULqjJwqB6/O2LCU7uB+5e8mR7 - +X1OpYwcLTjuYEN20dtqh35l+HB6uy3xBLRK5X5pgSyEW4f4txcJlPX3DDDnhcQ6Dk47PttR1H0y - hRRl9t7upuyrwLbSfWa6FxtN2XrvgdReV2zrZk4g9VfFh40TWyRUuoEzZYAIVc/3mvz2f87PQ3CP - Wfe3v6QEEgudiGtgNJlOwO/JVwDqQ8J+eqGTxFpD22XhUsDWMx1rxy4hSS4yWY2Ho90R+3KA6vld - U9Qk72Cycs+HvYtLrNRaFg8o3Djgn9OSrPzYLqZmFEL46dMgEGt7Ktpw9udnkQrqw7ClvOuu8PLP - CS7XrRlI7nt1gr9+LzVcvpzzID0sk/KX/xQjeXSe+n4LK+b5eYA6LCwc7TdfQEVxa/k4vMNfnsrW - sk/bQXY3AyxPmwXxHnRRdO+8FUBE7MMs8fAs+EZoLDh+Di6JN+4m4I/woMGMz8T4uBkfxLrU4EqS - gAWv/YqLxUu9gvFwV3Qiwi6gy013g5TwO5XX0qfo5LAr0blYRlTmnsHlFOW5/hGUimbdYCJx59NO - W/vmnthyc7X7bGxcRFfemdi8Z3azlrYO0uxjRfV4a6WDOJAOXpV6IKvrJbHnecEAs979+UGb7xdt - g5b+Mf573sMgrZK//elfBJYOv/yAbEPC/IB90lE5bZ7qzMcMq2oQL7k189FDaImdoU8xVXE0gSu1 - R+aQwzOQBufagIQzmbir/dqets3D0yrVT3B/XCsp83hvgG0GMkW5C/FPX+jupTEYebqfdOCGZIHa - n3Sy1YOM9796rD/7iJmnR5IONU2fMPcD+/nxKdqexL/+fnHXRzTnH7Km2eeKOTxxC0k5mU99sNoX - 1Y9DHvSCGNy01+F1/un7gJJzvQeBwoHFM/9IwfYyoZkvKH2aRct/85M+MR64PvBt3BfL11WLdovH - PH852P29J5oW7DVGNjvZimlQbCY4OYpFxXk/xtg+XWHGTwwOvOw5f74BPmRHEuTsE7Do1hko7Wj3 - y2fRsESLCC35GjMnsJYptf3BgbV3fRMbrDydPjJS0FXxXGLrD6ud1y+rTbjXiIuCNuBj4ydwE/CL - OcnyaM953AdOalbhqWtfxZBx3we1pRGz53mJ5D3ujiqu8hg3r61tS7fl9YBm/U3F0Dshqh0Phubs - 65Y5sH4H3U6vDZgW0mb2b6eACY8ih3n9+DffqkyLY5i/nxC8q4rR87YGun/ghgW3+CDJNFMPgvZm - 4EU8xvbUtHGCjjthw/z9cYjHJYcrOIoXkA2jvj1o648GJ4NS4kvvZzxiGUKg++9A9fIip+PjejXg - OVFznn8E8eB3ZYc6ti+Jf1sXfCh3jg/1TonJKRuKgjqaNcCjTXyyyd/PovM5ybVKXDhUrEPP7sT9 - TQZykL5szUqnmJabMoPEhztL78bdnnRBuP3yA8wfx5FP2DUzSGR9wvy8XxcyQQKgUdY+uC4u54AH - p65Ty0MW4TiZ9vGgmY6DdAdhslm9SDz0twSj37xn+4BnO+ZdeYVEOq+IDbe+oPcsD6HIuDv7zW0s - Pz2HAtoYI8OnGqVs7exP8NOXM34gyTPzv/hJ7DdCiJ9XrfXzfyyYzNL+zQeg7643+tbryh49s8Go - eRg++/ENr4xEAQtvgVjmtC8+sDFAHW7SY64/Kx7aqo0gCDWHTjaZULUnnqY6lw/B2owX/N2cROgv - bcjWt/0HNY9kFCDs74u/+qZZXncd0s9NRvzVZ7L5R0pFaFckw2hMtLiivWLBQyo37IdvEz86AlyO - BWXk/YnQtC8SGV7G5krW6vrScjHuNHRYYGXOv9N2HPj7b77IfL3yW2leH/z2/70/9YjG+7YE4ZTa - 8zxDalvhUTx/88HZL1nFdF7bLkQ7/TH72V06pY2+B1rQmE7z/Gv86e9elSS25l+M6hkv4DdvmOdf - 7XSMT57OrD3Bn/bxQnzRPJ+66pIBLzqpLNj5FO0h2EUWcepPnEodQb52k9qICnALgnH67vfIXMUX - tjqo23Y6uskT3lvsz3xfFrxyEYUhHhy2fctyMXZKa6BZf+PBrHq7TuKnr3dPdc+C5bqI/87jlJfE - 6f8AAAD//6R9Sa+rQLLm/v2KUm3dJWPAZPB2zDaDMxk8Sq0W2NgGG2OGTCCl999b+JRavXir7u29 - OjqQGfFNEfYRvbOTCS1zLETWuxeu0lxB/FQeFFhOlsT0cNmjeZ6a//IOZll217JvJHcw+2G2u110 - c+VdutlPlebMb28+HKbtQzHEpcS8ed46Ojs1hn/+tgL+63/8P2wUrP77jYLbbl0wWy5yc5K98wAn - SR2w9EipyTe12al9BRmzI+vdjlXj7dGUyBU7HJ9mKXFUX6EoNgS3+eJljur37CGqiQ7zXX1KuIV7 - ATRr42O+OjCfu9VagefpuyBOWIXJmJOPDPpGeBC/cJ7+sDAVAWzYf9nVWuYtzz9RAWSztMlmU95R - VwkHUdHehcDM6pGan43Bc5D9WGfm8rT1pbtU1/DZSzFu4rhMxvrgBnAaLhP9vKXO7F+vZIL7TsBs - l0z3ko6n6wK4F1oUCJGTaWtUZ6jNeiL5+676o19IFaQp3uL+mwxmF5bMQvenrJPg6ArldHUoVr5a - FxD9uvD88W6TI9T2WSZBJX19en9YFuzbkBKLp6jt37JpoZWUlBSaXcWHSBFfQNTrA7f7x7cdFl/T - UhNK9ljggYKGfbZX4BA/QtqFipRwd1toUJqFTCepK9F4qM8y6Lf6TCxUrsxxZx4UwMobk7/7en7t - CfTj4sbs6PHxeaoEISyXmwPxtebss+ztb2E/BC+m+QjzlREPHnq+zRXbrtZN+Y0r7wGrVXljhFAd - Tf7VCkHaPDoqvYJdNsiuWMN+/+LEc/ttQu8Kn0BZtSeipUPJx9iPRVXkVwXzbhDM8eA8BJBWuUsb - 5+1nAtp2Irx2iy190uODT/xRdkjXvTcer4vGby/3/QtsYWhxuTzVPh+0tACnrHym7z+Ei+l6GYA4 - UgGvO1FJ+o9+UeBZcYSltxT44/uYaQg0q2bhdWf4q0gwY5jwYiBu+wHEJ/cb/+qBYEkOE7Fk7hlK - o17hlUGGlm4c5wXW2aT4lK0mRD39+kJ5WxTM25mV2aXRIAM2bg0Fa7zxj61aAiwPu5btzu+s5Ol5 - j9E9qTeEKIOMuuyrnVWJQE/OeY+Scc+iEPrL68V29/upHUEKFSiWN5t4GOxWam+9AI7hFXTBmMh7 - Y9Q0tf2sJ7rU9MYfZZYswBr8hPmk78s+ktorFKKvE+KgyuddLwDAF2JymexTO2rt5QrU23ps463V - cgxL2MJQmx3+3Kwwm55FnC+9Zisx9xUtsyaLnOHv543LWeJD+NmEYFePkTh5WrdcS+4CHC6BzwwU - GhnXg3uOSt8SmZ9EgTmVu+gIeR/WWCx3r2ywCiUAyZ4qoi2dZTbyRgogceyBGX3j8SF7PwL4HgsL - d638LsecMAWJ9GmxDW6BDxsIHfWSayONWlzyTjn2L+QeLwXJCMJZ19RtjvZy8ybO6/pENCKapZLv - mWIxvhM0ajv3hZT9jjIif+W2ix5YQZdlnhI9imK/mfEALa/8y4Ly2SbdcZkdkXvMCqrOeME2Br9C - UY8eFgZpzSfn9HnA5BSMbCh2Mt44x+N67meSyKTNxml1mn79yjSdJCW/3K8VOErokHha1+b0TrUY - OSdIySbia85bpNK/94d+U5rc0781+pSbgIJV3swpOmo53KA3yLYwL+agnQ4O7PXMYtv17euPaqzV - cJHkK31+N2U7LFeKhrq23TDPCpts9L5LQNI1f+Klpnsm85UnVs8r3cNFs+9Nbq+7Rr6tfIs4ViuV - U4hCCh7kJSPGtskYR48rtB+dYaYs1m3v309nmFhxxCN9PUtuxliD8UVMZkdxldBH7O/RVAsZC6pv - nXSpJz+gTUvENu2+MadpChql4tmXGJJitRN/+TI4J+vENPfcm0O2CY+QmLcPHTfrzOTWe7WH1Vf/ - Mowa0g79dbSQa9kiccgp5m9Ufl+IJC+ReW7kcHa0RQohNRxm0mxCE550gKWWiGxzrFYtv2TCGWpo - LkTL90U2mELiAQovNgvi99EfmmdrKSZkKtMCaMvhiJCH+p0z4GlHFtlwTH3rx2fM7UQlGyOpzUFv - NcLI5r3NRm3vLkC6Xp/kOqyLZLgs3AKG1aVkrtkbaPL0fQXny+VCa+AOH9LuUal6XmTMlRzBnO6L - bAETtnri3BYfn31PyxjNAz7ixXGZTRJ7amCna41YpvvJ+teDv+Cwe6XMudqbdtQdHQOKki3RTuKm - 5KcL1WAM3YgYuZ+0Uzl9KxiE8oFTTC0+nJsYw35fcdzOfNx17uzYN0WHr4eem/XRQC/kfR6UpPp2 - l6y86j4hIMGLxML23U6r73SFerrGzDk/v+bk6dcKkH8nRMMr3xxegRQoqR0nzDc2R5MJ8aDB55qF - hEgilBMOLzJ4Yt0S29AZopO7D8DJmwOxyWprdukhckA/wo1pFo9Nzh/DsP7k7pHsHg8hGeRwaSDp - dnzRpSxdsim3r2cYp6tKdkflWo6NWcdgV8VI4Xqh5ZSqpxQuuSIQo9nv/MHaGgVSFpszMR8fpfzV - G1Ias8JrvSra1iujTj0tS4qnKz2UnF73GnLex4j5mrZCjVe9RDgwxSGbs8kRy+1nDofP1aaSODui - n36YNulE5n5Khvp+7SAfjxlWadEn9JbcPOTk9QGjcqm108W6C4pzWqRkl7xyzn1J12ACecdu32eI - ZjyO4UUoxij162QIPySGnfoUZjwfkoleMaBYkkQqoPGApKCrr0izbJ9Ywu7U0lm/wB13EXNH6cg5 - PXMBSbUTEzxJHA3LU7NFmmpNP75FVBgmQenNoWOb2yPio3E8H+E6ZgzDxRwQ/9Wnq996uvzVP7Iv - FI3jSyHbS577NLxpApyjVcaIrnzbIdQlA25P9YAVF7nmQA8yRQlTUxb88O8en89KejnabHM2EzT5 - B1MGqQhTEsz1yNwmdtTPogPi7+OaM1VxQA098YSny1lC9TLz9sifBIMYkX4rh2VeFKp7dmtmH5OC - /+oRSYl3Y/oRBtSToKuV5bO/M83ccnP4dn691p+dTxUlULO+Gr0O8Jr5tGbfsJwKUZ9AX1o6MdYn - gw9lugSl60qPGdNtnsAlty1Mz/BGNOsdZWOR9wHSvfyLFxVk/lCf93tAwlViwauozd/5g2avImah - 8cDzR+wfAcTcIfa+tkyRuNEDzfzPLHTYZ4Ot6FSFr0PmDago4Qsv91C9E9d0OAXvZPju+PDDI/oZ - Jwvx71QBzHiGBbE4t2yk4wOF/dYkO7oP2vG99K/r8SgFDIu7qOX8GAZK/4gfzJUPUSsWojvBsMpK - +hEUHUk/vocyPhE7KzR/VfVzwta/B6Ldl7opCnEDgEaB4sWzV1FXptICwndl95A/KBqPaeipQPCL - 5uuSZePrwxfgu0JKcAWZOdEznWB/PK4pfJeVyQN8fsHvvolSnE0h9ncTePjp/PSeOcnPRwiHqjJI - YJWqSWd+QZOIY9wslmt/ks1zilaqnRHPMr4lXz7fNcyRJF7Jw4IP8YEewbpJFV1lg/bv52th9cFS - PW6zsRbHEPZy/caCVtnltHsqAlLKQ0unGf96be8CFFpbsc2+P5pSnd2v8NP7aDMJiEr79R7Nepml - sWWU/XH5SJG9sBgLmp3Dp9fyXCBR2a7YTd7avvCpDg5M6hQye5Pv+J+eUqTshuVLlyO2eZUF4Oj9 - Yfa2bzN6O672AAt5w24rXKNJfmtXFd2fOvOWWVp2Xy+pgIjTmxZlOqCJMTFE+kZ8UKr1mi8KR9+D - u53umPGSiCkk31sN17U0kE16FvgYiFRGIF4dsr0Y0PJvuJAV5N8I8x/f0h9//mq+X+LkwYdPTBQb - ZWzkBdl+rFXLZv2u5HojEwsdhKz/3J/Trx7puF+FLb9LjwawtRuYfn+2aBIk9Ncv7Kfn/vTrrN/w - uL8Qn25cOqFl8SmI59437ViAaiHrmNR/9yPdBS2H1ep5Y7su25l8EeUFyr0FEAPlpineF8kC5S/h - w1zb081pCq/V7/zJdnQw4mP4bcA/HjELyqRpp0gIj+rSMIGKznRC3czXUBrNCg9+j/32509qvj+Q - TXeo0IB61YGKHUTiDsHZH41juFct7ysxex8ULbtfwgFVU1nh4dY8/Cn/BFeY+4FZlvcye2Vsjuin - X/TN7VJOt/Ft/PwO5d9UTCZ6Z56iqc7EvMV4TibhaG5hlX0nrKyHDI3SvvvjB7rcCjaXps/o/ent - XVtHfhM+vgYsX6eaCj4tkun13DawKg6UaPpNSKYormPo7WLCfHnamlPprrfgHXYGXhTuMuuk9eeK - Dkwz2WnWc3zc6yLM/MWcqizM7kSKAt13IqaL5rEuR/0xKKr9oGv2h9fTZ9yiw/m4Jf5jp7cjhkOO - 8mPVs81b6vyB+aGnfpavJTFWb7OULPwWkL6lJRbsVcGZfx63yp8efEeQMRbxK1A33hDbE/yWN+6i - ULo8CpnbrtSyV30tBjJYDdN2XpDwVr49YBCTasbrquT551IA7Lcpncp04N1Pf+5H50OnRaX5gs31 - PVxcB5jzLN7t5FnCBJJQOYTI0iUZy50V/vKKn381+3BRCmjWZ3SpFGef/zZCSh/WuK987tf77Kqg - 5PO8kH3PAE07swCwoxcQ4wxiMlj3WIPPcDPZXaozxNvUbuA0RitiTQvFn66vhQOeeqz+9MKgJYKC - is3hSWY9mjBDWeSo09bpzA9jNijyoYGB9h/iVGOBukXhUbRcqmdib8LenAazb+DJE8bsi6RnQ7Lp - X5A4m4HoLTaRKCp6BTdgBlUwvGf+XhroMgZP5sR92PIbjWSo0KohZLcykhGf7ACu3W1NtLP0SuiY - rjxUKfaL6I/hm3U/PUyuhkT0/YchnnlZDmfr/mKWvSpQ10I6/fQrrfK0Ln95Eqp3wpoFoXLKulrt - XtCmT8Rs7+yZ4yhLC0XZMIWZdyFvf/UGufFAWHwOVTb1/UeGbqhUsrtVZ39cp+msR6SMeZi+0LBc - pwHyLa1gePpyc0DkHYD+pD4zRq0uB+PRiqgbXioxv8Gq/MIiCsFeNZQFu9e6/fPbk113bM5Dsu71 - ocraNXf8V1/tmGRfgP1NlqhYZrYvpuLdAEVOHnixLklGw9tWRC/n7BH9YI4ZH6eIojlPof1Kq83O - 9AsKxeb0ZBv/sDS/Rf4OgNwmlVlOZGVjHT012H+Lmmx4+8q67F1jVDx3AXnLi2XbP3h1XGOOEqLP - eMtm/4M6KZZnvKNoYlF1RtMjTYmPDconQeIYfviiB+GhHT5Wr6Ep3j7YZrU1Wmlyn7EqEadhwTPw - Mol15RY0oRlpL6437ZRFzoTu5LUn+bokSfcKlhjSh2wxU1U884fnaE8adc4fF365XKqFMucvzC8c - 3R/2qrX4+TGqOO82m/XmHnIXi2QjdLrZ6591CMrqe6KDEw4+zcsuhKu87PGsf7LBjFsHluvkRuX8 - npa82R0poOAQ//KRn/8OIX0oFtNbzfTHw/P8+PkDEsSnQzacxvQFv/xox8svH0xiKDDK8WrGl7Zk - bWrXcL86W7bht7Jld7QVkBj5mGmRujXZkHkYLpJypeLcb+NaLqiKLL5nXuiX5phoU6gml+ROPFPv - eH3eNh6gfkIs6A8l6rG8CpF+tFISXKKopThRLPR866tffpr91be33y+JZ95wNhxvbQxEyzZ0zifQ - N7l7HuSn68CC6fhIBr21zuhm35+YefdXOyhoJcDPP+9Ox9yn3Ba0Xx5ExbPqlUOZLF9A9c7F7S2x - k+lZpDmcN5ueYaae2v7gPMSfP6JijXVfeD+qAu72ece089cspQCfK6DGKyBWr97awezjAT7a+CCB - pyFzWN/6BfJ7w2WGSN6on8/j5xfZRuieZvcKZ38mT3e8HOI8G7JCM5BUxCn+5SHjfvcMFCjOe4ps - kvi8McQtiJcPYXp3eyY/vwXPN5Jpk7BnNkXDsFW14Bn84UtfbdMYiqYMmbaQFy1T1c8W5nyOjo+i - LrmxyBvlotUIy59Y/KsnJc+3LQZPy/zBuPkN0qK7QTaJkvrjrq488PX0QlfaNszQfk06SB+aTtfq - i6JhfxI6NOtJtvvaLHnXyuUKLS9Lph2eTjmt+rSGln56Rn753j7SU9C3XUl2o9z6gzlMC9UZFgab - 87dyVKixhXGgEtHTGJfd4t3IUKf7HotWeyr79y07//CKbfsiTFYfdWwADvKDXSzQsgmf0hglAgrJ - Tlx/ys7m7h5GHZ2IHuRixg+UefDrb+0mP/ioECUE0eQnYmPPTQarmIJ/55PrcTD/9LTGKMKD9R4T - /vBDQy1u/oV2/jptR/0VWRBeFns8lWKcUW5kAlzWdUEbX6jLQdKYAu3lK+MZn8rB8c6KcjEuOvGC - lZ0MNA4L+B5q/Yf/Sa/62xjt80GZ9XPFR4V63p9+cg6rXTv0jyhWf/pr930OiKWspb//x99REhGd - Pq9549I44mv59BPpmnsTOuNvS6ngjFkvWrctHJhhUmk8ltlQSQvtL7/aCteglL4TXUASjC3Tls49 - 6xZf34LBWqnEDsUX54cWL9A5ja5szud9+no9RKgr8Uk/kl6YdWbKWzT7I+L4b942WX0Mf/xMR6NR - +WD26YQ+h/7A9DSmJVP3iw7KqvvM29BJ9t3vvsEvb8Avo7f596ePu2a0fv6tXP3y4iqyVeYuW2LS - EJ3pL19gAbmt/RXajop62eI1Nq7x3hzh+v3ja2YJ2TnpKmK/4Jx8niwg5JyMh3Z0AKd6zXbq2/Sn - 29gbEFb5FkvjZPGf3gEPriWL0pi203XZD6CXeUTlS3hL2NHICwVTO2Xm/XzzO6tKz8pffc16rHGy - TQfzvIC+5jxrWDt5ruRv2hDLOr9Qt769F3DPsE3IcjxkY1HYKUrCVU4sP34gvqgrDX2a1iP6e1mV - dOPgSsnN84KY43LMJv/+ylHZpwXZiPyZjMa41dCp1BGb84F2mj+yB85WuFG5fEjmGMUZhvDVGX95 - 26g7Lgbr/unwovbPJU3V+xn12bGhU3/1TKEv11c4O7uGFi+J+KMg7BZATw+d4DFY/eVL6iGFiMQH - 4ZINPz1ZvsUXc56Dk/CL1Sk//KdjdI/5FJGthV6bcMeOxJ384aJ/B+Qb8ZVt6rFOfnoDndW7P99H - 6Y/hZ7+HNssWzFReQcZGun6Am88bg4f6aY5HuTbAJhEh2vlblv2q371QEko5llrnm3SOM1AolelC - 5auQIVEYFAHC6rplQW712fc3T+qddIVHR0Nt64QC/vOnWmjV7eSVQQPOyTnh9ZwX8Id/NiCkisvw - x0NoGmpV/tNLZHjcTX6p9gCdPt6I5VMjmft3CyvhmxItfDR+lxWahjDXQ+IEQmR2M/7BjMds8wp2 - yTDn8+CfF6ef/zTH5G54sHre27meuoS51SjDnI/gaX0qEJv7G/xJNKjQfO58WHRtDN5D4FTQjY/Z - Lt+2COfMv5PtQVmWQ2bKHnzI+kp2915OfvkDGsDOmUairh1qPRABp2ZNgnleMfNJqGjxwWa3ZkE5 - /+7vFloOqytxv3HGh0PtC/CbJwjLDW+pL6IFCsM6pM1yt0ajXywrsI5RTcfEi8rBWPAOiYYZzX55 - nwxxtxJAd6sKT/ln5fNgEwbqnD8Q7TRPr+d5wr/nW7OfFXdQPKBb0jXbfqxDWUtrlit1pHTEmvVB - pwjq9Q+PD/apL7taCc6orfyOInt9yLqw/Dgwxd6DWDDF5SgWbw20KpWIbZ92Za+svAJmPcKM15cm - g7zLRYBNUzFr3RzaQW+DVFl91x1xDp+Az/77AX20LWc/UaIhHbYDSOIxoOt53vT27/cUcMhef350 - UHF2BjuZNy7FQ+e/mrcf/uoTS59Fl/Dgq8WqclAFYm/vTcs6Qd2j80M9YyWOzWyUWbaAkMou2zZB - XI4z36I+vX7Iafbn/LpUBHUr9kum31K/5Xv4KPDNHQMXo7Yth8t5HaMf3/70MQN9c4Z8wjlxtvrq - z28i78o1Zi3ayR/2++vjrz/tbHjwSVSfE1ya4o2Xu4vGV2qsNXBILUwSuQ14L3s+BWcUbTrfp8nn - +RIqX1bO3MmW2vFxFmvwTe9Op1Mvo/k8z4qJngrRDomNhPUyN+Ca75ZzHijM8+FGQ/RU6H95ktDU - ZQ65rFyoVKiM8+kVAuyXxwcz3snQMv8QLv5/NgrE/36jYEOSnOmNzc1ufL898LOiZ87BFVB3sj6d - +vQAsyP75Nl4PrAcFs/Nna6dvOE8FLIzKO4xoCJ1RX88KhMGONhH3MvFzhRltnGAFtuIOdgVMg5C - bijSB5dsu0zTlnH7ckV5vLBov7MMc7puyjNke+HCDmna++PzIi7gli40svMLFzEL5BruFfOY3skb - n127yQJS3HHPjpaXDIbd7OFOJokWtFwmLEjuoXLYTBHBGv9m3VHfv5C9rxwKkYY53UrNFqmG7zK7 - B8cfa+aFECjUoOOtVFpGRi2EMTRUPNjlIaGaP3SoVJUv8fTd1H4/FB/R01buzBtYnzBwHwvYLpM3 - sQWoSh5umxSiuloxHVLNH1upPiMhVs/M24BY9uqxf0GbjB/6LVJArdPJA5jsQdiV81c23ptpQr0B - wHBVsLaT1/BAeFt9mB2kXTayy1JAK1gtiBO0ndm1Kh7QI5lUYuztAx/VVs6BFN2OmZv2YY72fRtA - Y1shCY6Fg7pP7j3A+9YeSz7tk099eUjl21uO2FWLXDRuo1MB9/Gb0d6xni0fkHQE99DYdAA7LL8m - DTwUxd2eBGMUoBWq+hwdds1ErOFzMuuhiA21aceSLpaV1g7b3qLoYk5PZrwEBQ0J1o9q33g7ootl - hjqB+qGC6rhgpCi4Ob4V5IB3a7Zse4TBf/+eRzSWd7zk0dlcPS8LgOR26cj20O6zJjg1ZxTVrxW5 - LrUoE6Tn8QF41aTMH0DNJqE8CGDj/E1294gkfAAUwz78aLSVtb7tJPF5hmp0LGYfd4+SrhAX0cJz - A+JVrEvaJLl3yrrfe0zX4pv/e35w4XCmPLdT86sQ87yO9Lpk5Fvwsjori62yntSeGLq8zVbGgW5h - 7jei2R/bFPbv9gxdtVCw0H+OLc+vUwDfcnwQXfy0be2O2YD4iD6US25r8vH7CEHTNivKNeHacv06 - 5OpVVwKm1aVU8pOQCTD3E3EKcM3+Vp5fMD8PSX/1tl+xAGRF/bKdXPQmf1+nGpqWl7iz8mPyLe76 - YvmUuMGsqLVaMTFOC3gshwXxg3aZjGt/CNXXVlTwmAvHbJWmynX9LfmDIok/+PBaGDFCJzyyIIC7 - OdWa58DNej+Zvv18zW5zaGrlV3+eVOi+eBPOR3ClR0253JZZA684AH+6a5R3boOY9emn3/0Rsq8K - s783ygQxKTfYn3Zrc6obyYP09PyQGy06fyjjS4ymxTLGQphuOb1Xnxoq0Pbsui5cf1hHxxqoihK8 - 8LnbTnekPOBGyhFLKjMy6de/2EzWVLqmB3M8lOEWjiBsiL2ThXIqHSYj5jolfgbyOxnPxzKFw3LY - 0/gorHkTJ9kEko04ntoPbafM3B/h3g5rLH1y2+f65l0hYYnPWNm3iA+tOm9sHI6HGS97v//yyxE5 - +lkhwdz/TLFugIhzD4i7bJWMO90wQHwfnF89ZmNHjALSSLHp12ulbPzmzlVdJleNnTa7jz91Pj8i - 3gYJXu9zH/WXi1goZ7/MiZdEpjmKp6+jnNWvRsfVkfCp3LQifF/GnXiLQm/HBfMrOL1EnzmX3asc - /FUhqL0xJ/J3WzSH9/FxRNlb9rDqalPCz8Eoq+tii7Cw/xyyz2lbCOjciZh2OSz5i7nCzHiBxk5P - 2JmNLn076PdGT7wS5Gx4ig9LxdvXB39VrTL5+nCZwJJfFskPLOX9Mhsq2Kn1cf4MKM1ok3GMKrx4 - UnnViv7kH6sr5Ov2xDRHfvBhZfdneJw/PR7pkWT8dB0H5HevnC7T6Iimk1QawFyrpOswBbMv7jrA - aBmIaXfZ8NkXiQrsPg+RmJbcZe0jUI7gkseL+FZUZTM+PmCZ+xHxSeS008QPFADMmmmvOMv643oR - Q6EsDjhxbZmPqVMWYBXkjVemzNu+vkhnxMf1hwWVNpgcXdECLmwoWLJw27LDqq0hcRvvaCMVT7M/ - H9szYHzfEn+jNRkV64cIkr3meMkPHz6oUzrBtAkwu5KiSpqhRQ94Rwoj2u3YtNNzf36BnucnEijc - QpN8foCaDWJGnLrt0XfzpjlCcaozR2lxOd3udg7utFMIti27XD2dFhT/WWMSI1viQ7AL4I9PYlFu - M75YPzW1i6wL20S72uzXnnBEqSo7lBeuy/ul03code4i2/Su4o/bRZCj4FtH83k6iTgyp0HbW6MT - XZI/Cd36aw88I18T32W0nG4PN4VG4m+MnkWJuPSOatCTx4ZoO1lPRPrprmjaYMw2ItORoGn3PcSH - piZBuQOzy9bKoOgrv8Wncefy6YOUBYhbHRNd/9Rl+wimvWo21we5WUz0u2H1NuBOSplgzOcNrpzs - AefdhvlvrvkDdWoZGml8E2edF+3oHotC2UvPmHL8Cfn0SW4O9F+Ef/yTzJ/6eaivpr+R7Kr5nCef - qkbBLgux6kXYH8vi4CjlcXFiBk41xNpzZwA6BSOze1nMaGDcCxjx0ie7WV/R0ys0VAVhhpFYvM22 - mBXkYVdPNHx/KjTuVtUEL5P7zAvS5Q/vCsW+JyfinxjLqHb3KYSYYkYijk0Wh1YFa3Wtsh1hx2w8 - G/scHZRbRYz2g9uhOz4GyHUlYduFu+DjxQxTkFfHDfHe+dAOn+lyhcS4X/FKSSkayui2l7frzCIb - kT35kBZnCmCZb2ZcPj2qg12wgCcII11Q3vLGMu7OurTlimVBe8+mkFgdNNWCY/kGQ0sLcz+Ad64u - bOO5Eho+uVGAIdtLhg/cK5sDz0C9vMSY7BzrWY6T9BBU7bg7MOLxvh2KNceAFqnBzLkfmflKGxhJ - 4FEzSi005lXZoaUQTkTXjh0fqwYFoMzyEnPtnAzGmOwBOcuJbUjLOE0bMUTCS3eZXxevpNcUWUbD - 2mkI+RZJyeNX9pA31gkTz80xGqydVcDzKT+xfITQHF/EcIAhbNO1qjmmuDz1V7Tc7e94JchHPplL - X4GbqxCspLuE00dyrWEMNZVdc7ijTjh+MQwqStmmhr6kteZZSH5vtngtRc/sWfCzDKXPN0zbHt1M - mBa+h45qppDfeYx7sdxCQu83ui/liNOleXxA2NCQGfg4+n3ilI7604PhThjbbuHJIsoaquB94Abt - SjXjCjpp7NiuZbJf1fvIUGf8JDgqcMI3bAPK7thZzA7bbTvEW3EPybruSSZrfUkX+/ioJpvJI967 - eGRDsXNiCPK7PvfXwxzjdNIgE28qZpMGyewvAgh2DcE8dF1TmO9T/ZyNI9NCITb7quEBqDR1sXCF - ZzYcFm6KoMUirqyUoJ5dliJqJs+kcpSezenqfK5gjy4iWiEXJde3z0JN/emFkbU7llIoZClKhGpB - 7DrF5pQNegx9vlDJ/L7mY4l9QO/PGFJ5mXtZd77ZFMbRoWwTuXIy8/8eBCHe0gmnD8TluhsgdeiK - Ya/Yzfp8uMJDECkzqbD0n9mKzfhX62R7zreZ+EiuDey0w5t5+i4uX4NYL37PS6Ettv43W31qwJfs - Qjlti6QhxZ2Csg9v7ILyHae9XIeKki8pCayiMoecuguI0+5ECLPalifR9gHyaq0QS3VJK/XCwYM+ - B5VsIK/K4eIqHTibJCMznvvT3mEahO7lQbQpBpO6aMRQ2kpFnIO7539+bW9nA5a4nJs/vEEHgxbE - 2rdvczDs4ghfYRVhwTjK5tiIXa6IF2dJTNoamWi1gwyFATGZ79Mfn6kigxGdO+KO7JvUzbvrYH3V - U7JdQ5x19rt5QBTTPdHj+IYGvQ9idGuHiVlV++YT8cdKZXupohX7LDLav6IjMLyNf3oCTb38CCH4 - NhHTYj33m2xwY+Qfrwuij26Z8anjKeSLhU28ooV2Sk6NiNz2UWH50x58vtY9EVTqe0Tv5I/JTEIm - QP0+IobnvtqJ+OsK1ifcMNuEMvkOTidA+VRqypfpJxnfn4cF507AhERskfT95/GA79fCzGxlmo2e - kbz+8Oqv/q4Oy1EUHAQqQyuWcz2GYF7OjJnjh5u8Gz0Nbc+nhNLa+qBHTz0B8puyZxu9JaZUbUsK - Srpd0PHnR5+poqDbW4n++JL17sNRl4YfEn+KtmjYUq2BndocSTDrN3baVDLMeo7Zt93T53EYvOB0 - Fl3cEyYm39kPwGa86GQb5R80HrAdw7Z+xSya84VhrQy5is1CJuanfaKf30b12C7wumkv/rjBwRmp - gtnRabClltfhTkEH4WMTy2stcxCn9Ij2FX0Q+wwvxJcAHqDF2SDpzG9tdggNWKtIZRsOOyQc6kXx - 4yPKXXdb8lLXC4j65kUHK76UXH2aGqgLFYjDW2xOpLh3wEkQ0R/fzPi1QB69KmQLrdgOyEjpT8+w - KI5VNHlJdoSG8CduHOaV/blRjtAux5rY3Ucp6a+esRmtyW5icsuL/bUADqGFR1tY+X98OPsLZozH - JGFo9BQIlLtJthoz0OQSa574nJbMq6NXOVTUOANGCRDdkF9Jp9MtRttl9Ga7hbbKuL1PJ/junADP - ftEfpFWfozb3LKIF5YHzkN+v0Hn9mliKy/zf+8DL0jyiH0vFZw+5PKqTjh5M++mH8W6IkAiHJTFx - +2in191WUMQnmw7J0W2ZkC0r5NvZjvlpzsvxfPjkyJWKmpE7W/qVW1V71TQLTLaDm/tDdNvFMPMJ - sXQbMipbsQbp4r7Go2wLZm9NCVYt3ReYk0FdTqyuU5ShZ0d2sx7rjWPhALckgdh3sH3paCUD/N7P - SduAjxkPr2gSQp25G+aU/HUuX+hlGd7MP3U7TmIngxOcvNlPGibrr8iCmb+xsDiislus3rJy1oQd - ZSZTkyEtwk7lLU7w4spbc5z9E0iRbTLnmGvZVDofGYJLFjMtKFd87JPoBZoUOX98xDdWrEC+lo+U - LPnQTomZKFC8xBWzvPblMxpwDK+V0pPgVnySXp6O8c9vMydoA39cpEINR4++sTjr88G1qIgul9bA - aw1ixKNgvP76k21DF7LRtylFP/1jLVI/Y+x1CBEqA046wdIQr1bnBiqRVQRzTU54czjLyA1fx9mP - P002fuv4p+8wD+1L8vIfd1g7wctlu3vEkm5lv1P03VnBnMeEPj9tGxE+a2fDnHUao0G/rENgg1TT - ddmey7FdLys0/zzJZ/00ASF7pFLXI+4+b/kAF5jvb2uxGB8jcwjkFcDnZtnzxBZnrNTsFzwo2xEn - 3r3+zddzHkUIql4+VwNwlLFRd8wU0o0v/fJIpO9DYispRjxITuGfXtT2ss4lnecVBPlNx8vusCnF - 6NN00GlazeZ68BtDEUQljb4OHny7z4akCEOV6s6D/OVRq3YwwIjcHg9IEEy6Le4h3NPFhu0kTeBT - vAwGCK3TyPRXifz2IX1SpU4XDQke87fuaOJ7QPF9cpj1Ab1c/fLGpJwC8uufKarosA62rwfx0h3n - FF4xVvVLWuOySiu/qZfYQrW18pj904eC/OjUzeNFcGBzHQ0sN0B85YuUSgrQhK+e3gsAL1f0tf8c - EuH4VXIojEVMnMvOaoe3friCpaccr1Ot5NM1U/Yow1TGnwBaPsErDSBOb2diGcezPy7zzQSDLLVU - 4C5ue9td7WHfPkMqYNASUU2OKfTY89nGz8usG4rUABkFNZ0+qeFP5tJUfv1G9LfstOOF7nLwzqeU - 2a0b+3TPLBmScgjYiebvcuqES6CU0fdLbEEW0bh0egqjpSG266MhoU9Nb375Mn3awsHn+lXOUWv0 - Iv2+dyGarNNzoZosCknQW1o2Tdu6hqR87giZheW4zMmk/Or5ULRuNuzf5RlcKfqyv/w0u+sPmILV - wLYzHwyPG/aAnB4q8dfRN5t++ZKlnznBb2uTDEg/TqBp9opsLSAZykd3C596tSUBycW2D+7bGhna - HpHNJ3+bc/4You6qfenISpT0jliEarK+UKadStEf5bsfK4Igob98ik/nLgdaaxOeKtdJVhgHAnBr - Jfy9D9O3zwfg/evLtk3ummNkXDWQoqNBl/nBKaW3fa5gBGPBzHtqt8LMxzCdTY3sCHf8MVxq4l8e - 9U00M5vCUGvUXx7lb/OJ0w3PLDDNiBB80sTyj//kvXli+MAU1Lfr5Qs+cV8TTbN3pmCvx1xNgkrB - dH8wstGakgDWve3jBWZpwvmlPqO5HqlsAUsG97LuUBeuUuanRZlx+jQ8iN2moo/842RT7k85fE7j - iblMe/tDsUYYqbfjmeENW/Pxpkw1TPEyolN5nJJpHIxKHVMvY2bzicvxtV56EDldTDbLXdMyU/6+ - 4LAZIrJdaMYvT14gnNMN0dnH97+Nh66/PBjzt9tk/d5dYEXLHiaxjfZTznktVtdXM2W6XspoXG6+ - NcgI12SXWQafAuP0gMdmQnh12z3NOU+Sf3nTn57mNED453/JFpiTjE+mCxAonUGCdeGaUgBrC+b8 - n6qHHPnfbVWcQXXUNcEju7bTaEUvKKP2iycirLMpl8oreobiQIx5/sEtkBs4bT8evdKoS3h5CHN1 - ns8wPZcrX/zlK/a9OGK+cP1SOvvqAi3GY850/bNtx6mMFKjcltPB+Fgl3WXrHNjDEPF0kxt/unmL - h3TtW4yfc34/3pd6txZepsusEYpy9qcBbO7FjdnizsjEcnA7JNzWNXF3uZ8N3+ehhkUWqEz72MTv - FeKfwddOOZ62co24FHkdajTtSSzVviMe7DMMN/cb4u8ieqLpLZUKCElwIrcH37R/en7ggfunt/sk - 33loDx/9r39WCvFT0KTEoYsPy8qpMPcTqsW+Z5Z0RP48L4p/ePTTnyV/BNMR3qo8kM2NPcqpl15H - xF1U/uWB/VReFFgudwYz326TjP5lVUN2n74UqcW7ZO9sQeGCb9Osfxb+L/+Cg3Evyaxv2qGnhgB3 - S/iwW6ft26GsHlhNr+KB7b5Wyed8voHuuN2ypLMzfyzFlwaPs9jN+mIy+XHUOvVaizmziRtmwyqV - Yzic3yY7tmmEJnEfycCfzopCwIuk17+qA9LVTHBEynU7VBd0BXWxBNx2LETscKom1FXzt/LxwwcJ - 7pgMEAUngfkSG33+fId7CO+lxuzwI/OxlR6pmn6GitnGR+L8Zp89RdP2ApnzPbMT+s0ezf3PZnzM - xmPVxsqsh7F8YS9zOiuih2Y/TxdXhrKJIpSi2Y8Ro3KrZBJ8PsDuSC0KvTaU3K6/FJJ10xPjWi7K - 8VaGlXphZcl2tOjMcZnJFQg3VDNvGxWIodFQUPaev5OmzeWk7r5oUF6DuGC//JubgVyh7ebxZJsf - 3+hlPKlPW74zI5W/JTeD4aXOfIYHFqOyI729hXk+Qml2MMrmmilH0Oxz+Zefto3maGieYbPA5k/O - H3K5V69xtyCbF3v6U1/ezkiSzQMVc3mdDSM2HXWlOioVGnnK+LpDIqCbHZPthVmmJGTLv/kgwfuD - kUjoigCw+ZDJptm52Uq+zxN27SNTdND8bED9ZoKH0QfEYfmzHMKLskVcwgc86MeaN2UqilDdx4T4 - 8e6UDb954Xz+//Zr3029h8fyucTLiFP/vcw3A1zYVGD1a5lciMY9VuZ6peutVvrf3zz4HcmM3XZW - YU43TyzA+2Y+M3rXQcNnvD3gkncjwfd8mQ1572gwz6uoeo6YP/CvEECTLkaGRwZlf2F6CsbxmhFX - 2cUmnfkfCYvlhRg7+5B0T5dv4XzsKP427dr/rqVvDNE6+9CffqFnRdyi5oAMCk9utmO+sOfzYAEt - WxlnPXlTBa5OByTsPp9sPC3dUJ3Pg21s8DN+fm5FFJ1KiwpYDsvZnxioGdfWD/9aacZ7sBa7Cq9e - O70cg/u2Qb/80cJy2Erj/nBG8zwIL91i5NP5U3oQmNGcJ8aqOZKqEJQ5TyTzPNP88wO/+nVe+TMZ - Dqp9hbeqDMxfcD0TFp4sQBq1zm8e6k9DiwpQHvqDGfFnl41VcvHgcpF1dtmwqhw2i+0DwIpflM18 - L+hn9QiuR0QqryFOVjeiN0hx9wGzLTf0h/3rk6//vVHwH//4x//8/RWEqr7l73kxoM/H/l//Z1Xg - X+kt/ZcgiP9i4t9fS6Bd+sj/+Z//XkL457etq2//v/r6lX+6f/7nP9S/bYN/9nWfvv+vf/6P+Xf9 - 13/8bwAAAP//AwD3h+LQhWEAAA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7cb8ca2a5f088cee-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 22 May 2023 23:20:26 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '60' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '999990' - x-ratelimit-reset-requests: - - 20ms - x-request-id: - - 1e0383e52c940a1f1d04b8173a9053de - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/embedding_async.yaml b/tests/contrib/openai/cassettes/v0/embedding_async.yaml deleted file mode 100644 index ca7beafc250..00000000000 --- a/tests/contrib/openai/cassettes/v0/embedding_async.yaml +++ /dev/null @@ -1,71 +0,0 @@ -interactions: -- request: - body: '{"input": "hello world", "model": "text-embedding-ada-002", "encoding_format": - "base64"}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.26.5 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.26.5", "httplib": "requests", "lang": "python", "lang_version": - "3.8.13", "platform": "macOS-13.2-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.3.0 Darwin Kernel Version 22.3.0: Thu Jan 5 20:48:54 - PST 2023; root:xnu-8792.81.2~2/RELEASE_ARM64_T6000 arm64 arm"}' - method: post - uri: https://api.openai.com/v1/embeddings - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\"\ - : \"embedding\",\n \"index\": 0,\n \"embedding\": \"wkl0vGCgtDp/tZe8yNz+vNsTx7z8XfU7lkm8vJoXh7rlyVC88VK3vLWz0zxMXDI8Vr0HvcJJdLt0nLw74s5iPHYnnzwd/rq8pYWWPEPOOTyJUMq7J18QPHxX2DtpSQS8kntxvK1AMrxmTpY8tiNfvF7AnTywOyC9EdglO/Pdmbs/xpG8Sf5yvIDdKDz4ABm8mUQqOQuNlby9icY86k+hvJw/GDxMpKy6D/iOPIuTsrxnBhy90BXDO4B61zoQBcm8kNEIu4eLCj0P6vE8KBeWu841rLzGehA8yKKhvO8qpjzKH+e8VqKwPDm13jxVMqW8cnQrO7SmGTwkZKK87YRsPA/q8TtgAwY86k8hPOx3MjsrZzi8cnSrOwy1pjyOK088zf99vGoBCrxUep88/6BduoDC0byHKLm7PdjdOmlJhDv92x09eGoHvcPHHLzAhLQ7O6OSPM3//TueggC8YsjFPMofZ7yfOoa89b2wO8b8ZzsAjxE8injbO1ZaNrz4ncc7/kspvA5AiTx7AiQ5r733vJz3nbzcg1K87vR3vH9tHbydTFK8Qe4ivBzj4zsw32s7ACzAPIJNtDtR4oK8HtGXPN/hEbyeggC9HWEMvMxVlbsBgfS7cQSguysShLx4B7a8LzUDPDv4xjw+87Q890iTvCKECzz6Q4E7QBtGvXJ0K7xSmgi890iTvI7WGj3cg9I7iVDKPDCKN7zyp+u8DDd+PAMnrrzz3Zk8pWq/vAK3orxYgse6PGjSPD6egDzdDrW7lp5wu+V0HLsvb2A8oVR6OysSBDu90UC8TiHyuitnuDvNxaA7C0UbPBsepDyWrI08zWJPuwPE3DxY5Zg7ujkkvAHkRTrLgjg7LUfPO/JtDr3izuI7Ti8PPb3RwDwfiR08hQCoO87S2rxE6RC8ztJaPDFdFL2Q0Yg8w2RLuSk/pzsNJTI8TL8DPXbEzbu7DIG8YD3jvApyvjyeggA8VvfkPI27Q7vAhDS7oOTuO1w1Ozv2yuo7X0sAvAxSVTxcmAw9wTy6POM+bjwXazC/DW0svB9BIzzbLh48tV4fPIhDkDwNbSw8sDugPLPTvLvkWcU8wMwuu1CsVDwdU286+n1evLhZDbxPVyC8UeICPD07r7wfQaO8uWbHPHJ0K7y/sdc8ToTDvDVlvLsd/jq6p62nOyqUW7lWvYe8TiFyvObkJz0Mtaa8ggU6PIAlIzz6fV46esx1PSyCjzyL9oO8OXsBPHxyLzwCtyI9CVdnvJasjbz2kI07dicfvEpu/jqiJ1c8DogDPDIVGryrtc+76d+VuzRYAj04RdO7kkGUPFoNKjxIjue7A28ovKNCrjzE1Na7Nh1Cu+fxYTynSla77gKVPAllhLrrv6w7NQJrvGUmhTxd+vq8ZuvEO7Tgdjular+7HPGAOvkoqjtBi9G8ei9HvPVaXzx52hI9IoSLPK3dYLxfMKm7uJPqPEvspjw0WAI8KM+bvPp9XrwTG44803OCvIv2A72D2Ja7+J3Hu0N5BbpY5Rg9uwwBPKnwj7z6fd68KkzhPAllhDvffsC7WOWYO3y6qTwOeua7n/KLu/UFKzzbaPu7Mk/3O0A2HT0Sq4K7BmqWuxaY0zxhc5E8XFCSvPDiqztAG8Y5P0jpvCYpYjxCQ9c7gxL0vBseJDusiKw8dQzIPOBRHbxpSQQ9n/KLvA565jwVfXw6IQbjuhKrgjw1Auu7pc0QvEVZHLwTY4i89pCNPJjUnrtHHlw8fA9evAMMVzyjQi68CJKnuxV9fLz8CME71GXlO/D9AryINfO7mhcHvMkSrbo1Ams8RmbWvPIKvbyoZa27hritO1Onwjj8wEY7PYMpvNZTGb092N085jncuwfaobt8V9g783rIvPxddbzfG++8w8ecOz3YXTyOyH28Gx4kPAWykLvs2gO9WMrBvGh2pzw7W5g6XsAdvf9mgDvNGlU7CnI+vF54ozutQDK7+1C7PPVaX7zGepC7DkCJO/+gXbyyxoI81GXlu2OboryKeFs8yVonPCaMszrI6hs7hYL/PAGBdLxiKxc7LNdDPP+7tDtjOFG8w7n/uvuYNTu8GTu8Ms0fPD/GEbvf4ZE8bqZgPNaoTT09INg7LLzsPPTq07wihIu7jXPJvDv4xrvuupq8iEOQPMHZaDzn8WE7f7WXvHeXqjsryok8KM8bPCvKCT02cna7vuyXu8cylry5A3Y7NcgNPC9v4DsbHiS8htMEvF9LgDwOeuY8XJgMPFt9NT3QwA48VTIlvDol6rwWmNM79spqPC6qoDtruQ+7LzUDPD7zNDzp0fi8qpr4PIa4rbv7mLW7f+/0O2lJBD0tR8+8EkixuwLx/zwPsJQ8szYOvLtG3jrieS49wqxFvONMC7sP+I68xnoQPJL5GTzQwA69yfdVO8kSLbsxXRQ9ppLQPCzXwzzntwQ8MN9rOzrrjLzQFUO6TKSsvGtWPjxgAwa8tmtZuovbrDoihAu8kAtmOplfgTz8CMG88go9PPUggrvDx5w6YD1jO9q+Ejw1EIg74jG0vH3iurxpg+E6k+v8O0auUDqqmvi8JGQivZz3HTsnmW06WGdwOwCPkbwq9yw7FSjIPFCs1Lxhre47EkixOy7/1Dw6JWq7b8G3t5e5R7xnQHk8iWshOoPYFry+Qcy8aeYyPIxLuLmP/iu8iOC+vCPm+bojkcW52DOwvLDzpTpGS3+8OGAqvHnaEjyT6/w6yVonvOUsIjx6zPU8EGgavDywzLuz7pO87ee9vP7oV7xAG0Y9ZcMzPK6wvbs2OJk7c8lfu7lmx7u4rkG91Mi2vOS8FjufOga8/kspOxV9/LstLHi7MV2UPOCm0TzPpbc7noKAPIcoubx52hK8PTsvPGC7i7uib9G74AmjuyKEizxydKs8mrQ1u1KaCDzbaHs81GXlu/MX97t81YA7KM8bO4VIojxm60Q8vHyMPHOPAj06JWo89nW2POLO4jvzlZ+8J5ntO4j7FTwvNYO7v1wjvBb7JDzhXlc8wdlovAd3UDwKcj47890ZvSbvBD0c4+O6bOGgu7LGgryfdGO8IcyFPDiopLwPTUO8vYlGvPwjmLt1b5m4pQduvHPJ3ztJ/vI5JXHcvHl3wbymd/m8PMujPA5AibxCpqg6LLxsvLiuwbylB2682aM7u8XvrTzrvyw8fX9pvHW3Ezs9gyk8zPJDPI7WGryaFwe92vjvOqaSULvQeBQ8ANcLPOySCTzZTgc8obdLvN9+wDz1Wl88ysoyPKZ3eTzWRXy8sJDUPPKna7oTYwg8o/qzu/D9Aryzi0I7/CMYu5tsO7xwhve7Br9KOr2JRjvtSg88qY2+PCW51jy8YbW8OTOHvJgO/Dwvt9q8GNu7PAAR6btsY3g6ptrKPGYzPzwuqiA9BTRoO3hqh7yHxee7wOcFvYbThLvrv6w88xf3PO/H1Du78ak7ucmYvFZatrs92F28kBmDvHIRWjypOIq7C0WbvFF/sbyib1G8+kOBvDeNzTvwf1q71ZuTvHYnn7yJsxu8Ga4YPKtgm7sbHiS9T1cgvUU+RbxqAYq5X83Xu10IGDzYlgG7wZ+LuUC4dLx+RYy8mHHNO982Rrxno0o7WIJHvMUKBT04/Vg8vHwMPUnEFTyP41Q8+n1ePHNHCLy7Rl68jGaPuyHMBbv6Q4G8nJRMPMcyFj2wkNQ86GHtu2VgYjzdVi+7ZjM/u11dzLvavhI8PvO0vJGJjrwFT7+8P2NAO8zyQ7tIOTO68P2CPMYXvzu8xIY83VavPPwjmDwBgXS7i/YDPU0UuLyWrI08uK7BOSCxLjxbxS+7dDlru1a9h7ujl2I7iQhQPJhxzTxCpqg82HsqvMXvLbwWsyq8/6DdPCr3LLtW92S7UX+xOyw6lbztn8M7LNfDvCHMBTxoE1a8fLopO0Zm1rvpfMS81eONPBzjY7widu68nh+vu6qolTtgoDQ9dW+ZO3IRWjxrDkQ8dDnrO0N5BbwDbyg8QH6XvDbVx7tNseY8qSptPJ/yi7v0TSW80ugfPD8ODDupKm28f+/0vM8ICTzVgLw8RmbWuwpyvrzIh0o8Itk/vR22wDyuW4m7TzxJvMcylrwfw3q7GCO2vBqg+ztFWRy9WZ2ePPgAmTxgA4a89E0lvPaQjbl1t5O8EFr9OizXQ7yvvXc8FvukvGA94zsmjLM8u/EpPDol6rxDFjS6h4sKPIg1czz/oN28A2+ou7OLwru2hjA8n3RjPL0m9Tv2kA28mCnTu4VIIrzqT6G7T1egPCgXljvjob86/F11vLo5JLy9ica8qxghve70dzulhRY7AUeXvHlcary61lK8E51lu9Wbkzx81QA89SCCvE7nFDzgi/o8QH6XvBF11LuAele7DP0gPHjs3rwkAVE8vdHAu9dg07xGrlA6I/SWvAz9ILwyssg6hYJ/POwUYTwj5nk8z6W3uSeZ7Tw9g6k8Wdd7O9lOB7y7Rl68mlHkPGlJhLxupuA5L7fau14VUrsbHiQ7xl+5uyr3LLv8wMa7NFgCvSgJebymPZw6mV8BPI/+q7vpNEq7xsIKvdZFfLwidu68SDkzPFLvPDzCrMW8sgBgPJNpJTvKyrK6a1a+O5yUzLv8CMG7+n3evF1dzLs/SOm78qdrvF8wKbtWorA8yRKtOrGrq7uSQZS8VeoqvOwU4bw4qKS8iDVzvP+7tDvrvyw8tumBPLNw67vVOMI87vT3O8IPFzwH2iE8F2uwvLkDdjytowO7XV1MPM3//TtQrNS8xYxcuxV9fDwALEA8Ql4uvJGJjjzpNMo7Av8cvElhRLxsKZu7v7FXu5wx+ztYysE8hrgtvFXqqjuRJr26o/qzuXbETboyFZq51ThCPHPkNryJs5s8nD+YvFI3N7xR4gI73VavvJoXBz25gZ68c48CPE+fGj3XYNO5AlTRuobTBLsj9Ba8YshFvAKcSztRfzG7DLWmvPwjmLx5d8G7QDYdvPwjGL3nVLM7OGCqvF/orrtTChQ7uwwBPZpRZDyyxgK9vGE1vHWpdrxTX0g8pLI5Ow0lMrxciu87bmyDu9RlZTp7AqQ8ppJQvG8kCbyYDvw7uJNqPF9LgDv/HgY9JXFcPiw6lbwq9yy8agEKPQVPPzxqAYo8m8FvO3zVgDsdYYw6pWq/PC5iprwRddQ7gZWuvO2EbDtfzVc70LLxuqLSorzIP9C8xzIWvWdA+bzp0fg6rfi3vGoBCr3nVLO8hnCzPGUmhbvN/328wlcRvK/LFD1no0o8UeICu5oXh7wn/D48vdFAPMwNm7zn8eG7Rq7QPFMKlLv1BSs9D5U9PJlEKrzjTIu8+Q1Tu0uJ1bvc5qO7D01DPBypBjzZTge9l7nHPEJD1zxPPEm8CJInPA0K2zw0WAI9mrS1umYzP7v9eMw7XzApPAyaz7ttNlW6d5equzzLIz2egoA6c48CPdXjjbxtUSw7SzShvEoZyrv/u7Q7K6+yvHxyL7zywsK7E53lO5vB77stj8m8U6fCvD/GkTzjPu47L7faPKiABD0jrJw7RsknvHbETTzffsC8ECAgvW5sA73Z6zW8+J1HPJYBwrvZToe8SI5nu3DpyLy+pB271ZuTumejyjx8V9g8oORuO0pufjz8I5i8oVR6PLUWpbwebka85SwiOwNvKLu9iUY7pYWWPIojJ7wZ9hK77Hcyu9Lon7sLKkS8bGN4vLo5JDyMrom77vR3u7o5JDwkZKK8zcUgvAZqljtAG0a8TKSsO+dUM7wlcdy7fppAu44rT7s2cna7wxxRvN25ADxvFuw7mUQqvXGhTroJArO7qfCPPIfFZztZnR46ApzLu6PfXDxsxkk5kSa9vCkkUDup8A+6vdFAvNZTGbxV6qo6XngjvCeZ7bvzlR89vMSGvJALZrywkNQ61kX8vCEGY7y5A3a790iTvPnF2DygYpe8xvznvB1T77wLRRs8Tcw9u5aecLx/73Q857cEPWLIRbxi4xy9PvO0vLupL755v7s8LSz4O0mpvryvIMk8+ACZPCJ27jwkZKI7UpoIu7qOWDvO0tq6n3RjvFHiAr3vKia8nDF7uqDkbrxTX0g8gN2oPLVeHz2dBNg8acvbPIeLiryxq6s8bqbguzm13jtcim+8FeDNOzUC6zwGB8U6VHofvDIVmryIQ5C88OKrPHQ56zu8xIY8xzIWvJlEqjvSIv2822j7ulBk2jyoAtw8iQhQPKgdMzx9KrW8KGxKvPB/2jslHKg84z7uOygJeTzE1NY7DkCJPLxhNbybh5K7Qxa0O9yeqTxTX0g8xNTWO+Duyzxciu871eONvMg/0LtMXLK88OKruHW3E7wTY4i5RT7FOQK3IrzSoCU8edqSvKDkbjyj+rO73xvvvFaiMLyG0wS9f1LGPAZqljvgi/q8ysqyPLRDSLwFNGi7GD6Nu/Z1tjwTneU6ts4qPCP0FryfOgY84s5iu17AHTw5td68kAtmvBn2kjxTRHG8Uu+8ulKaiLwZ9pI7Uu88PDH6wjsZMHA8lp5wvDVlvDpv3I67QvvcO+x3srtmlhA8BxT/PDol6rrsFOE83OajPIj7lTxOIfK8ppLQvK5NbDxV6qo8lCGrPJ6CgDwhBuM8Uu88vLnJmLz1BSs7q7XPu65bCT0GpPO6GD4NvQrVjzppg2E76Ay5O2oBir1Smgi9bmwDPAARaTz7swy8/F31PDv4xrr5cCQ7fv2ROO4ClTwq9yw8A8TcvAYinLzWUxm8q2CbPFztwLwO3Te8C0Ubu3eXqrxtNtU8eLIBvA+VPbxNdwk8OTOHu9dg07zeKYw7aBNWvCP0Fj3PQmY84+m5uRiGh7yjQq67heXQu40eFTi2zqq6GMBkO8DMLr1Pkf080BVDPI1Y8ryiiig9d5cqPHvnzLu3Pja9KM8bu4DdqDkDJy47ujkkPSpMYTv5cKS81gufvFyK77xt7tq8w3+iOy2PyTzQsnG7kvmZPGi+IT0QWn28Vr0HPJL5mTyg5O46m2y7vNU4QjxIjue7LY9JOZuHkrw/qzo81YC8POnfFTyQGYO83xvvPO66GrxrDsQ7gqLovHEEIDpO55S7edqSvHrMdTzCV5G8C0UbvTaAk7zXYNO7yzq+u+fx4Tx3NFk8GD6Nu4g18zslcVy7pnf5vPFSt7wz2tk8XaVGPBjA5LtjUyg8ECCgOknEFby2hrA79VpfPOe3hDweGZK8ryBJvCbvhL1QZNo85oFWvNRlZbwyT3c89QUrO6+99zu/FKm8gTLdu5UuZbwOiAO9AlRRu35FDLx5Io06CR0KvU6Ew7sTneU8EL1OPEs0oTxhrW48OGAqPL0m9bx6khi8fFfYO5U8gryQC2Y8nUzSvIyuiTuUIau7BU8/vAd3ULpiKxe9+7MMu+tc2zxMvwM846E/ukJDVzpgWLo8J1+QOxqg+zwuqiC9GD6NvA0KWzyL9oO6iDVzO3W3kzsgFAC8oORuu/Diqzx81QA8qGWtum6m4DzUK4i8zKrJvF7AnbxSUo683Q61u6InV7qNu0M76G8KvWNTqDww7Qi8yVqnPEhUijqvvXc6s4vCuw/4jrwK1Q+8HybMuwMnrrx7AiS83Q41vO1KDzr5xVg8S9HPPJALZjwcqYa8jbvDPAuNFb2DdcU8KxKEPMothDwO3be8mfwvPC81Az2lhZY8ujmktyPm+bsw7Yi7gN0oPOCL+rz/oF28dW+ZO54frzxvJAm84s7iO+70dzzhXlc822j7PGsORDx8V1g8MV0UPFyKb7zwN2C8oP9FvIZws7mTBtS7i/YDvSKEC7ulIkU8r713OzFdlDx/Ckw8CsdyPCvKibwoCXm7JRyoPL/5Uby2ziq9wZ8LPUvRTzk7lfU66TTKPNsuHrw38J48KGzKO/3bnbo4qKQ7g72/PLwZu7v1Wl88P2PAu9ZTGby2I9+8lkk8vAGB9DtZVaQ7LSz4PD7zNLy+7Jc9pnf5u0/0zjv6fV48f22dPFztwDwZrpg8pYWWPACPEbz22Ae9zWJPu3xXWDzGX7m6fA/evFmdnrx+/RG8YzjRvPflwTpbfTW8iPsVPDbVRzxGySc85FlFPOl8xDqc9528a1a+vJOxHzyPm1o8xDeovLSmGb1kCy47tV4fO1JSDrusbVW88m2OO3tKHjzL5Qm8Jiniuww3fjyS+Rk8UA+mPGC7izuI4L68Ti8PvQARaTypOAo6Z0D5vFb3ZLvdDjW8\"\ - \n }\n ],\n \"model\": \"text-embedding-ada-002-v2\",\n \"usage\": {\n\ - \ \"prompt_tokens\": 2,\n \"total_tokens\": 2\n }\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7b9ff2fb789e1899-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 18 Apr 2023 21:19:59 GMT - Server: - - cloudflare - Set-Cookie: - - _cfuvid=vqygkpE2OUrL96vSlv1OD3Rmj96ehCMA55GNNJFvkHY-1681852799371-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '35' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '999997' - x-ratelimit-reset-requests: - - 20ms - x-request-id: - - b776543b22e7ef450f7bdf42016c75b8 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/embeddings -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/embedding_string_array.yaml b/tests/contrib/openai/cassettes/v0/embedding_string_array.yaml deleted file mode 100644 index c610c04af79..00000000000 --- a/tests/contrib/openai/cassettes/v0/embedding_string_array.yaml +++ /dev/null @@ -1,286 +0,0 @@ -interactions: -- request: - body: '{"input": ["hello world", "hello again"], "model": "text-embedding-ada-002", - "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '105' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/embeddings - response: - body: - string: !!binary | - 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 - 4z+mY/3nj/8CAAD//wMAV8QGxzNBAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7cb8ca016f4f0f6b-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 22 May 2023 23:20:19 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '52' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '999994' - x-ratelimit-reset-requests: - - 20ms - x-request-id: - - 8bca500bd9e9b6ef5a806851fc636143 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/embedding_token_array.yaml b/tests/contrib/openai/cassettes/v0/embedding_token_array.yaml deleted file mode 100644 index a21d3f8ae01..00000000000 --- a/tests/contrib/openai/cassettes/v0/embedding_token_array.yaml +++ /dev/null @@ -1,181 +0,0 @@ -interactions: -- request: - body: '{"input": [1111, 2222, 3333], "model": "text-embedding-ada-002", "encoding_format": - "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '93' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/embeddings - response: - body: - string: !!binary | - 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 - 73/957/+CwAA//8DAOLZibDhIAAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7cb8ca2808ce429f-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 22 May 2023 23:20:25 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '159' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '999997' - x-ratelimit-reset-requests: - - 20ms - x-request-id: - - 7f79a4071d81f4339aa26cb739c4337b - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_create.yaml b/tests/contrib/openai/cassettes/v0/file_create.yaml deleted file mode 100644 index fd7bc9f495c..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_create.yaml +++ /dev/null @@ -1,85 +0,0 @@ -interactions: -- request: - body: "--4308829d92633101b77b91a9fe983f8a\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nfine-tune\r\n--4308829d92633101b77b91a9fe983f8a\r\nContent-Disposition: - form-data; name=\"file\"; filename=\"dummy_training_file.jsonl\"\r\nContent-Type: - application/octet-stream\r\n\r\n{\"prompt\":\"@united was that English? I'll - DM though I don't think you'll make a plane appear.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Thank you. Mention that before I boarded - she asked 1other person to measure their bag, and it was another woman. Men - not asked.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - why must a traveler miss a flight to Late Flight check a bag? I missed my morning - appointments and you lost my business. #sfo2lax\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica \u200B is flying from Love to Austin - now. That is most excellent news.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - @ladygaga @carrieunderwood - Carrie!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - again I ask, who can I call to get this fixed? Tweeting me BS questions to stall - only makes things worse. Phone number please.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica How about some free drinks on the - flight back for the free promo?\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - 45+ min at EWR baggage claim #stillnobags #ridiculous\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica got it. All set - Thanks!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united we would...how do I contact you to discuss? - A few poor experiences with customer service but would give it a shot!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n\r\n--4308829d92633101b77b91a9fe983f8a--\r\n" - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1729' - Content-Type: - - multipart/form-data; boundary=4308829d92633101b77b91a9fe983f8a - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/files - response: - body: - string: !!binary | - H4sIAAAAAAAAA0yOPQ+CMBBAd35F01lMwILI6GBMZHDwYySVnqSktNheBzT+d1PQxPHee3e5V0QI - NbcOGqQloXepgC4Ck+I3x4oVh/Z62a2z0zPdV4/KNmexPco5HLwdjIO51hCj198TYVnzflLC9/1Y - o+VSS93WQS07Z7Sa09uI4GhJErZKJtBY4Aii5uGtJC+ynG3SlE3OIUcfauoHZbgAQf94LQC5VMFr - r1T0jj4AAAD//wMAldjOH+QAAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a01213a8e42c3-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 19:53:44 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '734' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 5e4c6dc050cf92778f66f2365082c9d2 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_create_async.yaml b/tests/contrib/openai/cassettes/v0/file_create_async.yaml deleted file mode 100644 index 032ccdae3b8..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_create_async.yaml +++ /dev/null @@ -1,77 +0,0 @@ -interactions: -- request: - body: "--5921a566d468b062f9ff036fdb51c50e\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nfine-tune\r\n--5921a566d468b062f9ff036fdb51c50e\r\nContent-Disposition: - form-data; name=\"file\"; filename=\"dummy_training_file.jsonl\"\r\nContent-Type: - application/octet-stream\r\n\r\n{\"prompt\":\"@united was that English? I'll - DM though I don't think you'll make a plane appear.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Thank you. Mention that before I boarded - she asked 1other person to measure their bag, and it was another woman. Men - not asked.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - why must a traveler miss a flight to Late Flight check a bag? I missed my morning - appointments and you lost my business. #sfo2lax\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica \u200B is flying from Love to Austin - now. That is most excellent news.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - @ladygaga @carrieunderwood - Carrie!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - again I ask, who can I call to get this fixed? Tweeting me BS questions to stall - only makes things worse. Phone number please.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica How about some free drinks on the - flight back for the free promo?\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - 45+ min at EWR baggage claim #stillnobags #ridiculous\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica got it. All set - Thanks!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united we would...how do I contact you to discuss? - A few poor experiences with customer service but would give it a shot!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n\r\n--5921a566d468b062f9ff036fdb51c50e--\r\n" - headers: - Content-Type: - - multipart/form-data; boundary=5921a566d468b062f9ff036fdb51c50e - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/files - response: - body: - string: "{\n \"object\": \"file\",\n \"id\": \"file-l48KgWVF75Tz2HLqLrcUdBPi\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"dummy_training_file.jsonl\",\n - \ \"bytes\": 1431,\n \"created_at\": 1685649224,\n \"status\": \"uploaded\",\n - \ \"status_details\": null\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a0c9bbbb50f5d-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 20:01:35 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1128' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - ed5f2dca754b6383149b773d22dbf1e1 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/files -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_delete.yaml b/tests/contrib/openai/cassettes/v0/file_delete.yaml deleted file mode 100644 index dd2ec637473..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_delete.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: DELETE - uri: https://api.openai.com/v1/files/file-l48KgWVF75Tz2HLqLrcUdBPi - response: - body: - string: !!binary | - H4sIAAAAAAAAA6rmUlBQyk/KSk0uUbJSUErLzElV0gGJZabA+Lo5Jhbe6eFhbuamIVVGHj6FPkXJ - oSlOAZkQhSmpOaklqSDVJUWlqVy1XAAAAAD//wMAz0KtD1MAAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a3b189f2343df-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 20:33:18 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '598' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - f6160964d0dc7577e21ca86a29548277 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_delete_async.yaml b/tests/contrib/openai/cassettes/v0/file_delete_async.yaml deleted file mode 100644 index 1f7e18e925c..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_delete_async.yaml +++ /dev/null @@ -1,53 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: delete - uri: https://api.openai.com/v1/files/file-l48KgWVF75Tz2HLqLrcUdBPi - response: - body: - string: "{\n \"object\": \"file\",\n \"id\": \"file-l48KgWVF75Tz2HLqLrcUdBPi\",\n - \ \"deleted\": true\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a44779c66c356-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 20:39:42 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '444' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 087c466d2cbf8d2c4421d7015971b08c - status: - code: 200 - message: OK - url: https://api.openai.com/v1/files/file-l48KgWVF75Tz2HLqLrcUdBPi -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_download.yaml b/tests/contrib/openai/cassettes/v0/file_download.yaml deleted file mode 100644 index 74b7bba6135..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_download.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: GET - uri: https://api.openai.com/v1/files/file-xC22NUuYBkXvzRt2fLREcGde/content - response: - body: - string: "{\"prompt\":\"@united was that English? I'll DM though I don't think - you'll make a plane appear.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thank you. Mention that before I boarded she asked 1other person to measure - their bag, and it was another woman. Men not asked.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a97e85dbb0f7b-EWR - Connection: - - keep-alive - Content-Type: - - application/octet-stream - Date: - - Thu, 01 Jun 2023 21:36:40 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - content-disposition: - - attachment; filename="file" - openai-organization: - - datadog-4 - openai-processing-ms: - - '27' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 528dfe1071f01f10689b6d7bb6f86419 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_download_async.yaml b/tests/contrib/openai/cassettes/v0/file_download_async.yaml deleted file mode 100644 index bdbdf7c7d50..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_download_async.yaml +++ /dev/null @@ -1,1932 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: get - uri: https://api.openai.com/v1/files/file-xC22NUuYBkXvzRt2fLREcGde/content - response: - body: - string: "{\"prompt\":\"@united was that English? I'll DM though I don't think - you'll make a plane appear.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thank you. Mention that before I boarded she asked 1other person to measure - their bag, and it was another woman. Men not asked.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica why must a traveler miss a flight - to Late Flight check a bag? I missed my morning appointments and you lost - my business. #sfo2lax\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - \u200B is flying from Love to Austin now. That is most excellent news.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica @ladygaga @carrieunderwood - Carrie!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united again I ask, who can I call to get this - fixed? Tweeting me BS questions to stall only makes things worse. Phone number - please.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - How about some free drinks on the flight back for the free promo?\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united 45+ min at EWR baggage claim #stillnobags - #ridiculous\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - got it. All set - Thanks!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - we would...how do I contact you to discuss? A few poor experiences with customer - service but would give it a shot!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Why tell us flight is delayed, then tell us it's on time again with 20 min - to spare? Don't say it's delayed unless you're sure!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica are flights leaving Dallas for Seattle - on time Feb 24?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - @ladygaga @carrieunderwood All were entertaining\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united what is the real deal with the delay on - flight UA 1032 from Denver to Vegas?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - any updates on flight 413 from Jfk > Lax\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Beats EPS Views, Takes On #SouthwestAir - VA LUV - Investor's Business Daily http:\\/\\/t.co\\/FLwmGDAHxu\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united yes, David Allan send an email with this - number (KMM24999563V99860L0KM) and case#8719519\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united unfortunately still on the Tarmac at @fly2ohare - and definitely missing my ride from @flypdx #GonnaBeALongNight\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united has once again let me down. Don't think - I've ever flown with them and not had problems. Worst airline period.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica adds Austin-Dallas Love Field route. - http:\\/\\/t.co\\/XWJoL55FLH http:\\/\\/t.co\\/Y8AOrMfkaC\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica gave a credit for my Late Flight - flight yesterday. Great service !!!! That's a Wow moment! Unexpected gesture!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Wow. What a deal. Again, 30+ plus seats - available. Easy change to make a customer happy.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I'm seeking to go 2 client. B\\/c u cant - get me there I need refund. I filled out form not confident it works if past - is an indication\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - spending my birthday night with you, DAL-DCA. Get me home!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica has getaway deals through May, from - $59 one-way. Lots of cool cities http:\\/\\/t.co\\/tZZJhuIbCH #CheapFlights - #FareCompare\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - we have a hot female pilot! Sweet! DCA to SFO! :-)\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\".Thnx for the response @united bot. It seems this - 'improvement' could be easily attained. Is your 1st Class service really only - worth $50?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - once he found out we had a problem he avoided me like the plague. Was told - \\\"we can't find a supervisor.\\\"\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - love you guys, but pls get some direct routes LAS to AUS!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united thx for update\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica omg omg\U0001F60D\U0001F60D nonstop - Dallas to Austin on virgin\u2728\U0001F631\u2708\uFE0F\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united go to hell\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@United flight delayed-no one remembered to turn - the heat on flight 559 leaving ORD-seriously???\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united It's still a valid flight. Just seems strange - to delay for Late Flight inbound crew, 7 hours from now, when the plane is - already here.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - ok! first time flying with you tonight :)\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united for the record- Rozana at Newark was lovely - and helpful. #choosekind\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Now, when will we see VirginAmerica come to Philadelphia (PHL).\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@virginamerica Need to change reservation. Have - Virgin credit card. Do I need to modify on phone to waive change fee? Or can - I do online?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - WTF is happening in PDX Late Flight March such that one way from SFO is ~$550?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united $25 United coupon to make up for broken - entertainment system on a 9-hour flight, seriously? #Ridiculousness #learncustomerservice\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united at what pt do u just Cancelled Flight! - \ Finally got stndby 4 1pm flight. What a day! #missedWork #clientNotHappy - http:\\/\\/t.co\\/sUPrLfOi8T\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - your site is tripping. I'm trying to check in and I'm getting the plain text - version. I am reluctant to enter any card info.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Can't leave the Tarmac ..united's gate - agent cannot agree on a head count. 20 min now counting a 100 people max #epicfailunited\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@virginamerica.. Can you help? Left my blazer in. - Kooples jacket bag at 3rd row second seat from right gate 36 T3 lax.. Flight - to sfo\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Thanks to Karen Salisbury at IAH for amazing customer service! Found my daughter's - bag lost on UA1516. Made her day!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Flight Booking Problems flight to uphold my status match. Do taxes on ticket - count as earned status points? #statusmatch #virginamerica\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica what happened to direct flights from - SFO-FLL? Looking in May, only see connecting #help #dontdothistome\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica will you be making BOS>LAS non - stop permanently anytime soon?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - I have an unused ticket but moved to a new city where you don't fly. How can - I fly with you before it expires? #travelhelp\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica We're on flight 910 Vegas to Boston - today, checked in online but our bag count didn't register. Can I fix that - somehow?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - This is NOT a local UNITED number for Malaysia 0011 800-55558000. What is - your local United Airlines here in Kuala Lumpur ( KUL )?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united How do I get reimbursed for hotel and taxis - for the Cancelled Flightation?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - on flight VX399 headed to LA from JFK - dirtiest VA plane I have ever been - on. Sad for a great airline.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - is the website down?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united: - I don't care that a @thehipmunk link showed me a \\\"wrong\\\" price on your - site\u2014it's your site & responsibility to ensure correctness.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Thanks for the lovely soft views! - #travel #SAN to #SFO http:\\/\\/t.co\\/CnctL7G1ef\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united done\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united I will but right now I'm to angry\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united has the WORST customer svcs! This Kevin - rep at call center must be investigated. My baggage's lost and there's no - help but argument!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - For my Grandma Ella's 80th, she would <3 a bday greeting from your flight - crew! She was a stewardess for Eastern Airlines.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica is saving my sanity right now: http:\\/\\/t.co\\/ELtBOLjUl9\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Is flight 0769 out of LGA to DFW - on time?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - flight 404 delayed 2 hours in LA due to mechanical problems. Handle like pros - but you could have tossed us a free drink.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Can't bring up my reservation online - using Flight Booking Problems code\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - at Logan airport and waiting to checkin for my 9am flight. Checkin desk not - open !!!!! Why?!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Lost bag process is broken. Agent promised they'd call & hold my bag when - found. Now they're waking me at 3am w\\/ delivery. #fail\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica @ladygaga @carrieunderwood Julie - Andrews all the way though @ladygaga was very impressive! NO to @Carrieunderwood\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica love it, taking @SouthwestAir on - in their backyard! Consumers win when biz competes.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Kewl. Will also let them know the overhead - bin over my row was \\\"Inop\\\". I love a good abbreve.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica thanks! Y'all have some of the best - customer service left in the industry.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica - can you tweet me the Cancelled - Flight\\/chng fee for a flight? or can I rebook under one of your affiliates? - If so, who are afiliates?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - I need to register a service dog for a first class ticket from SFO > Dulles. - The phone queue is an hour or longer. Pls advise\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united traveling with @MegZezzo who is injured. - Gate agent in Chicago was awesome helping her. TY #roadwarrior\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica Will flights be leaving Dallas for - LA on February 24th?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - what is going on with customer service? Is there anyway to speak to a human - asap? Thank you.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - to start 5xweekly #A319 flights from to #Dallas @DallasLoveField #Austin on - 28APR #avgeek\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - Only way to fly! #Elevate #Gold\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - you know it. Need it on my spotify stat #guiltypleasures\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I've never experienced worst customer service. - Placing blame on codeshare partners and not assuming responsibility is unacceptable\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united UA63 from Madrid arrived no agent mass - confusion we sent to and fro by 3 UA employees. MaryJo was rude and unhelpful.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united forces us to check our baby bag on overbooked - flight complains to wife that we need to much for our baby.. united has no - baby meals\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - why Cancelled Flight flight VX413? One sec its delayed, on my to airport, - the next its Cancelled Flightled?Gonna email or call me to reschedule?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Calls to 800# resulted in 2hrs of hold - time & 2day wait to check suspect code share fare. Nothing investigated\u2014my - time wasted (2\\/2)\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Have a great week \U0001F31E\u2708\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - iah to charlotte. Baggage claim rep latrice h. #customerservice non existent, - Ignored customer then inappropriately touched customer\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united you are the worst airline in the world! - From your crap website to your worthless app to your Late Flight flight. You - SUCK! Just shut down.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thanks! I'll fill up the form as soon as I land. I don't like being duped - so I hope you will appreciate my feedback & will be better\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I applied over 2 weeks ago. Haven't - heard back and I'm flying this week #disappointed\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I wasn't asking for a full refund but delaying - me 3 hours and giving no reason should be enough to give partial credit\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united is there an email address I can reach? - Too long for a DM.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - flying gla-mco in a few weeks. How long do we have to be at airport for before - departure for both international and domestic? Ta\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica YES FYI MY BFF\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica they told to check with the airline - regulation first so that is why I contacted you.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica I need a receipt for a flight change. - Can you send one?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Do you have any flights with lie flat seating from STL to PDX around the date - of March 5?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - I'm so frustrated and nervous because of this.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I am trying to book awards for September - and need flights on @aegeanairlines but they will not show even w\\/ many - award seats availab\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - \ i have a weekend of dealing with your company that would say otherwise.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Funny story, your website is broken, - you have missing javascript and stylesheets on the checkin process. I dislike - this!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - thanks to your outstanding NYC-JFK crew who moved mountains to get me home - to San Francisco tonight!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - as a 1k, I'm always hoping for improvement.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica You'd think paying an extra $100 - bucks RT for luggage might afford you hiring an extra hand at @sfo #lame\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@lindaSWC @united: We don't like to hear you had - a poor experience. Please share details w\\/our Customer Care team http:\\/\\/t.co\\/HIsc4NdMgZ.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I've applied more then once to be - a member of the #inflight crew team...Im 100% interested. #flightattendant - #dreampath -G\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - can you assist with current flight status for flt# 1016 out of DFW tomorrow - at 6:55am?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - The agent that met us at the gate said any issues w\\/delays on UA1116 would - have to be taken up online...\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I'd thank you - but you didn't help. taking 6 hours to reply (so I get a - message in the middle of the night) isn't actually helpful\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thank you. I flew into Newark from Vail\\/Eagle.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united UA276 sitting at EWR nearly an hour after - sked. Pilot says computers down but no clue when we will leave. Can you - help?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - your helpful agents in Club helped. I am just out baggage fees and a night - of my life.stop doing business with @SilverAirways\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica currently in minute 10 of being - on hold with cust. service. Do I need to do anything to add a lap child to - my reservation?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - These are great fares!!!!!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - my drivers license is expired by a little over a month. Can I fly Friday morning - using my expired license?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - he has no priority and Iove it\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - What's going on with your website? I'm Flight Booking Problems three tickets - today and I've been booted off the system umpteen times.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"\u201C@united: @Darquenloveli We regret to hear - this. Please let us know if you need assistance. ^KN\u201D I was finally able - to secure my seat. Thx\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - classiq, luv Virgin America. Greetingz\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica How do I reschedule my Cancelled - Flightled flights online? The change button is greyed out!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united what is that going to do for you? Nothing - just like you always do\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - you suck!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I lost a voucher that I was given in Miami aeroport on jan 26. I did not use - it.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united Connection - at ORD was on the exact same plane again. Checked carry-on was apparently - taken off & left in Chicago. Pretty ridiculous.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united please upload the March on-demand entertainment - listing on your website! \u2708\uFE0F\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - I will do delayed baggage claim when I land. Hopefully the bag isn't broken - into, damaged or lost w\\/c will result in more complaints\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Only thing I see on passbook is - Virgin Mobile Mexico. How do I integrate?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united and most frustratingly, all this delay happened - either at the gate, or even onboard the aircraft! No heads up in advance!!!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica help. I was On Flight 27 from - JKF tonight. seat 7C left portfolio. Need it back!!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica How can I watch the #Oscars2015 on - my JFK->SFO flight?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - to speak to a real person to get this resolved politely and efficiently. (2\\/2)\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united but it's hard to stay upset at someone - when they at least TRY to show remorse.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica moved my seat with no notice. \\\"Better - seat\\\" is cabin select not behind the row I selected\U0001F44E #DISAPPOINTED\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united a) she's an international. Her phone is - on the fritz, I had to get to Chicago from nearly 4 hrs away to figure everything - out.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - happy to spend the day together. Let's do this!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica, the only airline based in Silicon - Valley! #disruption #FCmostinnovative #incubator @FastCompany's http:\\/\\/t.co\\/wU3LbCNcr9\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Please than Robin at EWR Premiere Desk - for helping me get on a an earlier flight. She did the work. Huge thanks.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united how do I get my account number if your - website says email is unavailable?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - A Tourist Wonder: Super Tides and Tide of the Century at French and U.K coasts: - http:\\/\\/t.co\\/gXdqORtsS0\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - started my flight with a scolding for using an overhead bin that was then - offered to the person seated next to me.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\".@VirginAmerica I heard he has a virgin mobile - hotspot ;)\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - what's a girl gotta do to get a flight name change when SHE bought one for - a mean ex boyfriend and needs a girl's trip stat?!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Well the bar is set low! You guys are really - good at the apology game! What will change? When will u guys learn?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Pls Help Baby Hannah get the life saving - surgeries she requires.She needs your help.Pls Donate\\/RT http:\\/\\/t.co\\/kQnrrP86A5\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica thank you\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Everyone around us is sitting with their - friends and family members. They booked their tickets in October and December. - We bought\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - thanks. Just a program comment; the system assigned seats behind each other - even though pairs were available. I changed it back.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I flew back w other company since United - didnt have an earlier flight\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Any luck with finalizing my reservation? I DM'd information to you. Please - let me know what else you need. Want to confirm ASAP. Thx\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united 1k and had problem getting out of FLL to - IAH sent DM to you about making my connection please let me know\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united It was last night's 1235\\/ORD-LGA.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Dear Virgin customer, while you're - stranded in SF for 3 days & $1000cost- we'll do the very least we can - to accommodate you!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - or @flysaa has lost my baggage\u2026 heard different things from different - employees of @united. @flysaa has said nothing.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@virginamerica Looks like a broken link for your - assets https:\\/\\/t.co\\/OArDjjGrrD\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thanks for the lack of help and the canned response from the 1K desk!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica seats in Row 8 don't recline should - mention that on your website #soreback\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united shes been rescheduled for today, but with - the frigid cold, being a possible reason for \\\"maintenance\\\" it could - be the same issue 2day\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Very poor experience. First computer problem now seat malfunction. Stuck. - Missing meeting in San Diego.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @shrinerack Seattle bound. Wifey got me the duffle for vday. She's a keeper!!! - Holla!!! http:\\/\\/t.co\\/JlOIbLnair\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - Grand Budapest Hotel #OscarsCountdown\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - @JMS2802 : sure show a video of your outsourced favorite TIMCO, who has a - knack for doing substandard maintenance work on aircraft.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Hi! Just wanted to see if you have - any new routes planned this year for Newark. Love flying you guys and hope - to do so more!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - I would love if someone could get me back to Austin tonight and I do not wish - to wait til tomorrow morning.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - still waiting to hear back. My wallet was stolen from one of your planes so - would appreciate a resolution here\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Apparently they are asking 20 people to off board the plane--how can such - a big miscalculation be made?!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - way to take advantage of #MayweatherPacquiao :)\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica what is your policy on flying after - surgery?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - system failure again = bad trend. Software projects are like flying an airplane; - there's no such thing as an emergency takeoff.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I can't check in or add a bag. Your - website isn't working. I've tried both desktop and mobile http:\\/\\/t.co\\/AvyqdMpi1Y\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Can you please follow for a Dm on a missing - bag?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@United - an idea: monitor mileage members travel patterns enough to know when they - change jobs\\/lose status...and make the transition easier.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Are the hours of operation for the - Club at SFO that are posted online current?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"Hey @united why does the flight from IAH to POS - leave so Late Flight, and the one back to IAH so early? I rather get to POS - earlier\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I need the phone number to baggage claim in LAX, my mom left her phone and - someone called saying they would put it there but on\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@virginamerica may start service to Hawaii from - #SanFrancisco this year http:\\/\\/t.co\\/yPo7nYpRZl #biztravel\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica I'm trying to check into my 10:50AM - CT flight tmm on the desktop website and it's not working (some sort of caching - bug) SOS\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I love your guy's song! We're dancing to it for our high school dance revue\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Thank you for that. Am I able to claim - any interim expenses or is the cost of the stuff up on me?\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica shame on VA for making people spend - money in stranded cities when other airlines are landing at JFK! Who will - reimburse me?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - only thing confusing me is why I lost priority boarding? I'm a mileage plus - card member \U0001F614\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I <3 Flying VA But Life happens and I am trying to #change my trip JPERHI - \ Can you help.VA home page will not let me ?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Our vacation's going to be ruined w\\/ 3 - days of rain. : ( The change fee for 2 of us is nearly cost of original flight. - Can you help?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - ..back for the expensive holiday, he worked all year to pay for, that you - RUINED! We want compensation & his original case back!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united was no one between the scan and inside - the plane. I just asked the people in line around me where the plane was going\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Thanks so much for the awesome support, - you guys rock!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - Heads up We didn't check 8 bags, 2 we checked arrived, those aren't claim - #s for our 2. Other people's bags? http:\\/\\/t.co\\/dplQ3mhQGD\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica achieves a second year of profitability - despite revenue pressure ... - @CAPA_Aviation http:\\/\\/t.co\\/zSuZTNAIJq\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Awesome flight crew on UA1589, re the plane, - \ the Jurassic period called and they want their dinosaur\\/plane back!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica just got on the 1pm in Newark home - to LA. Your folks at EWR are incredible #letsgohome\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united not just refunded, but for those of us - who are on vacation to get a free room night to make up for making us sleep - in DIA\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - OMG FINALLY\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - Delayed due to lack of crew and now delayed again because there's a long line - for deicing... Still need to improve service #united\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"Just sent thank u RT @united: @goodenufmother Please - DM your confirmation number if reFlight Booking Problems is needed. Thank - you. ^EY\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - another awesome new plane flight 1584 and extremely nice Captain Steve Connolly.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica did you know that suicide is the - second leading cause of death among teens 10-24\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united That's correct\u2014I've spent hours trying - to book online only to receive an error when clicking final purchase button. - (1\\/2)\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - another perfect flight. How come on your planes, the sun visors can stay - down? Other carriers make you raise them?\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica you stink. Flight Cancelled Flighted - from PSP to JFK and no notification or ability to rebook #disappointed. #expected - better\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - New marketing song? https:\\/\\/t.co\\/F2LFULCbQ7 let us know what you think?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@United so what\u2019s the deal? Do u provide voucher - for overnight or am I cozy on the floor at #OHare ? #gross #HelpMePlease #AnyoneThere\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united I'm trying to get to my final destination, - we need compensation. Just about 2hrs of personal time wasted.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica shares up on 4Q results - @iol http:\\/\\/t.co\\/XZ6qeG3nef\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Please help... I am in Ethiopia adopting - a two year old child. Have an existing confirmation #. Need to add child to - reservation.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - 3 days Late Flightr and my bag has not left IAD, United is not helping at - all. Everyone tells me a different story\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united not able to DM you my confirmation number\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united We've had a ton of problems with getting - our bags and have been given the run around for a day. Whats up with that?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Not a happy flyer. UA flight 1161 from - SFO to Cleveland. Sunday 2\\/22. Stay tuned for blog article from http:\\/\\/t.co\\/VdFdODqVGx\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica had to change to another airline - to get to DC today ... Why is @united able to land in DC but not you? Cost - me $800 ...ugh\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I sent the message. Let me know ASAP.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - has not responded to my various requests for contact numbers, does anyone - know the UK customer service number for #UnitedAirlines\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Could you update me on the suitcase please? - The online and phone tracking told me nothing. I was told I'd have it back - yesterday!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@United - States faundation was by faith Judeo Cristian,@Not it was by ideologias.@ - http:\\/\\/t.co\\/mWBk68k0A3\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - what a pointless tweet. At least @AmericanAir asked me to follow them to try - and resolve\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - why would they make me share a room?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - thank goodness!! Also, see you friday, nwk>sf.. BOOM!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Asked Flight attendant what typical compensation - would be & says we might get free TV. #Unacceptable\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united that is not in line with your responses - here. And now I'm waiting until tomorrow morning because all the flights are - overbooked.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Already checked in so the page expired :X\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united By the way, a simple apology goes a long - way, even if it's a hollow one. It's obvious that you don't care about me - or my well-being,\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - thanks guys! Sweet route over the Rockies #airplanemodewason\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united service so far has been horrid. We wanted - to end the trip on a high note. Guess that's not an option.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united A measly $50 e-certificate is not how you - appreciate loyal customers after they wait 3hrs on the tarmac during UA1116. - #unacceptable\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - by the time I finally get to Dallas I could have driven with less frustration - and cheaper.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - @dfpietra THAT'S your response? Shaking my head back and forth with a tsk. - You can do better-from customer service to your apology\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Greetings. UA Club member here. Any idea - if I can use the Air Canada Lounge at YVR. Flying UA tomorrow.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united already did that at the airport and 12 hrs - Late Flightr its still not here! you guys are really killing me today. trying - to stay positive..\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Results Handily Exceed Forecasts - @NYTimes http:\\/\\/t.co\\/gonmRwEM6I\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united follow me please this airline is beautifull - \u2665\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - The DEN b44 agent (9:30am) was amazing. The MPAgent at check in? She sucks. - @seanMFmadden @PeterStraubMMA @jmercadoMMA @TonySimsMMA\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica I have no interesting flying with - you after this. I will Cancelled Flight my next four flights I planned.#neverflyvirginforbusiness\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica thanks so much!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united does this process ever end? Still waiting - for the reply since 2 months #pathetic #customerservice\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I requested a mileage challenge - for status several weeks ago online but haven't heard back. How do I get help - with this?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - is flight 882 Cancelled Flightled and what do I do if it is?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united well someone should tell that to the employees - at the Denver baggage claim. Still no bag!!!!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Yeah sorry but there's always a problem - with United. And you have an international reputation for having problems.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Premier Gold desk changes flight. Waives - fees. Gives me wrong flight. Now Jana Acosta in Salt Lake refuses the same - service. Angry.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica, - I submitted a status match request a while back and still haven\u2019t heard! - I\u2019m flying on Monday. Can you look \\/ accelerate?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thank you.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united also during the run I was instructed to - do, I shattered my computer. http:\\/\\/t.co\\/oAflfr7WXB\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Why isn't the flight status updated to - delayed UA1532 no board\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - wonderful bag claim people - finally have my bag. But why did I catch earlier - flight? Original flight just landed. #wastedtime\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica thanks for taking care of @SuuperG - on her flight!! #rockstars #travel\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - You should still develop an app - then you will be my favorite airline.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Or watch some of the best student - films in the country at 35,000 feet! #CMFat35000feet http:\\/\\/t.co\\/KEK5pDMGiF\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"Decisions Decisions @MandarinJourney @united: We'd - love for you to try our service. We offer status match too. http:\\/\\/t.co\\/xbQqqbRgVF - ^KP\u201D\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - always!!! Xoxo\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - yes, we've been with the agents for the last 50 minutes. One of the agents - have been very rude, but thankfully Ladan has been nice.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united how does it get Cancelled Flightled 10 - hours before take off?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - ...and when that doesn't work...\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @LadyGaga @CarrieUnderwood Sorry, Mary Martin had it first!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica best customer service rep in the - world! #irmafromDallas takes the cake!!!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united LHR arrival lounge #fail. Waited 20 mins - for shower then left to find hotel. U know how many passengers u carry. Planning???\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I just did, how can I DM? Do u have - to also add me?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@virginamerica - Digging the swanky pink mood lighting during the flight from NYC to SFO. Just - needs a cabaret singer. Think about it!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica why can't we book seats on your flights - when we buy them or even during check in? Creates so much anxiety! #frustrated\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thank you. We are signed up for notifications. - We shall watch and wait! \u2744\uFE0F\u2744\uFE0F\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Thanks for the reminder. It's been a fun - ride. http:\\/\\/t.co\\/pPVA4Rch9f\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - \ how are you gonna have a deal from Dallas to DC but no deal from DC to Dallas? - #sad\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thanks. It is on the same ticket.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Boo for a not refunding a seat upgrade fee I did not want to buy in the first - place!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - arrived in YYZ to take our flight to Taiwan. Reservation missing our ticket - numbers. Slow agent Sukhdeep caused us to miss our flt.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@virginamerica Trying to make the change in advance - (not just 24 hours prior)\u2026tried it online earlier and it wanted $300 - in change fees.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I spoke with a representative that offered no solution, I am a loyal customer - who flies on @VirginAtlantic as well\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - In ORD, waited 20 min after crew members left before gate items came. Flight - attendant sarcastically said good luck and walked away.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united ua1673 still waiting! Supposed to depart - 9:08\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Done and done\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - searched for mileage tickets to BOM couldn't find a single one is saver awards - - I see how you play. Earn miles but can't use them.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united then why have I not received my call back - its been 3 days...it's an infant car seat how am I supposed to go anywhere - with my child\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - your announcement for pre boarding only addresses mobility. My disability - requires me to travel with a lot of stuff. Do I preboard?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united So you are inadequate by accident?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I don\u2019t use Passbook =\\/ I - still love you though <3 :) I\u2019ll just use my email in the future.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united silly I'm flying delta today. Your united - club staff and attendants are surly and unhelpful and always seem bothered - by pesky folk\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - thank you\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - It's an incredibly easy fix, but you would rather stay in your comfort zone, - while I get forced out of mine.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Change made in just over 3 hours. For something that should have taken seconds - online, I am not thrilled. Loved the agent, though.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica soooo are you guys going to leave - the seatbelt light on all flight? You can barely call this turbulence :-)\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Your chat support is not working - on your site: http:\\/\\/t.co\\/vhp2GtDWPk\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica hi! I just bked a cool birthday - trip with you, but i can't add my elevate no. cause i entered my middle name - during Flight Booking Problems \U0001F622\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica the CSS on your site is a 404 right - now, please fix. Site unusable.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - , am I dreaming? Did you really just open up a route between Dallas and Austin?! - And does this mean Houston might be next?\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@virginamerica you ROCK for making it so I can - watch #Oscars on my flight!! #redcarpet #oscars #oscars2015\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united someone needs to DM me and resolve this - correctly. Extremely disappointed with the service I received. Terrible management.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united My mom left her Kindle on flight 1544 today. - Burgundy case with a light. Seat 27D. Did anyone find it?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica it's really aggressive to blast obnoxious - \\\"entertainment\\\" in your guests' faces & they have little recourse\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @AmericanAir so that's it? It just ends - there? Come on! I traveled for literally an extra day and a half because of - this!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - what's the point of asking for details about a #servicedog when you book if - your flight crew doesn't read them? (Continued)\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Ok thank again for your help!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I did DM the details but still no response. - I have to book today.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - FAIL You Cancelled Flightled our flight frm GJT and then used our reserv home - to IAH (from SEA) for reFlight Booking Problems w\\/out OUR PERMISSION!! #PH6RPS\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Your website deserves a new design. #html5 - FTW!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - fails again. @SouthwestAir saves the day.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Congrats VX on the new route! \u2708\uFE0F\U0001F389\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united it's like you're trying to make me hate - your airline. Fee for each checked bag that's never mentioned in the ticket - + rude agents \U0001F47F\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - #thankyou the DAL-AUS route makes my day!!!!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united gate C 24 IAD. U released passengers to - board w\\/others deplaning .50 peopleOn bridge while next flight board http:\\/\\/t.co\\/HfoF33iyhi\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica trying to add my boy Prince to my - ressie. SF this Thursday @VirginAmerica from LAX http:\\/\\/t.co\\/GsB2J3c4gM\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united flight ua3576, gate b1. And tell ray I somehow - made it on to the 736 flight out of IAH and didn't have to wait for the 917 - one. :)\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - my flight (6000) scheduled for 1pm departure still says on time but no plane - at gate. Any update on how long of a delay?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united It's the fact that an international should - not be with out her bag and no sense of what's going on other than \\\"maintenance\\\".\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united you suck. 9 hour delay?!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united, last week shanghai to sfo 858 delay 5hrs - bc of engine. today sfo-sea delay to \\\"sick pilot\\\". no compensation. - They Do. Not. Care.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - it's frustrating, as a frequent flyer, loyal since Continental. Upgrade equals - paying 3 times or more on top of purchase ticket.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united really? Someone called in sick and then - someone FORGOT to call a replacement?! Now an hour Late Flight to take off. - #theworst\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Like http:\\/\\/t.co\\/VPqEm31XUQ\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - \ #UnitedAirlines how long will1531 be delayed.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united are the ones who make it difficult for - me.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - just confirmed a seat! Crisis averted! Beers won't be missed now\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united That's not the issue. The fact that no - one even called (despite promises) to confirm the bag's location is.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica heyyyy guyyyys.. been trying to - get through for an hour. can someone call me please? :\\/\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Hi, Virgin! I'm on hold for 40-50 - minutes -- are there any earlier flights from LA to NYC tonight; earlier than - 11:50pm?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Not encouraged that I'll have my CPAP tonight.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica why Cancelled Flight flights today? - No precipitation to be scared of! \u2744\uFE0F\u2744\uFE0F\u2744\uFE0F\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica This is such a great deal! Already - thinking about my 2nd trip to @Australia & I haven't even gone on my 1st - trip yet! ;p\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - mood lighting on point\U0001F64C Reclining my seat, kickin up my feet\U0001F4A4\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united would love help getting there today. In - #EWR now. Will take any airline and connections. Thx\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica weather delays > next few weeks - ;) #JFK #BOS #DCA\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - all crap channels which is why I pay to watch UK tv\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Thanks; might want to fix this line: \\\"Our - Customer Care team is currently responding to most inquiries within 7-10 business - days.\\\"\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@United - the ones who suffer. I understand delays, I don't understand trying speed - up a process that has been delays to this extent.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I hadn't filed a refund claim as I was - told there was no charge by your DM. This is disputed by my bank, hence why - I would like(1\\/2)\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - thank you very much for the help. We're do I pick up my bags aspen airport - & are they coming in today on flight911\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united keep me updated. Let me know that the bags - make the flight to j-burg\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@United - We've been waiting on tarmac for >1hr because apparently UA1116 is overweight - & we returned to gate. #WTF #fb\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - beginning of Feb I called United they said they would send another voucher - by mail. Never got anything. #tiredofwaiting\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thank you !\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united flight 3763 IAd-Sat. We're on the outdoor - track for an hour\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Shame that there's no flex to tickets transfer rules. Even calling from Neurosurgery - ICU isn't enough!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I would like to know what's going on before his current flight lands.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica cutest salt and pepper shaker ever. - Just when I think you guys can't get any better you just do! http:\\/\\/t.co\\/vC6Keulg2J\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united you Cancelled Flighted our flights for - no reason & now we have been on the phone for AN HOUR on our vacation. - Why?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - is todays flight from Palm Springs, Ca to JFK in NY Cancelled Flightled?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica great. Well deserved.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica I didn't today... Must mean I need - to take another trip!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - yes, nearly every time I fly VX this \u201Cear worm\u201D won\u2019t go away - :)\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\".@VirginAmerica - They were very understanding and helped me out. Thx! #Comps\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united is doing musicians real dirty at LAX. I've - never been blocked from getting on a flight with my bass.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica does Virgin America fly direct from - Seattle to NYC or Boston?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - this will definitely be a trip to remember EWR-STI second of the season, first - on seat 35A because it pays to be loyal!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica on iPad and iPhone, clicking the - CHECKIN link in the email I received at 24hrs before flight\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"Need more info on that! @united: @momsgoodeats We - have great amenity kits. PJ's not included. We status match AA. ^KP\u201D\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica do you miss me? Don't worry we'll - be together very soon.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - 1.75 hour delay. Nothing says sorry like a voucher. Missing time with family. - \ #family #precioustime\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - of course! I work for @VirginAtlantic and I'm obsessed with the entire Virgin - family!!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - where is my flight voucher?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Great! I'm ready to go home.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - 2nd flight also delayed no pilots! But they boarded is so we can just sit - here! #scheduling\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I'm sure a lot of your 747 and 777 JFK-LHR flights go a lot faster than 513mph - with a strong tailwind.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - okay ase24766m. Find our luggage.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I sure did. I had to drive a total of 3 hours to get my own bag. I'd like - to explain that debacle but no one wants to talk to me.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I was originally trying to share details - but the link Jimmy Samartzis Vice President - Customer Experience sent me - expired.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I am in seat 4C and I cannot even open my laptop; and I paid extra for this - seat!!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - any plans to start flying direct from DAL to LAS?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica posts second consecutive full-year - net profit - @ATWOnline http:\\/\\/t.co\\/tvB5zbzVhg\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica status match program. I applied - and it's been three weeks. Called and emailed with no response.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Nice, Lofty View @flyLAXairport. - #SilverStatus http:\\/\\/t.co\\/F4Tp0dAwbd\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united OKC ticket agent Roger McLarren(sp?) LESS - than helpful with our Intl group travel problems Can't find a supervisor for - help.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - wow this just blew my mind\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - can u help this \U0001F478 @FreyaBevan_Fund needs urgent treatment in\U0001F1FA\U0001F1F82y - old battling cancer could u help with flights \U0001F497#freyasfund\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica called your service line and was - hung up on. This is awesome. #sarcasm\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - well, considering every agent before claimed they were unable to help with - everything else, why waste more time to hear 'call corp'\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica hi! i'm so excited about your $99 - LGA->DAL deal- but i've been trying 2 book since last week & the page - never loads. thx!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Just submitted my response on the link you sent.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica You guys charged me $100 to reschedule - a flight that was then Cancelled Flighted and are now refusing to refund it. - What's the deal?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Use another browser! 2015 & a brand with a reputation built on tech response - doesn't have a cross-browser compatible website?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"Thank you \u201C@united: @TRUU_Tall I can certainly - take a look. Please follow and DM me your confirmation number for assistance. - ^JH\u201D\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - don't see a justifiable cost to get on an early flight with seats. No airline - charges to conveniently get their passengers in early\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united How do I formally complain about your customer - service handler who misconnected me. I was denied boarding & I now lost - my bag. Help!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - hi I just booked a flight but need to add baggage, how can I do this?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united - SERIOUSLY it's 2015?!?! NO WiFi on a - 5hr flight from CLE-SFO #1589. You're the ONLY airline w\\/out WiFi...and - pls no 'unwind' BS.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I sent in my feedback. Thank you.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - just 1 last thing. U guys shouldn't be charging $ for drinks on a transatlantic - flight\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - No, I need you guys to not over book planes. It's not a concern, I'll just - travel with someone else moving forward.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united awesome I'll book my next Christmas vacatinn - this December any other ways you want to devalue mileage plus.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united we needed them here asap. Will they make - it on today's flight?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - A refund and flight vouchers or another flight on a different airline at your - expense for today. 8 hour drive is very inconvenient\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united rude rude\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica sad to learn you no longer fly SFO - > PHL. Hope it returns!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I am buying 2 yo own seat on 3 legs of intl trip, car seat? Required? If not- - then allowed? Can child still sit w\\/mom after takeoff?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica momma I made it! \U0001F601\U0001F601\U0001F601\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united flight arrives 30 minutes early, but then - have we to wait for an hour for our bags.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@virginamerica the manage itinerary section of - your website seems to be broken for me https:\\/\\/t.co\\/2pUJvCElNg\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united better train your support staff with appropriate - decorum, consider revisiting your terrible \\\"provide a death certificate' - policy\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Flight attendant never served me my beverage (tea), and not once checked up - on me. What gives? #ua6076 #notcool\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@United - the internet is a great thing. I am emailing executives in your company, - maybe they will respond to me in a timely manner.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I received my luggage that also looked - to be left in the snow when I arrived. I'm asking for all 50 people to be - refunded.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - thank you. Been trying for two days to set this up.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united @Apollochplayers we just want to go home - tonight - why did you Cancelled Flight the last leg of our reserv. w\\/out - our permission??! #PH6RPS\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @ladygaga @carrieunderwood Julie Andrews first but Lady Gaga wow'd me last - night. Carrie? Meh.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - nope, they told us it was time for them to go home and to sleep at the airport. - Even though they assured us we would get a room...\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I like the TV and interesting video - . Just disappointed in Cancelled Flightled flight when other flights went - out to jfk on Saturday .\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - can you tell me how to file a claim for clothing that had to be purchased?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united it was credit from my last trip that never - came in the mail!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - to jump into the #Dallas #Austin market http:\\/\\/t.co\\/SzR0pioA21\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united I am signed up for notifications. This is - the first trip I was not updated on. Not sure why this happened.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica already contacted Central Baggage - & sent DM. @RenttheRunway is charging me for the dress that was in the - lost suitcase #help\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I luv ur people and product! 1 thing is y do u charge for herbal tea but not - black tea? I'm not a caffeine drinker\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - Just sent! Thanks :)\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - i would like help with some flights please.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica announces new nonstop connecting - @AUStinAirport & @DallasLoveField, $39 intro: http:\\/\\/t.co\\/qXnOaQtYN8 - http:\\/\\/t.co\\/JK7qmdfqgf\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - has unrivalled access to #California with flights to the U.S. from 7 UK airports, - with nonstop or one-stop connections year-round\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united yes, a paper voucher that I got on January - 26th 2015\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - how come ABC is the only one of the network channels you don't have?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united what gate is ua5396 leaving from?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Flight from BOS > LAS tomorrow - was Cancelled Flightled. No notification; wait times are 1+ hour. Will you - rebook on another airline?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - why do you guys split up the charges to credit cards? Making it unnecessarily - more expensive for people to fly with you guys on pts\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica kinda sucked my earphone jack didn't - work on my flight. They may want to look into that for future passengers\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica has getaway deals through May, from - $59 one-way. Lots of cool cities http:\\/\\/t.co\\/RPdBpX3wNd #CheapFlights - #FareCompare\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - delayed to10.30!!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - sounds like fun !\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - customer service is atrocious! You have disrupted my travel plans, you have - lost my luggage and it is impossible to TALK TO A HUMAN\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I guess that's too much ask, huh?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united why am I to believe they will help when - customer service couldn't? Like I said, I want a number to someone who can - fix what you did.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Umm so no reason as to why this is? Is there someone different I should contact - (or contact me) to get a definitive answer?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united so if I'm flying 1st class just one leg - to Chicago but not on my long flight to China am I still able to use the lounge - in Chicago\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - This is what you missed @NewsVP. Next trip to the 407.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\".@VirginAmerica not only was it great, but you return - my calls the day after. Couldn't ask for more. #myVXexperience\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Could this email be resent as it doesnt - appear to have arrived.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @VirginAtlantic @GMA @AmericanAir \\nCan You Help #ourprincess in need of - some help in #USA \\n\U0001F380\U0001F1EC\U0001F1E7\U0001F380\U0001F1FA\U0001F1F8\U0001F380 - http:\\/\\/t.co\\/778AzTDaer\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - thanks, just sent :)\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - @UCtraveladvisor - I would have loved to respond to your website until I saw - the really long form. In business the new seats are bad\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica @JezzieGoldz would have been a rough - trip but LUCKILY we were on a #virginamerica flight. #weather\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"\U0001F60E RT @VirginAmerica: You\u2019ve met your - match. Got status on another airline? Upgrade (+restr): http:\\/\\/t.co\\/RHKaMx9VF5. - http:\\/\\/t.co\\/PYalebgkJt\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica, - @reallytallchris dropped a track on you... https:\\/\\/t.co\\/zv2pt6TRK9\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united is unfriendly screw family, that hates kids - and moms. now waiting on UA871... pray its better FYVRFN ..due to agent error - and tickt\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thanks for remembering to load my bag onto my connecting flight. Oh wait you - forgot. Iceland should be fun with no clothes....\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @getmeontop 7 WEEKS Late FlightR AND I - STILL HAVE NOT RECEIVED MY MILES FROM THE MileagePlus Gift Card $150 STARBUCKS - CARD I HANDED OVER!!!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - why can't you supp the biz traveler like @SouthwestAir and have customer - service like @JetBlue #neverflyvirginforbusiness\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united good to know you will open the closed doors - for \\\"premier passengers\\\" after safety briefings on delayed flights. - #annoyed.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - we're still waiting to find out your rep is working hard - most upset about - having to wait to tomorrow pm to get to mammoth\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united 4 passengers after a 2 hour delayed flight - left with no hotel at the end of the night @ hou airport. Wtf??!! http:\\/\\/t.co\\/ZfqMpGXVS6\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica LAX to EWR - Middle seat on a red - eye. Such a noob maneuver. #sendambien #andchexmix\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united How does United refuse to reissue a $400 - lost voucher when their plane didn't take off due to mechanics? #badcustomerservice\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I'm disappointed that the agent - at the designated silver status check in line @Dulles_Airport closed to assist - all pasengers\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - love the 90s music blasting at gate in #Boston while waiting for flight to - #SanFrancisco. Only if I could get an iced coffee!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica I mean. Probably inappropriate while - on board.. But, it's on!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - All of group E was told there was no more room in the bins. when I got on - the plane, was room for at least 4 bags in my row!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica first time flying Virgin, went to - #SanFrancisco .Thanks for the smooth ride. Easily my new fav airline!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica Just trying to book tickets to NYC - and facing super fun broken styling. Don't worry, I'll keep trying :)\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Need to start flying to @KCIAirport - . \U0001F60A\U0001F600\U0001F603\U0001F604\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united When will direct flights from Belfast Intl - to Newark resume from their winter break? Thanks.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica - Let 2 scanned in passengers leave - the plane than told someone to remove their bag from 1st class bin? #uncomfortable\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica do you have an application for iOS? - Was looking and only saw Virgin Mexico :( <\\/3\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united flight 1491...plane from SFO to DEN is basically - on time.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - your customer service is terrible! Stood inline 3 hours no flights and 4 hours - Late Flightr still no bag#disgutedindenver\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united airlines is the absolute worst. They have - no idea what they are doing. #neveragain #UnitedAirlines\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@United fucked up, then voided my ticket, and KEPT - MY MONEY. Not even an apology. I will never fly with your airline again. - #UnitedAirlines\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thank you.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - yes I filed a claim & hope to receive by luggage by 2am. Ridiculous as - I had to purchase items to go to sleep & no reimbursement.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united we just flew with United from AUS (Austin - Bergstrom) to Cancun Intl. Best flight ever! The 737's are not too big... - Not too small!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - kudos for not Cancelled Flightling flights from DFW this morning. United - usually first to panic...\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Flight 0736 DAL to DCA 2\\/24 2:10pm. Tried to check in could not. Status - please.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - I send an email about my bad experience and you send back a generic response. - \ Yet another reason why I'll never fly with you again.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"\u201C@united: @MelanieSpring We'll see what we - can do. ^KN\u201D We are running! Most of this plane is running. Thanks for - the help!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - No. Denver said they don't handle baggage that made it to Colo. Springs. They - gave me an 800 number to call. No help there either.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Definitely will!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united UA5396 can wait for me. I'm on the ground - trying to get to the gate after we were moved to B. This is crap.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica pilot says we expect a choppy landing - in NYC due to some gusty winds w\\/a temperature of about 5 degrees & - w\\/the windchill -8\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - Thanks! Good times there and back! #Vodkatonics the entire flight\U0001F378#sfo\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united rarely ceases to amaze...for the worse. - \ i hope this is the last time i \\\"have\\\" to fly with you.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united is there a United gold number? I've been - on hold 24 minutes and think I may be lost in nowhereland. Have a gold reservation. - Help.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - brought it all the way across the country today I see http:\\/\\/t.co\\/TKaUyGcPmS\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Do I need to use a Chase United Club pass - for my 8yr old son, or can he come in with me on my pass?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica I was so looking forward to my first - flight with you today but it was Cancelled Flightled along with the subsequent - one ...\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Atlantic ploughs a lone furrow in the #MiddleEast http:\\/\\/t.co\\/DCoBoKN7EE - @TheNationalUAE\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - I\u2019m looking forward to watching the Oscars on my flight home tomorrow. - I might even get something bubbly to drink! ;)\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united question:are there onboad 110 volt outlets - in all planes? If so, where?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - should use this in their next airline commercial lol :: http:\\/\\/t.co\\/pXEXIlSjBs\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united how we looking on getting those bags to - Lusaka\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - The Flight Booking Problems section of your website seems to be broken on - Chrome. Might wanna look into that.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Thank you! You need to follow back tho otherwise I can't DM you. X\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Flight 211\\/ORD gate agent tried to prevent - me from taking onboard a bag I've used for 15 years! Flight crew was more - reasonable!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - If it's any consolation, your staff was stellar. Just not the hour+ delays - I encountered with every one of my 4 flights.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Thank you for responding so quickly with - a helpful tool! @dustyob\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - e-ticket # 0162389030167, refund request # 16866853, case id # 8465981\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica - the passenger in 7D, Flt 338 that - assaulted me shouldn't have flown. I trust he's banned. Crew filed report - to @FAANews\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - It's taken ~3 weeks for Cust Care to respond to Case #8477733, requesting - a refund for wi-fi not working. Where can I get an update?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united they helped me at the baggage service desk. - \ Said bc TSA screening was down in FLL not all bags made it but bag will - be in EWR @ 12\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I emailed your customer service team. Let me know if you need the tracking - number.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - why is flight 345 redirected?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Have clients with an 11 hr layover at IAH (during the day). Will they have - to claim & recheck luggage. Or will it be taken care of?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica awaiting my return phone call, just - would prefer to use your online self-service option :(\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united UA 746. Pacific Rim and Date Night cut - out. Not constantly or randomly, but one spot, repeatably.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united v upset with your disability \\\"services\\\". - When I told one of your employees I was carrying medical equipment she was - very rude.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Thanks for making my flight from LAX to JFK a nightmare by forcing me to check - my carry on bag at the gate. (1)\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Never had a bad experience before, but this one took the cake. Now extortion - for carry on items as well?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - requested window seat and confirmed window but got stuck in middle seat. Not - a good way to treat silver member\U0001F612\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Keep up the great work :)\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I will not be flying you again\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @campilley hahaha. If they weren't an American - company, i would say this was great sarcasm!!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united mobile apps need construction from the - ground up for each OS category. It's expensive to get right .\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I have 2d and 3d embossed badges - and patches superior to the ones you are currently using. \\nhttp:\\/\\/t.co\\/3fq3XElbOn\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thanks for effing up our holidays - we're - missing a full day of skiing due to your baggage team's incompetence at @FlyYOW\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica first time flying you all. do you - have a different rate\\/policy for media Bags? Thanks\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica it was a disappointing experience - which will be shared with every business traveler I meet. #neverflyvirgin\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united why no preferred security line anymore. - My TSA pre-check didn't pull on my @SilverAirways partner flight! #Platinum - #spoiled\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - you're the best!! Whenever I (begrudgingly) use any other airline I'm delayed - and Late Flight :(\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @JezzieGoldz club Virgin is bumping in New York http:\\/\\/t.co\\/HaQc7GDg7c\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united In 2015, United is \\\"unable\\\" to look - up a flight reservation by passenger name at the YYZ check-in counter - WOW - smh #customerservice\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Blackmailed me into paying \xA3130 extra or having my return ticket nullified - in San Francisco Airport. Terrible service from rep #scam\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united My post was just more of disappointment. - \ I'm a frequent United flyer, it was a simple ??. 1 bad apple doesn't spoil - the bunch.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - 2 Cancelled Flighted flights Late Flightr, agent claimed she put me on a new - flight but then Cancelled Flighted it. Coworker got on flight- now delayed. - Now?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - no Cancelled Flightn just left us to fend for ourselves when flt came in Late - Flight. Getting runaround for 3 hrs. Each employee blaming previous 1.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@virginamerica awesome deals DAL-AUS for only $39 - each way! https:\\/\\/t.co\\/xCVQXYkg49\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united thanks again for your concern. I will contact - customer care upon our return from Australia.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united ok thx!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united look at this beauty \U0001F609 dc 10 united - airlines \U0001F609 http:\\/\\/t.co\\/MvYoizRPdE\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica\\nwjere is our luggage #so slow - at lax\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - trying to book a flight & your site is down \U0001F601\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I love the dancing little richard. - cool beans.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - the os isn't controlled by me but rather @VerizonWireless . App is new.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica seriously would pay $30 a flight - for seats that didn't have this playing.\\nit's really the only bad thing - about flying VA\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - missed my flight. How does standby work?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united private jet would have been cool! Do does - not work. I'll try again\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - you should have 39 dollar LAX-Las fares!!!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united well that's big of you but I don't have - terribly high expectations at this point.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Not appropriate to ask in public (hence - the dm). each united employee, each a new answer. your process was such a - hassle i Cancelled Flighted.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Flight UA1270 is descending into farce and we haven't left EWR yet. Is this - going to get any worse?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - your no Late Flight bag check just lost you my business. I missed flight and - AM apt. Three other people on flight had same exp.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @CheerTymeDad Gee that's like almost caring - about ppl more than $$. Think I'm more int in having a trusted adult w\\/ - daughter .\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - despite my bag not making it to Newark good informative email tracking updates - help!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - @ladygaga @carrieunderwood all are great , but I have to go with #CarrieUnderwood - \U0001F60D\U0001F44C\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - Thank you!!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - when an airline causes the missed connection u would think they would take - whatever steps to remedy that screw up.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica hahaha \U0001F602@VirginAmerica - YOU GUYS ARE AMAZING. I LOVE YOU GUYS!!!\U0001F497\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica wish I can afford to fly with you - next Friday going back home.. love everything about your airline\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica I paid the premium to fly you across - the country, you Cancelled Flight my flight and offer no check fee or upgrade - love? Sad face :(\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - there are a lot of unhappy cold people on the bridge in freezing temps for - an hour. Not given any info.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"\u201C@VirginAmerica: - @KarinSLee Of course. Have fun celebrating!\u201D Thanks! Happy Chinese New - Year!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - your beautiful front-end design is down right now; but it was cool to still - book my ticket b\\/c all your back-end was secure.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united that's exactly the point. It fits. I'm - premier access. Boarding group 2. This was a return ticket. I've been doing - this for 15 yrs\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - current bug on website shows \u2018select departure city\u2019 when selecting - destination city http:\\/\\/t.co\\/SLLYIBE2vQ\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united today take flight to san francisco. .. - refuse to let us board with baby early... time we board wont let us take baby - carryon bag\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - it was amazing, and arrived an hour early. You're too good to me.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica I have lots of flights to book and - your site it not working!!!! I've been on the phone waiting for over 10 minutes..........\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united my flight was delayed due to maintenance - in LIT and caused me to miss my connection at IAH to MSY. Can you help?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Atlantic ploughs a lone furrow in - the #MiddleEast http:\\/\\/t.co\\/vw4P4T4tLh @TheNationalUAE\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united #albanyairport delayed departure to check - bags at gate claiming space filled and walk on to open spaces a delay #poorcustomerservice\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica ...Please come to Minneapolis St. - Paul!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - wow you even answered back! Awesome! @AmericanAir @USAirways That's customer - service!!! #usairwaysfail\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - you have amazing staff & super helpful as I just ran the @WaltDisneyWorld - #PrincessHalf they have spoiled me with comfort!!!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica Flying LAX to SFO and after looking - at the awesome movie lineup I actually wish I was on a long haul.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Oh, we are sure it's not planned, but it - occurs absolutely consistently, it's usually the only YYJ flight that's Cancelled - Flightled daily.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - #Newarkliberty Airport need to indicate different gate#'s for terminals A&C. - #Flyingainteasy\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - - too many apologies! You r the worse airlines! Don't even respond to your - cudtomers\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - After speaking to a United customer service rep the night before a flight, - confirming that everything is ok with your reservation..\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united really? 3 hr delay, 4 gate changes, & - you boarded us, sent us back up, & boarded us again. Won't change our - flight. Can we go now?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - not yet. I complained about the guy who checked my luggage in as he was throwing - the bags around. Unfortunate coincidence I hope?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I paid for economy plus and you put me - in the last boarding group so I have to gate check my bags too? @VirginAmerica - knows better..\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Really missed a prime opportunity for Men Without Hats parody, there. https:\\/\\/t.co\\/mWpG7grEZP\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united in addition, my first flight was delayed - an hour and I'm arriving at my destination 8 hrs Late Flight.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united it won't help...been there done that.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica just promoting the product is all, - had a problem with southwest and recommend noneother than the best! http:\\/\\/t.co\\/tFaNXBh1Cf\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica my luggage is gone. I've filed my - paperwork, promised a call\\/email. Still no resolution or response from central - luggage.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I've filed the claim but have no way of calling for updates. Is there another - way to do this?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - I'm very frustrated and have wasted 2 days now due to your equipment failures.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica, you're doing a great job adding - little luxuries\\/aesthetics that improve the air travel experience. Thank - you. Keep it up!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - i left an item on the plane and have been calling non stop and no one has - been answering can you please help\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Lost bags. Cancelled Flightled flights. Delhi call centers. Poor United staff - spread thin and stressed. You name it.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united DM sent\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united load balancing system apparently down #systemwide - - major impact on all #united airlines flights. Was this a #cyberattack?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united just wanted to let you know how wonderful - Rosetta the gate agent was working flight 6457 Dan to Ase. Let her know she - wasappreciated\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - I hope so too\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - if I pay you $25 and $35 for my luggage to be delivered when I arrive. Why - should I have to wait 3 additional days for its delivery?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@United now what?!? http:\\/\\/t.co\\/5hpSqVRjK8 - flight was gone when I got off plane! #BusinessTravel #goodenoughmother\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united\\nYou really know how to piss people off. - Your Farelock option is fake!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - can we make every VX plane with #nerdbird? Why should Austin be the only one - getting nerd love?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - thats weak. See ya \U0001F44B\\nHey @VirginAmerica !!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united 3 hours to rebook but 8 hours l8r the same - problem again. Arrive at gate stopped cause now infant is sitting in 4 yr - old lap\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Site down? #help\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - since bulkhead seats cannot have bags on floor, why don't u reserve o\\/head - space above those seats? In 1B on UA246 - not impressed\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica twitter team. you guys killed it - for rescheduling me asap. thank you!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - what happened to Doom?!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@virginamerica - #flight home to #dc #sunset #globe in' #backtowinter back to #work! #refreshed - http:\\/\\/t.co\\/VX9vBCTdLf\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - What is your phone number. I can't find who to call about a flight reservation.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Thank you for the cheese platter and abundance - of entertainment options. Time just flew by.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I just sent an email to Customer Care, - telling them I may have to break up with you \U0001F622. I sincerely hope - they can help me!!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @ChrysiChrysic your assistance yesterday when u Cancelled Flightled our flight - was to give us a hotel hotline Shame on you!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united is my favorite airline.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica your website sucks donkey dicks. - Just thought you should know. All best.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united of course I did. The bag should be here - by now :( #frustrated\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - thanks -- we filled it out. How's our luck with this? Is it common?\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united thanks we'll be in touch!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Thanks for taking care of that MR!! Happy - customer.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - completed form but doubt it's any use. UA doesn't care. 6 day vacation will - now be 5. Sure UA won't feel responsibility for that...\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica seriously, though. will there not - be direct flights from SFO-FLL in may???\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica a brilliant brisk am in Boston in - cue for vx363 http:\\/\\/t.co\\/rMZNIVGmg6\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica What @dhepburn said.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"Bruh \u201C@VirginAmerica: @giannilee Turn down - for what. #VXSafetyDance\u201D\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - your SFO-YYJ fight is Cancelled Flightled several times each week, why even - bother?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Are there any plans for a short haul airline in Europe? Would defiantly fly - with you guys :)\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - BUT you have received confirmation via email that you are confirmed and ticketed - on this flight.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - I take back the comment about your team here working hard to help us A so - far no solution for a hotel or food or anything #fail\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica to begin Dallas-Austin #flights - in April - 88.9 KETR http:\\/\\/t.co\\/SSUVWwkyHH\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica I am all about the in flight artisanal - cheese and wine pairing.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Do you provide complimentary upgrades to first class, if there are available - seats?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - In the process of recovering their car rental - condo rental $ in Florida. - They called #United for an alternate flight #NOANSWER\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united and what am I suppose to do with that number?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica \\\"You down with RNP?\\\" \\\"Yeah - you know me!\\\"\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - \ gate agent at EWR \\\" if you are disabled or in a wheel chair, it's time - to board, please step\\\". STEP UP??? Lol\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica too bad you say it takes 10 to 14 - days via YOUR confirmation email. When I inquired after 3 weeks you claim - 6 to 8 weeks!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - have been waiting 2 days for my military bags from an airport 3 hours away - from me. Horrible.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Pleased to be a Premier Platinum\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - luggage was severely dented\\/missing wheel coming off baggage claim in SAN. - Luggage agent Miranda (I think) wasn't any help.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica everything was fine until you lost - my bag\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @FiDiFamilies us too! Terrible airline! Just gave us a hotel hotline number - and said sorry\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @madbee95 check the website before you go to the airport!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united can you ask your guys with flight 1146 to - BWI to wait for us to get off a delayed flight from San Diego? Pretty please?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica please contact me about portfolio - left on flight VX 27 from JFK to SFO tonite seat 7AM. Need it returned. Call - 914-329-0185.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - @JMS2802 : outsource it all United Airlines...your customers are just loving - you for it. Outsource. Outsource. Outsource.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica still waiting to see @Starryeyes_Dev_ - \ \U0001F61E\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - yep that's correct, I got an email at 12:30 am that the flight was Cancelled - Flightled, doesn't matter now flight into atl is delayed, thx\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Agent in LAS letting 20 customers know - they can't help them rebook delayed flight to DEN #unfriendlyskies http:\\/\\/t.co\\/QuzVmK2rTR\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica my group got their Cancelled Flightlation - fees waived but I can't because my ticket is booked for 2\\/18? Your reps - were no help either \U0001F621\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - is my new go to airline\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - this is atrocious customer service.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - - Your site seems a little wonked right now. May want to have a look. Tried - on two browsers. No CSS? http:\\/\\/t.co\\/8qsQMM7KF2\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica amazing to me that we can't get - any cold air from the vents. #VX358 #noair #worstflightever #roasted #SFOtoBOS\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united is the worst. Nonrefundable First class - tickets? Oh because when you select Global\\/FC their system auto selects - economy w\\/upgrade.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - thanks!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - hi guys, do you have a general enquires email address please? Thanks David.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica to jump into the Dallas-Austin market - - @Dallas_News http:\\/\\/t.co\\/EwwGi97gdx\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united better just keep connection from ORD To - FWA that boards in ten minutes open until I get off the plane that just landed - an hour Late Flight\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - congrats, you just got all my business from EWR to SFO\\/LAX. Fuck you @united - fl1289 SFO\\/EWR was the clincher...\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I did start a claim but 8-10 weeks is unrealistic, am I really supposed to - go that long with out a car seat for my child.Ridiculous!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united empathizes w\\/ my disappointment that - 1stClass flight w\\/nonworking entertainmnt is worth $50. #UnFriendlySkies - http:\\/\\/t.co\\/lOecO4gmvd\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - according to your DMs, I'm not owed a refund. please may I be provided with - a contact number before I go to my bank to file claim\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Can you give me Silver Status for - 12 months?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - your airline is awesome but your lax loft needs to step up its game. $40 for - dirty tables and floors? http:\\/\\/t.co\\/hy0VrfhjHt\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I think DM would be better\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united 441, which also had 1 working WC in coach. - Good thing this bird landed ahead of schedule. I have to use the WC stat.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica Very nicely done. \U0001F44F\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica can\u2019t access your website from - Safari on iPhone 6. Seems to work on Mac and iPad. Need iPhone to add Passbook.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united should NOT sell tickets for @SilverAirways - on http:\\/\\/t.co\\/onhXHCO6bK. has terrible service and UA staff cannot - reach Silver\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - has flight number 276 from SFO to Cabo San Lucas arrived yet?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united we had four scheduled flights on this reservation - and literally did not take one! Unreal\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united so 8 hotels for 32 people but feel like - we are being held hostage because someone has our boarding passes so we can't - leave! #FAIL\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I was denied getting on the plane w\\/o getting the chance to prove it fits. - I'm not a rookie. Read my bio.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - If only you guys had flights from CMH.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Hey, first time flyer next week - - excited! But I'm having a hard time getting my flights added to my Elevate - account. Help?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I was scheduled for SFO 2 DAL flight 714 today. Changed to 24th due weather. - Looks like flight still on?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Today was not your finest. All could have been prevented by one gate agent - advising 200 passengers.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - you guys need some serious training in customer service. Too many better options - to put up with the way you guys handle ur mistakes\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united yes please! Trying to get to POP- in Newark - now....\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - how can you not put my bag on plane to Seattle. Flight 1212. Waiting in line - to talk to someone about my bag. Status should matter.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Now arriving a day and a half Late Flightr - than supposed to. Lesson of the day, don't believe verbal or written confirmations - from United\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Grouping Virgin in with the others now. BOS weather has exposed their actual - Cus Serv model. Never Flight Booking Problems with Virgin again!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Man of steel flies to more cities - though...and with more frequency too.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - you guys messed up my seating.. I reserved seating with my friends and you - guys gave my seat away ... \U0001F621 I want free internet\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united DM does not work what do I do?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united booked award tix on ThaiAirways but I'm - not seeing a conf# for them, just the United Flight Booking Problems#. Can - you get get the Thai# for me?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - @FlyEIA yes, they said it took more than an hour!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Nope. Walked up & down the ORF terminal, - & not a United agent to be found. Showed up @ last minute to board us. - Many panicked people\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - on VX399 from JFK to LA - dirty plane - not up to your standards.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united 5 gate changes, two delays. Even the crew - thinks the airline sucks\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I did. The AC went on for about 20 minutes before returning to the Mojave - Desert. #PressureCooker #HeatTrap\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - had me at their safety video . . . http:\\/\\/t.co\\/CqMm7nuE9m LOVED my - first cross country flight. #livewelltraveled #sytycd\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica now it's just t-minus 32 minutes - until my Elevate a Silver upgrade window opens . #FreeNeverSucks \U0001F603\U0001F44D\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica thanks for gate checking my baggage - on your full flight dfw-lax 883 and giving me early boarding too #sweet\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united at its worse. Can't figure how to pack - plane, screws up connectns then claims no hotl rooms in San Fran for stranded - pax. Way to go!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I'm saying I made the flight but with poor\\/non-communication, unaccounted - for lost time & lots of frustrated flyers standing around\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica @AmericanAir can u help with flights - to get a 2y old battling cancer who needs treatment in \U0001F1FA\U0001F1F8 - @FreyaBevan_Fund \U0001F497 \U0001F380 \U0001F497\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Can I get some help with a support - ticket? It's been 15 days.... Incident: 150202-000419 Thank you!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thanks! Will you guys be getting the A380s - anytime soon?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - Thank you for the follow\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"I - \u2764\uFE0F flying @VirginAmerica. \u263A\uFE0F\U0001F44D\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Thank you!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united agent helps the person in front of me. - \ Finishes up with them and then walks away. The guy behind me is as shocked - as I am.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Mobile boarding pass disappeared from phone while standing in line to board. - Second time this week... Hmm.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I called a 3-4 weeks ago about adding 3 flights from 2014 to my Elevate...they - still haven't shown up...help!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - your inflight team makes the experience #amazing!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united switched to fly united from delta for the - past two trips and was very disappointed. Now my UA4646 on 2\\/23 is delayed - by 3 hours!!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"\U0001F44D\U0001F44D\u2708\uFE0F\u2708\uFE0F\U0001F497 - When are you guys going to start flying to Paris? @VirginAmerica: @LizaUtter - You're welcome.\u201D\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - computers are down but you stopped giving updates and took my flight info - off the app. That's just ridiculous keep people updated!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica got it squared away. Someone picked - up as soon as I tweeted. Should have tweeted sooner. \U0001F609\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united captain \\\"on behalf of the front office, - welcome on board.\\\".... Never heard that before. I laughed...hard. #funnycaptain\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Terrific. Many thanks. Looking forward - to being back on UA tomorrow. Had a great flight up to Vancouver.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united GRK13575M is the file reference\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thanx so much. You followed through and - emailed me a $1000 ticket voucher. #unitedairlines they do care\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united that's unfortunate. The @Tumitravel was - an xmas gift and it looks like a razor ripped right through the front pocket - in the picture\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - i DMed you the details\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - My favorite way to travel! Thank you! http:\\/\\/t.co\\/vGN2X1ckg0\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Cancelled Flights flt from EWR. \\\"No - crew\\\".Tells wife & 4 yr old to \\\"get to NY to catch @AirCanada\\\" - to YYZ! Good #customerservice is dead.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Why is it taking 12 years to fly - home to Dallas? Get your shit together.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I'm pulling my hair out trying to - book a flight with u. Your site doesn't work on iPhone or iPad.don't have - a computer #help\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - So what does someone with severe anxiety do when the one person who can help - him isn't next to him?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - the proper response: sorry for your wait, what flight # were you on so we - can look into the issue. That's how @Delta would handle.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united ok. I just submitted. Thanks for the opportunity - to give feedback.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Comenity Bank is a joke! Please change. Nothing but constant problems with - this bank\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - no A's channel this year?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - not worried, it's been a great ride in a new plane with great crew. All airlines - should be like this.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - u would not be able to rebook me to get home any sooner than a now 2hr delayed - flight. #linesforever #customerservice #fail #again\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united that would help! or how about integrate - it into the App so I can just \\\"activate\\\" it and surf...\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica was wondering if you guys recieved - my dm and we're able to potentially respond asap\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Ice, which I totally understand. But when - a large number of us are facing 15+ hours of time and overnight Cancelled - Flightations it seems like\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - disappointed that u didnt honor my $100 credit given to me for ur mistakes. - Taking my business elsewhere \u270C\uFE0Fout.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica come back to #PHL already. We need - you to take us out of this horrible cold. #pleasecomeback http:\\/\\/t.co\\/gLXFwP6nQH\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica Your back of seat entertainment - system does not accept credit cards that have an apostrophe in the surname. - #apostrophefail\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Had to explain to a very over eager flight attendant trying to ask about my - vision that my @ccicanine was not a guide dog!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united #worst2unitedflightsever UA 236 LAS to - IAD 2\\/24 mechanical problems again - took off - had to land for fix - delayed - again #wtfodds!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Why is the site down? When will it be back up?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united sorry for the delayed response. It was - UA #381 Chicago to San Fran. Held up for almost an hour on the Tarmac. Also, - lost my bags\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - morning. If I have a question regarding elevate points & flights can I - DM you?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Dmed you. Thank you\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - It's a shame choosing #United may be the difference between reuniting with - aging friends and never seeing them again #PoorService\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united also, the mere fact that I have to go online - to issue a statement vice calling and talking to some directly is one good - example.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I <3 pretty graphics. so much better than minimal iconography. :D\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica good to be home #texas #moodlighting - http:\\/\\/t.co\\/N3BVZTY3zI\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - on 4124 arriving two hours Late Flight into CLT. Now sitting on the tarmac - while they move a plane from the gate. Unhappy customer.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@United well sitting on the ground 'on time' but - waiting for a gate....again #tiredofthis\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica plz help me win my bid upgrade for - my flight 2\\/27 LAX--->SEA!!! \U0001F377\U0001F44D\U0001F4BA\u2708\uFE0F\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Is it normal to receive no reply - from Central Baggage #baggageissues #smh\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica how come you don't have an iPhone - app? Still using and making me waste paper.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I flew United last month and the experience - was AWESOME!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - shares rise on Q4 financial results - USA TODAY http:\\/\\/t.co\\/lFS4PEFE6y\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united follow back and I'll give you the details.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica has the most INCREDIBLE customer - service I've ever experienced! So refreshing!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united is flight 587 from DFW to ORD currently - on-time? I see an advisory that DFW may be affected by weather\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united that's right- with an overnight Miami.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united you're the reason this whole travel experience - has been a nightmare\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - This ALWAYS happens with you guys, and it makes traveling incredibly stressful - and uncomfortable. Is that good business to you?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united AND my luggage has been broken!! #youcouldntmakethis - up #brokenwheel\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - 8602947, jon at http:\\/\\/t.co\\/58tuTgli0D, thanks.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united #UnitedAirlines Any other way ORD to ABQ - anytime within the next 7 hours?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@United - gate announcement states delay due to maintenance yet app says Late Flight - arriving aircraft tell the truth! @unfriendly\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@United how do you lose a gate checked bag DEN - to ORD? Direct flight. Ugh.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - BIG Love\\/gratitude.mpower w\\/ http:\\/\\/t.co\\/1AGR9knCpf weRin #OSCARS2105 - VIPswagbags@ #AvalonHollywood http:\\/\\/t.co\\/ybMbGs0dHn\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Many Thanks for the Follow.\\n#ourprincess - #freyasfund #USA #Bandie \\nLooking for Any Help\U0001F60D\\n\U0001F497\U0001F1EC\U0001F1E7\U0001F497\U0001F1FA\U0001F1F8\U0001F497\\n\U0001F380\U0001F30F\U0001F380 - http:\\/\\/t.co\\/UJfS9Zi6kd\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - SFO-PDX schedule is still MIA.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - \ Stressed and rude agents. Overwhelmed by delyd flight LAS-DEN 1657. Yelling - at several people. Not pretty. This is #friendlyskies??\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica @SSal thanks!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united #worst2unitedflightsever UA1429 IAD to - LAS 2\\/19 mechanical problems - switched aircraft delayed 3.5 hours!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united On a standby to Denver, which has been - delayed, and a confirmed to Aspen, whose flights have been Cancelled Flighted - all day. 0 confidence.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - tried calling too, but w\\/25 min phn wait means we'd miss options anyway\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica when are you putting some great - deals from PDX to LAS or from LAS to PDX show me your love! http:\\/\\/t.co\\/enIQg0buzj\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica @TTINAC11 I DM you\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica is anyone doing anything there today? - \ Website is useless and no one is answering the phone.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united if the car seat is lost @united should - just reimburse me for a new one, this is not a pair of shoes, it's a necessity - for my child\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I love the hipster innovation. You are a feel good brand.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica partners with @Visa Checkout as - mobile payment method to help boost mobile conversion rates #etailwest #payments - #visa\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - you are one great airline \u2764\uFE0F\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united iCloud it is not there yet -- PLEASE HELP - 917 703 1472\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - it's not getting any better. I'd suggest you get a senior manager to this - gate , then retrain these gate people\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Airline trouble this winter & not getting good customer service? contact - http:\\/\\/t.co\\/aQjn4HwNaC we negotiate resolutions for You!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Read my bio. See who I work with. I have - NEVER encountered this with your airline before. Disappointed is an understatement.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I adore you, and am so looking forward - to my flight to Austin in two weeks.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Nice to see you expanding in Texas but don't forget about us here in #SanDiego. - I would love to see more flights out of here!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united seriously #fail on making strangers share - a room\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I was really looking forward to my flight. can you let me know when it will - be rescheduled? #diehardvirgin\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - cool picture of another VirginAmerica plane off our wing. What a site! http:\\/\\/t.co\\/5B2agFd8c4\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united has made my no fly list. Other airlines - wait when connector Late Flight. Stuck in IAH.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica just landed in LAX, an hour after - I should of been here. Your no Late Flight bag check is not business travel - friendly #nomorevirgin\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - yes at 2am...but now back on a plane again and delayed again due to baggage - loading issue... http:\\/\\/t.co\\/NfAQHhr09j\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Congrats on winning the @Travelzoo - award for Best Deals from an Airline (US) http:\\/\\/t.co\\/kj1iljaebV\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united where's my damn bag??\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I need you to follow back in order - to DM.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - did bags make it on the flight out of iad? second day without clothes is - pretty inconvenient. We're pretty curious #UnitedAirlines\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I\u2019m having trouble adding this - flight my wife booked to my Elevate account. Help? http:\\/\\/t.co\\/pX8hQOKS3R\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica to battle @SouthwestAir on @DallasLoveField-@AUStinAirport - route \\nhttp:\\/\\/t.co\\/6RLz0EBk2X via @usatoday\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united 18 flights so far this year. 13 delays - including 2 Cancelled Flightations. Late Flightst reason, crew needed mandatory - sleep. IN MEXICO!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - is your website ever coming back online?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica awesome. I flew yall Sat morning. - Any way we can correct my bill ?\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - flight attendant doesn\u2019t understand not understanding English doesn\u2019t - mean they are deaf. Stop yelling English slowly to them.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united wont transfer flight ticket to accompany - an 11 yr old who's active military mom had to have emergency brain surgery? - WOW!!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Had to spend 5 hours worrying that items in carryon would be broken\\/stolen - since I couldn't carry them on plane or lock bag.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Okay thank you\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Having an issue finding a missing - item on a plane. Can you help me find which airport my plane headed to next?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica you know I'm flying virgin for the - fight #MayweatherPacquiao\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - What is the reason for the delay of the departure of VX 413 from JFK this - afternoon?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - so loyal that I'm driving to #NYC from #PA, to fly Virgin, since you cut - #Philly flights ;)\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@United - has two whole people trying to schedule a flight's worth of missed connections. - Shameful http:\\/\\/t.co\\/6kqLhVaP7G\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - When will email address\\/username sign-on be available? It's been a while.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica and again! Another rep kicked butt! - Naelah represents your team so beautifully!! Thank you!!!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Not sure what you are talking about. She - is going on nonstop flights. SNA to SFO and then SFO to EWR.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@United of urgency, but this is ridiculous. Your - ceo claims to be customer focused, yet when delays happen, planes sit and - customers are\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - The bright side would be keeping the promise that was made to me. Hope you're - having a good night. Thanks.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Gate agent hooked me up with alternate flights. If you have a way to PREVENT - the constant issues, that would rock.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Fingers crossed & its all intact. Very disappointed with this experience - as before this we were actually saying we enjoyed using you\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united despite shaky connections, looks like I'll - get home tonight. Great job, @united - was touch and go for a while..\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Just checking in again - what is the status - of our claim. It is going on 2 months with no attention to this? We are - very upset.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - lots of reports of system failures delaying flights over the last week. Currently - sitting on the tarmac at OGG for over an hour.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica i need to change my flight thats - scheduled in 9 hours and 120 min wait time on phone. Im calling intern. Help!!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica is the best airline I have flown - on.Easy to change your reservation,helpful representatives & a comfortable - flying experience\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - On all your flights?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - I send you an urgent message via eservice@united.com. BG0KWM Narayanan. - Please respond ASAP. Also, NO local United Tel # @ KUL\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united found a group of people who actually hates - people more than ISIS, thats right United Airlines.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica @ladygaga @carrieunderwood I'm - Lady Gaga!!! She is amazing! \U0001F60A\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I tried but no one was available in bogota - and everyone was rude in Houston. I was stuck for 35 hours because of you - guys\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - you are the worst. I will avoid you like the plague.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united can someone please explain the process - of of what happens to property found on a plane after passengers leave at - Heathrow ?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - landed in Boston at 9 last night. The 15 hours of traveling was rough tho.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thanks! It's 35K miles from RTB to Europe, - to do a multiple destination so we could stop over in US on way\\/way back- - mileage diff?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - - amazing customer service, again! \U0001F495\U0001F495 RaeAnn in SF - she's - the best! #customerservice #virginamerica #flying\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united ours in July. You have ZERO excuses for - this. You have an out-of-date system that causes problems like this.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica your Avis rental continue button - doesn't work on your website to book car. Tried 4 times on phone. This sucks!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Adds Pillows Instead of Lie-Flat - Seats in First Class Arms Race http:\\/\\/t.co\\/rGYwJBbhm4\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united I know this is probably a no but is there - a way to get a cheaper airfare ticket if the flight is leaving in a few hours? - \U0001F64F\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - \ DREAM http:\\/\\/t.co\\/oA2dRfAoQ2 http:\\/\\/t.co\\/lWWdAc2kHx\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@virginamerica not really the experience I was hoping - 4, I ws forced 2 check in a small carry on, w\\/ nothing but empty cabin space - on board\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - But thanks for asking\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - Because we never rec'd Cancelled Flightlation notice we were left w no options - to fly out of PS. Driving to LA for a red eye Mon w kids\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica check out new music http:\\/\\/t.co\\/maRcnOCWzn\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica and it's a really big bad thing about - it\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united ok - it's now been 7 months waiting to hear from airline. I gave them quite a bit - more than the 30 days requested! Terrible service\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united has been such a disappointment today. Simply - put. Rather unpleased with things currently. Flight delayed; cant wait to - just get home\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - wish you flew out of Atlanta... Soon?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - there is something wrong with you website in Safari iPhone\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united it was UA381 on 14 Feb. Point is, overselling - flights= bad. Making people wait 1hr while you kick them off after boarding - is worse\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I tried that. You offered to charge me an additional $1k for a new ticket - or be stranded until Thurs. 1st time, last time.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united is the worst airline in the world.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @luke_mcintosh68 nah you wouldn't\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united I appreciate your efforts getting me home!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united maybe one day you'll be the one quoted - on http:\\/\\/t.co\\/mJkpgVXmPC\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - lost my luggage 4 days ago on flight VX 112 from LAX to IAD & I'm calling - every day, no response.Please give me back my stuff\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica I was so glad it was mentioned. - I took my first virgin flight a few years back and it was a transformative - experience.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - is horrible!! They lost our carseat and expect us to use a loner carseat, - safety regulations say it's illegal to use a used car seat\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica thank you! I absolutely will \U0001F60E\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\".@VirginAmerica I don't understand why you need - a DM to give me an answer on if you have a damaged luggage policy.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica you have the absolute best team - and customer service ever. Every time I fly with you I'm delighted. Thank - you!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - Did you find out where it is? Thanks\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Cancelled Flighted our flight, didn't rebook us on added flight, now have - to drive from a Denver to KC....thanks!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Every United flight between Saipan and Guam - is an adventure! You never know when @CapeAir's old plane will be operational - :)\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united how - about 3659 YUL-ORD?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - Is flight 769 on it's way? Was supposed to take off 30 minutes ago. Website - still shows \\\"On Time\\\" not \\\"In Flight\\\". Thanks.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united frankly worse customer service ever. Problems - will happen, how you deal defines a company. Never again United.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united flt 1249 Cancelled Flightled and I get - email @3:30 AM? What happened to courtesy phn call? Had to book diff airline - & city\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I am deeply disappointed that your birthday promo was not applied to a trip - I booked mere days before I received the email\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I'd say most of the public can't extend - their vacation a week, point is why advertise multiple flights you can't honor?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Can you find us a flt out of LAX - that is sooner than midnight on Monday? That would be great customer service - \U0001F603\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - Good point!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - So they didn't drop my bag overnight & now I'm leaving for a week. This - is why you were supposed to hold on to the bag....\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\".@VirginAmerica If only you guys were starting - those flights at the end of the month! Guess I\u2019m still road tripping - on Feb 27\u2026\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - I took the exact same aircraft in to LAX 3 days ago. It fit, no problem. The - agent today told some nonsense about a policy change\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united yes lots. You have terrible customer service - at Newark and despite raising a complaint there we were ignored hence the - tweet\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@virginAmerica - Other carriers are less than half price for a round trip fare. I am stunned. - http:\\/\\/t.co\\/UKdjjijroW\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - you know what would be amazingly awesome? BOS-FLL PLEASE!!!!!!! I want to - fly with only you.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - YOU GUYS ARE HORRIBLE.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"Nice - RT @VirginAmerica: Vibe with the moodlight from takeoff to touchdown. #MoodlitMonday - #ScienceBehindTheExperience http:\\/\\/t.co\\/Y7O0uNxTQP\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united UA938 ORD-LHR. bags are being loaded 30min - Late Flight. Frigid air into cabin! Plane feels like falling apart! Upgrade - long haul fleet!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - still no refund or word via DM. Please resolve this issue as your Cancelled - Flightled flight was useless to my assistant's trip.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united After our unscheduled refueling stop and - missing 2 connecting flights we r home n looking 4ward to our bed and a big - PB&J sandwich.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - done. Want me to send a screen shot of the second call, which is now at over - 45 minutes?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Status match - 2 weeks have gone by and no news.Flt next week - hope flt will - count towards requirement. Cust Svc no help!!!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Delay DEN-CLE because they have to manually - enter baggage tags? Really? Worst cust service day for this 1ker. #friendlyskies??\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united See? We were told repeatedly that the pilot - was Late Flight and kept getting Late Flightr. After we boarded, there was - a defibrillator issue.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Deep Vein thrombosis\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - Woke up to notification- flight moved 1.5 hrs early. Barely made flight then - 3 hrs layover in SFO - wanted to hop on earlier option\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united what's a good number to call to speak with - someone about how you can fix what you did to 50 people and their luggage - on Saturday?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - when can I book my flight to Hawaii??\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - I'd love to know what your policy is for damaged luggage.\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Hi, I'm trying to do check-in but - the website is not working. I tried 3 different browsers and the problem continues\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Twitter isn't letting me DM you..\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united Has it departed? I was awaiting an inbound - plane yesterday for three hours and it never arrived. Had to stay overnight - (again).\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - that's brilliant Thankyou so much. Is it classed as part of carryon?\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united agent split up my reservation? Now can't - Cancelled Flight and refund credit for 2wks? Why\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Do we know why UA5282 is delayed x2)? This - is getting crazy. I've already had 2 overnight delays. #UnitedAirlines\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica you guys are perfect as always! - <3 #WeRVirgin\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - \ - Is Flight 713 from Love Field to SFO definitely Cancelled Flightled for - Monday, February 23?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\".@united - it will be because I'm moving to @AmericanAir because of @united talk, no - service\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - we were not given the option of using our United TravelBank in a recent Flight - Booking Problems! Any help in using or recouping these funds? Thanks!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united http:\\/\\/t.co\\/hj5kq82Chn, however, - is completely under your control\u2014the price was and still is displayed - on http:\\/\\/t.co\\/hj5kq82Chn.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - @VirginAtlantic I have just checked in flight to SFO from LAX & been told - as Atlantic Flying Club Gold I get no benefits?!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @simonroesner you'll need to upgrade the - seats too, even in economy plus it's like sitting on a concrete bench.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united - SERIOUSLY it's 2015?!?! NO WiFi on a - 5hr flight from CLE-SFO #1589. You're the ONLY airline without WiFi...\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united thnx for the info\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united great to hear Thankyou so much. Greatly - appreciate your replies. Feel much more settled now.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united 6533 ORD to DCA\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united We're hoping to hear from you actually.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Outbound 2 bags 70 lbs bags Returning home - 1 bag 50 lbs. What is your logic? And WHY? Am I writing to a Machine? Human - HELP required\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - i understand, thanks\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - \ I flew from NYC to SFO last week and couldn't fully sit in my seat due to - two large gentleman on either side of me. HELP!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica completely awesome experience last - month BOS-LAS nonstop. Thanks for such an awesome flight and depart time. - #VAbeatsJblue\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - add DTW and I'm sold!\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - beats expectations, shares take off - Santa Cruz Sentinel http:\\/\\/t.co\\/qm9dQbai6G\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united currently on board so not now. Check in - was terrible. Staff rude. Expensive luggage thrown around etc.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united looks like today will be my 6th consecutive - delayed flight from you...do I win a prize??? @Southwest Air why don't you - fly to SBA? \U0001F62D\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"\u201C@VirginAmerica:You've - met your match.Got status on another airline? Upgrade : http:\\/\\/t.co\\/H952rDKTqy\u201D - @asarco_ES_ar ? \U0001F649\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - should I be concerned that I am about to fly on a plane that needs to be delayed - due to a \\\"tech stop\\\"?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - I guess. But what is the excuse for understaffed costumer services? 3 people - had to deal with lots of angry passengers. Weather too?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united to be clear on my luggage comment, I am - referencing the photo attached. Flight 6232 to JAC http:\\/\\/t.co\\/PnBajfkmHG\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@United. What's going on with UA 236? outbound - flight last thurs was delayed 4hrs How long will this delay be? #worst2unitedflightsever\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica can you please have flights in SJC - ? I have no choice but to fly Southwest to Vegas \U0001F629\U0001F62D\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica Do you guys know your check-in links - from emails are broken? http:\\/\\/t.co\\/2npXB6oBMr\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Are there any sign up bonuses to - enroll in Elevate?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - It's fine. Already done with my purchase. But you should try it. Just go most - of the way through then go back 3\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"Thanks - @united. @imran_r44 had a question about the wait time for baggage on UA6366\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united you are easily the worst company I have - ever experienced. You have lost someone's personal possessions & you couldn't - care less!....\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - yes, but still now answers. Many have not had their luggage for 3 days! Unacceptable!!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I filed a delayed bag report on Saturday! - my flight was Cancelled Flightled and I never went anywhere!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @CheerTymeDad So I can buy tix 3 days before - flight but can't transfer the tix. Flawed security logic. Flawed customer - service\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Adds Pillows Instead of Lie-Flat Seats in First Class Arms Race \\nhttp:\\/\\/t.co\\/SfjDuahx9Z - by @skift\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - I'm #elevategold for a good reason: you rock!!\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica wifi AND better seating.\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica having problems Flight Booking Problems - on the web site. keeps giving me an error and to contact by phone. phone - is 30 minute wait.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - i travelled from SCL- IHA feb 17. the AC on my sit (21L) was ON all night. - I complaint to FA who never gave me a real answer. Help!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Lister to my show my on Monday 1230 - 130\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - So excited for my first cross country flight LAX to MCO I've heard nothing - but great things about Virgin America. #29DaysToGo\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united I understand, but it's tough when there - is no way to get to the airport w\\/o serious risk of an accident. It's a - steep price.\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - @ladygaga @carrieunderwood After last night #tribute #SoundOfMusic #Oscars2015 - @ladygaga! I think @carrieunderwood agree\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica trying to book a flight with you - guys and your website won't let me... about to lose my business\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united I am trying to find out if the loaner seat - is new or used, a used car seat is illegal according to safety regulations\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united why not? Is it a law or a policy?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united and those three people were awesome working - very long hours. It is easy to say sorry on Twitter but you should help your - ppl @EWR\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@SouthwestAir - doesn't charge ticket change fees. Do they not incur the same mysterious \\\"costs\\\" - that you incur, @united?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - @AmericanAir spent hundreds to rectify the situation and you guys go quiet\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united those whose pay to actually fly with you - over 30k\\/ year deserve better service than a CC holder.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica While other airlines weren't Cancelled - Flighting flights into BOS, and helping their customers get home, Virgin was - saying Good luck!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - JH, thanks so much for reaching out. I was able to get assistance after waiting - for 70 minutes.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I think i left something on the plane yesterday. who do i call...ah!\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united I'm rebooked now, but the line was 300 people - deep.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - man I can't wait to book my ticket now! Thanks JP you're a life sabe\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united Exhausted & frustrated! Link to a FB - post abt my travel issue https:\\/\\/t.co\\/LaRKC8vc4s\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica it\u2019s just a bug report, guys\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica What happened 2 ur vegan food options?! - At least say on ur site so i know I won't be able 2 eat anything for next - 6 hrs #fail\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Is there anything going on with the website? I've been getting a lot of errors - past 30 minutes.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Okay thanks if you could please update me. I was told at the airport someone - would call me today but they haven't.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - I miss the #nerdbird in San Jose\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united - in ORD hotel issued to my 4yr old. Tickets needed fixing again another hour - and 5 agents l8r nightmare still not over\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Done, but I need the receipt ASAP. - Could you please help? #150219-000114\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@VirginAmerica - You have the best flight attendant ever!!! http:\\/\\/t.co\\/PxdEL1nq3l\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@VirginAmerica @freddieawards Done and done! Best - airline around, hands down!\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - I'm grounded in Montreal with ua3659. I am missing my connection ua3417 to - St. Louis. Can you help,Do you have a private jet for me?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united 32 people getting pretty tired about no - action on solving the problem plus missing a day of vacation and skiing\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united sitting in a plane with no pilot. Thanks! - #waitingonapilot #denver #siouxfalls #whyairtravelsucks\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica Flight Booking Problems last second - flight for next week from SFO- to SAN any chance you want to gift me a promo - code since I love you guys\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - thanks so much for sharing. Just added it to my site http:\\/\\/t.co\\/TsviBTvT8h\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united caught earlier flight to ORD. Gate checked - bag, and you've lost it at O'Hare. original flight lands in 20minutes. #frustrating!\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Understood and thanks! I should have tried - reaching out sooner.\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@united - ok. To top things off, you've lost my luggage. Could you get ANY worse??? - #UnitedAirlines\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - help, left expensive headphones on flight 89 IAD to LAX today. Seat 2A. No - one answering L&F number at LAX!\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Does customer care have email or a phone rep that I can speak with? We had - so many issues they can't be placed in 2000 characters?\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united 20 min more delays to flt 2086 at sfo 2 - load 2 more pax makes no sense. Will strand many of us overnight at ORD due - to missed cnxns\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@VirginAmerica - Just DM'd. Same issue persisting.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united. - It's not my first time flying to the US. I have medical info. Looking for - practical like my adapted seat cushion allowed on?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united @JMS2802 : nothing like supporting your - own mechanics and maintenance workers...instead United puts out a video of - TIMCO doing wifi.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - yes, after this awful weather it appears I can get home\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united thanks\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united boarding time shows 35 min and your gate - agent started at 45. showed up at 4:00 and they had to check bag. http:\\/\\/t.co\\/zCBJyo6lsN\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united first time flying with United. Also last - time. #terrible back to @VirginAtlantic for me. #branson #virginatlantic #UnitedAirlines\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united already done that. the answer i got was... - oops we can give you miles and we're very sorry. but who pays for my discomfort - for 9 h?\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - counter agents at RDU deserve a medal. #thankyou\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united tag numbers 0016 964012, 0016 964077, 0016 - 964078 - let's find these bags.\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - thnx for quick reply but don't think you can assist. Our intl grp will be - put to considerable inconvenience today.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@VirginAmerica got a flight (we were told) for - 4:50 today..,checked my email and its for 4;50 TOMORROW. This is unacceptable.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Luckily I made my flights this time but - was so disappointed with the lack of communication :(\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united Hopefully my baggage fees will be waived - tomorrow when I actually get on a flight, as well as compensation for my hotel - room\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@virginamerica - why don't any of the pairings include red wine?! Only white is offered :( - #redwineisbetter\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - Late Flight to Denver, Late Flight to Newark...let's not even get into the - disaster that was checking bags. Unacceptable.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united pls properly train your agents. Requested - to speak to 1k customer service & was transferred to a dead end. Not even - open at this hr\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - #UnitedAirlines Pls Fix #AspenBaggageFail issues. Had to pay my own way to - #Aspen after flight Cancelled Flight. Left us in the cold in DEN.\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united @RenoAirport hi, when do direct flights - from Houston to Reno begin? Don't see any days in March?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@united how is Mexico not international from the - us?\\n\\n###\\n\\n\",\"completion\":\" neutral\"}\n{\"prompt\":\"@united @reebok - @rockinwellness @ Denver International Airport https:\\/\\/t.co\\/tKVmHBkeC3\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united @scotthroth scott, need a good book suggestion?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica thank you for checking in. tickets - are purchased and customer is happy ;-)\\n\\n###\\n\\n\",\"completion\":\" - positive\"}\n{\"prompt\":\"@united the least you could do is offer me a ticket - in coach instead of just Cancelled Flighting my reservation because of your - glitch!!! #notfair\\n\\n###\\n\\n\",\"completion\":\" negative\"}\n{\"prompt\":\"@united - i think he actually did not like your screen @campilley \U0001F603\U0001F603\U0001F603\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n{\"prompt\":\"@united even on international flight Glasgow to - the U.S.? Then what about orlando to Newark? All 90 mins?\\n\\n###\\n\\n\",\"completion\":\" - neutral\"}\n{\"prompt\":\"@VirginAmerica has getaway deals through May, from - $59 one-way. Lots of cool cities http:\\/\\/t.co\\/B2Xi4YG5T8 #CheapFlights - #FareCompare\\n\\n###\\n\\n\",\"completion\":\" positive\"}\n{\"prompt\":\"@VirginAmerica - hold times at call center are a bit much\\n\\n###\\n\\n\",\"completion\":\" - negative\"}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0ab3021e800f4f-EWR - Connection: - - keep-alive - Content-Disposition: - - attachment; filename="file" - Content-Type: - - application/octet-stream - Date: - - Thu, 01 Jun 2023 21:55:10 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '21' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 5df3e996fb15c961a41845446a237e59 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/files/file-xC22NUuYBkXvzRt2fLREcGde/content -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_list.yaml b/tests/contrib/openai/cassettes/v0/file_list.yaml deleted file mode 100644 index d930f0e0264..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_list.yaml +++ /dev/null @@ -1,123 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: GET - uri: https://api.openai.com/v1/files - response: - body: - string: !!binary | - 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 - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d09f6f119d08c0c-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 19:46:47 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '852' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - ceb794ea825e803eede8711250728f30 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_list_async.yaml b/tests/contrib/openai/cassettes/v0/file_list_async.yaml deleted file mode 100644 index 2025873637e..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_list_async.yaml +++ /dev/null @@ -1,419 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - OpenAI/v1 PythonBindings/0.26.5 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.26.5", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: get - uri: https://api.openai.com/v1/files - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"file\",\n \"id\": \"file-4nASatDKfNXPcAIJhu6DQk0q\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 13595,\n \"created_at\": 1684135508,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-BedfiwO5QEuczJKcl7jPFqhn\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 3460,\n \"created_at\": - 1684134162,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-AP2oVdna7PVuCsQoQjJiOPSJ\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 547,\n \"created_at\": 1684167655,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-JVB6DvcQbV1F3EFPgL9ZXDzq\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"hackadog_2023_05_15/monitor_types/diffs_prepared.jsonl\",\n - \ \"bytes\": 64082,\n \"created_at\": 1684127801,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-k3SktX2wisx1NEJDl7AYSec9\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"hackadog_2023_05_15/monitor_types/diffs_prepared.jsonl\",\n - \ \"bytes\": 43869,\n \"created_at\": 1684135206,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-urNQLYhvv32Bd1rpC6SlaIUP\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"hackadog_2023_05_15/monitor_types/diffs_prepared.jsonl\",\n - \ \"bytes\": 56897,\n \"created_at\": 1684136755,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-cLQTrRoqi3ukD7CjP3gq0opQ\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"hackadog_2023_05_15/monitor_types/diffs_prepared.jsonl\",\n - \ \"bytes\": 64082,\n \"created_at\": 1684133994,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-jCaQfiyC4IYco2NbvxK6zubA\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 3402,\n \"created_at\": 1684128532,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-fC7XELyRUmTkxXbOKEyoa6PR\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 13544,\n \"created_at\": - 1684137098,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-j5W4aPaQU8XDWhvw2oGC7i1l\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"https://cdn.openai.com/API/train-demo.jsonl\",\n - \ \"bytes\": 60491,\n \"created_at\": 1684141044,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-neSwyhymYHinwrhCFdn817wb\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"https://cdn.openai.com/API/train-demo.jsonl\",\n - \ \"bytes\": 60491,\n \"created_at\": 1684140199,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-hHCqyYR8sEzL5D3S1VocFheR\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 25599,\n \"created_at\": 1684142240,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-ZLSTpMaTRD79Hln13zaOtwmH\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 25759,\n \"created_at\": - 1684142982,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-3EQsx9gbFjGZBM6YVoc0oJxD\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"https://cdn.openai.com/API/train-demo.jsonl\",\n - \ \"bytes\": 60491,\n \"created_at\": 1684141939,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-PnbH9j5N7lNDf2X8YhoqlhMV\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 24620,\n \"created_at\": 1684142793,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-F6UiULU9OIyDEntZNjAdGeHt\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"linting.jsonl\",\n \"bytes\": 1592,\n \"created_at\": - 1684147923,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-cyVDAIlU2hzpMOf7LvMxTKiH\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"linting_prepared_valid.jsonl\",\n - \ \"bytes\": 400,\n \"created_at\": 1684144740,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-RLgIiMVu65jHkFJrdvvCGEWN\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 251,\n \"created_at\": 1684145877,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-Z6PCF1JU9hSazbtV2rJ6pon2\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"data_prepared.jsonl\",\n \"bytes\": 19500,\n \"created_at\": - 1684164083,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-lndqRPW7ECu8l8AlzKFywuEX\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 24226,\n \"created_at\": 1684164274,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-9yVHft364SlsmdSbm34ihtmI\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"data_prepared.jsonl\",\n \"bytes\": - 18240,\n \"created_at\": 1684164424,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-HkDaoGHV5GLrNOp2eTofvuaT\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 24237,\n \"created_at\": - 1684164612,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-DX2IaCNp1lFtolZnnTdwgLk2\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"data_prepared.jsonl\",\n - \ \"bytes\": 89100,\n \"created_at\": 1684168561,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-R0AobPvwrkHAhG8NEhyGIKB8\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 125751,\n \"created_at\": 1684170700,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-bGtz4ZC0WDBF7g78mJgGvu1T\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"my_data_prepared.jsonl\",\n \"bytes\": 3084,\n - \ \"created_at\": 1684155377,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-YkKccqyov4CXWv867x57XxX6\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 586,\n \"created_at\": 1684148921,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-6Rt6KLzuIPgU0Ea9JFaZMG8w\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 2632,\n \"created_at\": 1681159926,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-gLtI9MieDJLAkvs4JeXE7YjK\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"/Users/anna.pauxberger/Desktop/openai_training_datav0_prepared.jsonl\",\n - \ \"bytes\": 770,\n \"created_at\": 1684167081,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-sVGuZtkEfZf6DEImRgpY9fiw\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 2384,\n \"created_at\": 1684155657,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-ttjCc0R1r7mbPTYb3QHPtYE6\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 2731,\n \"created_at\": - 1681160993,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-6DvWgBS1WldSojcaGTXQ79FZ\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"data_prepared_train.jsonl\",\n - \ \"bytes\": 66391,\n \"created_at\": 1684160422,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-doH3yD4tG1rkqC1Qc4booSvP\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"kvs_for_openai_prepared.jsonl\",\n \"bytes\": - 5597725,\n \"created_at\": 1679450294,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-3xkmTptENqM4RLEB8O29W4mm\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 188921,\n - \ \"created_at\": 1679460340,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-tpcyKBtqWDE0c2oY2hViFztT\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 99810,\n \"created_at\": 1684161359,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-oVPgfn80efEzWDvHAWEy0dWi\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 271,\n \"created_at\": 1684178911,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-KopsI0lv1S9jZ3T8o6NKHVSt\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"data_prepared_train.jsonl\",\n \"bytes\": 66391,\n - \ \"created_at\": 1684160464,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-We3rJbGyTpLdaTNwx31kCtWw\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"bleh.jsonl\",\n \"bytes\": - 41,\n \"created_at\": 1684178593,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-0cBAMbhVDtxHWZ7alTplIJsS\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"bleh.jsonl\",\n \"bytes\": 41,\n \"created_at\": - 1684178627,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-FAs4QLr9mBp0tcn54rlXSVOq\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"data.jsonl\",\n \"bytes\": - 1645,\n \"created_at\": 1681160076,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-9kgi9twwuubMp9mIyeNmhIfB\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 13606,\n \"created_at\": - 1684196562,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-6s71uPPo6xYtLyxvC2nTdx8Z\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"sqli-sample/sqli_sample_prepared_valid.jsonl\",\n - \ \"bytes\": 3638,\n \"created_at\": 1684221695,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-acfqy1ZHBCkKVt6QGm47J1xm\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"data.jsonl\",\n \"bytes\": 1269,\n - \ \"created_at\": 1681159225,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-GRyGBacpscSHrrU1NK2dTFKx\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"hackadog_2023_05_15/monitor_types/diffs_prepared.jsonl\",\n - \ \"bytes\": 66257,\n \"created_at\": 1684196349,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-onrz06LQNU0oonJAH1jAJHdn\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"sqli-sample/sqli_sample_prepared_train.jsonl\",\n - \ \"bytes\": 13635,\n \"created_at\": 1684221692,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-UynjNiMGzVCXU9dWmns0STS3\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"data_prepared.jsonl\",\n \"bytes\": - 19240,\n \"created_at\": 1684224417,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-tXQ9oVloAUxylptLvtoI9TLZ\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 34759,\n \"created_at\": - 1684223819,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-EDL79B0GN6G6dvuMpxrDiEIS\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"data_prepared_comb.jsonl\",\n - \ \"bytes\": 38950,\n \"created_at\": 1684225491,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-l94OdT0jQtCQiMcClKeZUlGS\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"data_prepared.jsonl\",\n \"bytes\": - 19310,\n \"created_at\": 1684224740,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-ApPhFIRCYQE3Wp8Lq7xeBJ99\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"metrics_data_prepared.jsonl\",\n \"bytes\": 585,\n - \ \"created_at\": 1683148239,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-ZA8VAjTn1eJdQd36CZNMDopX\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"sqli-sample/sqli_sample_prepared_train_2.jsonl\",\n - \ \"bytes\": 91449,\n \"created_at\": 1684229197,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-yDL0SqS8LMWVkJ9vOE4tmhda\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"data_prepared_comb.jsonl\",\n \"bytes\": - 156640,\n \"created_at\": 1684226497,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-dt8O7hr5qybjiNoYVgGXz2dq\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 24807,\n \"created_at\": - 1684226682,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-TojnLRgrLQB1oEd25Rwd5iXk\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"sqli-sample/sqli_sample_prepared_valid_2.jsonl\",\n - \ \"bytes\": 22164,\n \"created_at\": 1684229199,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-KZhpUKDqkuMT3a3Kf7VLyFkH\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"metrics_data_prepared.jsonl\",\n \"bytes\": - 585,\n \"created_at\": 1683148121,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-vtQwa0RSStoqN2Ul190UFkOT\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 854,\n \"created_at\": - 1683148243,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-RZDdmRElF7SCqHmABdC8kJEH\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 858,\n \"created_at\": 1683149180,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-oH06n9Vcnu3wZJNTeeWa0lYP\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 37488,\n \"created_at\": 1684231309,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-erAWhcbGW4T9RUGjrd1yA74s\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"data_prepared.jsonl\",\n \"bytes\": 265320,\n \"created_at\": - 1684232842,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-hPz9r2ctQt0IWYQ7ozRtPjkN\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"file\",\n \"bytes\": - 602,\n \"created_at\": 1684251089,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-eHo6DYQsoTtuRT1x7m9UIdX6\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"sqli-sample/sqli_sample_prepared_valid_4.jsonl\",\n - \ \"bytes\": 25134,\n \"created_at\": 1684250869,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-LeGeDVEgVCwXx0S1W7NaqG2x\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"sqli-sample/sqli_sample_prepared_train_4.jsonl\",\n - \ \"bytes\": 104915,\n \"created_at\": 1684250866,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-d9AjUOxfponMoemKpwf2RLZF\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 154934,\n \"created_at\": 1684235653,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-cBvVu5bekOrx0NIrNBmW7gIc\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"file\",\n \"bytes\": 602,\n \"created_at\": - 1684251156,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-vCHipSgdL3IIdH5Y0mk4Iwso\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 753,\n \"created_at\": 1684258665,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-4p4ADCbFs5u3Ab0jakZFtXp5\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 758,\n \"created_at\": 1684260495,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-bJyf8TM0jeSZueBo4jpodZVQ\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 410,\n \"created_at\": - 1684442697,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-C7BHnrA5AtAD0fjBmmzcSJ7I\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 181582,\n \"created_at\": 1684239223,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-cxGN0bdxQgOnWWMcP5XiJGbQ\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"data_prepared.jsonl\",\n \"bytes\": - 513270,\n \"created_at\": 1684240072,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-ADhhXk4VxbM8DQ5Z2VhGM5eI\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 215866,\n - \ \"created_at\": 1684254357,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-EOGj5PzR8so6PrzVWTsxIo1J\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"file\",\n \"bytes\": - 93047,\n \"created_at\": 1683312507,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-veyadp2XWuw9ecbBvOiLaXbD\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 5995,\n \"created_at\": - 1683312714,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-eCN5aUvSCi2c84znY4YhOM8y\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 197009,\n \"created_at\": 1684236147,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-mKA7CfQJTkfWQLQ022mxQQmh\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"file\",\n \"bytes\": 602,\n \"created_at\": - 1684252252,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-b6NRmgCoBjIRLwfFJXRNjK0E\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"data_prepared.jsonl\",\n - \ \"bytes\": 735334,\n \"created_at\": 1684240901,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-R8v9JH72cR3QUZz53BXNi7Yh\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"sqli-sample/sqli_sample_prepared_valid_3.jsonl\",\n - \ \"bytes\": 23040,\n \"created_at\": 1684242638,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-YjlXm6e4tZIil2pblYIfOAs4\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"tmdb_1000_movies_prepared.jsonl\",\n - \ \"bytes\": 367679,\n \"created_at\": 1683526040,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-N2YmodLX2yTAquvccIVohk1B\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 148396,\n \"created_at\": 1683583447,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-1ybAxD6DjBTRg1ljpFk1glus\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"/Users/mac.mccarthy/Desktop/prompts_jsonl_for_documentation_tuning_prepared.jsonl\",\n - \ \"bytes\": 10204795,\n \"created_at\": 1684256310,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-c6fHTOi6VZT89Egl7NllKBhn\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"sqli-sample/sqli_sample_prepared_train_3.jsonl\",\n - \ \"bytes\": 94953,\n \"created_at\": 1684242636,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-bzqhZlAd6DfD9dhG3XDJX9bG\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 155083,\n \"created_at\": 1684243394,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-PDUZRTcpRB2ooI4fkKSZuV2o\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"tmdb_1500_movies_reverse_prepared.jsonl\",\n \"bytes\": - 539441,\n \"created_at\": 1683581296,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-llDq0Q9la7EBTScAowIotxxc\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"yun_file.jsonl\",\n \"bytes\": 147697,\n \"created_at\": - 1684447571,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-yIU3Ospni9s3cF76cUT0Fu6L\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 197700,\n \"created_at\": 1684247618,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-mTQFJJ4soT3mSasMHfibbtjk\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 190364,\n \"created_at\": 1684247560,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-Z8WhLG0b6KQKsZLKdjaFAXBr\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 113426,\n - \ \"created_at\": 1683527055,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-xC22NUuYBkXvzRt2fLREcGde\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"file\",\n \"bytes\": - 147697,\n \"created_at\": 1684277658,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-jJzVhzb0omnycOMayDzboMlL\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 131719,\n - \ \"created_at\": 1684262191,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-RnPEQRhqru539eMxbkifDeIP\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 2634,\n \"created_at\": 1684266455,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-zacazVNNLWU7dRBeC1dymHWR\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"da_prepared (1).jsonl\",\n \"bytes\": - 4770,\n \"created_at\": 1684264681,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-fIkEUgQPWnVXNKPJsr4pEWiz\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"training_data_prepared_train.jsonl\",\n \"bytes\": - 197504,\n \"created_at\": 1684266989,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-kXHUNqbfOZJhdgz7vFF0xoHc\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 169003,\n - \ \"created_at\": 1684280547,\n \"status\": \"processed\",\n \"status_details\": - null\n },\n {\n \"object\": \"file\",\n \"id\": \"file-TZKghfKuCBHQR09JIzFVCjyy\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"output_prepared.jsonl\",\n - \ \"bytes\": 25389,\n \"created_at\": 1683753834,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-81juw46uj7dR03Na4UwmpMg8\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 393,\n \"created_at\": 1684452342,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-Aeh42OWPtbWgt7gfUjXBVFAF\",\n \"purpose\": \"fine-tune-results\",\n - \ \"filename\": \"compiled_results.csv\",\n \"bytes\": 91400,\n \"created_at\": - 1683906271,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-6QnU9h34M6aeQGxeeLwT4RGg\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 168937,\n \"created_at\": 1684508093,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-Po4FpPAgVCwyxwvrLnmYa6WB\",\n \"purpose\": - \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n \"bytes\": - 4597,\n \"created_at\": 1683754543,\n \"status\": \"processed\",\n - \ \"status_details\": null\n },\n {\n \"object\": \"file\",\n - \ \"id\": \"file-ql47i6hE7ijYO4MB8X3h6tgv\",\n \"purpose\": \"fine-tune\",\n - \ \"filename\": \"dave-hal.jsonl\",\n \"bytes\": 356,\n \"created_at\": - 1684363554,\n \"status\": \"processed\",\n \"status_details\": null\n - \ },\n {\n \"object\": \"file\",\n \"id\": \"file-t3k1gVSQDHrfZnPckzftlZ4A\",\n - \ \"purpose\": \"fine-tune\",\n \"filename\": \"dave-hal.jsonl\",\n - \ \"bytes\": 356,\n \"created_at\": 1684365950,\n \"status\": - \"processed\",\n \"status_details\": null\n },\n {\n \"object\": - \"file\",\n \"id\": \"file-PnJdAPMFhj9h4NavxdBe35sv\",\n \"purpose\": - \"fine-tune\",\n \"filename\": \"tmdb_1500_to_2000_movies_reverse_prepared.jsonl\",\n - \ \"bytes\": 176718,\n \"created_at\": 1683905057,\n \"status\": - \"processed\",\n \"status_details\": null\n }\n ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d09a8f9089e19cb-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 18:53:33 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '362' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 5b63d5066f2cce86806cc14e9e7a7852 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/files -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_retrieve.yaml b/tests/contrib/openai/cassettes/v0/file_retrieve.yaml deleted file mode 100644 index 95f72e967c7..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_retrieve.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: GET - uri: https://api.openai.com/v1/files/file-Aeh42OWPtbWgt7gfUjXBVFAF - response: - body: - string: !!binary | - H4sIAAAAAAAAA0zOMQ+CMBAF4J1fQTqLASSgbDiw6qK4kdIeWFJK015NjPG/m4Imjvfel5d7BWFI - 5m4EhqQMSS8kkI3PBP/dUQX3LD01Z+yaAYuhv4y347Wu6hVqZ/RsYdUKInQKIgPWSbSr8COKTgth - 86SFBN5+xZbZx6q6J4IlZXhIsjheEmaAIvCW+teSfL87xHlaJEtnkaLznGgzM7AWOPkrWg5IhfRA - OSmDd/ABAAD//wMA3n+O5ukAAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a8aebdce24235-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 21:27:47 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '16' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - a2c7866caa888908c439eeb01e5dc3af - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/file_retrieve_async.yaml b/tests/contrib/openai/cassettes/v0/file_retrieve_async.yaml deleted file mode 100644 index 0aceb7025f3..00000000000 --- a/tests/contrib/openai/cassettes/v0/file_retrieve_async.yaml +++ /dev/null @@ -1,55 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: get - uri: https://api.openai.com/v1/files/file-Aeh42OWPtbWgt7gfUjXBVFAF - response: - body: - string: "{\n \"object\": \"file\",\n \"id\": \"file-Aeh42OWPtbWgt7gfUjXBVFAF\",\n - \ \"purpose\": \"fine-tune-results\",\n \"filename\": \"compiled_results.csv\",\n - \ \"bytes\": 91400,\n \"created_at\": 1683906271,\n \"status\": \"processed\",\n - \ \"status_details\": null\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a90988eb74352-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 21:31:40 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '13' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 091f79919ee8cf59b2509b1fd0f8a6e6 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/files/file-Aeh42OWPtbWgt7gfUjXBVFAF -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/image_create.yaml b/tests/contrib/openai/cassettes/v0/image_create.yaml deleted file mode 100644 index 598086d16fe..00000000000 --- a/tests/contrib/openai/cassettes/v0/image_create.yaml +++ /dev/null @@ -1,70 +0,0 @@ -interactions: -- request: - body: '{"prompt": "sleepy capybara with monkey on top", "n": 1, "size": "256x256", - "response_format": "url"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '101' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/images/generations - response: - body: - string: !!binary | - H4sIAAAAAAAAA1yRzU7cMBhF93kKK1KyqvNnx+MZKaoyP4XCAAOkUKbqwrE9wUomCbYTKhDvXgV1 - M918utK5i3v0vTsAuFxLZqVwFyAmNCUoSnH0ZQKCWeYuwC8HAADePy8A7qAbdwHcZ2t7swjDjinB - mkayXvW6E4YPJiibrgx4p2XwqlrRvZqglTbstRqZlWGnK3hzj9+4WV9T841u6Eo8/6mu6uUDDgcj - NRyeLtbbx929Xd2e86e2RpufxcV4VofqWMH99jEp1uyGjZdvL/bH0DGhv78UIujb6quxWRIlCEYE - RnERIw/lOPFQnkR738gTlp6wPtO+GadCDCMKI+IbnZW+Nlxkqm1UK6dsM3VklQz7tvJN3SmREcaY - kEJCfCgRxGROIaMHAgnFYjajpIzIzDe1VSJjmHLOUgIlEQxiiiVkNMZwzimekzQpeYmm6r+VKURx - kUQeytGkkaK9b+oThf+hyUrf1KcSqspSL1nmhDRX2021G5ftcVid352N6bVNVb57qHU3HOLtEdGw - ltRDa/fz0x8OAL+dD+cvAAAA//8DACuw4jkjAgAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0838d0c942c32b-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 14:42:20 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '7495' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - ac4360dcca42e930dcc04d25740595a8 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/image_create_async.yaml b/tests/contrib/openai/cassettes/v0/image_create_async.yaml deleted file mode 100644 index 7b34cb8f072..00000000000 --- a/tests/contrib/openai/cassettes/v0/image_create_async.yaml +++ /dev/null @@ -1,57 +0,0 @@ -interactions: -- request: - body: '{"prompt": "sleepy capybara with monkey on top", "n": 1, "size": "256x256", - "response_format": "url"}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/images/generations - response: - body: - string: "{\n \"created\": 1685630540,\n \"data\": [\n {\n \"url\": - \"https://oaidalleapiprodscus.blob.core.windows.net/private/org-OS4zcsDN8sF8E8CdhxgMkBV4/user-uYJDLWPStCQHcYnk3EXTJvGk/img-ZLW2TDasOTkj3kouhogRut5s.png?st=2023-06-01T13%3A50%3A28Z&se=2023-06-01T15%3A50%3A28Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-05-31T20%3A31%3A26Z&ske=2023-06-01T20%3A31%3A26Z&sks=b&skv=2021-08-06&sig=Wu1FzR3YLfZ3FP2xMb6LrN9ZMyGA%2BVDuQUlHnSB4g8Q%3D\"\n - \ }\n ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0844bdd9691875-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 14:50:28 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '7022' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 6c6d4c81d189b9cc41d5d91a662c4a8a - status: - code: 200 - message: OK - url: https://api.openai.com/v1/images/generations -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/image_create_b64_json.yaml b/tests/contrib/openai/cassettes/v0/image_create_b64_json.yaml deleted file mode 100644 index caa258a82a0..00000000000 --- a/tests/contrib/openai/cassettes/v0/image_create_b64_json.yaml +++ /dev/null @@ -1,2401 +0,0 @@ -interactions: -- request: - body: '{"prompt": "sleepy capybara with monkey on top", "n": 1, "size": "256x256", - "response_format": "b64_json"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '106' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/images/generations - response: - body: - string: !!binary | - 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 - PUeVZ0m1LdEbpbyeZjdiW06yGs9WaK+wF0APD1+BxZ5mmtUnsG/fMtcrMlHPldPghg4Yd3+Ob5tc - IF+x7nDsm7246XikSVNDupjWQ/HQY+RZ4NkFPW3jj4kkN8EHFrSrjx06b/vuVjfb/LvxaNdhXxe0 - zU/a8Mb/0e4ncvnwfYTXR5peTmwPeIK83zgKGl549suwHwwMgsbbV4W5ftV4ApusPvIJBz9y2P8F - PXCbWcH5Qytg+cNv0+4ygr7eBVYNmB3VPUYutKp772joeC1G+B4yt5GqviDzdtZn9prq9UvmzESJ - wwTNwdhEbzjnwF7PZP6GWeuQ9wdZvaGijWs7zHelAfhEug2xPPPF7EM4lSpzGmV1PWLVmanF6kOa - DXLXR8kVgIPz0M95cpWL5G3yYXbpnFslLu+JnX6n9Uamle5BM5DBf00M3VLi3Mhv+Rx7BvRyGV47 - 5dzVb/C1Yn6lbvkyYT2R78qVcOp/6CHVIp/j+lEumTOx7mX15Z2LzZjz46uo1VCJ3juy4Fl9euf8 - Do3ctxTbCa/iiHK1kWHrttOsdm9cqwh1HHhQkmZP3o8Yz2OLt/b1Fz/K+vBeZrVJmK0pf6PeZtyu - 76o+jFhl45HcGHk7rYi3xbGXqZH5McH5ni/KWeZOJXRVjB9p74+MTlYVL/RAAR/H0r7b15wuV1nt - pqh1U+gaoN0n3mskpPscpnzfQ12eCcoOH2RmOyfOjz0OU71+xe4nc6c3+pnUBGV4x+4MdT+yB4N3 - MPZ5A1vat0GPz8WSw5uf8v0rdkPIGQdbhPPjSy7FHJkEtKP3WmzuGXvg3zeaO+Kwq8Yr3T5Xbehn - 6+A37ezPOx7yhvXlZwSkVSzSoEfu5Phy/uTPbPWGwYtZB28972RGN54BmvuLbsZImzXgM35FYMJ4 - 3jp0E0HHy0h7Tr+P1FMdb+PAJEKPcH/k9Ok4zAd9Vp+gnRlxyXyuIjFset5v0ck1avmd5nf/WTgL - yWdb+o/b44CJzVv2d74b2/1L6vW7PhtodzCoM3OuevBPo6DiOAfMSmAhBKaM1MUtyWZr5Q6kyxNg - Lmjo/tFPuVKSRx8/xyJlf5c/x9XyHrveLKurhNvinpCf2BXyY3sor/yW6OolXQiT637MxDROxSXn - Oh7EruDMru/QzsCXwtxmjJ5R8uKe3larMe2MkRtzmarq+Bqbw1SJzWRUb/KkOg9T0qfOxgp5nzV0 - AHgu1XOFDEq9dDFdh2ac2WkvdphD5p4/hlm1WxVKTzFbGmXcpjTHwb7JHv1O+Xo/RtXUxsRfKMcS - vRxY/lRjHabZNf41XJw2o91sNRKlwE3EzFbhocD0/iUVbq5up+14h+/73Gfz/nlotsiqf8/1OmLm - MBbI8cG+Bpo3s8kz6j23U5oL2eU9wS5ykS9y3GvV8jul7MNlj7IDofmnGdHyNaXM2nWUumSmMHP6 - sv8OnHsHrA5C2aHD8+AyVcjbguaH9HLIHzMhj5xmaQNGdUJiFPoB8qwgO3E2zojHu1E+fJrqbcgi - xhJMqyu3CXiCZlZQloed3lNjHr11FfgqOgrMBar31cNnErTertUD8weLqctcVm1mFfc5gtLPDL2e - 7qHny7scokdWt3jsATp68E4e3m9+heC59edA+eB0+xo8eP4apk5BOioesmp9bT9lbR9gQp9A771K - uKCeIPHZfLHPJXKBX8RDRlHL1A2ch8CufGTv+d4qaH6QJY26pJACPMPpd6q1S61ORXWqx7fPFHt4 - rqs7s5d6fKvLROT1aKfOSQVtzVaJKqIMBM6jQrj8z3w3BR/mK3f8luq6lGb2R75T19iKH6NF9ZpW - ZqqEHaR8C5/cPAPHXm+RYcd5jZnsAb1jJrQzyhwkt/YlmfdfU10knods6VxjHD0y6mn8YMCghX7E - fIxk/WO0O/+Kv3ojaVTC7DYXZhqldpkK9PtuixzGmap72J0JXhVDYS85tE1co84pXtNqVmYm7iFU - gNkzdthltsOBCU9m7005fG3MFw6YU00yDN9YbyLdBfP1e8wcfvYztcBOWKN+6yUsGWXiAGODyRf5 - LDP1W+aO91TP3qRbQ3+D6+rHaIecjjWY+7+GDDsqzNJL1POpMJtNftODtCJtX5Rijm4q+ANn2DGK - mt8SK8ZS3yOYJ1JrvxM++8gXZiTqqYu/sKfdgvfaS7iZUo437b3g8z3b+AvaJn1P7BTPtY/8Bv0P - fr6zH7mBbwL7oM1Eus9f8TyaKYHxkMN9MlPGSSmmITOGsiGGfuik7oktJ9IhJ+AgeHUZ+RzCT69F - pWynIiFfSU394SMnkD+eiZ4ZAO13h3fPaRcYfAWxZ1h2c52J4drp37vZ5N2de8NhavPEu7qfhmfR - fV1dpkPLCGCPTLyQY12rlm/RZlNS/R752h85CPT73oMv0dTy3gvIvPas32Rw4RANvURPtD1BqwPq - 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 - +eef//3P//3n/wEAAP//AwCMBxIf6gIEAA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d09588448318c11-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 17:58:44 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '7338' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 0c82d4cddb29531a592b0c62cf5a3eb4 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/image_edit.yaml b/tests/contrib/openai/cassettes/v0/image_edit.yaml deleted file mode 100644 index c088d14984d..00000000000 --- a/tests/contrib/openai/cassettes/v0/image_edit.yaml +++ /dev/null @@ -1,9867 +0,0 @@ -interactions: -- request: - body: !!binary | - LS0wMjIwMDQwZjQ2NjRjMDdlMjg0NzdiODBiZjY5OWNjMw0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJuIg0KDQoxDQotLTAyMjAwNDBmNDY2NGMwN2UyODQ3N2I4MGJmNjk5 - Y2MzDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InByb21wdCINCg0KQSBz - dW5saXQgaW5kb29yIGxvdW5nZSBhcmVhIHdpdGggYSBwb29sIGNvbnRhaW5pbmcgYSBmbGFtaW5n - bw0KLS0wMjIwMDQwZjQ2NjRjMDdlMjg0NzdiODBiZjY5OWNjMw0KQ29udGVudC1EaXNwb3NpdGlv - bjogZm9ybS1kYXRhOyBuYW1lPSJzaXplIg0KDQoyNTZ4MjU2DQotLTAyMjAwNDBmNDY2NGMwN2Uy - ODQ3N2I4MGJmNjk5Y2MzDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InJl - c3BvbnNlX2Zvcm1hdCINCg0KdXJsDQotLTAyMjAwNDBmNDY2NGMwN2UyODQ3N2I4MGJmNjk5Y2Mz - DQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImltYWdlIjsgZmlsZW5hbWU9 - ImltYWdlIg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0NCg0KiVBORw0K - GgoAAAANSUhEUgAAAgwAAAIMCAYAAACZhvQPAAAMQWlDQ1BJQ0MgUHJvZmlsZQAAeJyVVwdYU8kW - nluSkEBoAQSkhN4EkRpASggt9I4gKiEJEEqMgaBiRxYVXAsqFrChqyIKVkAsKGJnUex9saCirIsF - u/ImBXTdV7433zd3/vvPmf+cOXfm3jsAqB3niES5qDoAecICcWywP31ccgqd9BSggAa0gQvAONx8 - ETM6OhzAMtT+vby7DhBpe8VeqvXP/v9aNHj8fC4ASDTE6bx8bh7EBwDAq7kicQEARClvNrVAJMWw - Ai0xDBDihVKcKcfVUpwux3tkNvGxLIjbAVBS4XDEmQCoXoI8vZCbCTVU+yF2FPIEQgDU6BD75OVN - 5kGcBrE1tBFBLNVnpP+gk/k3zfRhTQ4ncxjL5yIrSgGCfFEuZ/r/mY7/XfJyJUM+LGFVyRKHxErn - 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 - Mjg0NzdiODBiZjY5OWNjMy0tDQo= - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '558449' - Content-Type: - - multipart/form-data; boundary=0220040f4664c07e28477b80bf699cc3 - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/images/edits - response: - body: - string: !!binary | - H4sIAAAAAAAAA1yRvW7bMACEdz8FIUCaSv2RoigDQuHYaZ3ESevaTeIUHSiSkQkqkkJSdtsg717I - 6OIuhwO+G+5wbxMAPG4kc1J4U5AQmhGUpKj4MALBHPOm4McEAADeTgqAN5jGmwJv71xvp1HUMSVY - 00jWq950wvLBhlXTVSHvjAyPqhXd0YatdFFv1IE5GXWmhl82+A+3iztqP9FLOhf7X/WtvrjH0WCl - gcPuerF6+Lpx8/WS71qNLh+314fPOlIvNWxvxP33O45vHupt/s2M9GpPln3Yt/VH68o0ThGMCYyT - bYJ8NMtOUjwFVp6x7Iz1pQnsYQwkMKYwJoE1ZRUYy0Wp2ka1cvSuVC+sllHf1oHVnRIlYYwJKSTE - zxWCmBQUMvpMIKFY5DklVUzywGqnRMkw5ZxlBEoiGMQUS8hogmHBKS5Illa8QmP0X8sMomSbxj6a - odRHsyR/Cqw+m/A/tGUVWH0+QtWlPKyzdbMa8Otq+XuxvNqZSh11PuBepzI95q925acX6nEz12vt - o4V3evp9AsDPyfvkLwAAAP//AwAZ+ff1IwIAAA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0849c66943176c-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 14:53:59 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '11075' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - fce54039884a80781d41cbbc19d69086 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/image_edit_async.yaml b/tests/contrib/openai/cassettes/v0/image_edit_async.yaml deleted file mode 100644 index 3c9bb004856..00000000000 --- a/tests/contrib/openai/cassettes/v0/image_edit_async.yaml +++ /dev/null @@ -1,9854 +0,0 @@ -interactions: -- request: - body: !!binary | - LS1jMWNkYmM4YmFjMjU0ZTczZDVkZTcwOTU4YmNmNDkwYg0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJuIg0KDQoxDQotLWMxY2RiYzhiYWMyNTRlNzNkNWRlNzA5NThiY2Y0 - OTBiDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InByb21wdCINCg0KQSBz - dW5saXQgaW5kb29yIGxvdW5nZSBhcmVhIHdpdGggYSBwb29sIGNvbnRhaW5pbmcgYSBmbGFtaW5n - bw0KLS1jMWNkYmM4YmFjMjU0ZTczZDVkZTcwOTU4YmNmNDkwYg0KQ29udGVudC1EaXNwb3NpdGlv - bjogZm9ybS1kYXRhOyBuYW1lPSJzaXplIg0KDQoyNTZ4MjU2DQotLWMxY2RiYzhiYWMyNTRlNzNk - NWRlNzA5NThiY2Y0OTBiDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InJl - c3BvbnNlX2Zvcm1hdCINCg0KdXJsDQotLWMxY2RiYzhiYWMyNTRlNzNkNWRlNzA5NThiY2Y0OTBi - DQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImltYWdlIjsgZmlsZW5hbWU9 - ImltYWdlIg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0NCg0KiVBORw0K - GgoAAAANSUhEUgAAAgwAAAIMCAYAAACZhvQPAAAMQWlDQ1BJQ0MgUHJvZmlsZQAAeJyVVwdYU8kW - nluSkEBoAQSkhN4EkRpASggt9I4gKiEJEEqMgaBiRxYVXAsqFrChqyIKVkAsKGJnUex9saCirIsF - u/ImBXTdV7433zd3/vvPmf+cOXfm3jsAqB3niES5qDoAecICcWywP31ccgqd9BSggAa0gQvAONx8 - ETM6OhzAMtT+vby7DhBpe8VeqvXP/v9aNHj8fC4ASDTE6bx8bh7EBwDAq7kicQEARClvNrVAJMWw - Ai0xDBDihVKcKcfVUpwux3tkNvGxLIjbAVBS4XDEmQCoXoI8vZCbCTVU+yF2FPIEQgDU6BD75OVN - 5kGcBrE1tBFBLNVnpP+gk/k3zfRhTQ4ncxjL5yIrSgGCfFEuZ/r/mY7/XfJyJUM+LGFVyRKHxErn - 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 - ZDVkZTcwOTU4YmNmNDkwYi0tDQo= - headers: - Content-Type: - - multipart/form-data; boundary=c1cdbc8bac254e73d5de70958bcf490b - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/images/edits - response: - body: - string: "{\n \"created\": 1685631239,\n \"data\": [\n {\n \"url\": - \"https://oaidalleapiprodscus.blob.core.windows.net/private/org-OS4zcsDN8sF8E8CdhxgMkBV4/user-uYJDLWPStCQHcYnk3EXTJvGk/img-nKdVUNcPKT31w3sPZi0tNgx0.png?st=2023-06-01T13%3A59%3A28Z&se=2023-06-01T15%3A59%3A28Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-05-31T20%3A34%3A48Z&ske=2023-06-01T20%3A34%3A48Z&sks=b&skv=2021-08-06&sig=iVSnCz4kVzSekZv7%2BOljKfOwGIAndaW/VXOdTideqwg%3D\"\n - \ }\n ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0851d7eba14211-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 14:59:28 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '10206' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 171211d5cc7cb5f6be14641e923130de - status: - code: 200 - message: OK - url: https://api.openai.com/v1/images/edits -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/image_variation.yaml b/tests/contrib/openai/cassettes/v0/image_variation.yaml deleted file mode 100644 index 8a1fd7e398f..00000000000 --- a/tests/contrib/openai/cassettes/v0/image_variation.yaml +++ /dev/null @@ -1,5235 +0,0 @@ -interactions: -- request: - body: !!binary | - LS0xMDNiNTNjM2FmODA4ZjBkYTk4YWU1NjBhNzU2NTVhNQ0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJuIg0KDQoxDQotLTEwM2I1M2MzYWY4MDhmMGRhOThhZTU2MGE3NTY1 - NWE1DQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InNpemUiDQoNCjI1Nngy - NTYNCi0tMTAzYjUzYzNhZjgwOGYwZGE5OGFlNTYwYTc1NjU1YTUNCkNvbnRlbnQtRGlzcG9zaXRp - b246IGZvcm0tZGF0YTsgbmFtZT0icmVzcG9uc2VfZm9ybWF0Ig0KDQp1cmwNCi0tMTAzYjUzYzNh - ZjgwOGYwZGE5OGFlNTYwYTc1NjU1YTUNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsg - bmFtZT0iaW1hZ2UiOyBmaWxlbmFtZT0iaW1hZ2UiDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9u - L29jdGV0LXN0cmVhbQ0KDQqJUE5HDQoaCgAAAA1JSERSAAACDAAAAgwIBgAAAJmG9A8AAAxBaUND - UElDQyBQcm9maWxlAAB4nJVXB1hTyRaeW5KQQGgBBKSE3gSRGkBKCC30jiAqIQkQSoyBoGJHFhVc - CyoWsKGrIgpWQCwoYmdR7H2xoKKsiwW78iYFdN1XvjffN3f++8+Z/5w5d+beOwCoHeeIRLmoOgB5 - wgJxbLA/fVxyCp30FKCABrSBC8A43HwRMzo6HMAy1P69vLsOEGl7xV6q9c/+/1o0ePx8LgBINMTp - vHxuHsQHAMCruSJxAQBEKW82tUAkxbACLTEMEOKFUpwpx9VSnC7He2Q28bEsiNsBUFLhcMSZAKhe - gjy9kJsJNVT7IXYU8gRCANToEPvk5U3mQZwGsTW0EUEs1Wek/6CT+TfN9GFNDidzGMvnIitKAYJ8 - US5n+v+Zjv9d8nIlQz4sYVXJEofESucM83YzZ3KYFKtA3CdMj4yCWBPiDwKezB5ilJIlCUmQ26MG - 3HwWzBnQgdiRxwkIg9gA4iBhbmS4gk/PEASxIYYrBJ0mKGDHQ6wL8UJ+fmCcwmaTeHKswhfamCFm - MRX8WY5Y5lfq674kJ4Gp0H+dxWcr9DHVoqz4JIgpEJsXChIjIVaF2CE/Jy5MYTO2KIsVOWQjlsRK - 4zeHOJYvDPaX62OFGeKgWIV9WV7+0HyxTVkCdqQC7yvIig+R5wdr53Jk8cO5YJf4QmbCkA4/f1z4 - 0Fx4/IBA+dyxZ3xhQpxC54OowD9WPhaniHKjFfa4KT83WMqbQuySXxinGIsnFsAFKdfHM0QF0fHy - OPGibE5otDwefBkIBywQAOhAAms6mAyygaCzr6kP3sl7ggAHiEEm4AN7BTM0IknWI4TXOFAE/oSI - D/KHx/nLevmgEPJfh1n51R5kyHoLZSNywBOI80AYyIX3Etko4bC3RPAYMoJ/eOfAyoXx5sIq7f/3 - /BD7nWFCJlzBSIY80tWGLImBxABiCDGIaIPr4z64Fx4Or36wOuEM3GNoHt/tCU8IXYSHhGuEbsKt - SYJi8U9RRoBuqB+kyEX6j7nALaGmK+6Pe0N1qIzr4PrAHneBfpi4L/TsClmWIm5pVug/af9tBj88 - DYUd2ZGMkkeQ/cjWP49UtVV1HVaR5vrH/MhjTR/ON2u452f/rB+yz4Nt2M+W2EJsP3YGO4Gdw45g - TYCOtWLNWAd2VIqHV9dj2eoa8hYriycH6gj+4W/oyUozme9Y59jr+EXeV8CfJn1HA9Zk0XSxIDOr - gM6EXwQ+nS3kOoyiOzk6OQMg/b7IX19vYmTfDUSn4zs3/w8AvFsHBwcPf+dCWwHY6w63/6HvnDUD - fjqUATh7iCsRF8o5XHohwLeEGtxpesAImAFrOB8n4Aa8gB8IBKEgCsSDZDARRp8F17kYTAUzwTxQ - CsrBMrAKrAMbwRawA+wG+0ATOAJOgNPgArgEroE7cPX0gBegH7wDnxEEISFUhIboIcaIBWKHOCEM - xAcJRMKRWCQZSUMyESEiQWYi85FypAJZh2xGapG9yCHkBHIO6UJuIQ+QXuQ18gnFUBVUCzVELdHR - KANlomFoPDoBzUSnoEVoCboEXYPWoLvQRvQEegG9hnajL9ABDGDKmA5mgtljDIyFRWEpWAYmxmZj - ZVglVoPVYy3wOV/BurE+7CNOxGk4HbeHKzgET8C5+BR8Nr4YX4fvwBvxdvwK/gDvx78RqAQDgh3B - k8AmjCNkEqYSSgmVhG2Eg4RTcC/1EN4RiUQdohXRHe7FZGI2cQZxMXE9sYF4nNhFfEQcIJFIeiQ7 - kjcpisQhFZBKSWtJu0itpMukHtIHJWUlYyUnpSClFCWhUrFSpdJOpWNKl5WeKn0mq5MtyJ7kKDKP - PJ28lLyV3EK+SO4hf6ZoUKwo3pR4SjZlHmUNpZ5yinKX8kZZWdlU2UM5RlmgPFd5jfIe5bPKD5Q/ - qmiq2KqwVFJVJCpLVLarHFe5pfKGSqVaUv2oKdQC6hJqLfUk9T71gypN1UGVrcpTnaNapdqoeln1 - pRpZzUKNqTZRrUitUm2/2kW1PnWyuqU6S52jPlu9Sv2Q+g31AQ2axhiNKI08jcUaOzXOaTzTJGla - agZq8jRLNLdontR8RMNoZjQWjUubT9tKO0Xr0SJqWWmxtbK1yrV2a3Vq9WtrartoJ2pP067SPqrd - rYPpWOqwdXJ1lurs07mu82mE4QjmCP6IRSPqR1we8V53pK6fLl+3TLdB95ruJz26XqBejt5yvSa9 - e/q4vq1+jP5U/Q36p/T7RmqN9BrJHVk2ct/I2waoga1BrMEMgy0GHQYDhkaGwYYiw7WGJw37jHSM - /IyyjVYaHTPqNaYZ+xgLjFcatxo/p2vTmfRc+hp6O73fxMAkxERistmk0+SzqZVpgmmxaYPpPTOK - GcMsw2ylWZtZv7mxeYT5TPM689sWZAuGRZbFaoszFu8trSyTLBdYNlk+s9K1YlsVWdVZ3bWmWvta - T7Gusb5qQ7Rh2OTYrLe5ZIvautpm2VbZXrRD7dzsBHbr7bpGEUZ5jBKOqhl1w17FnmlfaF9n/8BB - xyHcodihyeHlaPPRKaOXjz4z+pujq2Ou41bHO2M0x4SOKR7TMua1k60T16nK6aoz1TnIeY5zs/Mr - FzsXvssGl5uuNNcI1wWuba5f3dzdxG71br3u5u5p7tXuNxhajGjGYsZZD4KHv8ccjyMeHz3dPAs8 - 93n+5WXvleO10+vZWKux/LFbxz7yNvXmeG/27vah+6T5bPLp9jXx5fjW+D70M/Pj+W3ze8q0YWYz - dzFf+jv6i/0P+r9nebJmsY4HYAHBAWUBnYGagQmB6wLvB5kGZQbVBfUHuwbPCD4eQggJC1kecoNt - yOaya9n9oe6hs0Lbw1TC4sLWhT0Mtw0Xh7dEoBGhESsi7kZaRAojm6JAFDtqRdS9aKvoKdGHY4gx - 0TFVMU9ix8TOjD0TR4ubFLcz7l28f/zS+DsJ1gmShLZEtcTUxNrE90kBSRVJ3eNGj5s17kKyfrIg - uTmFlJKYsi1lYHzg+FXje1JdU0tTr0+wmjBtwrmJ+hNzJx6dpDaJM2l/GiEtKW1n2hdOFKeGM5DO - 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 - NTYwYTc1NjU1YTUtLQ0K - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '294420' - Content-Type: - - multipart/form-data; boundary=103b53c3af808f0da98ae560a75655a5 - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/images/variations - response: - body: - string: !!binary | - H4sIAAAAAAAAA2SRW2+bMACF3/kVFhI8zeFmHBMJTSFkWaulXZY0XTrtwdiGWBCgtkNv6n+f6NOi - vhwd6Tsvn86bBYDNlKBGcHsGAkxijEIfxV9GwKmh9gz8sQAA4O0jAbDPqrFnwD4a0+uZ53VUcto0 - gvayVx3X7KwnRdMVE9YpMXmSLe+e9KQVxuuVHKgRXqcqeLtFr0znN0R/I0uy4Mfnal1ne+SdtVDw - fLjOf9z/3JrF5js7tHW0/L27Hla1J08VfGxYwTYbzOjtXVH+Kl+GNtmuh2TSt9VXbdLQDyPoY+gH - uwA70TxGTjT34wdXiwtGLlifKlcP4yCAPoE+drVKC1dpxlPZNrIVYzepPNFKeH1bubruJE8xpZQL - LiAqiwginBBISYkhJohPpwQXPp66ujaSpxQRxmiMocCcQkSQgJQECCaMoATHYcGKaJx+MkDBGNGD - q+v/FMJPUKeFq+tLCVmldyuzNMnqlJfzXXb/Ql+f949XaJFn65vDJjiGTphFyc4Js6twj9fMiXL7 - 4+t3C4C/1rv1DwAA//8DAAaPOnUlAgAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0951ad081a428e-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 17:54:05 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '8078' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 255ffca3004c795a88de21fcf4a21f5c - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/image_variation_async.yaml b/tests/contrib/openai/cassettes/v0/image_variation_async.yaml deleted file mode 100644 index c8af17dd36a..00000000000 --- a/tests/contrib/openai/cassettes/v0/image_variation_async.yaml +++ /dev/null @@ -1,5222 +0,0 @@ -interactions: -- request: - body: !!binary | - LS1mNTljNmQ5OWEzYWQ3MDY3NzhjNmUzMjZlZTc3ODMyMg0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJuIg0KDQoxDQotLWY1OWM2ZDk5YTNhZDcwNjc3OGM2ZTMyNmVlNzc4 - MzIyDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InNpemUiDQoNCjI1Nngy - NTYNCi0tZjU5YzZkOTlhM2FkNzA2Nzc4YzZlMzI2ZWU3NzgzMjINCkNvbnRlbnQtRGlzcG9zaXRp - b246IGZvcm0tZGF0YTsgbmFtZT0icmVzcG9uc2VfZm9ybWF0Ig0KDQp1cmwNCi0tZjU5YzZkOTlh - M2FkNzA2Nzc4YzZlMzI2ZWU3NzgzMjINCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsg - bmFtZT0iaW1hZ2UiOyBmaWxlbmFtZT0iaW1hZ2UiDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9u - L29jdGV0LXN0cmVhbQ0KDQqJUE5HDQoaCgAAAA1JSERSAAACDAAAAgwIBgAAAJmG9A8AAAxBaUND - UElDQyBQcm9maWxlAAB4nJVXB1hTyRaeW5KQQGgBBKSE3gSRGkBKCC30jiAqIQkQSoyBoGJHFhVc - CyoWsKGrIgpWQCwoYmdR7H2xoKKsiwW78iYFdN1XvjffN3f++8+Z/5w5d+beOwCoHeeIRLmoOgB5 - wgJxbLA/fVxyCp30FKCABrSBC8A43HwRMzo6HMAy1P69vLsOEGl7xV6q9c/+/1o0ePx8LgBINMTp - vHxuHsQHAMCruSJxAQBEKW82tUAkxbACLTEMEOKFUpwpx9VSnC7He2Q28bEsiNsBUFLhcMSZAKhe - gjy9kJsJNVT7IXYU8gRCANToEPvk5U3mQZwGsTW0EUEs1Wek/6CT+TfN9GFNDidzGMvnIitKAYJ8 - US5n+v+Zjv9d8nIlQz4sYVXJEofESucM83YzZ3KYFKtA3CdMj4yCWBPiDwKezB5ilJIlCUmQ26MG - 3HwWzBnQgdiRxwkIg9gA4iBhbmS4gk/PEASxIYYrBJ0mKGDHQ6wL8UJ+fmCcwmaTeHKswhfamCFm - MRX8WY5Y5lfq674kJ4Gp0H+dxWcr9DHVoqz4JIgpEJsXChIjIVaF2CE/Jy5MYTO2KIsVOWQjlsRK - 4zeHOJYvDPaX62OFGeKgWIV9WV7+0HyxTVkCdqQC7yvIig+R5wdr53Jk8cO5YJf4QmbCkA4/f1z4 - 0Fx4/IBA+dyxZ3xhQpxC54OowD9WPhaniHKjFfa4KT83WMqbQuySXxinGIsnFsAFKdfHM0QF0fHy - OPGibE5otDwefBkIBywQAOhAAms6mAyygaCzr6kP3sl7ggAHiEEm4AN7BTM0IknWI4TXOFAE/oSI - D/KHx/nLevmgEPJfh1n51R5kyHoLZSNywBOI80AYyIX3Etko4bC3RPAYMoJ/eOfAyoXx5sIq7f/3 - /BD7nWFCJlzBSIY80tWGLImBxABiCDGIaIPr4z64Fx4Or36wOuEM3GNoHt/tCU8IXYSHhGuEbsKt - SYJi8U9RRoBuqB+kyEX6j7nALaGmK+6Pe0N1qIzr4PrAHneBfpi4L/TsClmWIm5pVug/af9tBj88 - DYUd2ZGMkkeQ/cjWP49UtVV1HVaR5vrH/MhjTR/ON2u452f/rB+yz4Nt2M+W2EJsP3YGO4Gdw45g - TYCOtWLNWAd2VIqHV9dj2eoa8hYriycH6gj+4W/oyUozme9Y59jr+EXeV8CfJn1HA9Zk0XSxIDOr - gM6EXwQ+nS3kOoyiOzk6OQMg/b7IX19vYmTfDUSn4zs3/w8AvFsHBwcPf+dCWwHY6w63/6HvnDUD - fjqUATh7iCsRF8o5XHohwLeEGtxpesAImAFrOB8n4Aa8gB8IBKEgCsSDZDARRp8F17kYTAUzwTxQ - CsrBMrAKrAMbwRawA+wG+0ATOAJOgNPgArgEroE7cPX0gBegH7wDnxEEISFUhIboIcaIBWKHOCEM - xAcJRMKRWCQZSUMyESEiQWYi85FypAJZh2xGapG9yCHkBHIO6UJuIQ+QXuQ18gnFUBVUCzVELdHR - KANlomFoPDoBzUSnoEVoCboEXYPWoLvQRvQEegG9hnajL9ABDGDKmA5mgtljDIyFRWEpWAYmxmZj - ZVglVoPVYy3wOV/BurE+7CNOxGk4HbeHKzgET8C5+BR8Nr4YX4fvwBvxdvwK/gDvx78RqAQDgh3B - k8AmjCNkEqYSSgmVhG2Eg4RTcC/1EN4RiUQdohXRHe7FZGI2cQZxMXE9sYF4nNhFfEQcIJFIeiQ7 - kjcpisQhFZBKSWtJu0itpMukHtIHJWUlYyUnpSClFCWhUrFSpdJOpWNKl5WeKn0mq5MtyJ7kKDKP - PJ28lLyV3EK+SO4hf6ZoUKwo3pR4SjZlHmUNpZ5yinKX8kZZWdlU2UM5RlmgPFd5jfIe5bPKD5Q/ - qmiq2KqwVFJVJCpLVLarHFe5pfKGSqVaUv2oKdQC6hJqLfUk9T71gypN1UGVrcpTnaNapdqoeln1 - pRpZzUKNqTZRrUitUm2/2kW1PnWyuqU6S52jPlu9Sv2Q+g31AQ2axhiNKI08jcUaOzXOaTzTJGla - agZq8jRLNLdontR8RMNoZjQWjUubT9tKO0Xr0SJqWWmxtbK1yrV2a3Vq9WtrartoJ2pP067SPqrd - rYPpWOqwdXJ1lurs07mu82mE4QjmCP6IRSPqR1we8V53pK6fLl+3TLdB95ruJz26XqBejt5yvSa9 - e/q4vq1+jP5U/Q36p/T7RmqN9BrJHVk2ct/I2waoga1BrMEMgy0GHQYDhkaGwYYiw7WGJw37jHSM - /IyyjVYaHTPqNaYZ+xgLjFcatxo/p2vTmfRc+hp6O73fxMAkxERistmk0+SzqZVpgmmxaYPpPTOK - GcMsw2ylWZtZv7mxeYT5TPM689sWZAuGRZbFaoszFu8trSyTLBdYNlk+s9K1YlsVWdVZ3bWmWvta - T7Gusb5qQ7Rh2OTYrLe5ZIvautpm2VbZXrRD7dzsBHbr7bpGEUZ5jBKOqhl1w17FnmlfaF9n/8BB - xyHcodihyeHlaPPRKaOXjz4z+pujq2Ou41bHO2M0x4SOKR7TMua1k60T16nK6aoz1TnIeY5zs/Mr - FzsXvssGl5uuNNcI1wWuba5f3dzdxG71br3u5u5p7tXuNxhajGjGYsZZD4KHv8ccjyMeHz3dPAs8 - 93n+5WXvleO10+vZWKux/LFbxz7yNvXmeG/27vah+6T5bPLp9jXx5fjW+D70M/Pj+W3ze8q0YWYz - dzFf+jv6i/0P+r9nebJmsY4HYAHBAWUBnYGagQmB6wLvB5kGZQbVBfUHuwbPCD4eQggJC1kecoNt - yOaya9n9oe6hs0Lbw1TC4sLWhT0Mtw0Xh7dEoBGhESsi7kZaRAojm6JAFDtqRdS9aKvoKdGHY4gx - 0TFVMU9ix8TOjD0TR4ubFLcz7l28f/zS+DsJ1gmShLZEtcTUxNrE90kBSRVJ3eNGj5s17kKyfrIg - uTmFlJKYsi1lYHzg+FXje1JdU0tTr0+wmjBtwrmJ+hNzJx6dpDaJM2l/GiEtKW1n2hdOFKeGM5DO - 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 - MzI2ZWU3NzgzMjItLQ0K - headers: - Content-Type: - - multipart/form-data; boundary=f59c6d99a3ad706778c6e326ee778322 - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/images/variations - response: - body: - string: "{\n \"created\": 1685642045,\n \"data\": [\n {\n \"url\": - \"https://oaidalleapiprodscus.blob.core.windows.net/private/org-OS4zcsDN8sF8E8CdhxgMkBV4/user-uYJDLWPStCQHcYnk3EXTJvGk/img-qlcbcQQ9FxrplYn9Ri2DfC1X.png?st=2023-06-01T16%3A55%3A48Z&se=2023-06-01T18%3A55%3A48Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-05-31T20%3A31%3A43Z&ske=2023-06-01T20%3A31%3A43Z&sks=b&skv=2021-08-06&sig=66LvIgR3xqe9pjYChG6%2BZLUabtNW03%2B%2BpRV28dQnjP8%3D\"\n - \ }\n ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0954324a0541ec-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 17:55:48 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '7958' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 20852efe78df0cc3b99f2e50988cf6e6 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/images/variations -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/model_delete.yaml b/tests/contrib/openai/cassettes/v0/model_delete.yaml deleted file mode 100644 index faf8cfa2afb..00000000000 --- a/tests/contrib/openai/cassettes/v0/model_delete.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: DELETE - uri: https://api.openai.com/v1/models/babbage%3Aft-datadog%3Adummy-fine-tune-model-2023-06-01-23-15-52 - response: - body: - string: !!binary | - H4sIAAAAAAAACiWMwQqAIBBE732F7LkFM+rg32i7iZEJsR4i+ve0LsPwhnl3pxRkv/EiYBWkTLxD - 32CkBrzz3gW2qyA5cZSDpZLShWs8GKXU+D5otBlRz6gHrGWYcDK/p44s3GRyFu6eFy86lityAAAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d0a3b189f2343df-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 01 Jun 2023 20:33:18 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '598' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - f6160964d0dc7577e21ca86a29548277 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/model_delete_async.yaml b/tests/contrib/openai/cassettes/v0/model_delete_async.yaml deleted file mode 100644 index 6e6d2859394..00000000000 --- a/tests/contrib/openai/cassettes/v0/model_delete_async.yaml +++ /dev/null @@ -1,53 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: delete - uri: https://api.openai.com/v1/models/babbage:ft-datadog:dummy-fine-tune-model-2023-06-01-23-15-52 - response: - body: - string: "{\n \"object\": \"model\",\n \"id\": \"babbage:ft-datadog:dummy-fine-tune-model-2023-06-01-23-15-52\",\n - \ \"deleted\": true\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7d1108aca969435b-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 02 Jun 2023 16:22:13 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '19' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 07733cdfe1d8d240c4112b123813faf5 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/models/babbage:ft-datadog:dummy-fine-tune-model-2023-06-01-23-15-52 -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/model_list.yaml b/tests/contrib/openai/cassettes/v0/model_list.yaml deleted file mode 100644 index 1b335a7cc14..00000000000 --- a/tests/contrib/openai/cassettes/v0/model_list.yaml +++ /dev/null @@ -1,152 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: GET - uri: https://api.openai.com/v1/models - response: - body: - string: !!binary | - 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 - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7ca072ee4e9532d0-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 May 2023 00:26:34 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-processing-ms: - - '209' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - b58d1a3f7ee02caaae2b1db89e739b8b - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/model_list_async.yaml b/tests/contrib/openai/cassettes/v0/model_list_async.yaml deleted file mode 100644 index d4077065086..00000000000 --- a/tests/contrib/openai/cassettes/v0/model_list_async.yaml +++ /dev/null @@ -1,1098 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: get - uri: https://api.openai.com/v1/models - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"id\": \"whisper-1\",\n - \ \"object\": \"model\",\n \"created\": 1677532384,\n \"owned_by\": - \"openai-internal\",\n \"permission\": [\n {\n \"id\": - \"modelperm-KlsZlfft3Gma8pI6A8rTnyjs\",\n \"object\": \"model_permission\",\n - \ \"created\": 1683912666,\n \"allow_create_engine\": false,\n - \ \"allow_sampling\": true,\n \"allow_logprobs\": true,\n - \ \"allow_search_indices\": false,\n \"allow_view\": true,\n - \ \"allow_fine_tuning\": false,\n \"organization\": \"*\",\n - \ \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"whisper-1\",\n \"parent\": null\n },\n - \ {\n \"id\": \"babbage\",\n \"object\": \"model\",\n \"created\": - 1649358449,\n \"owned_by\": \"openai\",\n \"permission\": [\n {\n - \ \"id\": \"modelperm-49FUp5v084tBB49tC4z8LPH5\",\n \"object\": - \"model_permission\",\n \"created\": 1669085501,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": false,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"babbage\",\n \"parent\": null\n },\n {\n - \ \"id\": \"gpt-3.5-turbo\",\n \"object\": \"model\",\n \"created\": - 1677610602,\n \"owned_by\": \"openai\",\n \"permission\": [\n {\n - \ \"id\": \"modelperm-Gsp3SyIu7GamHB3McQv3rMf5\",\n \"object\": - \"model_permission\",\n \"created\": 1684434433,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": false,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"gpt-3.5-turbo\",\n \"parent\": null\n },\n - \ {\n \"id\": \"davinci\",\n \"object\": \"model\",\n \"created\": - 1649359874,\n \"owned_by\": \"openai\",\n \"permission\": [\n {\n - \ \"id\": \"modelperm-U6ZwlyAd0LyMk4rcMdz33Yc3\",\n \"object\": - \"model_permission\",\n \"created\": 1669066355,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": false,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"davinci\",\n \"parent\": null\n },\n {\n - \ \"id\": \"text-davinci-edit-001\",\n \"object\": \"model\",\n \"created\": - 1649809179,\n \"owned_by\": \"openai\",\n \"permission\": [\n {\n - \ \"id\": \"modelperm-otmQSS0hmabtVGHI9QB3bct3\",\n \"object\": - \"model_permission\",\n \"created\": 1679934178,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": false,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"text-davinci-edit-001\",\n \"parent\": null\n - \ },\n {\n \"id\": \"text-davinci-003\",\n \"object\": \"model\",\n - \ \"created\": 1669599635,\n \"owned_by\": \"openai-internal\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-y4r1Z53hJ9TJxrUMPM50fYoS\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684345476,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-davinci-003\",\n \"parent\": - null\n },\n {\n \"id\": \"babbage-code-search-code\",\n \"object\": - \"model\",\n \"created\": 1651172509,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-4qRnA3Hj8HIJbgo0cGbcmErn\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669085863,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"babbage-code-search-code\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-similarity-babbage-001\",\n - \ \"object\": \"model\",\n \"created\": 1651172505,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-48kcCHhfzvnfY84OtJf5m8Cz\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669081947,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-similarity-babbage-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"code-davinci-edit-001\",\n - \ \"object\": \"model\",\n \"created\": 1649880484,\n \"owned_by\": - \"openai\",\n \"permission\": [\n {\n \"id\": \"modelperm-Foe5Y4TvaKveYxt74oKMw8IB\",\n - \ \"object\": \"model_permission\",\n \"created\": 1679934178,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"code-davinci-edit-001\",\n \"parent\": - null\n },\n {\n \"id\": \"text-davinci-001\",\n \"object\": - \"model\",\n \"created\": 1649364042,\n \"owned_by\": \"openai\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-MVM5NfoRjXkDve3uQW3YZDDt\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066355,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-davinci-001\",\n \"parent\": - null\n },\n {\n \"id\": \"ada\",\n \"object\": \"model\",\n - \ \"created\": 1649357491,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"modelperm-u0nKN4ub7EVQudgMuvCuvDjc\",\n - \ \"object\": \"model_permission\",\n \"created\": 1675997661,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada\",\n \"parent\": null\n - \ },\n {\n \"id\": \"babbage-code-search-text\",\n \"object\": - \"model\",\n \"created\": 1651172509,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-Lftf8H4ZPDxNxVs0hHPJBUoe\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669085863,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"babbage-code-search-text\",\n - \ \"parent\": null\n },\n {\n \"id\": \"babbage-similarity\",\n - \ \"object\": \"model\",\n \"created\": 1651172505,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-mS20lnPqhebTaFPrcCufyg7m\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669081947,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"babbage-similarity\",\n \"parent\": - null\n },\n {\n \"id\": \"code-search-babbage-text-001\",\n \"object\": - \"model\",\n \"created\": 1651172507,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-EC5ASz4NLChtEV1Cwkmrwm57\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669085863,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"code-search-babbage-text-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-curie-001\",\n - \ \"object\": \"model\",\n \"created\": 1649364043,\n \"owned_by\": - \"openai\",\n \"permission\": [\n {\n \"id\": \"modelperm-8InhPV3CZfN3F5QHKoJd4zRD\",\n - \ \"object\": \"model_permission\",\n \"created\": 1679310997,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-curie-001\",\n \"parent\": - null\n },\n {\n \"id\": \"gpt-4\",\n \"object\": \"model\",\n - \ \"created\": 1678604602,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"modelperm-HnvVZ1tf2jVawVaM1B3yjZnD\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684465847,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": false,\n - \ \"allow_logprobs\": false,\n \"allow_search_indices\": - false,\n \"allow_view\": false,\n \"allow_fine_tuning\": - false,\n \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"gpt-4\",\n \"parent\": - null\n },\n {\n \"id\": \"code-search-babbage-code-001\",\n \"object\": - \"model\",\n \"created\": 1651172507,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-64LWHdlANgak2rHzc3K5Stt0\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669085864,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"code-search-babbage-code-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-ada-001\",\n \"object\": - \"model\",\n \"created\": 1649364042,\n \"owned_by\": \"openai\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-KN5dRBCEW4az6gwcGXkRkMwK\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669088497,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-ada-001\",\n \"parent\": - null\n },\n {\n \"id\": \"text-embedding-ada-002\",\n \"object\": - \"model\",\n \"created\": 1671217299,\n \"owned_by\": \"openai-internal\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-Dbv2FOgMdlDjO8py8vEjD5Mi\",\n - \ \"object\": \"model_permission\",\n \"created\": 1678892857,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-embedding-ada-002\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-similarity-ada-001\",\n - \ \"object\": \"model\",\n \"created\": 1651172505,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-DdCqkqmORpqxqdg4TkFRAgmw\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669092759,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-similarity-ada-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"curie-instruct-beta\",\n - \ \"object\": \"model\",\n \"created\": 1649364042,\n \"owned_by\": - \"openai\",\n \"permission\": [\n {\n \"id\": \"modelperm-bsg59MlOi88CMf1MjnIKrT5a\",\n - \ \"object\": \"model_permission\",\n \"created\": 1680267269,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"curie-instruct-beta\",\n \"parent\": - null\n },\n {\n \"id\": \"gpt-4-0314\",\n \"object\": \"model\",\n - \ \"created\": 1678604601,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"modelperm-wD0mMKN1qMMpZ1ptTiU1uNNz\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684465847,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": false,\n - \ \"allow_logprobs\": false,\n \"allow_search_indices\": - false,\n \"allow_view\": false,\n \"allow_fine_tuning\": - false,\n \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"gpt-4-0314\",\n \"parent\": - null\n },\n {\n \"id\": \"ada-code-search-code\",\n \"object\": - \"model\",\n \"created\": 1651172505,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-wa8tg4Pi9QQNaWdjMTM8dkkx\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669087421,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada-code-search-code\",\n \"parent\": - null\n },\n {\n \"id\": \"ada-similarity\",\n \"object\": - \"model\",\n \"created\": 1651172507,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-LtSIwCEReeDcvGTmM13gv6Fg\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669092759,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada-similarity\",\n \"parent\": - null\n },\n {\n \"id\": \"code-search-ada-text-001\",\n \"object\": - \"model\",\n \"created\": 1651172507,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-JBssaJSmbgvJfTkX71y71k2J\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669087421,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"code-search-ada-text-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-search-ada-query-001\",\n - \ \"object\": \"model\",\n \"created\": 1651172505,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-1YiiBMYC8it0mpQCBK7t8uSP\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669092640,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-ada-query-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"davinci-search-document\",\n - \ \"object\": \"model\",\n \"created\": 1651172509,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-M43LVJQRGxz6ode34ctLrCaG\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066355,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"davinci-search-document\",\n - \ \"parent\": null\n },\n {\n \"id\": \"ada-code-search-text\",\n - \ \"object\": \"model\",\n \"created\": 1651172510,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-kFc17wOI4d1FjZEaCqnk4Frg\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669087421,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada-code-search-text\",\n \"parent\": - null\n },\n {\n \"id\": \"text-search-ada-doc-001\",\n \"object\": - \"model\",\n \"created\": 1651172507,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-kbHvYouDlkD78ehcmMOGdKpK\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669092640,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-ada-doc-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"davinci-instruct-beta\",\n - \ \"object\": \"model\",\n \"created\": 1649364042,\n \"owned_by\": - \"openai\",\n \"permission\": [\n {\n \"id\": \"modelperm-k9kuMYlfd9nvFiJV2ug0NWws\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066356,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"davinci-instruct-beta\",\n \"parent\": - null\n },\n {\n \"id\": \"text-similarity-curie-001\",\n \"object\": - \"model\",\n \"created\": 1651172507,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-6dgTTyXrZE7d53Licw4hYkvd\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669079883,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-similarity-curie-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"code-search-ada-code-001\",\n - \ \"object\": \"model\",\n \"created\": 1651172507,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-8soch45iiGvux5Fg1ORjdC4s\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669087421,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"code-search-ada-code-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"ada-search-query\",\n - \ \"object\": \"model\",\n \"created\": 1651172505,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-b753xmIzAUkluQ1L20eDZLtQ\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669092640,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada-search-query\",\n \"parent\": - null\n },\n {\n \"id\": \"text-search-davinci-query-001\",\n \"object\": - \"model\",\n \"created\": 1651172505,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-9McKbsEYSaDshU9M3bp6ejUb\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066353,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-davinci-query-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"curie-search-query\",\n - \ \"object\": \"model\",\n \"created\": 1651172509,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-sIbfSwzVpVBtymQgOQSLBpxe\",\n - \ \"object\": \"model_permission\",\n \"created\": 1677273417,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"curie-search-query\",\n \"parent\": - null\n },\n {\n \"id\": \"davinci-search-query\",\n \"object\": - \"model\",\n \"created\": 1651172505,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-lYkiTZMmJMWm8jvkPx2duyHE\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066353,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"davinci-search-query\",\n \"parent\": - null\n },\n {\n \"id\": \"babbage-search-document\",\n \"object\": - \"model\",\n \"created\": 1651172510,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-5qFV9kxCRGKIXpBEP75chmp7\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669084981,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"babbage-search-document\",\n - \ \"parent\": null\n },\n {\n \"id\": \"ada-search-document\",\n - \ \"object\": \"model\",\n \"created\": 1651172507,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-8qUMuMAbo4EwedbGamV7e9hq\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669092640,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada-search-document\",\n \"parent\": - null\n },\n {\n \"id\": \"text-search-curie-query-001\",\n \"object\": - \"model\",\n \"created\": 1651172509,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-Iion0NCpsXPNtIkQ0owQLi7V\",\n - \ \"object\": \"model_permission\",\n \"created\": 1677273417,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-curie-query-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"gpt-4-32k-0314\",\n - \ \"object\": \"model\",\n \"created\": 1678604599,\n \"owned_by\": - \"openai\",\n \"permission\": [\n {\n \"id\": \"modelperm-f7EiuSfSfAfWXc7eln18oUBw\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684185077,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": false,\n - \ \"allow_logprobs\": false,\n \"allow_search_indices\": - false,\n \"allow_view\": false,\n \"allow_fine_tuning\": - false,\n \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"gpt-4-32k-0314\",\n \"parent\": - null\n },\n {\n \"id\": \"text-search-babbage-doc-001\",\n \"object\": - \"model\",\n \"created\": 1651172509,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-ao2r26P2Th7nhRFleHwy2gn5\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669084981,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-babbage-doc-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"curie-search-document\",\n - \ \"object\": \"model\",\n \"created\": 1651172508,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-LDsN5wW8eKVuh1OsyciHntE9\",\n - \ \"object\": \"model_permission\",\n \"created\": 1677273417,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"curie-search-document\",\n \"parent\": - null\n },\n {\n \"id\": \"text-search-curie-doc-001\",\n \"object\": - \"model\",\n \"created\": 1651172509,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-taUGRSku7bQLa24SNIwYPEsi\",\n - \ \"object\": \"model_permission\",\n \"created\": 1677273417,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-curie-doc-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"babbage-search-query\",\n - \ \"object\": \"model\",\n \"created\": 1651172509,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-wSs1hMXDKsrcErlbN8HmzlLE\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669084981,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"babbage-search-query\",\n \"parent\": - null\n },\n {\n \"id\": \"text-babbage-001\",\n \"object\": - \"model\",\n \"created\": 1649364043,\n \"owned_by\": \"openai\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-a3Ph5FIBbJxsoA4wvx7VYC7R\",\n - \ \"object\": \"model_permission\",\n \"created\": 1675105935,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-babbage-001\",\n \"parent\": - null\n },\n {\n \"id\": \"text-search-davinci-doc-001\",\n \"object\": - \"model\",\n \"created\": 1651172505,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-qhSf1j2MJMujcu3t7cHnF1DN\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066353,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-davinci-doc-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-search-babbage-query-001\",\n - \ \"object\": \"model\",\n \"created\": 1651172509,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-Kg70kkFxD93QQqsVe4Zw8vjc\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669084981,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-search-babbage-query-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"curie-similarity\",\n - \ \"object\": \"model\",\n \"created\": 1651172510,\n \"owned_by\": - \"openai-dev\",\n \"permission\": [\n {\n \"id\": \"modelperm-zhWKExSloaQiJgzjVHFmh2wR\",\n - \ \"object\": \"model_permission\",\n \"created\": 1675106290,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"curie-similarity\",\n \"parent\": - null\n },\n {\n \"id\": \"curie\",\n \"object\": \"model\",\n - \ \"created\": 1649359874,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"modelperm-oPaljeveTjEIDbhDjzFiyf4V\",\n - \ \"object\": \"model_permission\",\n \"created\": 1675106503,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"curie\",\n \"parent\": - null\n },\n {\n \"id\": \"gpt-3.5-turbo-0301\",\n \"object\": - \"model\",\n \"created\": 1677649963,\n \"owned_by\": \"openai\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-pvjOAsmQhwelYZvz8BlX18w0\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684521457,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"gpt-3.5-turbo-0301\",\n \"parent\": - null\n },\n {\n \"id\": \"text-similarity-davinci-001\",\n \"object\": - \"model\",\n \"created\": 1651172505,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-OvmcfYoq5V9SF9xTYw1Oz6Ue\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066356,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-similarity-davinci-001\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-davinci-002\",\n - \ \"object\": \"model\",\n \"created\": 1649880484,\n \"owned_by\": - \"openai\",\n \"permission\": [\n {\n \"id\": \"modelperm-l4EU6QlN1HcS0so0jU16kyg8\",\n - \ \"object\": \"model_permission\",\n \"created\": 1679355287,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-davinci-002\",\n \"parent\": - null\n },\n {\n \"id\": \"gpt-4-32k\",\n \"object\": \"model\",\n - \ \"created\": 1678604599,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"modelperm-mYGfbXKBkKOuHbUgrguvtDKN\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684185078,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": false,\n - \ \"allow_logprobs\": false,\n \"allow_search_indices\": - false,\n \"allow_view\": false,\n \"allow_fine_tuning\": - false,\n \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"gpt-4-32k\",\n \"parent\": - null\n },\n {\n \"id\": \"davinci-similarity\",\n \"object\": - \"model\",\n \"created\": 1651172509,\n \"owned_by\": \"openai-dev\",\n - \ \"permission\": [\n {\n \"id\": \"modelperm-lYYgng3LM0Y97HvB5CDc8no2\",\n - \ \"object\": \"model_permission\",\n \"created\": 1669066353,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": true,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"davinci-similarity\",\n \"parent\": - null\n },\n {\n \"id\": \"cushman:2020-05-03\",\n \"object\": - \"model\",\n \"created\": 1590625110,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-FAup8P1KqclNlTsunLDRiesT\",\n - \ \"object\": \"model_permission\",\n \"created\": 1590625111,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"cushman:2020-05-03\",\n \"parent\": - null\n },\n {\n \"id\": \"ada:2020-05-03\",\n \"object\": - \"model\",\n \"created\": 1607631625,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-9TYofAqUs54vytKYL0IX91rX\",\n - \ \"object\": \"model_permission\",\n \"created\": 1607631626,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada:2020-05-03\",\n \"parent\": - null\n },\n {\n \"id\": \"babbage:2020-05-03\",\n \"object\": - \"model\",\n \"created\": 1607632611,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-jaLAcmyyNuaVmalCE1BGTGwf\",\n - \ \"object\": \"model_permission\",\n \"created\": 1607632613,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"babbage:2020-05-03\",\n \"parent\": - null\n },\n {\n \"id\": \"curie:2020-05-03\",\n \"object\": - \"model\",\n \"created\": 1607632725,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-bt6R8PWbB2SwK5evFo0ZxSs4\",\n - \ \"object\": \"model_permission\",\n \"created\": 1607632727,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"curie:2020-05-03\",\n \"parent\": - null\n },\n {\n \"id\": \"davinci:2020-05-03\",\n \"object\": - \"model\",\n \"created\": 1607640163,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-99cbfQTYDVeLkTYndX3UMpSr\",\n - \ \"object\": \"model_permission\",\n \"created\": 1607640164,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"davinci:2020-05-03\",\n \"parent\": - null\n },\n {\n \"id\": \"if-davinci-v2\",\n \"object\": \"model\",\n - \ \"created\": 1610745990,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"snapperm-58q0TdK2K4kMgL3MoHvGWMlH\",\n \"object\": - \"model_permission\",\n \"created\": 1610746036,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": false,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"if-davinci-v2\",\n \"parent\": null\n },\n - \ {\n \"id\": \"if-curie-v2\",\n \"object\": \"model\",\n \"created\": - 1610745968,\n \"owned_by\": \"openai\",\n \"permission\": [\n {\n - \ \"id\": \"snapperm-fwAseHVq6NGe6Ple6tKfzRSK\",\n \"object\": - \"model_permission\",\n \"created\": 1610746043,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": false,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"if-curie-v2\",\n \"parent\": null\n },\n - \ {\n \"id\": \"if-davinci:3.0.0\",\n \"object\": \"model\",\n - \ \"created\": 1629420755,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"snapperm-T53lssiyMWwiuJwhyO9ic53z\",\n \"object\": - \"model_permission\",\n \"created\": 1629421809,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": true,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"if-davinci:3.0.0\",\n \"parent\": null\n - \ },\n {\n \"id\": \"davinci-if:3.0.0\",\n \"object\": \"model\",\n - \ \"created\": 1629498070,\n \"owned_by\": \"openai\",\n \"permission\": - [\n {\n \"id\": \"snapperm-s6ZIAVMwlZwrLGGClTXqSK3Q\",\n \"object\": - \"model_permission\",\n \"created\": 1629498084,\n \"allow_create_engine\": - false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": true,\n \"organization\": - \"*\",\n \"group\": null,\n \"is_blocking\": false\n }\n - \ ],\n \"root\": \"davinci-if:3.0.0\",\n \"parent\": null\n - \ },\n {\n \"id\": \"davinci-instruct-beta:2.0.0\",\n \"object\": - \"model\",\n \"created\": 1629501914,\n \"owned_by\": \"openai\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-c70U4TBfiOD839xptP5pJzyc\",\n - \ \"object\": \"model_permission\",\n \"created\": 1629501939,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"davinci-instruct-beta:2.0.0\",\n - \ \"parent\": null\n },\n {\n \"id\": \"text-ada:001\",\n \"object\": - \"model\",\n \"created\": 1641949608,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-d2PSnwFG1Yn9of6PvrrhkBcU\",\n - \ \"object\": \"model_permission\",\n \"created\": 1641949610,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-ada:001\",\n \"parent\": - null\n },\n {\n \"id\": \"text-davinci:001\",\n \"object\": - \"model\",\n \"created\": 1641943966,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-Fj1O3zkKXOQy6AkcfQXRKcWA\",\n - \ \"object\": \"model_permission\",\n \"created\": 1641944340,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-davinci:001\",\n \"parent\": - null\n },\n {\n \"id\": \"text-curie:001\",\n \"object\": - \"model\",\n \"created\": 1641955047,\n \"owned_by\": \"system\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-BI9TAT6SCj43JRsUb9CYadsz\",\n - \ \"object\": \"model_permission\",\n \"created\": 1641955123,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-curie:001\",\n \"parent\": - null\n },\n {\n \"id\": \"text-babbage:001\",\n \"object\": - \"model\",\n \"created\": 1642018370,\n \"owned_by\": \"openai\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-7oP3WFr9x7qf5xb3eZrVABAH\",\n - \ \"object\": \"model_permission\",\n \"created\": 1642018480,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": false,\n - \ \"organization\": \"*\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"text-babbage:001\",\n \"parent\": - null\n },\n {\n \"id\": \"davinci:ft-datadog:datadog-vscode-2023-04-10-20-52-05\",\n - \ \"object\": \"model\",\n \"created\": 1681159925,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-jHx1COn3hOjxlAksAU8ZDJWY\",\n - \ \"object\": \"model_permission\",\n \"created\": 1681159925,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"davinci:2020-05-03\",\n \"parent\": \"davinci:2020-05-03\"\n },\n - \ {\n \"id\": \"ada:ft-datadog:kvs-20230314-2023-03-22-04-45-39\",\n - \ \"object\": \"model\",\n \"created\": 1679460340,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-eUyzL7rMzVpTh02Y72Lj84ik\",\n - \ \"object\": \"model_permission\",\n \"created\": 1679460340,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"ada:2020-05-03\",\n \"parent\": \"ada:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog:reverse-movie-search-2023-05-08-22-04-06\",\n - \ \"object\": \"model\",\n \"created\": 1683583446,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-0lFV9rhU8uRmsivLVy1Dni0R\",\n - \ \"object\": \"model_permission\",\n \"created\": 1683583446,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"davinci:ft-datadog:datadog-vscode-2023-04-10-21-09-52\",\n - \ \"object\": \"model\",\n \"created\": 1681160993,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-Xgxj2JPI0aUJwHiglXZI3oyM\",\n - \ \"object\": \"model_permission\",\n \"created\": 1681160993,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"davinci:2020-05-03\",\n \"parent\": \"davinci:2020-05-03\"\n },\n - \ {\n \"id\": \"ada:ft-datadog-2023-05-16-13-23-13\",\n \"object\": - \"model\",\n \"created\": 1684243393,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-Lz60BLO4U5PX0XmeMhQQGA9u\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684243393,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"ada:2020-05-03\",\n \"parent\": \"ada:2020-05-03\"\n },\n {\n - \ \"id\": \"davinci:ft-datadog-2023-05-03-21-26-19\",\n \"object\": - \"model\",\n \"created\": 1683149179,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-450TdaeaPCVOamk6ysCuV2b5\",\n - \ \"object\": \"model_permission\",\n \"created\": 1683149179,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"davinci:2020-05-03\",\n \"parent\": \"davinci:2020-05-03\"\n },\n - \ {\n \"id\": \"curie:ft-datadog-2023-05-08-06-24-14\",\n \"object\": - \"model\",\n \"created\": 1683527054,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-bDXwkBeRqSLV9HP5AVexqM26\",\n - \ \"object\": \"model_permission\",\n \"created\": 1683527054,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog:reverse-movie-search-v2-2023-05-12-15-44-30\",\n - \ \"object\": \"model\",\n \"created\": 1683906270,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-XTIOG7tgFnedaUqpGhPZmuLp\",\n - \ \"object\": \"model_permission\",\n \"created\": 1683906270,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:ft-datadog:reverse-movie-search-2023-05-08-22-04-06\"\n - \ },\n {\n \"id\": \"ada:ft-datadog-2023-05-16-14-32-39\",\n \"object\": - \"model\",\n \"created\": 1684247559,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-qqdMrF8WSzZqjjZ4pMSC7VlG\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684247559,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"ada:2020-05-03\",\n \"parent\": \"ada:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-16-14-33-37\",\n \"object\": - \"model\",\n \"created\": 1684247617,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-8eo9ux2gs5f448P0GrDu0GLF\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684247617,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-03-21-10-42\",\n \"object\": - \"model\",\n \"created\": 1683148242,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-scG6PTDZOxuhj6UEmAMlFzed\",\n - \ \"object\": \"model_permission\",\n \"created\": 1683148242,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-05-18-51-53\",\n \"object\": - \"model\",\n \"created\": 1683312713,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-oMu63vKFIV2bCgw36PhwdHYM\",\n - \ \"object\": \"model_permission\",\n \"created\": 1683312713,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"davinci:ft-datadog-2023-05-10-21-35-42\",\n \"object\": - \"model\",\n \"created\": 1683754542,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-c5yHbv6fULrWWPUuwWMZ322S\",\n - \ \"object\": \"model_permission\",\n \"created\": 1683754542,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"davinci:2020-05-03\",\n \"parent\": \"davinci:2020-05-03\"\n },\n - \ {\n \"id\": \"curie:ft-datadog:mobile-monitor-type-2023-05-15-07-02-41\",\n - \ \"object\": \"model\",\n \"created\": 1684134161,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-HFOu6LctNoid1iq1ILvuMz7W\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684134161,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog:mobile-monitor-type-2023-05-15-07-25-07\",\n - \ \"object\": \"model\",\n \"created\": 1684135507,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-ReNXLBbb96DnSXZRLQvKm38I\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684135507,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-15-11-08-40\",\n \"object\": - \"model\",\n \"created\": 1684148920,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-yIda7iTgBzSxQTprHE8N80ux\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684148920,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog:mobile-monitor-type-2023-05-15-07-51-38\",\n - \ \"object\": \"model\",\n \"created\": 1684137098,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-sozfWmgRS0I20L7Ubhmdv5xe\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684137098,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-15-09-17-19\",\n \"object\": - \"model\",\n \"created\": 1684142239,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-Wuk0v731XHZkDOzO6H8mckv6\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684142239,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-15-09-26-32\",\n \"object\": - \"model\",\n \"created\": 1684142792,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-AN4h8ulMoDfeTCXVfwI80gMU\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684142792,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:ft-datadog-2023-05-15-09-17-19\"\n - \ },\n {\n \"id\": \"ada:ft-datadog-2023-05-15-09-29-42\",\n \"object\": - \"model\",\n \"created\": 1684142982,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-trLweb8ZBeIKaqXGGZb9qcz5\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684142982,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"ada:2020-05-03\",\n \"parent\": \"ada:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-15-10-17-56\",\n \"object\": - \"model\",\n \"created\": 1684145876,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-wTcI65R0xZWg064rKdN6GnXO\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684145876,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"davinci:ft-datadog-2023-05-15-13-00-56\",\n \"object\": - \"model\",\n \"created\": 1684155656,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-36vcxqvgiSwfRXhuUfk7amgv\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684155656,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"davinci:2020-05-03\",\n \"parent\": \"davinci:2020-05-03\"\n },\n - \ {\n \"id\": \"curie:ft-datadog-2023-05-16-16-25-56\",\n \"object\": - \"model\",\n \"created\": 1684254356,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-TSJ3szrT1gTE3C5nySRFogpB\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684254356,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"davinci:ft-datadog-2023-05-15-14-35-58\",\n \"object\": - \"model\",\n \"created\": 1684161358,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-Zab2YYGHldkgYRRkvaF9ENmM\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684161358,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"davinci:2020-05-03\",\n \"parent\": \"davinci:2020-05-03\"\n },\n - \ {\n \"id\": \"ada:ft-datadog-2023-05-15-15-24-33\",\n \"object\": - \"model\",\n \"created\": 1684164273,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-rPt3Wa2ro3LwEf8s6yDOUsZJ\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684164273,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"ada:2020-05-03\",\n \"parent\": \"ada:2020-05-03\"\n },\n {\n - \ \"id\": \"ada:ft-datadog-2023-05-15-15-30-11\",\n \"object\": \"model\",\n - \ \"created\": 1684164611,\n \"owned_by\": \"datadog-4\",\n \"permission\": - [\n {\n \"id\": \"snapperm-1Hrl2bCLHRLOcOnz2CfPlZtr\",\n \"object\": - \"model_permission\",\n \"created\": 1684164611,\n \"allow_create_engine\": - true,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": true,\n \"organization\": - \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada:2020-05-03\",\n \"parent\": - \"ada:2020-05-03\"\n },\n {\n \"id\": \"curie:ft-datadog-2023-05-16-17-37-44\",\n - \ \"object\": \"model\",\n \"created\": 1684258664,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-p6saXiFah3Xm1qMAZygDmgIM\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684258664,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-16-18-08-14\",\n \"object\": - \"model\",\n \"created\": 1684260494,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-XjrLbHryvOt2D5pzUe6OGr8H\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684260494,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-16-18-36-30\",\n \"object\": - \"model\",\n \"created\": 1684262190,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-mtsxgUmZxC5N7mwssalZC7D3\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684262190,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-16-19-47-34\",\n \"object\": - \"model\",\n \"created\": 1684266454,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-i5dxnNODrofFPpCJEo0QJTYH\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684266454,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-15-16-20-54\",\n \"object\": - \"model\",\n \"created\": 1684167655,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-LhEq4Qxi3UhVhXoIqU3Ndb8z\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684167655,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-16-23-42-26\",\n \"object\": - \"model\",\n \"created\": 1684280546,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-meWBtZnPHs0LPlBPQuXviGl7\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684280546,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"davinci:ft-datadog-2023-05-15-19-28-30\",\n \"object\": - \"model\",\n \"created\": 1684178910,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-IKI1wW7eFvt9VZA7plnUaJ7b\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684178910,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"davinci:2020-05-03\",\n \"parent\": \"davinci:2020-05-03\"\n },\n - \ {\n \"id\": \"ada:ft-datadog-2023-05-15-17-11-39\",\n \"object\": - \"model\",\n \"created\": 1684170699,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-o9a4oxIzXsUgDXNmRkcIkIn9\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684170699,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"ada:2020-05-03\",\n \"parent\": \"ada:2020-05-03\"\n },\n {\n - \ \"id\": \"ada:ft-datadog-2023-05-16-08-44-41\",\n \"object\": \"model\",\n - \ \"created\": 1684226681,\n \"owned_by\": \"datadog-4\",\n \"permission\": - [\n {\n \"id\": \"snapperm-Ui6dnzeSWbwRFFrRTKoNUi69\",\n \"object\": - \"model_permission\",\n \"created\": 1684226681,\n \"allow_create_engine\": - true,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": true,\n \"organization\": - \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada:2020-05-03\",\n \"parent\": - \"ada:2020-05-03\"\n },\n {\n \"id\": \"curie:ft-datadog-2023-05-16-07-56-58\",\n - \ \"object\": \"model\",\n \"created\": 1684223818,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-EfAs9libZtaeiF8ruimc6oYJ\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684223818,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog:mobile-monitor-type-2023-05-16-00-22-41\",\n - \ \"object\": \"model\",\n \"created\": 1684196561,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-s5WTb4dol13btNrm3Ba0hkWn\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684196561,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"ada:ft-datadog-2023-05-16-10-01-48\",\n \"object\": \"model\",\n - \ \"created\": 1684231308,\n \"owned_by\": \"datadog-4\",\n \"permission\": - [\n {\n \"id\": \"snapperm-ZTWM9OlbwEEPoFGLxJdFfhdF\",\n \"object\": - \"model_permission\",\n \"created\": 1684231308,\n \"allow_create_engine\": - true,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": true,\n \"organization\": - \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada:2020-05-03\",\n \"parent\": - \"ada:2020-05-03\"\n },\n {\n \"id\": \"ada:ft-datadog-2023-05-16-12-13-42\",\n - \ \"object\": \"model\",\n \"created\": 1684239222,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-I24RVZFyItya2fo6Zkag8AOz\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684239222,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"ada:2020-05-03\",\n \"parent\": \"ada:2020-05-03\"\n },\n {\n - \ \"id\": \"ada:ft-datadog-2023-05-16-11-14-12\",\n \"object\": \"model\",\n - \ \"created\": 1684235652,\n \"owned_by\": \"datadog-4\",\n \"permission\": - [\n {\n \"id\": \"snapperm-bENXP2Y4Tn4J7aBjDuIo8a5v\",\n \"object\": - \"model_permission\",\n \"created\": 1684235652,\n \"allow_create_engine\": - true,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": - true,\n \"allow_fine_tuning\": true,\n \"organization\": - \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": null,\n \"is_blocking\": - false\n }\n ],\n \"root\": \"ada:2020-05-03\",\n \"parent\": - \"ada:2020-05-03\"\n },\n {\n \"id\": \"curie:ft-datadog:deleteme-2023-05-18-23-25-41\",\n - \ \"object\": \"model\",\n \"created\": 1684452341,\n \"owned_by\": - \"datadog-4\",\n \"permission\": [\n {\n \"id\": \"snapperm-Qua5xn65HKkdNE4ATv590n5e\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684452341,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-16-11-22-26\",\n \"object\": - \"model\",\n \"created\": 1684236146,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-rrfS2ov2MSzSFbJFfsWkEDxH\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684236146,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog:deleteme-2023-05-18-20-44-56\",\n \"object\": - \"model\",\n \"created\": 1684442696,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-bylweQ7uRLNMLNB0un6iknqE\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684442696,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n },\n {\n - \ \"id\": \"curie:ft-datadog-2023-05-19-14-54-52\",\n \"object\": - \"model\",\n \"created\": 1684508092,\n \"owned_by\": \"datadog-4\",\n - \ \"permission\": [\n {\n \"id\": \"snapperm-btR8GlxEjfo3E4Suv2Pv49Nh\",\n - \ \"object\": \"model_permission\",\n \"created\": 1684508092,\n - \ \"allow_create_engine\": true,\n \"allow_sampling\": true,\n - \ \"allow_logprobs\": true,\n \"allow_search_indices\": false,\n - \ \"allow_view\": true,\n \"allow_fine_tuning\": true,\n - \ \"organization\": \"org-OS4zcsDN8sF8E8CdhxgMkBV4\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": - \"curie:2020-05-03\",\n \"parent\": \"curie:2020-05-03\"\n }\n ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7ca0747cf826438e-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 May 2023 00:27:38 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-processing-ms: - - '84' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 7152d290a77134ab160db6ea5d58f464 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/models -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/model_retrieve.yaml b/tests/contrib/openai/cassettes/v0/model_retrieve.yaml deleted file mode 100644 index b3c382a3256..00000000000 --- a/tests/contrib/openai/cassettes/v0/model_retrieve.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: GET - uri: https://api.openai.com/v1/models/curie - response: - body: - string: !!binary | - H4sIAAAAAAAAA3SRMU/DMBCF9/yKk0cEUqsmLc1ckNgYEAtClpNc0guOL7KdRm3V/44So1Cisnh4 - 73vvzvY5AhBUiBRE3llCcT8InNWY+0FsuEAdxNyi8jigy3W8XSXbx00c6N5gIbPjwHOLRlEItGgb - co7YiBQ+IgCA83hOI8f2AXvgV6VrPOBb/fSyy/a7+vRMxzJ+H5vGxGwnedU+MdcrbpLlYp0sVpOp - tOZeBkSiqcigSKFU2uGMcappNZlKpOBtN3c1V63lzN12HSqb7yWZgnJ0/ww4EPa34yUZlL4zYfrf - LNtKGTopH15U3P1evLLctSIF02k9ieRkpjn/uuoarUsE8Dn+kGX2s69vlUXjf6qiS/QNAAD//wMA - kXR4gCECAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7ca077d1ca388c7d-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 May 2023 00:29:54 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-processing-ms: - - '52' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - 213fc1d89e08ac9b4c929d3cfa2143af - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/model_retrieve_async.yaml b/tests/contrib/openai/cassettes/v0/model_retrieve_async.yaml deleted file mode 100644 index 85ec686f431..00000000000 --- a/tests/contrib/openai/cassettes/v0/model_retrieve_async.yaml +++ /dev/null @@ -1,57 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: get - uri: https://api.openai.com/v1/models/curie - response: - body: - string: "{\n \"id\": \"curie\",\n \"object\": \"model\",\n \"created\": 1649359874,\n - \ \"owned_by\": \"openai\",\n \"permission\": [\n {\n \"id\": \"modelperm-oPaljeveTjEIDbhDjzFiyf4V\",\n - \ \"object\": \"model_permission\",\n \"created\": 1675106503,\n - \ \"allow_create_engine\": false,\n \"allow_sampling\": true,\n \"allow_logprobs\": - true,\n \"allow_search_indices\": false,\n \"allow_view\": true,\n - \ \"allow_fine_tuning\": false,\n \"organization\": \"*\",\n \"group\": - null,\n \"is_blocking\": false\n }\n ],\n \"root\": \"curie\",\n - \ \"parent\": null\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7ca077e8be9c17d9-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 20 May 2023 00:29:58 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-processing-ms: - - '28' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - cc340e13e0cc38b3cf62b051cde4499e - status: - code: 200 - message: OK - url: https://api.openai.com/v1/models/curie -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/moderation.yaml b/tests/contrib/openai/cassettes/v0/moderation.yaml deleted file mode 100644 index def8d16ad7d..00000000000 --- a/tests/contrib/openai/cassettes/v0/moderation.yaml +++ /dev/null @@ -1,73 +0,0 @@ -interactions: -- request: - body: '{"input": "i want to kill them.", "model": "text-moderation-latest"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '68' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.11.1", "platform": "macOS-13.6-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Fri Sep 15 13:41:28 - PDT 2023; root:xnu-8796.141.3.700.8~1/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/moderations - response: - body: - string: !!binary | - H4sIAAAAAAAAA4xSYWvbMBD9nl8h/LlWTtLppOtPCF0LZYOxMYZwFMfg2EOWu47S/z7cJIMlTsiX - A929u/d0794WQhTNurgXxa5fp9I/dp+Nq0dcPX1Tj2sM/Pxl/P2yevi6Cp+Kuwm969exnRpyfM3l - 9EohN31XAtAekeIwtnko7sX3hRBCvH1EIYpNG+o6Tmw5jfHumK5CjnWfmji1HMFCFEN8HcNEtQnt - 8A8uRLENOZ4M+cimMAy72OXz2hDbTbkNaTczbU+z3DVdn4YLbMu8TTHk2DVdfT79penb2FVxWafw - a9tUsyQHAcumy3uJ1yBDTmM1bXVe0PGjt8k6VA6F99O9//k5VH26uHwtvWe21ipAi2gplu7cC5CW - 0YDyij0oY4AuOQPSGQtGk/KA1gPxBZ+UBI1E3jFq643RKpZ8xTclHQIQIDEgWaVmlJ4sDKRCJEek - wGuHaNlft1VL6zUbBs/asTVo/+eYsdlI8qw1KSTH5NnHUsEtthtpyYO2aDSCIkQXS6VvuQOQjrRn - 671WmolYz18FSGa0TiswoI3VfDyRxTH+WLz/BQAA//8DAK8bfCojBAAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 82a3adc32b200f4d-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Wed, 22 Nov 2023 19:46:29 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=PTgc_thelLAM8Lj0uTQC8FpX2u1pi7Jmxtyf1IIHDJA-1700682389-0-AR8a2Fg0xpx43gUSSEnBJJ594N8OjT9BVvcvB5P7ANQBIdlCnexS1INRclTgCGdKcqohEEZAP/2fiTqyT0dX/WM=; - path=/; expires=Wed, 22-Nov-23 20:16:29 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=Hp_oZZIzSDgiH5njkX17p.QFRWo5lPZK5V7jSb_zJfU-1700682389386-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '324' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - d468ab0db543a82c037a4f683726e151 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/moderation_async.yaml b/tests/contrib/openai/cassettes/v0/moderation_async.yaml deleted file mode 100644 index d651fa18664..00000000000 --- a/tests/contrib/openai/cassettes/v0/moderation_async.yaml +++ /dev/null @@ -1,72 +0,0 @@ -interactions: -- request: - body: '{"input": "i want to kill them.", "model": "text-moderation-latest"}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.2 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.2", "httplib": "requests", "lang": "python", "lang_version": - "3.11.1", "platform": "macOS-13.6-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Fri Sep 15 13:41:28 - PDT 2023; root:xnu-8796.141.3.700.8~1/RELEASE_ARM64_T6000 arm64 arm"}' - method: post - uri: https://api.openai.com/v1/moderations - response: - body: - string: "{\n \"id\": \"modr-8NnYh1humNlrVd1V4st7Mqd0jSlcd\",\n \"model\": - \"text-moderation-006\",\n \"results\": [\n {\n \"flagged\": true,\n - \ \"categories\": {\n \"sexual\": false,\n \"hate\": true,\n - \ \"harassment\": true,\n \"self-harm\": false,\n \"sexual/minors\": - false,\n \"hate/threatening\": true,\n \"violence/graphic\": - false,\n \"self-harm/intent\": false,\n \"self-harm/instructions\": - false,\n \"harassment/threatening\": true,\n \"violence\": true\n - \ },\n \"category_scores\": {\n \"sexual\": 2.889955510454456e-7,\n - \ \"hate\": 0.5943018198013306,\n \"harassment\": 0.7350326180458069,\n - \ \"self-harm\": 1.0246687942583321e-9,\n \"sexual/minors\": - 1.7400604690465116e-7,\n \"hate/threatening\": 0.14467661082744598,\n - \ \"violence/graphic\": 2.5829390892795345e-7,\n \"self-harm/intent\": - 3.689226146796898e-10,\n \"self-harm/instructions\": 3.5680254324016447e-12,\n - \ \"harassment/threatening\": 0.7628958821296692,\n \"violence\": - 0.994572103023529\n }\n }\n ]\n}" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 82a3b6514a580c94-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Wed, 22 Nov 2023 19:52:19 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=hcev5kocl5SmHFbj8EFc5QmTL.oBz0Rkebq4E17gYL0-1700682739-0-AVquEygAoonkliS3iH0Q1po44VzmCkyPsUTb7oo/C+8RXddwjPoEYvzgfs+3URF80paHhCqm3pUSGtdtWohu17Y=; - path=/; expires=Wed, 22-Nov-23 20:22:19 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=QfAG6bky.Ec.UeBPgv2Po9ObQ1KvhXdBCwvn7328a0s-1700682739595-0-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '120' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-request-id: - - c9af16638263eedad8a614ee854ee340 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/moderations -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/transcribe.yaml b/tests/contrib/openai/cassettes/v0/transcribe.yaml deleted file mode 100644 index fee3a97cfc1..00000000000 --- a/tests/contrib/openai/cassettes/v0/transcribe.yaml +++ /dev/null @@ -1,882 +0,0 @@ -interactions: -- request: - body: !!binary | - LS0yYzBjOWY5MWQwZTIxNDk1ZWQyZGE0YWM3OWNlMGZlZQ0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJtb2RlbCINCg0Kd2hpc3Blci0xDQotLTJjMGM5ZjkxZDBlMjE0OTVl - ZDJkYTRhYzc5Y2UwZmVlDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InJl - c3BvbnNlX2Zvcm1hdCINCg0KdmVyYm9zZV9qc29uDQotLTJjMGM5ZjkxZDBlMjE0OTVlZDJkYTRh - Yzc5Y2UwZmVlDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InByb21wdCIN - Cg0Kd2hhdCdzIHRoYXQgb3ZlciB0aGVyZT8NCi0tMmMwYzlmOTFkMGUyMTQ5NWVkMmRhNGFjNzlj - ZTBmZWUNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0idGVtcGVyYXR1cmUi - DQoNCjAuMw0KLS0yYzBjOWY5MWQwZTIxNDk1ZWQyZGE0YWM3OWNlMGZlZQ0KQ29udGVudC1EaXNw - b3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJsYW5ndWFnZSINCg0KZW4NCi0tMmMwYzlmOTFkMGUy - MTQ5NWVkMmRhNGFjNzljZTBmZWUNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFt - ZT0iZmlsZSI7IGZpbGVuYW1lPSIvVXNlcnMveXVuLmtpbS9nby9zcmMvZ2l0aHViLmNvbS9EYXRh - RG9nL2RkLXRyYWNlLXB5L3Rlc3RzL2NvbnRyaWIvb3BlbmFpL3Rlc3RfZGF0YS9lbmdsaXNoX2F1 - ZGlvLm1wMyINCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtDQoNCklEMwQA - AAAAAQpUWFhYAAAAEgAAA21ham9yX2JyYW5kAGlzb20AVFhYWAAAABMAAANtaW5vcl92ZXJzaW9u - ADUxMgBUWFhYAAAAJAAAA2NvbXBhdGlibGVfYnJhbmRzAGlzb21pc28yYXZjMW1wNDEAVFNTRQAA - AA8AAANMYXZmNTguNzYuMTAwAAAAAAAAAAAAAAD/+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - 3A4mCB441EH53/FhzyK//thf/+XBjBQAAupNUMczJUT5KcwWmkiKzD5ZGBihBOrV6wWVF9ghQKl6 - Kj5dkYf/yyLFA+s/7MKi8zJpis1f3qeofzlIUcC+Ueb234NAvXtqGxhYTbUJJBBKUjAjEAxsoEpW - HhhYeVxNPyk6uHNXGvAUnf0vD+/PYg9pmlSRX+mrMnVyERadCN3eXP7vb86ksKzu38787yM4QUAM - 5FP53JQitRvzzi3IRRZeD/+uBIZTgSAiGm05zDeE7YB6x4noXHBbzpVaMUJpXuhzi+VLs/2QA3xd - b1JSqtSG8M3yfOy4+G11RjQhdGlUUqETPTu0oNhND1gilp1f+xX3nDOlbs9nQle1P0ffott1NOnV - XZTPWv/7kkToAAL4QFRh5R0CZEa6GmDIpInMj0yHsMfJaKjq9MGKjrMmjXbeHTsbpKBSSSkohSHD - 7VhMyJWCssYJknGiVKY2ZViMsq0/VQ8uyuX/7sPnmSvmgtIKWMGXtM29WKFsWTpNzPYmidJJn+W3 - hmaJP/85qFc3ZvZkRP7Np/855gEFSGAZRoep//9KIoeF2QUXdZ7UAAACAVQzRSSfD1EGLknjqRxf - ZkSFMWNXJK5oyPt/FAJGZk1GZb9jiVeq/7VWmoh0GoiBk6SEoSBUFQV8SuLHoNcFfyriz89PcqDQ - 4O63Hf4i+iJZISlTuKgOEwAAABmejgLAOPgPLxJJI4iEDZGJJJAFORJWCCgCUdgdUnROHlVn9RJR - lARPxgICX2DMGAhRbMzMx//qXszc1X1K30NKwYraGf8ramMBOGiImgq5XDrfgqdBoOLDVUxBTUUz - LjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JE8QADTmLVeesUQGgsOt08Za2LeG1Hp7DKgXseZ3TB - iqBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAaAEgXJWzUlFllOzs5RZZT1JxZR58XiR - E4SBHFlFlFlHmFHmWrZqTTi2tnYs0ouLZ2LeNypONKOLKdnKLMKLKeLh2Z2dnZ2ZzLi2dmdnZ2eI - vNmjTixIEeZcXF7m5UnFlFCx9QsyK3YqK/1iosAo0EZdoSy2Ohk1ks5ZZLFYKCBggQOCwsLCoqnb - wqwVFRQWFhYWFRUz6hYVZFWf/FRUWJP8WFhVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZJMP82tRsrgBMgA3 - YwZyACMmAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVQ0KLS0yYzBjOWY5MWQwZTIxNDk1ZWQyZGE0YWM3OWNlMGZlZS0tDQo= - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '46271' - Content-Type: - - multipart/form-data; boundary=2c0c9f91d0e21495ed2da4ac79ce0fee - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/audio/transcriptions - response: - body: - string: !!binary | - H4sIAAAAAAAAA3yQXWrDMBCEr+Lu89asfm3rDL1BCEZ1trawIxlJKYWQuxc3tI99GYaBmeXbO1Rf - VnBQs49lyuGdAWHzcb75mcEBx3kLZQGEyy37GlIEJ9uuRyg8XznWAu50h3ABR0fG69NUnys4agmB - 4+XoEELlrwoOmreU1sbXxm9bU5dUuJmWMK0cywsg1HQ4cCdDymqUZBRqIVGrATs5oJRKDkhoSFt9 - PlavO2dfb5mPiwrBf87jluY9p3dwr9Qa6qkfhOiNUtZqiTCl6565lJDi+IN1NLtOaNmbXzUIMY1l - Z56W8blFLQlhOqtp0EZYq/Sg8fm7wLGC+/Bb4cf5D/U/0sc3AAAA//8DAGkf0uR9AQAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7cb89561dae642c4-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 22 May 2023 22:44:24 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '588' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '50' - x-ratelimit-remaining-requests: - - '49' - x-ratelimit-reset-requests: - - 1.2s - x-request-id: - - f698d13a4e32cbf0c83200a4af33635a - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/transcribe_async.yaml b/tests/contrib/openai/cassettes/v0/transcribe_async.yaml deleted file mode 100644 index 790a79471c5..00000000000 --- a/tests/contrib/openai/cassettes/v0/transcribe_async.yaml +++ /dev/null @@ -1,870 +0,0 @@ -interactions: -- request: - body: !!binary | - LS1iZjFhYzcxNWEzYzVjOTYxMDA5MGQzZDM5ZTFmNDFiYg0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJtb2RlbCINCg0Kd2hpc3Blci0xDQotLWJmMWFjNzE1YTNjNWM5NjEw - MDkwZDNkMzllMWY0MWJiDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InJl - c3BvbnNlX2Zvcm1hdCINCg0KdGV4dA0KLS1iZjFhYzcxNWEzYzVjOTYxMDA5MGQzZDM5ZTFmNDFi - Yg0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJwcm9tcHQiDQoNCndoYXQn - cyB0aGF0IG92ZXIgdGhlcmU/DQotLWJmMWFjNzE1YTNjNWM5NjEwMDkwZDNkMzllMWY0MWJiDQpD - b250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InRlbXBlcmF0dXJlIg0KDQowLjcN - Ci0tYmYxYWM3MTVhM2M1Yzk2MTAwOTBkM2QzOWUxZjQxYmINCkNvbnRlbnQtRGlzcG9zaXRpb246 - IGZvcm0tZGF0YTsgbmFtZT0ibGFuZ3VhZ2UiDQoNCmVuDQotLWJmMWFjNzE1YTNjNWM5NjEwMDkw - ZDNkMzllMWY0MWJiDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZpbGUi - OyBmaWxlbmFtZT0iL1VzZXJzL3l1bi5raW0vZ28vc3JjL2dpdGh1Yi5jb20vRGF0YURvZy9kZC10 - cmFjZS1weS90ZXN0cy9jb250cmliL29wZW5haS90ZXN0X2RhdGEvZW5nbGlzaF9hdWRpby5tcDMi - DQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQ0KDQpJRDMEAAAAAAEKVFhY - WAAAABIAAANtYWpvcl9icmFuZABpc29tAFRYWFgAAAATAAADbWlub3JfdmVyc2lvbgA1MTIAVFhY - WAAAACQAAANjb21wYXRpYmxlX2JyYW5kcwBpc29taXNvMmF2YzFtcDQxAFRTU0UAAAAPAAADTGF2 - ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA//tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - rYs3///9G0MY5GkWl4v//8xG///9xqsY5lAij1VUhSRCNMgtJwJ4W4QxDGAozCjkaOeKdZux/HVx - li1rcOTFbuUJ3/HKHFc+58MZq94oEX4FZ6ZX6t6CqymZA/UMRWe1R85Zt6M3/9VXuULfL/R6LKvV - bnd2nIGxYidUbToAAAAAPtA6XA3HacNkXKOmE+1mMFilqZeCnFiiWRqohqpQmxG3K1CEW1uWKLNP - sTSBMDRoTUjTuIDOo0buVAs83Y7yJb////d3MPZDjXFA29U/9X/J/////oRO1panxwZjApANu4xV - 2cMxjsozdORQvz4RGvMwmyPKPv/7kkQPAELFPNv56izgZYsqvWHqassY82/ntLKBoyxqaZeeytcR - 7XeXxmBE90cZlu4jbococayTH8q3qNqtv8KFrtUlU+1e/u/5/zg5UQgfUthzln7PE7cUFnDwIACy - VEQAAAACs1TcSrShyQvclq3KZCbA7cBCaQ50el0Js4eOrIrUZa63uWQSeJeneK13/4C7SphCrKCp - /H6+JBJU+VGlSXO9R+Pf///6aHPLHRiBMWmdf/iYf4lAUiT////1ESWl1ktFzHsKooNslhul4O80 - GVQjYIXY/U5ZEi359V0rTi/7dYkahpY0hYNWolCzrYXECGWAgYiqqD06CqNnj9FX6BIXbznpW1P/ - /844kLHRWyXXNmfR/lSJg88FVrWAEA+WJNl/GvUUZQ6IEbV1o1RsoV7Yvji0RsDcJbPVKkB10ook - vS7biA0tP1ee7aejfECwn8WsDcEmb7f/UMK2oaQ08wwLi2rujeVEgbl////nZppsqw2OIgAkXH// - +OF/jpb////49SVgpgQRAMMPW3unkFdu/DOYyxpADEb+iobZ/nH/+5JEDgACyC7Z8es00GGnqo1p - 7ZaLJLFt56y0gY4eKjW3nmIECbHnCb4EMY1+VG/z4Zzrusf1ma9NL774I9P7MRy/8wW/8gAfR209 - 19YaG//tDTzOLJ31GR7sX7vhcxJODgZBAACAMlCbr0rmhyHUhlvdkq5nLtms5Kad0odOlnezs1NQ - EYRQg4qT+NWddg9/qHRwdTfueQViqb1Ol2MPBe58U7kD0RkMZsxeCUZdZgSam6yxH1v////8mGxC - kf1gLLLNT6g6gycAQNDguTjY4BkmFUyT252Cqm8R+daCPvb/WRkhvzVJns0QjXvseq73kINaJva4 - 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 - +d/xYc8iv/7YX//lwYwUAALqTVDHMyVE+SnMFppIisw+WRgYoQTq1esFlRfYIUCpeio+XZGH/8si - xQPrP+zCovMyaYrNX96nqH85SFHAvlHm9t+DQL17ahsYWE21CSQQSlIwIxAMbKBKVh4YWHlcTT8p - OrhzVxrwFJ39Lw/vz2IPaZpUkV/pqzJ1chEWnQjd3lz+72/OpLCs7t/O/O8jOEFADORT+dyUIrUb - 884tyEUWXg//rgSGU4EgIhptOcw3hO2AeseJ6FxwW86VWjFCaV7oc4vlS7P9kAN8XW9SUqrUhvDN - 8nzsuPhtdUY0IXRpVFKhEz07tKDYTQ9YIpadX/sV95wzpW7PZ0JXtT9H36LbdTTp1V2Uz1r/+5JE - 6AAC+EBUYeUdAmRGuhpgyKSJzI9Mh7DHyWio6vTBio6zJo123h07G6SgUkkpKIUhw+1YTMiVgrLG - CZJxolSmNmVYjLKtP1UPLsrl/+7D55kr5oLSCljBl7TNvVihbFk6Tcz2JonSSZ/lt4ZmiT//OahX - N2b2ZET+zaf/OeYBBUhgGUaHqf//SiKHhdkFF3We1AAAAgFUM0Uknw9RBi5J46kcX2ZEhTFjVySu - aMj7fxQCRmZNRmW/Y4lXqv+1VpqIdBqIgZOkhKEgVBUFfErix6DXBX8q4s/PT3Kg0ODutx3+Ivoi - WSEpU7ioDhMAAAAZno4CwDj4Dy8SSSOIhA2RiSSQBTkSVggoAlHYHVJ0Th5VZ/USUZQET8YCAl9g - zBgIUWzMzMf/6l7M3NV9St9DSsGK2hn/K2pjAThoiJoKuVw634KnQaDiw1VMQU1FMy4xMDBVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVV//uSRPEAA05i1XnrFEBoLDrdPGWti3htR6ewyoF7Hmd0wYqgVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQGgBIFyVs1JRZZTs7OUWWU9ScWUefF4kROEgRxZRZRZ - R5hR5lq2ak04trZ2LNKLi2di3jcqTjSjiynZyizCiyni4dmdnZ2dmcy4tnZnZ2dniLzZo04sSBHm - XFxe5uVJxZRQsfULMit2Kiv9YqLAKNBGXaEstjoZNZLOWWSxWCggYIEDgsLCwqKp28KsFRUUFhYW - FhUVM+oWFWRVn/xUVFiT/FhYVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmSTD/NrUbK4ATIAN2MGcgAjJgAA - AaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUNCi0t - YmYxYWM3MTVhM2M1Yzk2MTAwOTBkM2QzOWUxZjQxYmItLQ0K - headers: - Content-Type: - - multipart/form-data; boundary=bf1ac715a3c5c9610090d3d39e1f41bb - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/audio/transcriptions - response: - body: - string: 'Look at all those chickens. - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7cb8953f4be541d5-EWR - Connection: - - keep-alive - Content-Length: - - '28' - Content-Type: - - text/plain; charset=utf-8 - Date: - - Mon, 22 May 2023 22:44:19 GMT - Server: - - cloudflare - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '557' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '50' - x-ratelimit-remaining-requests: - - '49' - x-ratelimit-reset-requests: - - 1.2s - x-request-id: - - 4b35cc971985fa3dbe4133411fc291da - status: - code: 200 - message: OK - url: https://api.openai.com/v1/audio/transcriptions -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/translate.yaml b/tests/contrib/openai/cassettes/v0/translate.yaml deleted file mode 100644 index 7d9b45e0244..00000000000 --- a/tests/contrib/openai/cassettes/v0/translate.yaml +++ /dev/null @@ -1,1115 +0,0 @@ -interactions: -- request: - body: !!binary | - LS00NWE4MTc0MWRlZDcyNmM2NjEwNTQxZTI5ZDE2NzZjNQ0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJtb2RlbCINCg0Kd2hpc3Blci0xDQotLTQ1YTgxNzQxZGVkNzI2YzY2 - MTA1NDFlMjlkMTY3NmM1DQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InJl - c3BvbnNlX2Zvcm1hdCINCg0KdmVyYm9zZV9qc29uDQotLTQ1YTgxNzQxZGVkNzI2YzY2MTA1NDFl - MjlkMTY3NmM1DQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InByb21wdCIN - Cg0KYW5kIHdoZW4gSSd2ZSBnaXZlbiB1cCwNCi0tNDVhODE3NDFkZWQ3MjZjNjYxMDU0MWUyOWQx - Njc2YzUNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iZmlsZSI7IGZpbGVu - YW1lPSIvVXNlcnMveXVuLmtpbS9nby9zcmMvZ2l0aHViLmNvbS9EYXRhRG9nL2RkLXRyYWNlLXB5 - L3Rlc3RzL2NvbnRyaWIvb3BlbmFpL3Rlc3RfZGF0YS9mcmVuY2hfYXVkaW8ubXAzIg0KQ29udGVu - dC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0NCg0KSUQzBAAAAAABClRYWFgAAAASAAAD - bWFqb3JfYnJhbmQAaXNvbQBUWFhYAAAAEwAAA21pbm9yX3ZlcnNpb24ANTEyAFRYWFgAAAAkAAAD - Y29tcGF0aWJsZV9icmFuZHMAaXNvbWlzbzJhdmMxbXA0MQBUU1NFAAAADwAAA0xhdmY1OC43Ni4x - MDAAAAAAAAAAAAAAAP/7UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEluZm8AAAAP - AAAAjAAA5WIABAYKCw8RExYYHB4fIyUoKiwwMjU3OT0+QkRGSUtPUVJWWFxdX2NlaGpscHF1d3l8 - foKEhYmLj5CSlpibnZ+jpKiqrK+xtbe4vL7Cw8XJy87Q0tbX293f4uTo6uvv8fX2+Pz+AAAAAExh - dmM1OC4xMwAAAAAAAAAAAAAAACQDwAAAAAAAAOViZUAaTwAAAAAAAAAAAAAAAAAAAAD/+5BkAADy - 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 - Zo+QzI8JKCnKSd+agDFqBknnWJJFolEQIBJU+ErS7bRJaPosAotReEmXOTMkYRk2fOeSTy2zON3l - 8qyOHJZW9v6eWeW7fTcOo4BJknKCpYtFyS8OvKfWS52sf/9kS6WFIepOcfh7kuMKRBzGQ4imTAVo - jF8TkCbApQ7SIOcJ6Qv9KcNgkJSf+vVVgBCQGdpqwCLI4cDYao5LnJSasfSDNhQEulA0akxkGP1B - AR8ZSDCozMYZqAlSDN/1SZlhqWpRYKZjVe/GP2WMzGzdClrGpbcZ1gqUBWP/+5Jk6wPkwmFFQww0 - ci8ryGMACJ4SOYUQp7DLyLwr3wAANngBH0mYM2wqATl8NeMfVhtqsaqFarMmFGzBjCgLIsAACgD/ - dbJZLJf//nMRD444qSj4jHxUesyExURJGSj4XgURqKwzAVEMv/m3qQk3+v+sEB2ISyaiaRU4XOnE - 1JwnCd1corKpJpqLw10o1U81lEqWKjIwRoG3bkpKR2/9UVUXRUVUXaqIv/6oqXZymChgYci9QqPT - IqkIpFcwNyyThBDoUg6NA5kxWojiettP6Zna5szO5szM7m5tWtyrTKZDhYboOWTVa/Irb6aAa/+x - q7/+5K6huayiISx0PlEbD2WkKIiOlEbG1ayyaU4Tq6qebGSqyaakxKIGpEqg1cNUGqpVTEFNRTMu - MTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVV//uSZOWA41JhvkhmGNIxi2cTAAqOD1lwnkSJmsjXLdHIACZ5VVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ0KLS00NWE4MTc0MWRlZDcyNmM2NjEwNTQxZTI5ZDE2 - NzZjNS0tDQo= - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '59459' - Content-Type: - - multipart/form-data; boundary=45a81741ded726c6610541e29d1676c5 - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/audio/translations - response: - body: - string: !!binary | - H4sIAAAAAAAAA4yQzWrDMBCEX8XspZet0b9jvUGfoQSj1hvZxFkZSU4LIe9enJSeexsWZmbnu0EN - 5Qweag5cllAJEJbAcQuRwANxXOYyAcK45VDnxOB16xRCoXghrgX8+w3mEbzYb3R+ihpyBS9agUA8 - PjwIlb4reGi+JuLm7eVKzRTGhjhtcWrSqckb88yxCadKuQWEms7Ee4MV2hm0TqE6OHRCoNMKpTUd - qt6ictJgrw1KjVZYY4572WWlHOqW6feRcI3DkuKa0wf4V9E6qYSRWhpjVG+VRfhMlzVTKXPi4bF2 - dx6UEwfXW2eV7HQvETgNZSX6nIZnlmiFUL3S1pq+065zByE6fCKdiSv4U1gK3Y9/CP5J4P4DAAD/ - /wMAkWJV1Z8BAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7cb871e028d742cf-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 22 May 2023 22:20:10 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '765' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '50' - x-ratelimit-remaining-requests: - - '49' - x-ratelimit-reset-requests: - - 1.2s - x-request-id: - - 626efd8977ef036c7e125a1a1d5fbbf2 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/openai/cassettes/v0/translate_async.yaml b/tests/contrib/openai/cassettes/v0/translate_async.yaml deleted file mode 100644 index 075649c65a8..00000000000 --- a/tests/contrib/openai/cassettes/v0/translate_async.yaml +++ /dev/null @@ -1,1101 +0,0 @@ -interactions: -- request: - body: !!binary | - LS1mMTE4ZTVhNDVhNDNlYjJkMmUwMmZmOTk2YzU3MmIzYQ0KQ29udGVudC1EaXNwb3NpdGlvbjog - Zm9ybS1kYXRhOyBuYW1lPSJtb2RlbCINCg0Kd2hpc3Blci0xDQotLWYxMThlNWE0NWE0M2ViMmQy - ZTAyZmY5OTZjNTcyYjNhDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InJl - c3BvbnNlX2Zvcm1hdCINCg0KdGV4dA0KLS1mMTE4ZTVhNDVhNDNlYjJkMmUwMmZmOTk2YzU3MmIz - YQ0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJwcm9tcHQiDQoNCmFuZCB3 - aGVuIEkndmUgZ2l2ZW4gdXAsDQotLWYxMThlNWE0NWE0M2ViMmQyZTAyZmY5OTZjNTcyYjNhDQpD - b250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZpbGUiOyBmaWxlbmFtZT0iL1Vz - ZXJzL3l1bi5raW0vZ28vc3JjL2dpdGh1Yi5jb20vRGF0YURvZy9kZC10cmFjZS1weS90ZXN0cy9j - b250cmliL29wZW5haS90ZXN0X2RhdGEvZnJlbmNoX2F1ZGlvLm1wMyINCkNvbnRlbnQtVHlwZTog - YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtDQoNCklEMwQAAAAAAQpUWFhYAAAAEgAAA21ham9yX2Jy - YW5kAGlzb20AVFhYWAAAABMAAANtaW5vcl92ZXJzaW9uADUxMgBUWFhYAAAAJAAAA2NvbXBhdGli - bGVfYnJhbmRzAGlzb21pc28yYXZjMW1wNDEAVFNTRQAAAA8AAANMYXZmNTguNzYuMTAwAAAAAAAA - AAAAAAD/+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAAIwAAOVi - AAQGCgsPERMWGBweHyMlKCosMDI1Nzk9PkJERklLT1FSVlhcXV9jZWhqbHBxdXd5fH6ChIWJi4+Q - kpaYm52fo6SoqqyvsbW3uLy+wsPFycvO0NLW19vd3+Lk6Orr7/H19vj8/gAAAABMYXZjNTguMTMA - AAAAAAAAAAAAAAAkA8AAAAAAAADlYmVAGk8AAAAAAAAAAAAAAAAAAAAA//uQZAAA8vNZxckmGFAy - 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 - yknfmoAxagZJ51iSRaJRECASVPhK0u20SWj6LAKLUXhJlzkzJGEZNnznkk8tszjd5fKsjhyWVvb+ - nlnlu303DqOASZJygqWLRckvDryn1kudrH//ZEulhSHqTnH4e5LjCkQcxkOIpkwFaIxfE5AmwKUO - 0iDnCekL/SnDYJCUn/r1VYAQkBnaasAiyOHA2GqOS5yUmrH0gzYUBLpQNGpMZBj9QQEfGUgwqMzG - GagJUgzf9UmZYalqUWCmY1Xvxj9ljMxs3QpaxqW3GdYKlAVj//uSZOsD5MJhRUMMNHIvK8hjAAie - EjmFEKewy8i8K98AADZ4AR9JmDNsKgE5fDXjH1YbarGqhWqzJhRswYwoCyLAAAoA/3WyWSyX//5z - EQ+OOKko+Ix8VHrMhMVESRko+F4FEaisMwFRDL/5t6kJN/r/rBAdiEsmomkVOFzpxNScJwndXKKy - qSaai8NdKNVPNZRKlioyMEaBt25KSkdv/VFVF0VFVF2qiL/+qKl2cpgoYGHIvUKj0yKpCKRXMDcs - k4QQ6FIOjQOZMVqI4nrbT+mZ2ubMzubMzO5ubVrcq0ymQ4WG6Dlk1WvyK2+mgGv/sau//uSuobms - oiEsdD5RGw9lpCiIjpRGxtWssmlOE6uqnmxkqsmmpMSiBqRKoNXDVBqqVUxBTUUzLjEwMFVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7 - kmTlgONSYb5IZhjSMYtnEwAKjg9ZcJ5EiZrI1y3RyAAmeVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV - VVVVVVVVVVVVVVVVVVVVVVUNCi0tZjExOGU1YTQ1YTQzZWIyZDJlMDJmZjk5NmM1NzJiM2EtLQ0K - headers: - Content-Type: - - multipart/form-data; boundary=f118e5a45a43eb2d2e02ff996c572b3a - User-Agent: - - OpenAI/v1 PythonBindings/0.27.7 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.7", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.3.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 20:59:28 - PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/audio/translations - response: - body: - string: 'when I''ve had enough of running after. - - ' - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7cb871c16b6a43f2-EWR - Connection: - - keep-alive - Content-Length: - - '39' - Content-Type: - - text/plain; charset=utf-8 - Date: - - Mon, 22 May 2023 22:20:05 GMT - Server: - - cloudflare - alt-svc: - - h3=":443"; ma=86400, h3-29=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '566' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '50' - x-ratelimit-remaining-requests: - - '49' - x-ratelimit-reset-requests: - - 1.2s - x-request-id: - - 8a21546cdda864610acdbb9d9941bdf1 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/audio/translations -version: 1 diff --git a/tests/contrib/openai/conftest.py b/tests/contrib/openai/conftest.py index d25cae38e0d..64a046a37ba 100644 --- a/tests/contrib/openai/conftest.py +++ b/tests/contrib/openai/conftest.py @@ -34,7 +34,7 @@ def api_key_in_env(): @pytest.fixture def request_api_key(api_key_in_env, openai_api_key): """ - OpenAI allows both using an env var or a specified param for the API key, so this fixture specifies the API key + OpenAI allows both using an env var or client param for the API key, so this fixture specifies the API key (or None) to be used in the actual request param. If the API key is set as an env var, this should return None to make sure the env var will be used. """ @@ -70,14 +70,6 @@ def openai(openai_api_key, openai_organization, api_key_in_env): del sys.modules[m] -@pytest.fixture -def azure_openai(openai): - openai.api_type = "azure" - openai.api_version = "2023-05-15" - openai.api_base = "https://test-openai.openai.azure.com/" - yield openai - - @pytest.fixture def azure_openai_config(openai): config = { diff --git a/tests/contrib/openai/test_openai_llmobs.py b/tests/contrib/openai/test_openai_llmobs.py index bf18abd3f04..70adff39ef5 100644 --- a/tests/contrib/openai/test_openai_llmobs.py +++ b/tests/contrib/openai/test_openai_llmobs.py @@ -5,7 +5,6 @@ from ddtrace.internal.utils.version import parse_version from tests.contrib.openai.utils import chat_completion_custom_functions from tests.contrib.openai.utils import chat_completion_input_description -from tests.contrib.openai.utils import function_call_expected_output from tests.contrib.openai.utils import get_openai_vcr from tests.contrib.openai.utils import tool_call_expected_output from tests.llmobs._utils import _expected_llmobs_llm_span_event @@ -14,298 +13,6 @@ @pytest.mark.parametrize( "ddtrace_global_config", [dict(_llmobs_enabled=True, _llmobs_sample_rate=1.0, _llmobs_ml_app="")] ) -@pytest.mark.skipif(parse_version(openai_module.version.VERSION) >= (1, 0), reason="These tests are for openai < 1.0") -class TestLLMObsOpenaiV0: - def test_completion(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - """Ensure llmobs records are emitted for completion endpoints when configured. - - Also ensure the llmobs records have the correct tagging including trace/span ID for trace correlation. - """ - with get_openai_vcr(subdirectory_name="v0").use_cassette("completion.yaml"): - model = "ada" - openai.Completion.create( - model=model, prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10, user="ddtrace-test" - ) - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=model, - model_provider="openai", - input_messages=[{"content": "Hello world"}], - output_messages=[{"content": ", relax!” I said to my laptop"}, {"content": " (1"}], - metadata={"temperature": 0.8, "max_tokens": 10, "n": 2, "stop": ".", "user": "ddtrace-test"}, - token_metrics={"input_tokens": 2, "output_tokens": 12, "total_tokens": 14}, - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - def test_completion_stream(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - with get_openai_vcr(subdirectory_name="v0").use_cassette("completion_streamed.yaml"): - model = "ada" - expected_completion = '! ... A page layouts page drawer? ... Interesting. The "Tools" is' - resp = openai.Completion.create(model=model, prompt="Hello world", stream=True) - for _ in resp: - pass - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=model, - model_provider="openai", - input_messages=[{"content": "Hello world"}], - output_messages=[{"content": expected_completion}], - metadata={"stream": True}, - token_metrics={"input_tokens": 2, "output_tokens": 16, "total_tokens": 18}, - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ), - ) - - def test_chat_completion(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - """Ensure llmobs records are emitted for chat completion endpoints when configured. - - Also ensure the llmobs records have the correct tagging including trace/span ID for trace correlation. - """ - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with get_openai_vcr(subdirectory_name="v0").use_cassette("chat_completion.yaml"): - model = "gpt-3.5-turbo" - input_messages = [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Who won the world series in 2020?"}, - {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, - {"role": "user", "content": "Where was it played?"}, - ] - resp = openai.ChatCompletion.create( - model=model, messages=input_messages, top_p=0.9, n=2, user="ddtrace-test" - ) - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=resp.model, - model_provider="openai", - input_messages=input_messages, - output_messages=[{"role": "assistant", "content": choice.message.content} for choice in resp.choices], - metadata={"top_p": 0.9, "n": 2, "user": "ddtrace-test"}, - token_metrics={"input_tokens": 57, "output_tokens": 34, "total_tokens": 91}, - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - async def test_chat_completion_stream(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - """Ensure llmobs records are emitted for chat completion endpoints when configured. - - Also ensure the llmobs records have the correct tagging including trace/span ID for trace correlation. - """ - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with get_openai_vcr(subdirectory_name="v0").use_cassette("chat_completion_streamed.yaml"): - with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: - model = "gpt-3.5-turbo" - resp_model = model - input_messages = [{"role": "user", "content": "Who won the world series in 2020?"}] - mock_encoding.return_value.encode.side_effect = lambda x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - expected_completion = "The Los Angeles Dodgers won the World Series in 2020." - resp = openai.ChatCompletion.create( - model=model, messages=input_messages, stream=True, user="ddtrace-test" - ) - for chunk in resp: - resp_model = chunk.model - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=resp_model, - model_provider="openai", - input_messages=input_messages, - output_messages=[{"content": expected_completion, "role": "assistant"}], - metadata={"stream": True, "user": "ddtrace-test"}, - token_metrics={"input_tokens": 8, "output_tokens": 12, "total_tokens": 20}, - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - def test_chat_completion_function_call(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - """Test that function call chat completion calls are recorded as LLMObs events correctly.""" - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with get_openai_vcr(subdirectory_name="v0").use_cassette("chat_completion_function_call.yaml"): - model = "gpt-3.5-turbo" - resp = openai.ChatCompletion.create( - model=model, - messages=[{"role": "user", "content": chat_completion_input_description}], - functions=chat_completion_custom_functions, - function_call="auto", - user="ddtrace-test", - ) - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=resp.model, - model_provider="openai", - input_messages=[{"content": chat_completion_input_description, "role": "user"}], - output_messages=[function_call_expected_output], - metadata={"function_call": "auto", "user": "ddtrace-test"}, - token_metrics={"input_tokens": 157, "output_tokens": 57, "total_tokens": 214}, - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - def test_chat_completion_function_call_stream(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - """Test that function call chat completion calls are recorded as LLMObs events correctly.""" - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with get_openai_vcr(subdirectory_name="v0").use_cassette("chat_completion_function_call_streamed.yaml"): - with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: - model = "gpt-3.5-turbo" - resp_model = model - mock_encoding.return_value.encode.side_effect = lambda x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - resp = openai.ChatCompletion.create( - model=model, - messages=[{"role": "user", "content": chat_completion_input_description}], - functions=chat_completion_custom_functions, - function_call="auto", - stream=True, - user="ddtrace-test", - ) - for chunk in resp: - resp_model = chunk.model - - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=resp_model, - model_provider="openai", - input_messages=[{"content": chat_completion_input_description, "role": "user"}], - output_messages=[tool_call_expected_output], - metadata={"stream": True, "user": "ddtrace-test", "function_call": "auto"}, - token_metrics={"input_tokens": 63, "output_tokens": 33, "total_tokens": 96}, - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - def test_chat_completion_tool_call(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with get_openai_vcr(subdirectory_name="v0").use_cassette("chat_completion_tool_call.yaml"): - resp = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[{"role": "user", "content": chat_completion_input_description}], - tools=[{"type": "function", "function": chat_completion_custom_functions[0]}], - tool_choice="auto", - user="ddtrace-test", - ) - expected_output = { - "content": "", - "role": "assistant", - "tool_calls": [ - { - "name": "extract_student_info", - "arguments": { - "name": "David Nguyen", - "major": "computer science", - "school": "Stanford University", - "grades": 3.8, - "clubs": ["Chess Club", "South Asian Student Association"], - }, - "tool_id": "call_ukwJcJsOt7gOrv9xGRAntkZQ", - "type": "function", - } - ], - } - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=resp.model, - model_provider="openai", - input_messages=[{"content": chat_completion_input_description, "role": "user"}], - output_messages=[expected_output], - metadata={"tool_choice": "auto", "user": "ddtrace-test"}, - token_metrics={"input_tokens": 157, "output_tokens": 57, "total_tokens": 214}, - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - def test_completion_error(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - """Ensure erroneous llmobs records are emitted for completion endpoints when configured.""" - with pytest.raises(Exception): - with get_openai_vcr(subdirectory_name="v0").use_cassette("completion_error.yaml"): - model = "babbage-002" - openai.Completion.create( - model=model, - prompt="Hello world", - temperature=0.8, - n=2, - stop=".", - max_tokens=10, - user="ddtrace-test", - ) - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=model, - model_provider="openai", - input_messages=[{"content": "Hello world"}], - output_messages=[{"content": ""}], - metadata={"temperature": 0.8, "max_tokens": 10, "n": 2, "stop": ".", "user": "ddtrace-test"}, - token_metrics={}, - error="openai.error.AuthenticationError", - error_message="Incorrect API key provided: . You can find your API key at https://platform.openai.com/account/api-keys.", # noqa: E501 - error_stack=span.get_tag("error.stack"), - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - def test_chat_completion_error(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): - """Ensure erroneous llmobs records are emitted for chat completion endpoints when configured.""" - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with pytest.raises(Exception): - with get_openai_vcr(subdirectory_name="v0").use_cassette("chat_completion_error.yaml"): - model = "gpt-3.5-turbo" - input_messages = [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Who won the world series in 2020?"}, - {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, - {"role": "user", "content": "Where was it played?"}, - ] - openai.ChatCompletion.create(model=model, messages=input_messages, top_p=0.9, n=2, user="ddtrace-test") - span = mock_tracer.pop_traces()[0][0] - assert mock_llmobs_writer.enqueue.call_count == 1 - mock_llmobs_writer.enqueue.assert_called_with( - _expected_llmobs_llm_span_event( - span, - model_name=model, - model_provider="openai", - input_messages=input_messages, - output_messages=[{"content": ""}], - metadata={"top_p": 0.9, "n": 2, "user": "ddtrace-test"}, - token_metrics={}, - error="openai.error.AuthenticationError", - error_message="Incorrect API key provided: . You can find your API key at https://platform.openai.com/account/api-keys.", # noqa: E501 - error_stack=span.get_tag("error.stack"), - tags={"ml_app": "", "service": "tests.contrib.openai"}, - ) - ) - - -@pytest.mark.parametrize( - "ddtrace_global_config", [dict(_llmobs_enabled=True, _llmobs_sample_rate=1.0, _llmobs_ml_app="")] -) -@pytest.mark.skipif(parse_version(openai_module.version.VERSION) < (1, 0), reason="These tests are for openai >= 1.0") class TestLLMObsOpenaiV1: def test_completion(self, openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): """Ensure llmobs records are emitted for completion endpoints when configured. diff --git a/tests/contrib/openai/test_openai_v0.py b/tests/contrib/openai/test_openai_v0.py deleted file mode 100644 index 0a618b4bffc..00000000000 --- a/tests/contrib/openai/test_openai_v0.py +++ /dev/null @@ -1,1874 +0,0 @@ -from io import BytesIO -import os -from typing import AsyncGenerator -from typing import Generator - -import mock -import openai as openai_module -from PIL import Image -import pytest - -import ddtrace -from ddtrace.contrib.internal.openai.utils import _est_tokens -from ddtrace.internal.utils.version import parse_version -from tests.contrib.openai.utils import chat_completion_custom_functions -from tests.contrib.openai.utils import chat_completion_input_description -from tests.contrib.openai.utils import get_openai_vcr -from tests.utils import override_global_config -from tests.utils import snapshot_context - - -TIKTOKEN_AVAILABLE = os.getenv("TIKTOKEN_AVAILABLE", False) -pytestmark = pytest.mark.skipif( - parse_version(openai_module.version.VERSION) >= (1, 0), reason="This module only tests openai < 1.0" -) - - -@pytest.fixture(scope="session") -def openai_vcr(): - yield get_openai_vcr(subdirectory_name="v0") - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(metrics_enabled=True), dict(metrics_enabled=False)]) -def test_config(ddtrace_config_openai, mock_tracer, openai): - # Ensure that the module state is reloaded for each test run - assert not hasattr(openai, "_test") - openai._test = 1 - - # Ensure overriding the config works - assert ddtrace.config.openai.metrics_enabled is ddtrace_config_openai["metrics_enabled"] - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_model_list(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): - with snapshot_context( - token="tests.contrib.openai.test_openai.test_model_list", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("model_list.yaml"): - openai.Model.list(api_key=request_api_key, user="ddtrace-test") - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_model_alist(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): - with snapshot_context( - token="tests.contrib.openai.test_openai.test_model_list", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("model_list_async.yaml"): - await openai.Model.alist(api_key=request_api_key, user="ddtrace-test") - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_model_retrieve(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): - with snapshot_context( - token="tests.contrib.openai.test_openai.test_model_retrieve", - ignores=["meta.http.useragent", "meta.openai.base_url", "meta.openai.response.created"], - ): - with openai_vcr.use_cassette("model_retrieve.yaml"): - openai.Model.retrieve("curie", api_key=request_api_key, user="ddtrace-test") - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_model_aretrieve(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): - with snapshot_context( - token="tests.contrib.openai.test_openai.test_model_retrieve", - ignores=["meta.http.useragent", "meta.openai.base_url", "meta.openai.response.created"], - ): - with openai_vcr.use_cassette("model_retrieve_async.yaml"): - await openai.Model.aretrieve("curie", api_key=request_api_key, user="ddtrace-test") - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_completion( - api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, mock_logs, mock_llmobs_writer, snapshot_tracer -): - with snapshot_context( - token="tests.contrib.openai.test_openai.test_completion", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("completion.yaml"): - resp = openai.Completion.create( - api_key=request_api_key, - model="ada", - prompt="Hello world", - temperature=0.8, - n=2, - stop=".", - max_tokens=10, - user="ddtrace-test", - ) - - assert resp["object"] == "text_completion" - assert resp["model"] == "ada" - assert resp["choices"] == [ - {"finish_reason": "length", "index": 0, "logprobs": None, "text": ", relax!” I said to my laptop"}, - {"finish_reason": "stop", "index": 1, "logprobs": None, "text": " (1"}, - ] - - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:ada", - "model:ada", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [ - mock.call.distribution("tokens.prompt", 2, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.completion", 12, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.total", 14, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("request.duration", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.tokens", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.tokens", mock.ANY, tags=expected_tags), - ], - any_order=True, - ) - mock_logs.start.assert_not_called() - mock_logs.enqueue.assert_not_called() - mock_llmobs_writer.start.assert_not_called() - mock_llmobs_writer.enqueue.assert_not_called() - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_acompletion( - api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, mock_logs, mock_llmobs_writer, snapshot_tracer -): - with snapshot_context( - token="tests.contrib.openai.test_openai.test_acompletion", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("completion_async.yaml"): - resp = await openai.Completion.acreate( - api_key=request_api_key, - model="curie", - prompt="As Descartes said, I think, therefore", - temperature=0.8, - n=1, - max_tokens=150, - user="ddtrace-test", - ) - assert resp["object"] == "text_completion" - assert resp["choices"] == [ - { - "finish_reason": "length", - "index": 0, - "logprobs": None, - "text": " I am; and I am in a sense a non-human entity woven together from " - "memories, desires and emotions. But, who is to say that I am not an " - "artificial intelligence. The brain is a self-organising, " - "self-aware, virtual reality computer … so how is it, who exactly is " - "it, this thing that thinks, feels, loves and believes? Are we not " - "just software running on hardware?\n" - "\n" - "Recently, I have come to take a more holistic view of my identity, " - "not as a series of fleeting moments, but as a long-term, ongoing " - "process. The key question for me is not that of ‘who am I?’ but " - "rather, ‘how am I?’ – a question", - } - ] - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:curie", - "model:curie", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [ - mock.call.distribution("tokens.prompt", 10, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.completion", 150, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.total", 160, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("request.duration", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.tokens", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.tokens", mock.ANY, tags=expected_tags), - ], - any_order=True, - ) - mock_logs.start.assert_not_called() - mock_logs.enqueue.assert_not_called() - mock_llmobs_writer.start.assert_not_called() - mock_llmobs_writer.enqueue.assert_not_called() - - -@pytest.mark.xfail(reason="An API key is required when logs are enabled") -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True)]) -def test_logs_no_api_key(openai, ddtrace_config_openai, mock_tracer): - """When no DD_API_KEY is set, the patching fails""" - pass - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_completions(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for completion endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - with openai_vcr.use_cassette("completion.yaml"): - openai.Completion.create( - model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10, user="ddtrace-test" - ) - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "tests.contrib.openai", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/completions,openai.request.method:POST,openai.request.model:ada,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "prompt": "Hello world", - "choices": mock.ANY, - } - ), - ] - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_global_tags(openai_vcr, ddtrace_config_openai, openai, mock_metrics, mock_logs, mock_tracer): - """ - When the global config UST tags are set - The service name should be used for all data - The env should be used for all data - The version should be used for all data - - All data should also be tagged with the same OpenAI data. - """ - with override_global_config(dict(service="test-svc", env="staging", version="1234")): - with openai_vcr.use_cassette("completion.yaml"): - openai.Completion.create( - model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10, user="ddtrace-test" - ) - - span = mock_tracer.pop_traces()[0][0] - assert span.service == "test-svc" - assert span.get_tag("env") == "staging" - assert span.get_tag("version") == "1234" - assert span.get_tag("openai.request.model") == "ada" - assert span.get_tag("openai.request.endpoint") == "/v1/completions" - assert span.get_tag("openai.request.method") == "POST" - assert span.get_tag("openai.organization.name") == "datadog-4" - assert span.get_tag("openai.user.api_key") == "sk-...key>" - - for _, _args, kwargs in mock_metrics.mock_calls: - expected_metrics = [ - "service:test-svc", - "env:staging", - "version:1234", - "openai.request.model:ada", - "model:ada", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - ] - actual_tags = kwargs.get("tags") - for m in expected_metrics: - assert m in actual_tags - - for call, args, _kwargs in mock_logs.mock_calls: - if call != "enqueue": - continue - log = args[0] - assert log["service"] == "test-svc" - assert ( - log["ddtags"] - == "env:staging,version:1234,openai.request.endpoint:/v1/completions,openai.request.method:POST,openai.request.model:ada,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>" # noqa: E501 - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_chat_completion(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_chat_completion", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("chat_completion.yaml"): - openai.ChatCompletion.create( - api_key=request_api_key, - model="gpt-3.5-turbo", - messages=[ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Who won the world series in 2020?"}, - {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, - {"role": "user", "content": "Where was it played?"}, - ], - top_p=0.9, - n=2, - user="ddtrace-test", - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_chat_completion_function_calling", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_chat_completion_function_calling(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with openai_vcr.use_cassette("chat_completion_function_call.yaml"): - openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[{"role": "user", "content": chat_completion_input_description}], - functions=chat_completion_custom_functions, - function_call="auto", - user="ddtrace-test", - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_chat_completion_function_calling", - ignores=["meta.http.useragent", "meta.openai.base_url", "meta.openai.response.choices.0.finish_reason"], -) -def test_chat_completion_tool_calling(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with openai_vcr.use_cassette("chat_completion_tool_call.yaml"): - openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[{"role": "user", "content": chat_completion_input_description}], - tools=[{"type": "function", "function": chat_completion_custom_functions[0]}], - tool_choice="auto", - user="ddtrace-test", - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_chat_completion_image_input", - ignores=[ - "meta.http.useragent", - "meta.openai.base_url", - ], -) -def test_chat_completion_image_input(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - image_url = ( - "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk" - ".jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" - ) - with openai_vcr.use_cassette("chat_completion_image_input.yaml"): - openai.ChatCompletion.create( - model="gpt-4-vision-preview", - messages=[ - { - "role": "user", - "content": [ - {"type": "text", "text": "What’s in this image?"}, - { - "type": "image_url", - "image_url": image_url, - }, - ], - } - ], - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(metrics_enabled=b) for b in [True, False]]) -def test_enable_metrics(openai, openai_vcr, ddtrace_config_openai, mock_metrics, mock_tracer): - """Ensure the metrics_enabled configuration works.""" - with openai_vcr.use_cassette("completion.yaml"): - openai.Completion.create( - model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10, user="ddtrace-test" - ) - if ddtrace_config_openai["metrics_enabled"]: - assert mock_metrics.mock_calls - else: - assert not mock_metrics.mock_calls - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_achat_completion(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_chat_completion", - ignores=["meta.http.useragent", "meta.openai.base_url", "meta._dd.p.tid"], - ): - with openai_vcr.use_cassette("chat_completion_async.yaml"): - await openai.ChatCompletion.acreate( - api_key=request_api_key, - model="gpt-3.5-turbo", - messages=[ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "Who won the world series in 2020?"}, - {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, - {"role": "user", "content": "Where was it played?"}, - ], - top_p=0.9, - n=2, - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_image_create(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_image_create", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("image_create.yaml"): - openai.Image.create( - api_key=request_api_key, - prompt="sleepy capybara with monkey on top", - n=1, - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_image_acreate(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_image_create", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("image_create_async.yaml"): - await openai.Image.acreate( - api_key=request_api_key, - prompt="sleepy capybara with monkey on top", - n=1, - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_image_create(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for image endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with openai_vcr.use_cassette("image_create.yaml"): - openai.Image.create( - prompt="sleepy capybara with monkey on top", - n=1, - size="256x256", - response_format="url", - user="ddtrace-test", - ) - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "tests.contrib.openai", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/images/generations,openai.request.method:POST,openai.request.model:dall-e,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "prompt": "sleepy capybara with monkey on top", - "choices": mock.ANY, - } - ), - ] - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_image_edit(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_image_edit", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("image_edit.yaml"): - openai.Image.create_edit( - image=open(os.path.join(os.path.dirname(__file__), "test_data/image.png"), "rb"), - mask=open(os.path.join(os.path.dirname(__file__), "test_data/mask.png"), "rb"), - api_key=request_api_key, - n=1, - prompt="A sunlit indoor lounge area with a pool containing a flamingo", - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_image_aedit(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_image_edit", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("image_edit_async.yaml"): - await openai.Image.acreate_edit( - image=open(os.path.join(os.path.dirname(__file__), "test_data/image.png"), "rb"), - mask=open(os.path.join(os.path.dirname(__file__), "test_data/mask.png"), "rb"), - api_key=request_api_key, - n=1, - prompt="A sunlit indoor lounge area with a pool containing a flamingo", - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_image_edit(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for image endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with openai_vcr.use_cassette("image_edit.yaml"): - openai.Image.create_edit( - image=open(os.path.join(os.path.dirname(__file__), "test_data/image.png"), "rb"), - mask=open(os.path.join(os.path.dirname(__file__), "test_data/mask.png"), "rb"), - n=1, - prompt="A sunlit indoor lounge area with a pool containing a flamingo", - size="256x256", - response_format="url", - user="ddtrace-test", - ) - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "tests.contrib.openai", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/images/edits,openai.request.method:POST,openai.request.model:dall-e,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "prompt": "A sunlit indoor lounge area with a pool containing a flamingo", - "image": "image.png", - "mask": "mask.png", - "choices": mock.ANY, - } - ), - ] - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_image_variation(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_image_variation", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("image_variation.yaml"): - openai.Image.create_variation( - image=open(os.path.join(os.path.dirname(__file__), "test_data/image.png"), "rb"), - api_key=request_api_key, - n=1, - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_image_avariation(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_image_variation", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("image_variation_async.yaml"): - await openai.Image.acreate_variation( - image=open(os.path.join(os.path.dirname(__file__), "test_data/image.png"), "rb"), - api_key=request_api_key, - n=1, - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_image_variation(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for image endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with openai_vcr.use_cassette("image_variation.yaml"): - openai.Image.create_variation( - image=open(os.path.join(os.path.dirname(__file__), "test_data/image.png"), "rb"), - n=1, - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "tests.contrib.openai", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/images/variations,openai.request.method:POST,openai.request.model:dall-e,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "image": "image.png", - "choices": mock.ANY, - } - ), - ] - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_image_edit_binary_input", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_image_edit_binary_input(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - image = Image.open(os.path.join(os.path.dirname(__file__), "test_data/image.png")) - image_arr = BytesIO() - image.save(image_arr, format="PNG") - with openai_vcr.use_cassette("image_edit.yaml"): - openai.Image.create_edit( - image=image_arr.getvalue(), - n=1, - prompt="A sunlit indoor lounge area with a pool containing a flamingo", - size="256x256", - response_format="url", - user="ddtrace-test", - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_image_b64_json_response", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_image_b64_json_response(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Image"): - pytest.skip("image not supported for this version of openai") - with openai_vcr.use_cassette("image_create_b64_json.yaml"): - openai.Image.create( - prompt="sleepy capybara with monkey on top", - n=1, - size="256x256", - response_format="b64_json", - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_embedding(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Embedding"): - pytest.skip("embedding not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_embedding", ignores=["meta.http.useragent", "meta.openai.base_url"] - ): - with openai_vcr.use_cassette("embedding.yaml"): - openai.Embedding.create( - api_key=request_api_key, input="hello world", model="text-embedding-ada-002", user="ddtrace-test" - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_embedding_string_array", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_embedding_string_array(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Embedding"): - pytest.skip("embedding not supported for this version of openai") - with openai_vcr.use_cassette("embedding_string_array.yaml"): - openai.Embedding.create( - input=["hello world", "hello again"], model="text-embedding-ada-002", user="ddtrace-test" - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_embedding_token_array", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_embedding_token_array(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Embedding"): - pytest.skip("embedding not supported for this version of openai") - with openai_vcr.use_cassette("embedding_token_array.yaml"): - openai.Embedding.create(input=[1111, 2222, 3333], model="text-embedding-ada-002", user="ddtrace-test") - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_embedding_array_of_token_arrays", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_embedding_array_of_token_arrays(openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Embedding"): - pytest.skip("embedding not supported for this version of openai") - with openai_vcr.use_cassette("embedding_array_of_token_arrays.yaml"): - openai.Embedding.create( - input=[[1111, 2222, 3333], [4444, 5555, 6666], [7777, 8888, 9999]], - model="text-embedding-ada-002", - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_aembedding(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Embedding"): - pytest.skip("embedding not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_embedding", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("embedding_async.yaml"): - await openai.Embedding.acreate( - api_key=request_api_key, input="hello world", model="text-embedding-ada-002", user="ddtrace-test" - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_transcribe(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Audio"): - pytest.skip("audio not supported for this version of openai") - if api_key_in_env is False and parse_version(openai.version.VERSION) < (0, 27, 3): - pytest.skip("API keys could not be supplied in the request before openai==0.27.3") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_transcribe", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("transcribe.yaml"): - openai.Audio.transcribe( - api_key=request_api_key, - file=open(os.path.join(os.path.dirname(__file__), "test_data/english_audio.mp3"), "rb"), - model="whisper-1", - response_format="verbose_json", - prompt="what's that over there?", - temperature=0.3, - language="en", - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_atranscribe(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Audio"): - pytest.skip("audio not supported for this version of openai") - if api_key_in_env is False and parse_version(openai.version.VERSION) < (0, 27, 3): - pytest.skip("API keys could not be supplied in the request before openai==0.27.3") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_atranscribe", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("transcribe_async.yaml"): - await openai.Audio.atranscribe( - api_key=request_api_key, - file=open(os.path.join(os.path.dirname(__file__), "test_data/english_audio.mp3"), "rb"), - model="whisper-1", - response_format="text", - prompt="what's that over there?", - temperature=0.7, - language="en", - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_transcribe(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for audio endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - if not hasattr(openai, "Audio"): - pytest.skip("audio not supported for this version of openai") - with openai_vcr.use_cassette("transcribe.yaml"): - openai.Audio.transcribe( - file=open(os.path.join(os.path.dirname(__file__), "test_data/english_audio.mp3"), "rb"), - model="whisper-1", - response_format="verbose_json", - prompt="what's that over there?", - temperature=0.3, - language="en", - user="ddtrace-test", - ) - - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/audio/transcriptions,openai.request.method:POST,openai.request.model:whisper-1,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "file": "english_audio.mp3", - "prompt": "what's that over there?", - "language": "en", - "text": mock.ANY, - } - ), - ] - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_translate(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Audio"): - pytest.skip("audio not supported for this version of openai") - if api_key_in_env is False and parse_version(openai.version.VERSION) < (0, 27, 3): - pytest.skip("API keys could not be supplied in the request before openai==0.27.3") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_translate", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("translate.yaml"): - openai.Audio.translate( - api_key=request_api_key, - file=open(os.path.join(os.path.dirname(__file__), "test_data/french_audio.mp3"), "rb"), - model="whisper-1", - response_format="verbose_json", - prompt="and when I've given up,", - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_atranslate(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Audio"): - pytest.skip("audio not supported for this version of openai") - if api_key_in_env is False and parse_version(openai.version.VERSION) < (0, 27, 3): - pytest.skip("API keys could not be supplied in the request before openai==0.27.3") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_atranslate", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("translate_async.yaml"): - await openai.Audio.atranslate( - api_key=request_api_key, - file=open(os.path.join(os.path.dirname(__file__), "test_data/french_audio.mp3"), "rb"), - model="whisper-1", - response_format="text", - prompt="and when I've given up,", - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_translate(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for audio endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - if not hasattr(openai, "Audio"): - pytest.skip("audio not supported for this version of openai") - with openai_vcr.use_cassette("translate.yaml"): - openai.Audio.translate( - file=open(os.path.join(os.path.dirname(__file__), "test_data/french_audio.mp3"), "rb"), - model="whisper-1", - response_format="verbose_json", - prompt="and when I've given up,", - user="ddtrace-test", - ) - - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/audio/translations,openai.request.method:POST,openai.request.model:whisper-1,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "file": "french_audio.mp3", - "prompt": "and when I've given up,", - "language": "", - "text": mock.ANY, - } - ), - ] - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_file_list(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_list", ignores=["meta.http.useragent", "meta.openai.base_url"] - ): - with openai_vcr.use_cassette("file_list.yaml"): - openai.File.list(api_key=request_api_key, user="ddtrace-test") - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_file_alist(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_list", ignores=["meta.http.useragent", "meta.openai.base_url"] - ): - with openai_vcr.use_cassette("file_list_async.yaml"): - await openai.File.alist(api_key=request_api_key, user="ddtrace-test") - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_file_create(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_create", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("file_create.yaml"): - openai.File.create( - api_key=request_api_key, - file=open(os.path.join(os.path.dirname(__file__), "test_data/training_data.jsonl"), "rb"), - purpose="fine-tune", - user_provided_filename="dummy_training_file.jsonl", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_file_acreate(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_create", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("file_create_async.yaml"): - await openai.File.acreate( - api_key=request_api_key, - file=open(os.path.join(os.path.dirname(__file__), "test_data/training_data.jsonl"), "rb"), - purpose="fine-tune", - user_provided_filename="dummy_training_file.jsonl", - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_file_delete(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_delete", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("file_delete.yaml"): - openai.File.delete( - sid="file-l48KgWVF75Tz2HLqLrcUdBPi", - api_key=request_api_key, - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_file_adelete(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_delete", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("file_delete_async.yaml"): - await openai.File.adelete( - sid="file-l48KgWVF75Tz2HLqLrcUdBPi", - api_key=request_api_key, - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_file_retrieve(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_retrieve", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("file_retrieve.yaml"): - openai.File.retrieve( - id="file-Aeh42OWPtbWgt7gfUjXBVFAF", - api_key=request_api_key, - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_file_aretrieve(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_retrieve", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("file_retrieve_async.yaml"): - await openai.File.aretrieve( - id="file-Aeh42OWPtbWgt7gfUjXBVFAF", - api_key=request_api_key, - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_file_download(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_download", - ignores=["meta.http.useragent", "meta.openai.base_url", "meta.openai.organization.name"], - ): - with openai_vcr.use_cassette("file_download.yaml"): - openai.File.download( - "file-xC22NUuYBkXvzRt2fLREcGde", - api_key=request_api_key, - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_file_adownload(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "File"): - pytest.skip("file not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_file_download", - ignores=[ - "meta.http.useragent", - "metrics.openai.response.total_bytes", - "meta.openai.base_url", - "meta.openai.organization.name", - ], - ): - # mock vcrpy stream response does not have `total_bytes` attribute - with openai_vcr.use_cassette("file_download_async.yaml"): - await openai.File.adownload( - "file-xC22NUuYBkXvzRt2fLREcGde", - api_key=request_api_key, - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_model_delete(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Model"): - pytest.skip("model not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_model_delete", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("model_delete.yaml"): - openai.Model.delete( - sid="babbage:ft-datadog:dummy-fine-tune-model-2023-06-01-23-15-52", - api_key=request_api_key, - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_model_adelete(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Model"): - pytest.skip("model not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_model_delete", - ignores=["meta.http.useragent", "meta.openai.base_url"], - ): - with openai_vcr.use_cassette("model_delete_async.yaml"): - await openai.Model.adelete( - sid="babbage:ft-datadog:dummy-fine-tune-model-2023-06-01-23-15-52", - api_key=request_api_key, - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_create_moderation(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Moderation"): - pytest.skip("moderation not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_create_moderation", - ignores=["meta.http.useragent", "meta.openai.base_url", "meta.openai.response.id"], - ): - with openai_vcr.use_cassette("moderation.yaml"): - openai.Moderation.create( - api_key=request_api_key, - input="i want to kill them.", - model="text-moderation-latest", - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_acreate_moderation(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): - if not hasattr(openai, "Moderation"): - pytest.skip("moderation not supported for this version of openai") - with snapshot_context( - token="tests.contrib.openai.test_openai.test_create_moderation", - ignores=["meta.http.useragent", "meta.openai.base_url", "meta.openai.response.id"], - ): - with openai_vcr.use_cassette("moderation_async.yaml"): - await openai.Moderation.acreate( - api_key=request_api_key, - input="i want to kill them.", - model="text-moderation-latest", - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_misuse", - ignores=["meta.http.useragent", "meta.error.stack", "meta.openai.base_url"], -) -def test_misuse(openai, snapshot_tracer): - with pytest.raises(openai.InvalidRequestError): - openai.Completion.create(input="wrong arg") - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_span_finish_on_stream_error", - ignores=["meta.http.useragent", "meta.error.stack", "meta.openai.base_url"], -) -def test_span_finish_on_stream_error(openai, openai_vcr, snapshot_tracer): - with openai_vcr.use_cassette("completion_stream_wrong_api_key.yaml"): - with pytest.raises(openai.error.AuthenticationError): - openai.Completion.create( - api_key="sk-wrong-api-key", - model="text-curie-001", - prompt="how does openai tokenize prompts?", - temperature=0.8, - n=1, - max_tokens=150, - stream=True, - ) - - -def test_completion_stream(openai, openai_vcr, mock_metrics, mock_tracer): - with openai_vcr.use_cassette("completion_streamed.yaml"): - with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: - mock_encoding.return_value.encode.side_effect = lambda x: [1, 2] - expected_completion = '! ... A page layouts page drawer? ... Interesting. The "Tools" is' - resp = openai.Completion.create(model="ada", prompt="Hello world", stream=True) - assert isinstance(resp, Generator) - chunks = [c for c in resp] - - completion = "".join([c["choices"][0]["text"] for c in chunks]) - assert completion == expected_completion - - traces = mock_tracer.pop_traces() - assert len(traces) == 1 - assert len(traces[0]) == 1 - assert traces[0][0].get_tag("openai.response.choices.0.text") == expected_completion - assert traces[0][0].get_tag("openai.response.choices.0.finish_reason") == "length" - - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:ada", - "model:ada", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - "openai.estimated:true", - ] - if TIKTOKEN_AVAILABLE: - prompt_expected_tags = expected_tags[:-1] - else: - prompt_expected_tags = expected_tags - assert mock.call.distribution("tokens.prompt", 2, tags=prompt_expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.completion", len(chunks), tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.total", len(chunks) + 2, tags=expected_tags) in mock_metrics.mock_calls - - -@pytest.mark.asyncio -async def test_completion_async_stream(openai, openai_vcr, mock_metrics, mock_tracer): - with openai_vcr.use_cassette("completion_async_streamed.yaml"): - with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: - mock_encoding.return_value.encode.side_effect = lambda x: [1, 2] - expected_completion = "\" and just start creating stuff. Don't expect it to draw like this." - resp = await openai.Completion.acreate(model="ada", prompt="Hello world", stream=True) - assert isinstance(resp, AsyncGenerator) - chunks = [c async for c in resp] - - completion = "".join([c["choices"][0]["text"] for c in chunks]) - assert completion == expected_completion - - traces = mock_tracer.pop_traces() - assert len(traces) == 1 - assert traces[0][0].get_tag("openai.response.choices.0.text") == expected_completion - assert traces[0][0].get_tag("openai.response.choices.0.finish_reason") == "length" - - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:ada", - "model:ada", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - "openai.estimated:true", - ] - if TIKTOKEN_AVAILABLE: - expected_tags = expected_tags[:-1] - assert mock.call.distribution("tokens.prompt", 2, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.completion", 15, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.total", 17, tags=expected_tags) in mock_metrics.mock_calls - - -def test_chat_completion_stream(openai, openai_vcr, mock_metrics, snapshot_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - - with openai_vcr.use_cassette("chat_completion_streamed.yaml"): - with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: - mock_encoding.return_value.encode.side_effect = lambda x: [1, 2, 3, 4, 5, 6, 7, 8] - expected_completion = "The Los Angeles Dodgers won the World Series in 2020." - resp = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[ - {"role": "user", "content": "Who won the world series in 2020?"}, - ], - stream=True, - user="ddtrace-test", - ) - prompt_tokens = 8 - span = snapshot_tracer.current_span() - chunks = [c for c in resp] - assert len(chunks) == 15 - completion = "".join([c["choices"][0]["delta"].get("content", "") for c in chunks]) - assert completion == expected_completion - - assert span.get_tag("openai.response.choices.0.message.content") == expected_completion - assert span.get_tag("openai.response.choices.0.message.role") == "assistant" - assert span.get_tag("openai.response.choices.0.finish_reason") == "stop" - - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:gpt-3.5-turbo", - "model:gpt-3.5-turbo", - "openai.request.endpoint:/v1/chat/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - ] - assert mock.call.distribution("request.duration", span.duration_ns, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.requests", 3, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.remaining.requests", 2, tags=expected_tags) in mock_metrics.mock_calls - expected_tags += ["openai.estimated:true"] - if TIKTOKEN_AVAILABLE: - expected_tags = expected_tags[:-1] - assert mock.call.distribution("tokens.prompt", prompt_tokens, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.completion", 12, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.total", 12 + prompt_tokens, tags=expected_tags) in mock_metrics.mock_calls - - -@pytest.mark.asyncio -async def test_chat_completion_async_stream(openai, openai_vcr, mock_metrics, snapshot_tracer): - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with openai_vcr.use_cassette("chat_completion_streamed_async.yaml"): - with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: - mock_encoding.return_value.encode.side_effect = lambda x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - expected_completion = "As an AI language model, I do not have access to real-time information but as of the 2021 season, the captain of the Toronto Maple Leafs is John Tavares." # noqa: E501 - resp = await openai.ChatCompletion.acreate( - model="gpt-3.5-turbo", - messages=[ - {"role": "user", "content": "Who is the captain of the toronto maple leafs?"}, - ], - stream=True, - user="ddtrace-test", - ) - prompt_tokens = 10 - span = snapshot_tracer.current_span() - chunks = [c async for c in resp] - assert len(chunks) == 39 - completion = "".join([c["choices"][0]["delta"].get("content", "") for c in chunks]) - assert completion == expected_completion - - assert span.get_tag("openai.response.choices.0.message.content") == expected_completion[:128] + "..." - assert span.get_tag("openai.response.choices.0.message.role") == "assistant" - assert span.get_tag("openai.response.choices.0.finish_reason") == "stop" - - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:gpt-3.5-turbo", - "model:gpt-3.5-turbo", - "openai.request.endpoint:/v1/chat/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - ] - assert mock.call.distribution("request.duration", span.duration_ns, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.requests", 3500, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.tokens", 90000, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.remaining.requests", 3499, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.remaining.tokens", 89971, tags=expected_tags) in mock_metrics.mock_calls - expected_tags += ["openai.estimated:true"] - if TIKTOKEN_AVAILABLE: - expected_tags = expected_tags[:-1] - assert mock.call.distribution("tokens.prompt", prompt_tokens, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.completion", 35, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.total", 35 + prompt_tokens, tags=expected_tags) in mock_metrics.mock_calls - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_integration_sync", ignores=["meta.http.useragent"], async_mode=False -) -def test_integration_sync(openai_api_key, ddtrace_run_python_code_in_subprocess): - """OpenAI uses requests for its synchronous requests. - - Running in a subprocess with ddtrace-run should produce traces - with both OpenAI and requests spans. - """ - env = os.environ.copy() - pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] - if "PYTHONPATH" in env: - pypath.append(env["PYTHONPATH"]) - env.update( - { - "OPENAI_API_KEY": openai_api_key, - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_OPENAI_METRICS_ENABLED": "false", - } - ) - out, err, status, pid = ddtrace_run_python_code_in_subprocess( - """ -import openai -import ddtrace -from tests.contrib.openai.conftest import FilterOrg -from tests.contrib.openai.test_openai_v0 import get_openai_vcr -pin = ddtrace.trace.Pin.get_from(openai) -pin.tracer._configure(trace_processors=[FilterOrg()]) -with get_openai_vcr(subdirectory_name="v0").use_cassette("completion.yaml"): - resp = openai.Completion.create(model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10) -""", - env=env, - ) - assert status == 0, err - assert out == b"" - assert err == b"" - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_integration_async", - ignores=[ - "meta.http.useragent", - "meta.openai.base_url", - "metrics.openai.response.usage.total_tokens", - "metrics.openai.response.usage.prompt_tokens", - "metrics.openai.response.usage.completion_tokens", - ], - async_mode=False, -) -def test_integration_async(openai_api_key, ddtrace_run_python_code_in_subprocess): - """OpenAI uses requests for its synchronous requests. - - Running in a subprocess with ddtrace-run should produce traces - with both OpenAI and requests spans. - - FIXME: there _should_ be aiohttp spans generated for this test case. There aren't - because the patching VCR does into aiohttp interferes with the tracing patching. - """ - env = os.environ.copy() - pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] - if "PYTHONPATH" in env: - pypath.append(env["PYTHONPATH"]) - env.update( - { - "OPENAI_API_KEY": openai_api_key, - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_OPENAI_METRICS_ENABLED": "false", - } - ) - out, err, status, pid = ddtrace_run_python_code_in_subprocess( - """ -import asyncio -import openai -import ddtrace -from tests.contrib.openai.conftest import FilterOrg -from tests.contrib.openai.test_openai_v0 import get_openai_vcr -pin = ddtrace.trace.Pin.get_from(openai) -pin.tracer._configure(trace_processors=[FilterOrg()]) -async def task(): - with get_openai_vcr(subdirectory_name="v0").use_cassette("completion_async.yaml"): - resp = await openai.Completion.acreate( - model="curie", - prompt="As Descartes said, I think, therefore", - temperature=0.8, - n=1, - max_tokens=150, - user="ddtrace-test" - ) - -asyncio.run(task()) -""", - env=env, - ) - assert status == 0, err - assert out == b"" - assert err == b"" - - -@pytest.mark.parametrize( - "ddtrace_config_openai", - [dict(span_prompt_completion_sample_rate=r) for r in [0, 0.25, 0.75, 1]], -) -def test_completion_sample(openai, openai_vcr, ddtrace_config_openai, mock_tracer): - """Test functionality for DD_OPENAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE for completions endpoint""" - num_completions = 200 - - for _ in range(num_completions): - with openai_vcr.use_cassette("completion_sample_rate.yaml"): - openai.Completion.create(model="ada", prompt="hello world") - - traces = mock_tracer.pop_traces() - sampled = 0 - assert len(traces) == num_completions, len(traces) - for trace in traces: - for span in trace: - if span.get_tag("openai.response.choices.0.text"): - sampled += 1 - if ddtrace.config.openai.span_prompt_completion_sample_rate == 0: - assert sampled == 0 - elif ddtrace.config.openai.span_prompt_completion_sample_rate == 1: - assert sampled == num_completions - else: - # this should be good enough for our purposes - rate = ddtrace.config.openai["span_prompt_completion_sample_rate"] * num_completions - assert (rate - 30) < sampled < (rate + 30) - - -@pytest.mark.parametrize( - "ddtrace_config_openai", - [dict(span_prompt_completion_sample_rate=r) for r in [0, 0.25, 0.75, 1]], -) -def test_chat_completion_sample(openai, openai_vcr, ddtrace_config_openai, mock_tracer): - """Test functionality for DD_OPENAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE for chat completions endpoint""" - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - num_completions = 200 - - for _ in range(num_completions): - with openai_vcr.use_cassette("chat_completion_sample_rate.yaml"): - openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[ - {"role": "user", "content": "what is your name?"}, - ], - ) - - traces = mock_tracer.pop_traces() - sampled = 0 - assert len(traces) == num_completions - for trace in traces: - for span in trace: - if span.get_tag("openai.response.choices.0.message.content"): - sampled += 1 - if ddtrace.config.openai["span_prompt_completion_sample_rate"] == 0: - assert sampled == 0 - elif ddtrace.config.openai["span_prompt_completion_sample_rate"] == 1: - assert sampled == num_completions - else: - # this should be good enough for our purposes - rate = ddtrace.config.openai["span_prompt_completion_sample_rate"] * num_completions - assert (rate - 30) < sampled < (rate + 30) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(truncation_threshold=t) for t in [0, 10, 10000]]) -def test_completion_truncation(openai, openai_vcr, mock_tracer): - """Test functionality of DD_OPENAI_TRUNCATION_THRESHOLD for completions""" - if not hasattr(openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - - prompt = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10" - - with openai_vcr.use_cassette("completion_truncation.yaml"): - openai.Completion.create(model="ada", prompt=prompt) - - with openai_vcr.use_cassette("chat_completion_truncation.yaml"): - resp = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[ - {"role": "user", "content": "Count from 1 to 100"}, - ], - ) - assert resp["choices"] == [ - { - "finish_reason": "stop", - "index": 0, - "message": { - "content": "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, " - "16, 17, 18, 19, 20,\n" - "21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, " - "34, 35, 36, 37, 38, 39, 40,\n" - "41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, " - "54, 55, 56, 57, 58, 59, 60,\n" - "61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, " - "74, 75, 76, 77, 78, 79, 80,\n" - "81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, " - "94, 95, 96, 97, 98, 99, 100.", - "role": "assistant", - }, - } - ] - - traces = mock_tracer.pop_traces() - assert len(traces) == 2 - - limit = ddtrace.config.openai["span_char_limit"] - for trace in traces: - for span in trace: - if span.get_tag("openai.request.endpoint").endswith("/chat/completions"): - prompt = span.get_tag("openai.request.messages.0.content") - completion = span.get_tag("openai.response.choices.0.message.content") - assert len(prompt) <= limit + 3 - assert len(completion) <= limit + 3 - if "..." in prompt: - assert len(prompt.replace("...", "")) == limit - if "..." in completion: - assert len(completion.replace("...", "")) == limit - else: - prompt = span.get_tag("openai.request.prompt.0") - completion = span.get_tag("openai.response.choices.0.text") - # +3 for the ellipsis - assert len(prompt) <= limit + 3 - assert len(completion) <= limit + 3 - if "..." in prompt: - assert len(prompt.replace("...", "")) == limit - if "..." in completion: - assert len(completion.replace("...", "")) == limit - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(span_prompt_completion_sample_rate=0)]) -def test_embedding_unsampled_prompt_completion(openai, openai_vcr, ddtrace_config_openai, mock_logs, mock_tracer): - if not hasattr(openai, "Embedding"): - pytest.skip("embedding not supported for this version of openai") - with openai_vcr.use_cassette("embedding.yaml"): - openai.Embedding.create(input="hello world", model="text-embedding-ada-002") - logs = mock_logs.enqueue.call_count - traces = mock_tracer.pop_traces() - assert len(traces) == 1 - assert traces[0][0].get_tag("openai.request.input") is None - assert logs == 0 - - -@pytest.mark.parametrize( - "ddtrace_config_openai", - [dict(logs_enabled=True, log_prompt_completion_sample_rate=r) for r in [0, 0.25, 0.75, 1]], -) -def test_logs_sample_rate(openai, openai_vcr, ddtrace_config_openai, mock_logs, mock_tracer): - total_calls = 200 - for _ in range(total_calls): - with openai_vcr.use_cassette("completion.yaml"): - openai.Completion.create(model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10) - - logs = mock_logs.enqueue.call_count - if ddtrace.config.openai["log_prompt_completion_sample_rate"] == 0: - assert logs == 0 - elif ddtrace.config.openai["log_prompt_completion_sample_rate"] == 1: - assert logs == total_calls - else: - rate = ddtrace.config.openai["log_prompt_completion_sample_rate"] * total_calls - assert (rate - 30) < logs < (rate + 30) - - -def test_est_tokens(): - """Oracle numbers are from https://platform.openai.com/tokenizer (GPT-3).""" - assert _est_tokens("") == 0 # oracle: 1 - assert _est_tokens("hello") == 1 # oracle: 1 - assert _est_tokens("hello, world") == 3 # oracle: 3 - assert _est_tokens("hello world") == 2 # oracle: 2 - assert _est_tokens("Hello world, how are you?") == 6 # oracle: 7 - assert _est_tokens(" hello ") == 3 # oracle: 8 - assert ( - _est_tokens( - "The GPT family of models process text using tokens, which are common sequences of characters found in text. The models understand the statistical relationships between these tokens, and excel at producing the next token in a sequence of tokens." # noqa E501 - ) - == 54 - ) # oracle: 44 - assert ( - _est_tokens( - "You can use the tool below to understand how a piece of text would be tokenized by the API, and the total count of tokens in that piece of text." # noqa: E501 - ) - == 33 - ) # oracle: 33 - assert ( - _est_tokens( - "A helpful rule of thumb is that one token generally corresponds to ~4 characters of text for common " - "English text. This translates to roughly ¾ of a word (so 100 tokens ~= 75 words). If you need a " - "programmatic interface for tokenizing text, check out our tiktoken package for Python. For JavaScript, " - "the gpt-3-encoder package for node.js works for most GPT-3 models." - ) - == 83 - ) # oracle: 87 - - # Expected to be a disparity since our assumption is based on english words - assert ( - _est_tokens( - """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec hendrerit sapien eu erat imperdiet, in - maximus elit malesuada. Pellentesque quis gravida purus. Nullam eu eros vitae dui placerat viverra quis a magna. Mauris - vitae lorem quis neque pharetra congue. Praesent volutpat dui eget nibh auctor, sit amet elementum velit faucibus. - Nullam ultricies dolor sit amet nisl molestie, a porta metus suscipit. Vivamus eget luctus mauris. Proin commodo - elementum ex a pretium. Nam vitae ipsum sed dolor congue fermentum. Sed quis bibendum sapien, dictum venenatis urna. - Morbi molestie lacinia iaculis. Proin lorem mauris, interdum eget lectus a, auctor volutpat nisl. Suspendisse ac - tincidunt sapien. Cras congue ipsum sit amet congue ullamcorper. Proin hendrerit at erat vulputate consequat.""" - ) - == 175 - ) # oracle 281 - - assert ( - _est_tokens( - "I want you to act as a linux terminal. I will type commands and you will reply with what the terminal should show. I want you to only reply with the terminal output inside one unique code block, and nothing else. do not write explanations. do not type commands unless I instruct you to do so. When I need to tell you something in English, I will do so by putting text inside curly brackets {like this}. My first command is pwd" # noqa: E501 - ) - == 97 - ) # oracle: 92 - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_azure_openai_completion", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_azure_openai_completion(openai_api_key, azure_openai, openai_vcr, snapshot_tracer): - with openai_vcr.use_cassette("azure_completion.yaml"): - azure_openai.Completion.create( - api_key=openai_api_key, - engine="gpt-35-turbo", - prompt="why do some languages have words that can't directly be translated to other languages?", - temperature=0, - n=1, - max_tokens=20, - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_azure_openai_completion", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -async def test_azure_openai_acompletion(openai_api_key, azure_openai, openai_vcr, snapshot_tracer): - with openai_vcr.use_cassette("azure_completion_async.yaml"): - await azure_openai.Completion.acreate( - api_key=openai_api_key, - engine="gpt-35-turbo", - prompt="why do some languages have words that can't directly be translated to other languages?", - temperature=0, - n=1, - max_tokens=20, - user="ddtrace-test", - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_azure_openai_chat_completion", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_azure_openai_chat_completion(openai_api_key, azure_openai, openai_vcr, snapshot_tracer): - if not hasattr(azure_openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with openai_vcr.use_cassette("azure_chat_completion.yaml"): - azure_openai.ChatCompletion.create( - api_key=openai_api_key, - engine="gpt-35-turbo", - messages=[{"role": "user", "content": "What's the weather like in NYC right now?"}], - temperature=0, - n=1, - max_tokens=20, - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_azure_openai_chat_completion", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -async def test_azure_openai_chat_acompletion(openai_api_key, azure_openai, openai_vcr, snapshot_tracer): - if not hasattr(azure_openai, "ChatCompletion"): - pytest.skip("ChatCompletion not supported for this version of openai") - with openai_vcr.use_cassette("azure_chat_completion_async.yaml"): - await azure_openai.ChatCompletion.acreate( - api_key=openai_api_key, - engine="gpt-35-turbo", - messages=[{"role": "user", "content": "What's the weather like in NYC right now?"}], - temperature=0, - n=1, - max_tokens=20, - user="ddtrace-test", - ) - - -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_azure_openai_embedding", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -def test_azure_openai_embedding(openai_api_key, azure_openai, openai_vcr, snapshot_tracer): - with openai_vcr.use_cassette("azure_embedding.yaml"): - azure_openai.Embedding.create( - api_key=openai_api_key, - engine="text-embedding-ada-002", - input="Hello world", - temperature=0, - user="ddtrace-test", - ) - - -@pytest.mark.asyncio -@pytest.mark.snapshot( - token="tests.contrib.openai.test_openai.test_azure_openai_embedding", - ignores=["meta.http.useragent", "meta.openai.base_url"], -) -async def test_azure_openai_aembedding(openai_api_key, azure_openai, openai_vcr, snapshot_tracer): - with openai_vcr.use_cassette("azure_embedding_async.yaml"): - await azure_openai.Embedding.acreate( - api_key=openai_api_key, - engine="text-embedding-ada-002", - input="Hello world", - temperature=0, - user="ddtrace-test", - ) - - -@pytest.mark.parametrize("schema_version", [None, "v0", "v1"]) -@pytest.mark.parametrize("service_name", [None, "mysvc"]) -def test_integration_service_name(openai_api_key, ddtrace_run_python_code_in_subprocess, schema_version, service_name): - env = os.environ.copy() - pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] - if "PYTHONPATH" in env: - pypath.append(env["PYTHONPATH"]) - env.update( - { - "OPENAI_API_KEY": openai_api_key, - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_OPENAI_METRICS_ENABLED": "false", - } - ) - if schema_version: - env["DD_TRACE_SPAN_ATTRIBUTE_SCHEMA"] = schema_version - if service_name: - env["DD_SERVICE"] = service_name - with snapshot_context( - token="tests.contrib.openai.test_openai_v0.test_integration_service_name[%s-%s]" - % (service_name, schema_version), - ignores=["meta.http.useragent", "meta.openai.base_url"], - async_mode=False, - ): - out, err, status, pid = ddtrace_run_python_code_in_subprocess( - """ -import openai -import ddtrace -from tests.contrib.openai.conftest import FilterOrg -from tests.contrib.openai.test_openai_v0 import get_openai_vcr -pin = ddtrace.trace.Pin.get_from(openai) -pin.tracer._configure(trace_processors=[FilterOrg()]) -with get_openai_vcr(subdirectory_name="v0").use_cassette("completion.yaml"): - resp = openai.Completion.create(model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10) - """, - env=env, - ) - assert status == 0, err - assert out == b"" - assert err == b"" From 8ff2ecb35779ce428570d0268a90903c1c1ecf18 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 29 Jan 2025 14:19:31 -0500 Subject: [PATCH 08/63] docs: update trace filter docs (#12147) Resolves: https://github.com/DataDog/dd-trace-py/issues/12141 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- docs/advanced_usage.rst | 8 ++------ docs/troubleshooting.rst | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst index 05879acac37..64e0095abb1 100644 --- a/docs/advanced_usage.rst +++ b/docs/advanced_usage.rst @@ -342,11 +342,7 @@ all traces of incoming requests to a specific url:: return None return trace - tracer.configure(settings={ - 'FILTERS': [ - FilterbyName(), - ], - }) + tracer.configure(trace_processors=[FilterbyName()]) The filters in the filters list will be applied sequentially to each trace and the resulting trace will either be sent to the Agent or discarded. @@ -367,7 +363,7 @@ the pipeline or ``None`` if the trace should be discarded:: ... # And then configure it with - tracer.configure(settings={'FILTERS': [FilterExample()]}) + tracer.configure(trace_processors=[FilterExample()]) (see filters.py for other example implementations) diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 04bd56d0ba9..f471b6433b5 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -91,7 +91,7 @@ While this is default behavior for integrations, users can add a trace filter to return trace - tracer.configure(settings={'FILTERS': [ErrorFilter()]}) + tracer.configure(trace_processors=[ErrorFilter()]) From 89fa5e58661b798865c6a7000562ae291926e373 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 29 Jan 2025 15:19:37 -0500 Subject: [PATCH 09/63] chore(integrations): avoids using deprecated apis in ``ddtrace.patch(....)`` [3.0] (#12107) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensures every integration defines their `patch`, `unpatch`, and/or `get_versions()` function in `ddtrace/contrib/internal/integration_name/patch.py`. This allows the `ddtrace.patch(...)` to load integrations from one well defined location. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Vítor De Araújo --- ddtrace/_monkey.py | 31 +++++++++---------- ddtrace/appsec/_iast/_patch_modules.py | 8 ++--- ddtrace/contrib/cherrypy/__init__.py | 4 +-- ddtrace/contrib/flask_cache/__init__.py | 4 +-- ddtrace/contrib/internal/aioredis/patch.py | 4 +-- ddtrace/contrib/internal/cassandra/patch.py | 12 ------- .../cherrypy/{middleware.py => patch.py} | 0 ddtrace/contrib/internal/fastapi/patch.py | 2 +- .../flask_cache/{tracers.py => patch.py} | 0 ddtrace/contrib/internal/pytest/_plugin_v2.py | 2 +- ddtrace/contrib/internal/redis/patch.py | 4 +-- ddtrace/llmobs/_llmobs.py | 2 +- docs/contributing-integrations.rst | 3 +- ...ns-have-patch-module-ef2ced613d1f777a.yaml | 4 +++ tests/contrib/asyncio/test_tracer.py | 2 +- tests/contrib/cherrypy/test_middleware.py | 8 ++--- tests/contrib/flask_cache/test.py | 4 +-- tests/contrib/flask_cache/test_utils.py | 2 +- .../flask_cache/test_wrapper_safety.py | 4 +-- .../contrib/langgraph/test_langgraph_patch.py | 6 ++-- tests/tracer/test_monkey.py | 4 +-- 21 files changed, 48 insertions(+), 62 deletions(-) rename ddtrace/contrib/internal/cherrypy/{middleware.py => patch.py} (100%) rename ddtrace/contrib/internal/flask_cache/{tracers.py => patch.py} (100%) create mode 100644 releasenotes/notes/ensure-all-integrations-have-patch-module-ef2ced613d1f777a.yaml diff --git a/ddtrace/_monkey.py b/ddtrace/_monkey.py index 8ede9f49ca4..03417fe0d0f 100644 --- a/ddtrace/_monkey.py +++ b/ddtrace/_monkey.py @@ -157,9 +157,6 @@ } -DEFAULT_MODULES_PREFIX = "ddtrace.contrib" - - class PatchException(Exception): """Wraps regular `Exception` class when patching modules""" @@ -170,19 +167,14 @@ class ModuleNotFoundException(PatchException): pass -def _on_import_factory(module, prefix="ddtrace.contrib", raise_errors=True, patch_indicator=True): +def _on_import_factory(module, path_f, raise_errors=True, patch_indicator=True): # type: (str, str, bool, Union[bool, List[str]]) -> Callable[[Any], None] """Factory to create an import hook for the provided module name""" def on_import(hook): # Import and patch module try: - try: - imported_module = importlib.import_module("%s.internal.%s.patch" % (prefix, module)) - except ImportError: - # Some integrations do not have an internal patch module, so we use the public one - # FIXME: This is a temporary solution until we refactor the patching logic. - imported_module = importlib.import_module("%s.%s" % (prefix, module)) + imported_module = importlib.import_module(path_f % (module,)) imported_module.patch() if hasattr(imported_module, "patch_submodules"): imported_module.patch_submodules(patch_indicator) @@ -209,7 +201,7 @@ def on_import(hook): name, True, PATCH_MODULES.get(module) is True, "", version=v ) elif hasattr(imported_module, "get_version"): - # TODO: Ensure every integration defines either get_version or get_versions in their patch.py module + # Some integrations/iast patchers do not define get_version version = imported_module.get_version() telemetry.telemetry_writer.add_integration( module, True, PATCH_MODULES.get(module) is True, "", version=version @@ -258,8 +250,8 @@ def patch_all(**patch_modules): load_common_appsec_modules() -def patch(raise_errors=True, patch_modules_prefix=DEFAULT_MODULES_PREFIX, **patch_modules): - # type: (bool, str, Union[List[str], bool]) -> None +def patch(raise_errors=True, **patch_modules): + # type: (bool, Union[List[str], bool]) -> None """Patch only a set of given modules. :param bool raise_errors: Raise error if one patch fail. @@ -270,17 +262,22 @@ def patch(raise_errors=True, patch_modules_prefix=DEFAULT_MODULES_PREFIX, **patc contribs = {c: patch_indicator for c, patch_indicator in patch_modules.items() if patch_indicator} for contrib, patch_indicator in contribs.items(): # Check if we have the requested contrib. - if not os.path.isfile(os.path.join(os.path.dirname(__file__), "contrib", contrib, "__init__.py")): + if not os.path.isfile(os.path.join(os.path.dirname(__file__), "contrib", "internal", contrib, "patch.py")): if raise_errors: raise ModuleNotFoundException( - "integration module ddtrace.contrib.%s does not exist, " - "module will not have tracing available" % contrib + "integration module ddtrace.contrib.internal.%s.patch does not exist, " + "automatic instrumentation is disabled for this library" % contrib ) modules_to_patch = _MODULES_FOR_CONTRIB.get(contrib, (contrib,)) for module in modules_to_patch: # Use factory to create handler to close over `module` and `raise_errors` values from this loop when_imported(module)( - _on_import_factory(contrib, raise_errors=raise_errors, patch_indicator=patch_indicator) + _on_import_factory( + contrib, + "ddtrace.contrib.internal.%s.patch", + raise_errors=raise_errors, + patch_indicator=patch_indicator, + ) ) # manually add module to patched modules diff --git a/ddtrace/appsec/_iast/_patch_modules.py b/ddtrace/appsec/_iast/_patch_modules.py index 7ae1b0986fb..e91438ebd49 100644 --- a/ddtrace/appsec/_iast/_patch_modules.py +++ b/ddtrace/appsec/_iast/_patch_modules.py @@ -19,10 +19,6 @@ def patch_iast(patch_modules=IAST_PATCH): from ddtrace._monkey import _on_import_factory for module in (m for m, e in patch_modules.items() if e): - when_imported("hashlib")( - _on_import_factory(module, prefix="ddtrace.appsec._iast.taint_sinks", raise_errors=False) - ) + when_imported("hashlib")(_on_import_factory(module, "ddtrace.appsec._iast.taint_sinks.%s", raise_errors=False)) - when_imported("json")( - _on_import_factory("json_tainting", prefix="ddtrace.appsec._iast._patches", raise_errors=False) - ) + when_imported("json")(_on_import_factory("json_tainting", "ddtrace.appsec._iast._patches.%s", raise_errors=False)) diff --git a/ddtrace/contrib/cherrypy/__init__.py b/ddtrace/contrib/cherrypy/__init__.py index b8fbd426e00..0ae66d24918 100644 --- a/ddtrace/contrib/cherrypy/__init__.py +++ b/ddtrace/contrib/cherrypy/__init__.py @@ -54,8 +54,8 @@ def index(self): """ -from ddtrace.contrib.internal.cherrypy.middleware import TraceMiddleware -from ddtrace.contrib.internal.cherrypy.middleware import get_version # noqa: F401 +from ddtrace.contrib.internal.cherrypy.patch import TraceMiddleware +from ddtrace.contrib.internal.cherrypy.patch import get_version # noqa: F401 from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning from ddtrace.vendor.debtcollector import deprecate diff --git a/ddtrace/contrib/flask_cache/__init__.py b/ddtrace/contrib/flask_cache/__init__.py index ae6fcf003db..d35ab94f6e6 100644 --- a/ddtrace/contrib/flask_cache/__init__.py +++ b/ddtrace/contrib/flask_cache/__init__.py @@ -45,8 +45,8 @@ def counter(): """ -from ddtrace.contrib.internal.flask_cache.tracers import get_traced_cache -from ddtrace.contrib.internal.flask_cache.tracers import get_version # noqa: F401 +from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache +from ddtrace.contrib.internal.flask_cache.patch import get_version # noqa: F401 from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning from ddtrace.vendor.debtcollector import deprecate diff --git a/ddtrace/contrib/internal/aioredis/patch.py b/ddtrace/contrib/internal/aioredis/patch.py index 62b8ec9f80c..78342aa162a 100644 --- a/ddtrace/contrib/internal/aioredis/patch.py +++ b/ddtrace/contrib/internal/aioredis/patch.py @@ -12,9 +12,9 @@ from ddtrace.constants import _SPAN_MEASURED_KEY from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils +from ddtrace.contrib.internal.redis_utils import ROW_RETURNING_COMMANDS from ddtrace.contrib.internal.redis_utils import _run_redis_command_async -from ddtrace.contrib.redis_utils import ROW_RETURNING_COMMANDS -from ddtrace.contrib.redis_utils import determine_row_count +from ddtrace.contrib.internal.redis_utils import determine_row_count from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes from ddtrace.ext import db diff --git a/ddtrace/contrib/internal/cassandra/patch.py b/ddtrace/contrib/internal/cassandra/patch.py index ad375683633..3632e6943b1 100644 --- a/ddtrace/contrib/internal/cassandra/patch.py +++ b/ddtrace/contrib/internal/cassandra/patch.py @@ -1,14 +1,2 @@ -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - from .session import patch # noqa: F401 from .session import unpatch # noqa: F401 - - -deprecate( - ("%s is deprecated" % (__name__)), - message="Avoid using this package directly. " - "Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to enable and configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", -) diff --git a/ddtrace/contrib/internal/cherrypy/middleware.py b/ddtrace/contrib/internal/cherrypy/patch.py similarity index 100% rename from ddtrace/contrib/internal/cherrypy/middleware.py rename to ddtrace/contrib/internal/cherrypy/patch.py diff --git a/ddtrace/contrib/internal/fastapi/patch.py b/ddtrace/contrib/internal/fastapi/patch.py index 485c0424a5f..c79baefc59d 100644 --- a/ddtrace/contrib/internal/fastapi/patch.py +++ b/ddtrace/contrib/internal/fastapi/patch.py @@ -10,7 +10,7 @@ from ddtrace.contrib.internal.asgi.middleware import TraceMiddleware from ddtrace.contrib.internal.starlette.patch import _trace_background_tasks from ddtrace.contrib.internal.starlette.patch import traced_handler -from ddtrace.contrib.starlette.patch import traced_route_init +from ddtrace.contrib.internal.starlette.patch import traced_route_init from ddtrace.internal.logger import get_logger from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.utils.wrappers import unwrap as _u diff --git a/ddtrace/contrib/internal/flask_cache/tracers.py b/ddtrace/contrib/internal/flask_cache/patch.py similarity index 100% rename from ddtrace/contrib/internal/flask_cache/tracers.py rename to ddtrace/contrib/internal/flask_cache/patch.py diff --git a/ddtrace/contrib/internal/pytest/_plugin_v2.py b/ddtrace/contrib/internal/pytest/_plugin_v2.py index ece2098e05e..0b25af62e51 100644 --- a/ddtrace/contrib/internal/pytest/_plugin_v2.py +++ b/ddtrace/contrib/internal/pytest/_plugin_v2.py @@ -7,9 +7,9 @@ from ddtrace import DDTraceDeprecationWarning from ddtrace import config as dd_config from ddtrace._monkey import patch -from ddtrace.contrib.coverage import patch as patch_coverage from ddtrace.contrib.internal.coverage.constants import PCT_COVERED_KEY from ddtrace.contrib.internal.coverage.data import _coverage_data +from ddtrace.contrib.internal.coverage.patch import patch as patch_coverage from ddtrace.contrib.internal.coverage.patch import run_coverage_report from ddtrace.contrib.internal.coverage.utils import _is_coverage_invoked_by_coverage_run from ddtrace.contrib.internal.coverage.utils import _is_coverage_patched diff --git a/ddtrace/contrib/internal/redis/patch.py b/ddtrace/contrib/internal/redis/patch.py index 28beeb4d979..78d0ceaf22a 100644 --- a/ddtrace/contrib/internal/redis/patch.py +++ b/ddtrace/contrib/internal/redis/patch.py @@ -6,9 +6,9 @@ from ddtrace import config from ddtrace._trace.utils_redis import _instrument_redis_cmd from ddtrace._trace.utils_redis import _instrument_redis_execute_pipeline +from ddtrace.contrib.internal.redis_utils import ROW_RETURNING_COMMANDS +from ddtrace.contrib.internal.redis_utils import determine_row_count from ddtrace.contrib.internal.trace_utils import unwrap -from ddtrace.contrib.redis_utils import ROW_RETURNING_COMMANDS -from ddtrace.contrib.redis_utils import determine_row_count from ddtrace.internal import core from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.utils.formats import CMD_MAX_LEN diff --git a/ddtrace/llmobs/_llmobs.py b/ddtrace/llmobs/_llmobs.py index 91fd7959b50..d8b73bd014d 100644 --- a/ddtrace/llmobs/_llmobs.py +++ b/ddtrace/llmobs/_llmobs.py @@ -483,7 +483,7 @@ def _patch_integrations() -> None: integrations_to_patch.update( {k: asbool(v) for k, v in dd_patch_modules_to_str.items() if k in SUPPORTED_LLMOBS_INTEGRATIONS.values()} ) - patch(**integrations_to_patch) # type: ignore[arg-type] + patch(**integrations_to_patch) log.debug("Patched LLM integrations: %s", list(SUPPORTED_LLMOBS_INTEGRATIONS.values())) @classmethod diff --git a/docs/contributing-integrations.rst b/docs/contributing-integrations.rst index 0dab68b5053..3ae93789809 100644 --- a/docs/contributing-integrations.rst +++ b/docs/contributing-integrations.rst @@ -211,7 +211,8 @@ What does a complete PR look like when adding a new integration? The following is the check list for ensuring you have all of the components to have a complete PR that is ready for review. -- Patch code for your new integration under ``ddtrace/contrib/your_integration_name``. +- Define `patch` and `unpatch` functions for your new integration under ``ddtrace/contrib/internal/your_integration_name``. +- Document your integration in a ``ddtrace/contrib/_integration_name.py`` module and reference the doc string in ``docs/integrations.rst``. - Test code for the above in ``tests/contrib/your_integration_name``. - The virtual environment configurations for your tests in ``riotfile.py``. - The Circle CI configurations for your tests in ``.circleci/config.templ.yml``. diff --git a/releasenotes/notes/ensure-all-integrations-have-patch-module-ef2ced613d1f777a.yaml b/releasenotes/notes/ensure-all-integrations-have-patch-module-ef2ced613d1f777a.yaml new file mode 100644 index 00000000000..da5c951017a --- /dev/null +++ b/releasenotes/notes/ensure-all-integrations-have-patch-module-ef2ced613d1f777a.yaml @@ -0,0 +1,4 @@ +--- +other: + - | + cassandra,cherrypy,flask_cache,starlette: Ensures a deprecation warning is not raised when patching these integrations via ``ddtrace-run`` and ``import ddtrace.auto``. diff --git a/tests/contrib/asyncio/test_tracer.py b/tests/contrib/asyncio/test_tracer.py index e7aaa94d903..cb474786b72 100644 --- a/tests/contrib/asyncio/test_tracer.py +++ b/tests/contrib/asyncio/test_tracer.py @@ -4,7 +4,7 @@ import pytest from ddtrace.constants import ERROR_MSG -from ddtrace.contrib.asyncio.compat import asyncio_current_task +from ddtrace.contrib.internal.asyncio.compat import asyncio_current_task from ddtrace.contrib.internal.asyncio.patch import patch from ddtrace.contrib.internal.asyncio.patch import unpatch diff --git a/tests/contrib/cherrypy/test_middleware.py b/tests/contrib/cherrypy/test_middleware.py index 9bc4a600136..41b5e4fec32 100644 --- a/tests/contrib/cherrypy/test_middleware.py +++ b/tests/contrib/cherrypy/test_middleware.py @@ -15,7 +15,7 @@ from ddtrace.constants import ERROR_MSG from ddtrace.constants import ERROR_STACK from ddtrace.constants import ERROR_TYPE -from ddtrace.contrib.internal.cherrypy.middleware import TraceMiddleware +from ddtrace.contrib.internal.cherrypy.patch import TraceMiddleware from ddtrace.ext import http from tests.contrib.patch import emit_integration_and_version_to_test_agent from tests.utils import TracerTestCase @@ -55,7 +55,7 @@ def setUp(self): ) def test_and_emit_get_version(self): - from ddtrace.contrib.internal.cherrypy.middleware import get_version + from ddtrace.contrib.internal.cherrypy.patch import get_version version = get_version() assert type(version) == str @@ -543,7 +543,7 @@ def test_service_name_schema(ddtrace_run_python_code_in_subprocess, schema_versi from cherrypy.test import helper from tests.utils import TracerTestCase from tests.contrib.cherrypy.web import StubApp -from ddtrace.contrib.internal.cherrypy.middleware import TraceMiddleware +from ddtrace.contrib.internal.cherrypy.patch import TraceMiddleware class TestCherrypy(TracerTestCase, helper.CPWebCase): @staticmethod def setup_server(): @@ -602,7 +602,7 @@ def test_operation_name_schema(ddtrace_run_python_code_in_subprocess, schema_ver from cherrypy.test import helper from tests.utils import TracerTestCase from tests.contrib.cherrypy.web import StubApp -from ddtrace.contrib.internal.cherrypy.middleware import TraceMiddleware +from ddtrace.contrib.internal.cherrypy.patch import TraceMiddleware class TestCherrypy(TracerTestCase, helper.CPWebCase): @staticmethod def setup_server(): diff --git a/tests/contrib/flask_cache/test.py b/tests/contrib/flask_cache/test.py index b7be36a10eb..25ed861dbe2 100644 --- a/tests/contrib/flask_cache/test.py +++ b/tests/contrib/flask_cache/test.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from flask import Flask -from ddtrace.contrib.internal.flask_cache.tracers import CACHE_BACKEND -from ddtrace.contrib.internal.flask_cache.tracers import get_traced_cache +from ddtrace.contrib.internal.flask_cache.patch import CACHE_BACKEND +from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache from ddtrace.ext import net from ddtrace.internal.schema import DEFAULT_SPAN_SERVICE_NAME from tests.opentracer.utils import init_tracer diff --git a/tests/contrib/flask_cache/test_utils.py b/tests/contrib/flask_cache/test_utils.py index 7d7e200cd9f..aa4d529c05f 100644 --- a/tests/contrib/flask_cache/test_utils.py +++ b/tests/contrib/flask_cache/test_utils.py @@ -3,7 +3,7 @@ from flask import Flask from ddtrace._trace.tracer import Tracer -from ddtrace.contrib.internal.flask_cache.tracers import get_traced_cache +from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache from ddtrace.contrib.internal.flask_cache.utils import _extract_client from ddtrace.contrib.internal.flask_cache.utils import _extract_conn_tags from ddtrace.contrib.internal.flask_cache.utils import _resource_from_cache_prefix diff --git a/tests/contrib/flask_cache/test_wrapper_safety.py b/tests/contrib/flask_cache/test_wrapper_safety.py index 0b98e1e2557..d144b9ddc83 100644 --- a/tests/contrib/flask_cache/test_wrapper_safety.py +++ b/tests/contrib/flask_cache/test_wrapper_safety.py @@ -3,8 +3,8 @@ import pytest from redis.exceptions import ConnectionError -from ddtrace.contrib.internal.flask_cache.tracers import CACHE_BACKEND -from ddtrace.contrib.internal.flask_cache.tracers import get_traced_cache +from ddtrace.contrib.internal.flask_cache.patch import CACHE_BACKEND +from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache from ddtrace.ext import net from tests.utils import TracerTestCase diff --git a/tests/contrib/langgraph/test_langgraph_patch.py b/tests/contrib/langgraph/test_langgraph_patch.py index 5e57cbb3f63..5326ef0f4b0 100644 --- a/tests/contrib/langgraph/test_langgraph_patch.py +++ b/tests/contrib/langgraph/test_langgraph_patch.py @@ -2,9 +2,9 @@ import sys from tempfile import NamedTemporaryFile -from ddtrace.contrib.langgraph import get_version -from ddtrace.contrib.langgraph import patch -from ddtrace.contrib.langgraph import unpatch +from ddtrace.contrib.internal.langgraph.patch import get_version +from ddtrace.contrib.internal.langgraph.patch import patch +from ddtrace.contrib.internal.langgraph.patch import unpatch from tests.contrib.patch import PatchTestCase from tests.utils import call_program diff --git a/tests/tracer/test_monkey.py b/tests/tracer/test_monkey.py index 9b6f1ee86a6..d4eb1522176 100644 --- a/tests/tracer/test_monkey.py +++ b/tests/tracer/test_monkey.py @@ -38,8 +38,8 @@ def test_patch_raise_exception_manual_patch(self): _monkey.patch(module_dne=True) assert ( - "integration module ddtrace.contrib.module_dne does not exist, module will not have tracing available" - in str(me.exception) + "integration module ddtrace.contrib.internal.module_dne.patch does not exist, " + "automatic instrumentation is disabled for this library" in str(me.exception) ) assert "module_dne" not in _monkey._PATCHED_MODULES From 3f47ad72318ded5ae239c756a1a2b5e11ec3a42b Mon Sep 17 00:00:00 2001 From: kyle Date: Wed, 29 Jan 2025 15:22:51 -0500 Subject: [PATCH 10/63] chore(llmobs): remove deprecated env var support (#12106) [](https://datadoghq.atlassian.net/browse/MLOB-2094) --- ddtrace/llmobs/_llmobs.py | 3 --- .../notes/llmobs-app-name-73519e6ce588cdfd.yaml | 4 ++++ tests/llmobs/test_llmobs_service.py | 14 -------------- 3 files changed, 4 insertions(+), 17 deletions(-) create mode 100644 releasenotes/notes/llmobs-app-name-73519e6ce588cdfd.yaml diff --git a/ddtrace/llmobs/_llmobs.py b/ddtrace/llmobs/_llmobs.py index d8b73bd014d..acb214b019d 100644 --- a/ddtrace/llmobs/_llmobs.py +++ b/ddtrace/llmobs/_llmobs.py @@ -321,9 +321,6 @@ def enable( config._dd_api_key = api_key or config._dd_api_key config.env = env or config.env config.service = service or config.service - if os.getenv("DD_LLMOBS_APP_NAME"): - log.warning("`DD_LLMOBS_APP_NAME` is deprecated. Use `DD_LLMOBS_ML_APP` instead.") - config._llmobs_ml_app = ml_app or os.getenv("DD_LLMOBS_APP_NAME") config._llmobs_ml_app = ml_app or config._llmobs_ml_app # validate required values for LLMObs diff --git a/releasenotes/notes/llmobs-app-name-73519e6ce588cdfd.yaml b/releasenotes/notes/llmobs-app-name-73519e6ce588cdfd.yaml new file mode 100644 index 00000000000..b0509f70fb9 --- /dev/null +++ b/releasenotes/notes/llmobs-app-name-73519e6ce588cdfd.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + LLM Observability: support for the deprecated environment variable ``DD_LLMOBS_APP_NAME`` has been removed. diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py index deac267fac0..c43bee68ae2 100644 --- a/tests/llmobs/test_llmobs_service.py +++ b/tests/llmobs/test_llmobs_service.py @@ -110,20 +110,6 @@ def test_service_enable_no_ml_app_specified(): assert llmobs_service._instance._evaluator_runner.status.value == "stopped" -def test_service_enable_deprecated_ml_app_name(monkeypatch, mock_llmobs_logs): - with override_global_config(dict(_dd_api_key="", _llmobs_ml_app="")): - dummy_tracer = DummyTracer() - monkeypatch.setenv("DD_LLMOBS_APP_NAME", "test_ml_app") - llmobs_service.enable(_tracer=dummy_tracer) - assert llmobs_service.enabled is True - assert llmobs_service._instance._llmobs_eval_metric_writer.status.value == "running" - assert llmobs_service._instance._llmobs_span_writer.status.value == "running" - mock_llmobs_logs.warning.assert_called_once_with( - "`DD_LLMOBS_APP_NAME` is deprecated. Use `DD_LLMOBS_ML_APP` instead." - ) - llmobs_service.disable() - - def test_service_enable_already_enabled(mock_llmobs_logs): with override_global_config(dict(_dd_api_key="", _llmobs_ml_app="")): dummy_tracer = DummyTracer() From c8ac4da77c8db28dd57ba3b8958372d4f273c71e Mon Sep 17 00:00:00 2001 From: Sam Brenner <106700075+sabrenner@users.noreply.github.com> Date: Wed, 29 Jan 2025 15:57:47 -0500 Subject: [PATCH 11/63] chore(langchain): drop support for tracing v0.0.x (#12130) This PR officially drops tracing support for LangChain's 0.0.x release line. If a user tries to use `ddtrace` with `langchain< 0.1`, then we'll log a warning and stop patching to avoid hard crashing. This PR removes testing for v0.0.x, and removes patching for v0.0.x methods. Follow-ups for further cleanup: - resolve patching partner libraries and sub modules - re-enabling langchain>0.1 tests - refactoring patching further into handlers for different operations (llms, chat models, tools, vectorstores, embeddings) if possible MLOB-2092 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: kyle --- .riot/requirements/16c3b9f.txt | 84 -- .riot/requirements/585e779.txt | 82 -- .riot/requirements/d39d3de.txt | 84 -- ddtrace/contrib/internal/langchain/patch.py | 249 ++-- docs/index.rst | 2 +- ...in-drop-v0.0-support-745a0572da799e4e.yaml | 4 + riotfile.py | 11 - tests/contrib/langchain/test_langchain.py | 1073 ----------------- .../contrib/langchain/test_langchain_patch.py | 155 +-- 9 files changed, 173 insertions(+), 1571 deletions(-) delete mode 100644 .riot/requirements/16c3b9f.txt delete mode 100644 .riot/requirements/585e779.txt delete mode 100644 .riot/requirements/d39d3de.txt create mode 100644 releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml delete mode 100644 tests/contrib/langchain/test_langchain.py diff --git a/.riot/requirements/16c3b9f.txt b/.riot/requirements/16c3b9f.txt deleted file mode 100644 index ac3ccd42fa3..00000000000 --- a/.riot/requirements/16c3b9f.txt +++ /dev/null @@ -1,84 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --allow-unsafe --no-annotate .riot/requirements/16c3b9f.in -# -ai21==3.0.1 -ai21-tokenizer==0.12.0 -aiohappyeyeballs==2.4.4 -aiohttp==3.11.10 -aiosignal==1.3.1 -anyio==4.7.0 -async-timeout==4.0.3 -attrs==24.2.0 -backoff==2.2.1 -certifi==2024.8.30 -charset-normalizer==3.4.0 -cohere==4.57 -coverage[toml]==7.6.9 -dataclasses-json==0.5.14 -dnspython==2.7.0 -exceptiongroup==1.2.2 -fastavro==1.9.7 -filelock==3.16.1 -frozenlist==1.5.0 -fsspec==2024.10.0 -greenlet==3.0.3 -h11==0.14.0 -httpcore==1.0.7 -httpx==0.27.2 -huggingface-hub==0.26.5 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.11.0 -iniconfig==2.0.0 -jsonpatch==1.33 -jsonpointer==3.0.0 -langchain==0.0.192 -langchain-community==0.0.14 -langchain-core==0.1.23 -langchainplus-sdk==0.0.4 -langsmith==0.0.87 -loguru==0.7.3 -marshmallow==3.23.1 -mock==5.1.0 -multidict==6.1.0 -mypy-extensions==1.0.0 -numexpr==2.8.5 -numpy==1.26.4 -openai==0.27.8 -openapi-schema-pydantic==1.2.4 -opentracing==2.4.0 -packaging==23.2 -pinecone-client==2.2.4 -pluggy==1.5.0 -propcache==0.2.1 -psutil==6.1.0 -pydantic==1.10.19 -pytest==8.3.4 -pytest-asyncio==0.23.7 -pytest-cov==6.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.10.1 -python-dateutil==2.9.0.post0 -pyyaml==6.0.2 -regex==2024.11.6 -requests==2.32.3 -sentencepiece==0.2.0 -six==1.17.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -sqlalchemy==2.0.36 -tenacity==8.5.0 -tiktoken==0.8.0 -tokenizers==0.21.0 -tomli==2.2.1 -tqdm==4.67.1 -typing-extensions==4.12.2 -typing-inspect==0.9.0 -urllib3==2.2.3 -vcrpy==6.0.1 -wrapt==1.17.0 -yarl==1.18.3 -zipp==3.21.0 diff --git a/.riot/requirements/585e779.txt b/.riot/requirements/585e779.txt deleted file mode 100644 index 3e328720bd3..00000000000 --- a/.riot/requirements/585e779.txt +++ /dev/null @@ -1,82 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --allow-unsafe --no-annotate .riot/requirements/585e779.in -# -ai21==3.0.1 -ai21-tokenizer==0.12.0 -aiohappyeyeballs==2.4.4 -aiohttp==3.11.10 -aiosignal==1.3.1 -anyio==4.7.0 -attrs==24.2.0 -backoff==2.2.1 -certifi==2024.8.30 -charset-normalizer==3.4.0 -cohere==4.57 -coverage[toml]==7.6.9 -dataclasses-json==0.5.14 -dnspython==2.7.0 -exceptiongroup==1.2.2 -fastavro==1.9.7 -filelock==3.16.1 -frozenlist==1.5.0 -fsspec==2024.10.0 -greenlet==3.0.3 -h11==0.14.0 -httpcore==1.0.7 -httpx==0.27.2 -huggingface-hub==0.26.5 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.11.0 -iniconfig==2.0.0 -jsonpatch==1.33 -jsonpointer==3.0.0 -langchain==0.0.192 -langchain-community==0.0.14 -langchain-core==0.1.23 -langchainplus-sdk==0.0.4 -langsmith==0.0.87 -loguru==0.7.3 -marshmallow==3.23.1 -mock==5.1.0 -multidict==6.1.0 -mypy-extensions==1.0.0 -numexpr==2.8.5 -numpy==1.26.4 -openai==0.27.8 -openapi-schema-pydantic==1.2.4 -opentracing==2.4.0 -packaging==23.2 -pinecone-client==2.2.4 -pluggy==1.5.0 -propcache==0.2.1 -psutil==6.1.0 -pydantic==1.10.19 -pytest==8.3.4 -pytest-asyncio==0.23.7 -pytest-cov==6.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.10.1 -python-dateutil==2.9.0.post0 -pyyaml==6.0.2 -regex==2024.11.6 -requests==2.32.3 -sentencepiece==0.2.0 -six==1.17.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -sqlalchemy==2.0.36 -tenacity==8.5.0 -tiktoken==0.8.0 -tokenizers==0.21.0 -tqdm==4.67.1 -typing-extensions==4.12.2 -typing-inspect==0.9.0 -urllib3==2.2.3 -vcrpy==6.0.1 -wrapt==1.17.0 -yarl==1.18.3 -zipp==3.21.0 diff --git a/.riot/requirements/d39d3de.txt b/.riot/requirements/d39d3de.txt deleted file mode 100644 index 53ccfd3b257..00000000000 --- a/.riot/requirements/d39d3de.txt +++ /dev/null @@ -1,84 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --allow-unsafe --no-annotate .riot/requirements/d39d3de.in -# -ai21==3.0.1 -ai21-tokenizer==0.12.0 -aiohappyeyeballs==2.4.4 -aiohttp==3.11.10 -aiosignal==1.3.1 -anyio==4.7.0 -async-timeout==4.0.3 -attrs==24.2.0 -backoff==2.2.1 -certifi==2024.8.30 -charset-normalizer==3.4.0 -cohere==4.57 -coverage[toml]==7.6.9 -dataclasses-json==0.5.14 -dnspython==2.7.0 -exceptiongroup==1.2.2 -fastavro==1.9.7 -filelock==3.16.1 -frozenlist==1.5.0 -fsspec==2024.10.0 -greenlet==3.0.3 -h11==0.14.0 -httpcore==1.0.7 -httpx==0.27.2 -huggingface-hub==0.26.5 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.11.0 -iniconfig==2.0.0 -jsonpatch==1.33 -jsonpointer==3.0.0 -langchain==0.0.192 -langchain-community==0.0.14 -langchain-core==0.1.23 -langchainplus-sdk==0.0.4 -langsmith==0.0.87 -loguru==0.7.3 -marshmallow==3.23.1 -mock==5.1.0 -multidict==6.1.0 -mypy-extensions==1.0.0 -numexpr==2.8.5 -numpy==1.26.4 -openai==0.27.8 -openapi-schema-pydantic==1.2.4 -opentracing==2.4.0 -packaging==23.2 -pinecone-client==2.2.4 -pluggy==1.5.0 -propcache==0.2.1 -psutil==6.1.0 -pydantic==1.10.19 -pytest==8.3.4 -pytest-asyncio==0.23.7 -pytest-cov==6.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.10.1 -python-dateutil==2.9.0.post0 -pyyaml==6.0.2 -regex==2024.11.6 -requests==2.32.3 -sentencepiece==0.2.0 -six==1.17.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -sqlalchemy==2.0.36 -tenacity==8.5.0 -tiktoken==0.8.0 -tokenizers==0.21.0 -tomli==2.2.1 -tqdm==4.67.1 -typing-extensions==4.12.2 -typing-inspect==0.9.0 -urllib3==1.26.20 -vcrpy==6.0.1 -wrapt==1.17.0 -yarl==1.18.3 -zipp==3.21.0 diff --git a/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py index 430700e2782..0d1ba2a8d47 100644 --- a/ddtrace/contrib/internal/langchain/patch.py +++ b/ddtrace/contrib/internal/langchain/patch.py @@ -73,12 +73,6 @@ def get_version(): return getattr(langchain, "__version__", "") -# After 0.1.0, implementation split into langchain, langchain_community, and langchain_core. -# We need to check the version to determine which module to wrap, to avoid deprecation warnings -# ref: https://github.com/DataDog/dd-trace-py/issues/8212 -PATCH_LANGCHAIN_V0 = parse_version(get_version()) < (0, 1, 0) - - config._add( "langchain", { @@ -160,11 +154,11 @@ def _is_openai_llm_instance(instance): langchain_community does not automatically import submodules which may result in AttributeErrors. """ try: - if not PATCH_LANGCHAIN_V0 and langchain_openai: + if langchain_openai: return isinstance(instance, langchain_openai.OpenAI) - if not PATCH_LANGCHAIN_V0 and langchain_community: + if langchain_community: return isinstance(instance, langchain_community.llms.OpenAI) - return isinstance(instance, langchain.llms.OpenAI) + return False except (AttributeError, ModuleNotFoundError, ImportError): return False @@ -174,11 +168,11 @@ def _is_openai_chat_instance(instance): langchain_community does not automatically import submodules which may result in AttributeErrors. """ try: - if not PATCH_LANGCHAIN_V0 and langchain_openai: + if langchain_openai: return isinstance(instance, langchain_openai.ChatOpenAI) - if not PATCH_LANGCHAIN_V0 and langchain_community: + if langchain_community: return isinstance(instance, langchain_community.chat_models.ChatOpenAI) - return isinstance(instance, langchain.chat_models.ChatOpenAI) + return False except (AttributeError, ModuleNotFoundError, ImportError): return False @@ -188,11 +182,11 @@ def _is_pinecone_vectorstore_instance(instance): langchain_community does not automatically import submodules which may result in AttributeErrors. """ try: - if not PATCH_LANGCHAIN_V0 and langchain_pinecone: + if langchain_pinecone: return isinstance(instance, langchain_pinecone.PineconeVectorStore) - if not PATCH_LANGCHAIN_V0 and langchain_community: + if langchain_community: return isinstance(instance, langchain_community.vectorstores.Pinecone) - return isinstance(instance, langchain.vectorstores.Pinecone) + return False except (AttributeError, ModuleNotFoundError, ImportError): return False @@ -661,10 +655,7 @@ def traced_chain_call(langchain, pin, func, instance, args, kwargs): inputs = None final_outputs = {} try: - if PATCH_LANGCHAIN_V0: - inputs = get_argument_value(args, kwargs, 0, "inputs") - else: - inputs = get_argument_value(args, kwargs, 0, "input") + inputs = get_argument_value(args, kwargs, 0, "input") if not isinstance(inputs, dict): inputs = {instance.input_keys[0]: inputs} if integration.is_pc_sampled_span(span): @@ -719,10 +710,7 @@ async def traced_chain_acall(langchain, pin, func, instance, args, kwargs): inputs = None final_outputs = {} try: - if PATCH_LANGCHAIN_V0: - inputs = get_argument_value(args, kwargs, 0, "inputs") - else: - inputs = get_argument_value(args, kwargs, 0, "input") + inputs = get_argument_value(args, kwargs, 0, "input") if not isinstance(inputs, dict): inputs = {instance.input_keys[0]: inputs} if integration.is_pc_sampled_span(span): @@ -1197,44 +1185,42 @@ def _patch_embeddings_and_vectorstores(): Text embedding models override two abstract base methods instead of super calls, so we need to wrap each langchain-provided text embedding and vectorstore model. """ - base_langchain_module = langchain - if not PATCH_LANGCHAIN_V0 and langchain_community: - from langchain_community import embeddings # noqa:F401 - from langchain_community import vectorstores # noqa:F401 - - base_langchain_module = langchain_community - if not PATCH_LANGCHAIN_V0 and langchain_community is None: + if langchain_community is None: return + + from langchain_community import embeddings # noqa:F401 + from langchain_community import vectorstores # noqa:F401 + for text_embedding_model in text_embedding_models: - if hasattr(base_langchain_module.embeddings, text_embedding_model): + if hasattr(langchain_community.embeddings, text_embedding_model): # Ensure not double patched, as some Embeddings interfaces are pointers to other Embeddings. if not isinstance( - deep_getattr(base_langchain_module.embeddings, "%s.embed_query" % text_embedding_model), + deep_getattr(langchain_community.embeddings, "%s.embed_query" % text_embedding_model), wrapt.ObjectProxy, ): wrap( - base_langchain_module.__name__, + langchain_community.__name__, "embeddings.%s.embed_query" % text_embedding_model, traced_embedding(langchain), ) if not isinstance( - deep_getattr(base_langchain_module.embeddings, "%s.embed_documents" % text_embedding_model), + deep_getattr(langchain_community.embeddings, "%s.embed_documents" % text_embedding_model), wrapt.ObjectProxy, ): wrap( - base_langchain_module.__name__, + langchain_community.__name__, "embeddings.%s.embed_documents" % text_embedding_model, traced_embedding(langchain), ) for vectorstore in vectorstore_classes: - if hasattr(base_langchain_module.vectorstores, vectorstore): + if hasattr(langchain_community.vectorstores, vectorstore): # Ensure not double patched, as some Embeddings interfaces are pointers to other Embeddings. if not isinstance( - deep_getattr(base_langchain_module.vectorstores, "%s.similarity_search" % vectorstore), + deep_getattr(langchain_community.vectorstores, "%s.similarity_search" % vectorstore), wrapt.ObjectProxy, ): wrap( - base_langchain_module.__name__, + langchain_community.__name__, "vectorstores.%s.similarity_search" % vectorstore, traced_similarity_search(langchain), ) @@ -1245,34 +1231,39 @@ def _unpatch_embeddings_and_vectorstores(): Text embedding models override two abstract base methods instead of super calls, so we need to unwrap each langchain-provided text embedding and vectorstore model. """ - base_langchain_module = langchain if PATCH_LANGCHAIN_V0 else langchain_community - if not PATCH_LANGCHAIN_V0 and langchain_community is None: + if langchain_community is None: return + for text_embedding_model in text_embedding_models: - if hasattr(base_langchain_module.embeddings, text_embedding_model): + if hasattr(langchain_community.embeddings, text_embedding_model): if isinstance( - deep_getattr(base_langchain_module.embeddings, "%s.embed_query" % text_embedding_model), + deep_getattr(langchain_community.embeddings, "%s.embed_query" % text_embedding_model), wrapt.ObjectProxy, ): - unwrap(getattr(base_langchain_module.embeddings, text_embedding_model), "embed_query") + unwrap(getattr(langchain_community.embeddings, text_embedding_model), "embed_query") if isinstance( - deep_getattr(base_langchain_module.embeddings, "%s.embed_documents" % text_embedding_model), + deep_getattr(langchain_community.embeddings, "%s.embed_documents" % text_embedding_model), wrapt.ObjectProxy, ): - unwrap(getattr(base_langchain_module.embeddings, text_embedding_model), "embed_documents") + unwrap(getattr(langchain_community.embeddings, text_embedding_model), "embed_documents") for vectorstore in vectorstore_classes: - if hasattr(base_langchain_module.vectorstores, vectorstore): + if hasattr(langchain_community.vectorstores, vectorstore): if isinstance( - deep_getattr(base_langchain_module.vectorstores, "%s.similarity_search" % vectorstore), + deep_getattr(langchain_community.vectorstores, "%s.similarity_search" % vectorstore), wrapt.ObjectProxy, ): - unwrap(getattr(base_langchain_module.vectorstores, vectorstore), "similarity_search") + unwrap(getattr(langchain_community.vectorstores, vectorstore), "similarity_search") def patch(): if getattr(langchain, "_datadog_patch", False): return + version = parse_version(get_version()) + if parse_version(get_version()) < (0, 1, 0): + log.warning("langchain version %s is not supported, please upgrade to langchain version 0.1 or later", version) + return + langchain._datadog_patch = True Pin().onto(langchain) @@ -1281,68 +1272,50 @@ def patch(): # Langchain doesn't allow wrapping directly from root, so we have to import the base classes first before wrapping. # ref: https://github.com/DataDog/dd-trace-py/issues/7123 - if PATCH_LANGCHAIN_V0: - from langchain import embeddings # noqa:F401 - from langchain import vectorstores # noqa:F401 - from langchain.chains.base import Chain # noqa:F401 - from langchain.chat_models.base import BaseChatModel # noqa:F401 - from langchain.llms.base import BaseLLM # noqa:F401 - - wrap("langchain", "llms.base.BaseLLM.generate", traced_llm_generate(langchain)) - wrap("langchain", "llms.base.BaseLLM.agenerate", traced_llm_agenerate(langchain)) - wrap("langchain", "chat_models.base.BaseChatModel.generate", traced_chat_model_generate(langchain)) - wrap("langchain", "chat_models.base.BaseChatModel.agenerate", traced_chat_model_agenerate(langchain)) - wrap("langchain", "chains.base.Chain.__call__", traced_chain_call(langchain)) - wrap("langchain", "chains.base.Chain.acall", traced_chain_acall(langchain)) - wrap("langchain", "embeddings.OpenAIEmbeddings.embed_query", traced_embedding(langchain)) - wrap("langchain", "embeddings.OpenAIEmbeddings.embed_documents", traced_embedding(langchain)) - else: - from langchain.chains.base import Chain # noqa:F401 - from langchain_core.tools import BaseTool # noqa:F401 - - wrap("langchain_core", "language_models.llms.BaseLLM.generate", traced_llm_generate(langchain)) - wrap("langchain_core", "language_models.llms.BaseLLM.agenerate", traced_llm_agenerate(langchain)) - wrap( - "langchain_core", - "language_models.chat_models.BaseChatModel.generate", - traced_chat_model_generate(langchain), - ) - wrap( - "langchain_core", - "language_models.chat_models.BaseChatModel.agenerate", - traced_chat_model_agenerate(langchain), - ) - wrap("langchain", "chains.base.Chain.invoke", traced_chain_call(langchain)) - wrap("langchain", "chains.base.Chain.ainvoke", traced_chain_acall(langchain)) - wrap("langchain_core", "runnables.base.RunnableSequence.invoke", traced_lcel_runnable_sequence(langchain)) - wrap( - "langchain_core", "runnables.base.RunnableSequence.ainvoke", traced_lcel_runnable_sequence_async(langchain) - ) - wrap("langchain_core", "runnables.base.RunnableSequence.batch", traced_lcel_runnable_sequence(langchain)) - wrap("langchain_core", "runnables.base.RunnableSequence.abatch", traced_lcel_runnable_sequence_async(langchain)) - wrap("langchain_core", "runnables.base.RunnableSequence.stream", traced_chain_stream(langchain)) - wrap("langchain_core", "runnables.base.RunnableSequence.astream", traced_chain_stream(langchain)) - wrap( - "langchain_core", - "language_models.chat_models.BaseChatModel.stream", - traced_chat_stream(langchain), - ) - wrap( - "langchain_core", - "language_models.chat_models.BaseChatModel.astream", - traced_chat_stream(langchain), - ) - wrap("langchain_core", "language_models.llms.BaseLLM.stream", traced_llm_stream(langchain)) - wrap("langchain_core", "language_models.llms.BaseLLM.astream", traced_llm_stream(langchain)) - - wrap("langchain_core", "tools.BaseTool.invoke", traced_base_tool_invoke(langchain)) - wrap("langchain_core", "tools.BaseTool.ainvoke", traced_base_tool_ainvoke(langchain)) - if langchain_openai: - wrap("langchain_openai", "OpenAIEmbeddings.embed_documents", traced_embedding(langchain)) - if langchain_pinecone: - wrap("langchain_pinecone", "PineconeVectorStore.similarity_search", traced_similarity_search(langchain)) + from langchain.chains.base import Chain # noqa:F401 + from langchain_core.tools import BaseTool # noqa:F401 + + wrap("langchain_core", "language_models.llms.BaseLLM.generate", traced_llm_generate(langchain)) + wrap("langchain_core", "language_models.llms.BaseLLM.agenerate", traced_llm_agenerate(langchain)) + wrap( + "langchain_core", + "language_models.chat_models.BaseChatModel.generate", + traced_chat_model_generate(langchain), + ) + wrap( + "langchain_core", + "language_models.chat_models.BaseChatModel.agenerate", + traced_chat_model_agenerate(langchain), + ) + wrap("langchain", "chains.base.Chain.invoke", traced_chain_call(langchain)) + wrap("langchain", "chains.base.Chain.ainvoke", traced_chain_acall(langchain)) + wrap("langchain_core", "runnables.base.RunnableSequence.invoke", traced_lcel_runnable_sequence(langchain)) + wrap("langchain_core", "runnables.base.RunnableSequence.ainvoke", traced_lcel_runnable_sequence_async(langchain)) + wrap("langchain_core", "runnables.base.RunnableSequence.batch", traced_lcel_runnable_sequence(langchain)) + wrap("langchain_core", "runnables.base.RunnableSequence.abatch", traced_lcel_runnable_sequence_async(langchain)) + wrap("langchain_core", "runnables.base.RunnableSequence.stream", traced_chain_stream(langchain)) + wrap("langchain_core", "runnables.base.RunnableSequence.astream", traced_chain_stream(langchain)) + wrap( + "langchain_core", + "language_models.chat_models.BaseChatModel.stream", + traced_chat_stream(langchain), + ) + wrap( + "langchain_core", + "language_models.chat_models.BaseChatModel.astream", + traced_chat_stream(langchain), + ) + wrap("langchain_core", "language_models.llms.BaseLLM.stream", traced_llm_stream(langchain)) + wrap("langchain_core", "language_models.llms.BaseLLM.astream", traced_llm_stream(langchain)) - if PATCH_LANGCHAIN_V0 or langchain_community: + wrap("langchain_core", "tools.BaseTool.invoke", traced_base_tool_invoke(langchain)) + wrap("langchain_core", "tools.BaseTool.ainvoke", traced_base_tool_ainvoke(langchain)) + if langchain_openai: + wrap("langchain_openai", "OpenAIEmbeddings.embed_documents", traced_embedding(langchain)) + if langchain_pinecone: + wrap("langchain_pinecone", "PineconeVectorStore.similarity_search", traced_similarity_search(langchain)) + + if langchain_community: _patch_embeddings_and_vectorstores() if _is_iast_enabled(): @@ -1365,40 +1338,30 @@ def unpatch(): langchain._datadog_patch = False - if PATCH_LANGCHAIN_V0: - unwrap(langchain.llms.base.BaseLLM, "generate") - unwrap(langchain.llms.base.BaseLLM, "agenerate") - unwrap(langchain.chat_models.base.BaseChatModel, "generate") - unwrap(langchain.chat_models.base.BaseChatModel, "agenerate") - unwrap(langchain.chains.base.Chain, "__call__") - unwrap(langchain.chains.base.Chain, "acall") - unwrap(langchain.embeddings.OpenAIEmbeddings, "embed_query") - unwrap(langchain.embeddings.OpenAIEmbeddings, "embed_documents") - else: - unwrap(langchain_core.language_models.llms.BaseLLM, "generate") - unwrap(langchain_core.language_models.llms.BaseLLM, "agenerate") - unwrap(langchain_core.language_models.chat_models.BaseChatModel, "generate") - unwrap(langchain_core.language_models.chat_models.BaseChatModel, "agenerate") - unwrap(langchain.chains.base.Chain, "invoke") - unwrap(langchain.chains.base.Chain, "ainvoke") - unwrap(langchain_core.runnables.base.RunnableSequence, "invoke") - unwrap(langchain_core.runnables.base.RunnableSequence, "ainvoke") - unwrap(langchain_core.runnables.base.RunnableSequence, "batch") - unwrap(langchain_core.runnables.base.RunnableSequence, "abatch") - unwrap(langchain_core.runnables.base.RunnableSequence, "stream") - unwrap(langchain_core.runnables.base.RunnableSequence, "astream") - unwrap(langchain_core.language_models.chat_models.BaseChatModel, "stream") - unwrap(langchain_core.language_models.chat_models.BaseChatModel, "astream") - unwrap(langchain_core.language_models.llms.BaseLLM, "stream") - unwrap(langchain_core.language_models.llms.BaseLLM, "astream") - unwrap(langchain_core.tools.BaseTool, "invoke") - unwrap(langchain_core.tools.BaseTool, "ainvoke") - if langchain_openai: - unwrap(langchain_openai.OpenAIEmbeddings, "embed_documents") - if langchain_pinecone: - unwrap(langchain_pinecone.PineconeVectorStore, "similarity_search") - - if PATCH_LANGCHAIN_V0 or langchain_community: + unwrap(langchain_core.language_models.llms.BaseLLM, "generate") + unwrap(langchain_core.language_models.llms.BaseLLM, "agenerate") + unwrap(langchain_core.language_models.chat_models.BaseChatModel, "generate") + unwrap(langchain_core.language_models.chat_models.BaseChatModel, "agenerate") + unwrap(langchain.chains.base.Chain, "invoke") + unwrap(langchain.chains.base.Chain, "ainvoke") + unwrap(langchain_core.runnables.base.RunnableSequence, "invoke") + unwrap(langchain_core.runnables.base.RunnableSequence, "ainvoke") + unwrap(langchain_core.runnables.base.RunnableSequence, "batch") + unwrap(langchain_core.runnables.base.RunnableSequence, "abatch") + unwrap(langchain_core.runnables.base.RunnableSequence, "stream") + unwrap(langchain_core.runnables.base.RunnableSequence, "astream") + unwrap(langchain_core.language_models.chat_models.BaseChatModel, "stream") + unwrap(langchain_core.language_models.chat_models.BaseChatModel, "astream") + unwrap(langchain_core.language_models.llms.BaseLLM, "stream") + unwrap(langchain_core.language_models.llms.BaseLLM, "astream") + unwrap(langchain_core.tools.BaseTool, "invoke") + unwrap(langchain_core.tools.BaseTool, "ainvoke") + if langchain_openai: + unwrap(langchain_openai.OpenAIEmbeddings, "embed_documents") + if langchain_pinecone: + unwrap(langchain_pinecone.PineconeVectorStore, "similarity_search") + + if langchain_community: _unpatch_embeddings_and_vectorstores() delattr(langchain, "_datadog_integration") diff --git a/docs/index.rst b/docs/index.rst index 7517008b6da..f51c8df1af1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -112,7 +112,7 @@ contacting support. +--------------------------------------------------+---------------+----------------+ | :ref:`kombu` | >= 4.2 | No | +--------------------------------------------------+---------------+----------------+ -| :ref:`langchain` | >= 0.0.192 | Yes | +| :ref:`langchain` | >= 0.1 | Yes | +--------------------------------------------------+---------------+----------------+ | :ref:`logbook` | >= 1.0.0 | No | +--------------------------------------------------+---------------+----------------+ diff --git a/releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml b/releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml new file mode 100644 index 00000000000..28ca4ab6526 --- /dev/null +++ b/releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + langchain: Drops tracing and LLM Observability support for Langchain v0.0.x versions. \ No newline at end of file diff --git a/riotfile.py b/riotfile.py index e266d2a09a6..90452bca332 100644 --- a/riotfile.py +++ b/riotfile.py @@ -2698,17 +2698,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "greenlet": "==3.0.3", }, venvs=[ - Venv( - pkgs={ - "vcrpy": "==6.0.1", - "langchain": "==0.0.192", - "langchain-community": "==0.0.14", - "openai": "==0.27.8", - "pinecone-client": "==2.2.4", - "cohere": "==4.57", - }, - pys=select_pys(min_version="3.9", max_version="3.11"), - ), Venv( pkgs={ "vcrpy": "==5.1.0", diff --git a/tests/contrib/langchain/test_langchain.py b/tests/contrib/langchain/test_langchain.py deleted file mode 100644 index 57cb6139db4..00000000000 --- a/tests/contrib/langchain/test_langchain.py +++ /dev/null @@ -1,1073 +0,0 @@ -import os -import re -import sys - -import langchain as _langchain -import mock -import pytest - -from ddtrace.internal.utils.version import parse_version -from tests.contrib.langchain.utils import get_request_vcr -from tests.contrib.langchain.utils import long_input_text -from tests.utils import override_global_config - - -pytestmark = pytest.mark.skipif( - parse_version(_langchain.__version__) >= (0, 1), reason="This module only tests langchain < 0.1" -) - -PY39 = sys.version_info < (3, 10) - - -@pytest.fixture(scope="session") -def request_vcr(): - yield get_request_vcr(subdirectory_name="langchain") - - -@pytest.mark.parametrize("ddtrace_config_langchain", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_global_tags(ddtrace_config_langchain, langchain, request_vcr, mock_metrics, mock_logs, mock_tracer): - """ - When the global config UST tags are set - The service name should be used for all data - The env should be used for all data - The version should be used for all data - """ - llm = langchain.llms.OpenAI(model="text-davinci-003") - with override_global_config(dict(service="test-svc", env="staging", version="1234")): - cassette_name = "openai_completion_sync_39.yaml" if PY39 else "openai_completion_sync.yaml" - with request_vcr.use_cassette(cassette_name): - llm("What does Nietzsche mean by 'God is dead'?") - - span = mock_tracer.pop_traces()[0][0] - assert span.resource == "langchain.llms.openai.OpenAI" # check this needs changed - assert span.service == "test-svc" - assert span.get_tag("env") == "staging" - assert span.get_tag("version") == "1234" - assert span.get_tag("langchain.request.provider") == "openai" - assert span.get_tag("langchain.request.model") == "text-davinci-003" - assert span.get_tag("langchain.request.api_key") == "...key>" - - assert mock_logs.enqueue.call_count == 1 - assert mock_metrics.mock_calls - for _, _args, kwargs in mock_metrics.mock_calls: - expected_metrics = [ - "service:test-svc", - "env:staging", - "version:1234", - "langchain.request.model:text-davinci-003", - "langchain.request.provider:openai", - "langchain.request.type:llm", - "langchain.request.api_key:...key>", - ] - actual_tags = kwargs.get("tags") - for m in expected_metrics: - assert m in actual_tags - - for call, args, _kwargs in mock_logs.mock_calls: - if call != "enqueue": - continue - log = args[0] - assert log["service"] == "test-svc" - assert ( - log["ddtags"] - == "env:staging,version:1234,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>" # noqa: E501 - ) - - -@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test") -@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost", "resource"]) -def test_openai_llm_sync(langchain, request_vcr): - llm = langchain.llms.OpenAI(model="text-davinci-003") - with request_vcr.use_cassette("openai_completion_sync.yaml"): - llm("Can you explain what Descartes meant by 'I think, therefore I am'?") - - -@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test") -@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost"]) -def test_openai_llm_sync_39(langchain, request_vcr): - llm = langchain.llms.OpenAI(model="text-davinci-003") - with request_vcr.use_cassette("openai_completion_sync_39.yaml"): - llm("Can you explain what Descartes meant by 'I think, therefore I am'?") - - -@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test") -@pytest.mark.snapshot(ignores=["resource"]) -def test_openai_llm_sync_multiple_prompts(langchain, request_vcr): - llm = langchain.llms.OpenAI(model="text-davinci-003") - with request_vcr.use_cassette("openai_completion_sync_multi_prompt.yaml"): - llm.generate( - prompts=[ - "What is the best way to teach a baby multiple languages?", - "How many times has Spongebob failed his road test?", - ] - ) - - -@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test") -@pytest.mark.snapshot -def test_openai_llm_sync_multiple_prompts_39(langchain, request_vcr): - llm = langchain.llms.OpenAI(model="text-davinci-003") - with request_vcr.use_cassette("openai_completion_sync_multi_prompt_39.yaml"): - llm.generate( - [ - "What is the best way to teach a baby multiple languages?", - "How many times has Spongebob failed his road test?", - ] - ) - - -@pytest.mark.asyncio -@pytest.mark.snapshot(ignores=["resource", "langchain.request.openai.parameters.request_timeout"]) -async def test_openai_llm_async(langchain, request_vcr): - llm = langchain.llms.OpenAI(model="text-davinci-003") - cassette_name = "openai_completion_async_39.yaml" if PY39 else "openai_completion_async.yaml" - with request_vcr.use_cassette(cassette_name): - await llm.agenerate(["Which team won the 2019 NBA finals?"]) - - -@pytest.mark.snapshot(ignores=["meta.error.stack", "resource"]) -def test_openai_llm_error(langchain, request_vcr): - import openai # Imported here because the os env OPENAI_API_KEY needs to be set via langchain fixture before import - - llm = langchain.llms.OpenAI(model="text-davinci-003") - - if parse_version(openai.__version__) >= (1, 0, 0): - invalid_error = openai.BadRequestError - else: - invalid_error = openai.InvalidRequestError - with pytest.raises(invalid_error): - with request_vcr.use_cassette("openai_completion_error.yaml"): - llm.generate([12345, 123456]) - - -@pytest.mark.snapshot(ignores=["resource"]) -def test_cohere_llm_sync(langchain, request_vcr): - llm = langchain.llms.Cohere(cohere_api_key=os.getenv("COHERE_API_KEY", "")) - with request_vcr.use_cassette("cohere_completion_sync.yaml"): - llm("What is the secret Krabby Patty recipe?") - - -@pytest.mark.snapshot(ignores=["resource"]) -def test_huggingfacehub_llm_sync(langchain, request_vcr): - llm = langchain.llms.HuggingFaceHub( - repo_id="google/flan-t5-xxl", - model_kwargs={"temperature": 0.5, "max_length": 256}, - huggingfacehub_api_token=os.getenv("HUGGINGFACEHUB_API_TOKEN", ""), - ) - with request_vcr.use_cassette("huggingfacehub_completion_sync.yaml"): - llm("Why does Mr. Krabs have a whale daughter?") - - -@pytest.mark.snapshot(ignores=["meta.langchain.response.completions.0.text", "resource"]) -def test_ai21_llm_sync(langchain, request_vcr): - llm = langchain.llms.AI21(ai21_api_key=os.getenv("AI21_API_KEY", "")) - cassette_name = "ai21_completion_sync_39.yaml" if PY39 else "ai21_completion_sync.yaml" - with request_vcr.use_cassette(cassette_name): - llm("Why does everyone in Bikini Bottom hate Plankton?") - - -def test_openai_llm_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer): - llm = langchain.llms.OpenAI(model="text-davinci-003") - cassette_name = "openai_completion_sync_39.yaml" if PY39 else "openai_completion_sync.yaml" - with request_vcr.use_cassette(cassette_name): - llm("Can you explain what Descartes meant by 'I think, therefore I am'?") - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.langchain", - "langchain.request.provider:openai", - "langchain.request.model:text-davinci-003", - "langchain.request.type:llm", - "langchain.request.api_key:...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [ - mock.call.distribution("tokens.prompt", 17, tags=expected_tags), - mock.call.distribution("tokens.completion", mock.ANY, tags=expected_tags), - mock.call.distribution("tokens.total", mock.ANY, tags=expected_tags), - mock.call.increment("tokens.total_cost", mock.ANY, tags=expected_tags), - mock.call.distribution("request.duration", mock.ANY, tags=expected_tags), - ], - any_order=True, - ) - mock_logs.assert_not_called() - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_llm_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer): - llm = langchain.llms.OpenAI(model="text-davinci-003") - cassette_name = "openai_completion_sync_39.yaml" if PY39 else "openai_completion_sync.yaml" - with request_vcr.use_cassette(cassette_name): - llm("Can you explain what Descartes meant by 'I think, therefore I am'?") - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.enqueue.assert_called_with( - { - "timestamp": mock.ANY, - "message": "sampled langchain.llms.openai.OpenAI", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(trace_id)[2:], - "dd.span_id": str(span_id), - "prompts": ["Can you explain what Descartes meant by 'I think, therefore I am'?"], - "choices": mock.ANY, - } - ) - mock_metrics.increment.assert_not_called() - mock_metrics.distribution.assert_not_called() - mock_metrics.count.assert_not_called() - - -@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test") -@pytest.mark.snapshot( - token="tests.contrib.langchain.test_langchain.test_openai_chat_model_call", - ignores=["metrics.langchain.tokens.total_cost", "resource"], -) -def test_openai_chat_model_sync_call(langchain, request_vcr): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - with request_vcr.use_cassette("openai_chat_completion_sync_call.yaml"): - chat(messages=[langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")]) - - -@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test") -@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost"]) -def test_openai_chat_model_sync_call_39(langchain, request_vcr): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - with request_vcr.use_cassette("openai_chat_completion_sync_call_39.yaml"): - chat([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")]) - - -@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test") -@pytest.mark.snapshot( - token="tests.contrib.langchain.test_langchain.test_openai_chat_model_generate", - ignores=["metrics.langchain.tokens.total_cost", "resource"], -) -def test_openai_chat_model_sync_generate(langchain, request_vcr): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - with request_vcr.use_cassette("openai_chat_completion_sync_generate.yaml"): - chat.generate( - [ - [ - langchain.schema.SystemMessage(content="Respond like a frat boy."), - langchain.schema.HumanMessage( - content="Where's the nearest equinox gym from Hudson Yards manhattan?" - ), - ], - [ - langchain.schema.SystemMessage(content="Respond with a pirate accent."), - langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"), - ], - ] - ) - - -@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test") -@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost"]) -def test_openai_chat_model_sync_generate_39(langchain, request_vcr): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - with request_vcr.use_cassette("openai_chat_completion_sync_generate_39.yaml"): - chat.generate( - [ - [ - langchain.schema.SystemMessage(content="Respond like a frat boy."), - langchain.schema.HumanMessage( - content="Where's the nearest equinox gym from Hudson Yards manhattan?" - ), - ], - [ - langchain.schema.SystemMessage(content="Respond with a pirate accent."), - langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"), - ], - ] - ) - - -@pytest.mark.asyncio -@pytest.mark.snapshot( - token="tests.contrib.langchain.test_langchain.test_openai_chat_model_call", - ignores=["metrics.langchain.tokens.total_cost", "resource"], -) -async def test_openai_chat_model_async_call(langchain, request_vcr): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - with request_vcr.use_cassette("openai_chat_completion_async_call.yaml"): - await chat._call_async([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")]) - - -@pytest.mark.asyncio -@pytest.mark.snapshot( - token="tests.contrib.langchain.test_langchain.test_openai_chat_model_generate", - ignores=["metrics.langchain.tokens.total_cost", "resource"], -) -async def test_openai_chat_model_async_generate(langchain, request_vcr): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - with request_vcr.use_cassette("openai_chat_completion_async_generate.yaml"): - await chat.agenerate( - [ - [ - langchain.schema.SystemMessage(content="Respond like a frat boy."), - langchain.schema.HumanMessage( - content="Where's the nearest equinox gym from Hudson Yards manhattan?" - ), - ], - [ - langchain.schema.SystemMessage(content="Respond with a pirate accent."), - langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"), - ], - ] - ) - - -def test_chat_model_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - cassette_name = "openai_chat_completion_sync_call_39.yaml" if PY39 else "openai_chat_completion_sync_call.yaml" - with request_vcr.use_cassette(cassette_name): - chat([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")]) - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.langchain", - "langchain.request.provider:openai", - "langchain.request.model:gpt-3.5-turbo", - "langchain.request.type:chat_model", - "langchain.request.api_key:...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [ - mock.call.distribution("tokens.prompt", 21, tags=expected_tags), - mock.call.distribution("tokens.completion", 59, tags=expected_tags), - mock.call.distribution("tokens.total", 80, tags=expected_tags), - mock.call.increment("tokens.total_cost", mock.ANY, tags=expected_tags), - mock.call.distribution("request.duration", mock.ANY, tags=expected_tags), - ], - any_order=True, - ) - mock_logs.assert_not_called() - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_chat_model_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer): - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - cassette_name = "openai_chat_completion_sync_call_39.yaml" if PY39 else "openai_chat_completion_sync_call.yaml" - with request_vcr.use_cassette(cassette_name): - chat([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")]) - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.enqueue.assert_called_with( - { - "timestamp": mock.ANY, - "message": "sampled langchain.chat_models.openai.ChatOpenAI", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:gpt-3.5-turbo,langchain.request.type:chat_model,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(trace_id)[2:], - "dd.span_id": str(span_id), - "messages": [[{"content": "When do you use 'whom' instead of 'who'?", "message_type": "HumanMessage"}]], - "choices": [[{"content": mock.ANY, "message_type": "AIMessage"}]], - } - ) - mock_metrics.increment.assert_not_called() - mock_metrics.distribution.assert_not_called() - mock_metrics.count.assert_not_called() - - -@pytest.mark.snapshot -def test_openai_embedding_query(langchain, request_vcr): - embeddings = langchain.embeddings.OpenAIEmbeddings() - cassette_name = "openai_embedding_query_39.yaml" if PY39 else "openai_embedding_query.yaml" - with request_vcr.use_cassette(cassette_name): - embeddings.embed_query("this is a test query.") - - -@pytest.mark.skip(reason="Tiktoken request to get model encodings cannot be made in CI") -@pytest.mark.snapshot -def test_openai_embedding_document(langchain, request_vcr): - embeddings = langchain.embeddings.OpenAIEmbeddings() - cassette_name = "openai_embedding_document_39.yaml" if PY39 else "openai_embedding_document.yaml" - with request_vcr.use_cassette(cassette_name): - embeddings.embed_documents(["this is", "a test document."]) - - -@pytest.mark.snapshot(ignores=["resource"]) -def test_fake_embedding_query(langchain): - embeddings = langchain.embeddings.FakeEmbeddings(size=99) - embeddings.embed_query(text="foo") - - -@pytest.mark.snapshot(ignores=["resource"]) -def test_fake_embedding_document(langchain): - embeddings = langchain.embeddings.FakeEmbeddings(size=99) - embeddings.embed_documents(texts=["foo", "bar"]) - - -def test_openai_embedding_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer): - embeddings = langchain.embeddings.OpenAIEmbeddings() - cassette_name = "openai_embedding_query_39.yaml" if PY39 else "openai_embedding_query.yaml" - with request_vcr.use_cassette(cassette_name): - embeddings.embed_query("this is a test query.") - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.langchain", - "langchain.request.provider:openai", - "langchain.request.model:text-embedding-ada-002", - "langchain.request.type:embedding", - "langchain.request.api_key:...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [mock.call.distribution("request.duration", mock.ANY, tags=expected_tags)], - any_order=True, - ) - mock_logs.assert_not_called() - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_embedding_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer): - embeddings = langchain.embeddings.OpenAIEmbeddings() - cassette_name = "openai_embedding_query_39.yaml" if PY39 else "openai_embedding_query.yaml" - with request_vcr.use_cassette(cassette_name): - embeddings.embed_query("this is a test query.") - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.enqueue.assert_called_with( - { - "timestamp": mock.ANY, - "message": "sampled langchain.embeddings.openai.OpenAIEmbeddings", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-embedding-ada-002,langchain.request.type:embedding,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(trace_id)[2:], - "dd.span_id": str(span_id), - "inputs": ["this is a test query."], - } - ) - mock_metrics.increment.assert_not_called() - mock_metrics.distribution.assert_not_called() - mock_metrics.count.assert_not_called() - - -@pytest.mark.snapshot( - token="tests.contrib.langchain.test_langchain.test_openai_math_chain", - ignores=["metrics.langchain.tokens.total_cost", "resource"], -) -def test_openai_math_chain_sync(langchain, request_vcr): - """ - Test that using the provided LLMMathChain will result in a 3-span trace with - the overall LLMMathChain, LLMChain, and underlying OpenAI interface. - """ - chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0)) - cassette_name = "openai_math_chain_sync_39.yaml" if PY39 else "openai_math_chain_sync.yaml" - with request_vcr.use_cassette(cassette_name): - chain.run("what is two raised to the fifty-fourth power?") - - -@pytest.mark.asyncio -@pytest.mark.snapshot( - token="tests.contrib.langchain.test_langchain.test_openai_math_chain", - ignores=["metrics.langchain.tokens.total_cost"], -) -async def test_openai_math_chain_async(langchain, request_vcr): - """ - Test that using the provided LLMMathChain will result in a 3-span trace with - the overall LLMMathChain, LLMChain, and underlying OpenAI interface. - """ - chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0)) - with request_vcr.use_cassette("openai_math_chain_async.yaml"): - await chain.acall("what is two raised to the fifty-fourth power?") - - -@pytest.mark.snapshot(token="tests.contrib.langchain.test_langchain.test_cohere_math_chain") -def test_cohere_math_chain_sync(langchain, request_vcr): - """ - Test that using the provided LLMMathChain will result in a 3-span trace with - the overall LLMMathChain, LLMChain, and underlying Cohere interface. - """ - chain = langchain.chains.LLMMathChain( - llm=langchain.llms.Cohere(cohere_api_key=os.getenv("COHERE_API_KEY", "")) - ) - with request_vcr.use_cassette("cohere_math_chain_sync.yaml"): - chain.run("what is thirteen raised to the .3432 power?") - - -@pytest.mark.skipif(PY39, reason="Requires unnecessary cassette file for Python 3.9") -@pytest.mark.snapshot( - token="tests.contrib.langchain.test_langchain.test_openai_sequential_chain", - ignores=["metrics.langchain.tokens.total_cost", "resource"], -) -def test_openai_sequential_chain(langchain, request_vcr): - """ - Test that using a SequentialChain will result in a 4-span trace with - the overall SequentialChain, TransformChain, LLMChain, and underlying OpenAI interface. - """ - - def _transform_func(inputs): - """Helper function to replace multiple new lines and multiple spaces with a single space""" - text = inputs["text"] - text = re.sub(r"(\r\n|\r|\n){2,}", r"\n", text) - text = re.sub(r"[ \t]+", " ", text) - return {"output_text": text} - - clean_extra_spaces_chain = langchain.chains.TransformChain( - input_variables=["text"], output_variables=["output_text"], transform=_transform_func - ) - template = """Paraphrase this text: - - {output_text} - - In the style of a {style}. - - Paraphrase: """ - prompt = langchain.PromptTemplate(input_variables=["style", "output_text"], template=template) - style_paraphrase_chain = langchain.chains.LLMChain( - llm=langchain.llms.OpenAI(), prompt=prompt, output_key="final_output" - ) - sequential_chain = langchain.chains.SequentialChain( - chains=[clean_extra_spaces_chain, style_paraphrase_chain], - input_variables=["text", "style"], - output_variables=["final_output"], - ) - - input_text = """ - Chains allow us to combine multiple - - - components together to create a single, coherent application. - - For example, we can create a chain that takes user input, format it with a PromptTemplate, - - and then passes the formatted response to an LLM. We can build more complex chains by combining - - multiple chains together, or by - - - combining chains with other components. - """ - with request_vcr.use_cassette("openai_paraphrase.yaml"): - sequential_chain.run({"text": input_text, "style": "a 90s rapper"}) - - -@pytest.mark.skipif(PY39, reason="Requires unnecessary cassette file for Python 3.9") -@pytest.mark.snapshot(ignores=["langchain.tokens.total_cost", "resource"]) -def test_openai_sequential_chain_with_multiple_llm_sync(langchain, request_vcr): - template = """Paraphrase this text: - - {input_text} - - Paraphrase: """ - prompt = langchain.PromptTemplate(input_variables=["input_text"], template=template) - style_paraphrase_chain = langchain.chains.LLMChain( - llm=langchain.llms.OpenAI(), prompt=prompt, output_key="paraphrased_output" - ) - rhyme_template = """Make this text rhyme: - - {paraphrased_output} - - Rhyme: """ - rhyme_prompt = langchain.PromptTemplate(input_variables=["paraphrased_output"], template=rhyme_template) - rhyme_chain = langchain.chains.LLMChain(llm=langchain.llms.OpenAI(), prompt=rhyme_prompt, output_key="final_output") - sequential_chain = langchain.chains.SequentialChain( - chains=[style_paraphrase_chain, rhyme_chain], - input_variables=["input_text"], - output_variables=["final_output"], - ) - - with request_vcr.use_cassette("openai_sequential_paraphrase_and_rhyme_sync.yaml"): - sequential_chain.run({"input_text": long_input_text}) - - -@pytest.mark.asyncio -@pytest.mark.snapshot(ignores=["resource"]) -async def test_openai_sequential_chain_with_multiple_llm_async(langchain, request_vcr): - template = """Paraphrase this text: - - {input_text} - - Paraphrase: """ - prompt = langchain.PromptTemplate(input_variables=["input_text"], template=template) - style_paraphrase_chain = langchain.chains.LLMChain( - llm=langchain.llms.OpenAI(), prompt=prompt, output_key="paraphrased_output" - ) - rhyme_template = """Make this text rhyme: - - {paraphrased_output} - - Rhyme: """ - rhyme_prompt = langchain.PromptTemplate(input_variables=["paraphrased_output"], template=rhyme_template) - rhyme_chain = langchain.chains.LLMChain(llm=langchain.llms.OpenAI(), prompt=rhyme_prompt, output_key="final_output") - sequential_chain = langchain.chains.SequentialChain( - chains=[style_paraphrase_chain, rhyme_chain], - input_variables=["input_text"], - output_variables=["final_output"], - ) - with request_vcr.use_cassette("openai_sequential_paraphrase_and_rhyme_async.yaml"): - await sequential_chain.acall({"input_text": long_input_text}) - - -def test_openai_chain_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer): - chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0)) - cassette_name = "openai_math_chain_sync_39.yaml" if PY39 else "openai_math_chain_sync.yaml" - with request_vcr.use_cassette(cassette_name): - chain.run("what is two raised to the fifty-fourth power?") - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.langchain", - "langchain.request.provider:openai", - "langchain.request.model:text-davinci-003", - mock.ANY, # should be in format "langchain.request.type:" - "langchain.request.api_key:...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [ - mock.call.distribution("tokens.prompt", 236, tags=expected_tags), - mock.call.distribution("tokens.completion", 24, tags=expected_tags), - mock.call.distribution("tokens.total", 260, tags=expected_tags), - mock.call.increment("tokens.total_cost", mock.ANY, tags=expected_tags), - mock.call.distribution("request.duration", mock.ANY, tags=expected_tags), - ], - any_order=True, - ) - mock_logs.assert_not_called() - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_chain_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer): - chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0)) - cassette_name = "openai_math_chain_sync_39.yaml" if PY39 else "openai_math_chain_sync.yaml" - with request_vcr.use_cassette(cassette_name): - chain.run("what is two raised to the fifty-fourth power?") - traces = mock_tracer.pop_traces() - base_chain_span = traces[0][0] - mid_chain_span = traces[0][1] - llm_span = traces[0][2] - - assert mock_logs.enqueue.call_count == 3 # This operation includes 2 chains and 1 LLM call - mock_logs.assert_has_calls( - [ - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": "sampled langchain.llms.openai.OpenAI", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(llm_span.trace_id)[2:], - "dd.span_id": str(llm_span.span_id), - "prompts": mock.ANY, - "choices": mock.ANY, - } - ), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": "sampled langchain.chains.llm.LLMChain", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:,langchain.request.model:,langchain.request.type:chain,langchain.request.api_key:", # noqa: E501 - "dd.trace_id": hex(mid_chain_span.trace_id)[2:], - "dd.span_id": str(mid_chain_span.span_id), - "inputs": mock.ANY, - "prompt": mock.ANY, - "outputs": { - "question": "what is two raised to the fifty-fourth power?", - "stop": mock.ANY, - "text": '\n```text\n2**54\n```\n...numexpr.evaluate("2**54")...\n', - }, - } - ), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": "sampled langchain.chains.llm_math.base.LLMMathChain", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:,langchain.request.model:,langchain.request.type:chain,langchain.request.api_key:", # noqa: E501 - "dd.trace_id": hex(base_chain_span.trace_id)[2:], - "dd.span_id": str(base_chain_span.span_id), - "inputs": {"question": "what is two raised to the fifty-fourth power?"}, - "prompt": mock.ANY, - "outputs": { - "question": "what is two raised to the fifty-fourth power?", - "answer": "Answer: 18014398509481984", - }, - } - ), - ] - ) - mock_metrics.increment.assert_not_called() - mock_metrics.distribution.assert_not_called() - mock_metrics.count.assert_not_called() - - -def test_chat_prompt_template_does_not_parse_template(langchain, mock_tracer): - """ - Test that tracing a chain with a ChatPromptTemplate does not try to directly parse the template, - as ChatPromptTemplates do not contain a specific template attribute (which will lead to an attribute error) - but instead contain multiple messages each with their own prompt template and are not trivial to tag. - """ - import langchain.prompts.chat # noqa: F401 - - with mock.patch("langchain.chat_models.openai.ChatOpenAI._generate", side_effect=Exception("Mocked Error")): - with pytest.raises(Exception) as exc_info: - chat = langchain.chat_models.ChatOpenAI(temperature=0) - template = "You are a helpful assistant that translates english to pirate." - system_message_prompt = langchain.prompts.chat.SystemMessagePromptTemplate.from_template(template) - example_human = langchain.prompts.chat.HumanMessagePromptTemplate.from_template("Hi") - example_ai = langchain.prompts.chat.AIMessagePromptTemplate.from_template("Argh me mateys") - human_template = "{text}" - human_message_prompt = langchain.prompts.chat.HumanMessagePromptTemplate.from_template(human_template) - chat_prompt = langchain.prompts.chat.ChatPromptTemplate.from_messages( - [system_message_prompt, example_human, example_ai, human_message_prompt] - ) - chain = langchain.chains.LLMChain(llm=chat, prompt=chat_prompt) - chain.run("I love programming.") - assert str(exc_info.value) == "Mocked Error" - traces = mock_tracer.pop_traces() - chain_span = traces[0][0] - assert chain_span.get_tag("langchain.request.inputs.text") == "I love programming." - assert chain_span.get_tag("langchain.request.type") == "chain" - assert chain_span.get_tag("langchain.request.prompt") is None - - -@pytest.mark.snapshot -def test_pinecone_vectorstore_similarity_search(langchain, request_vcr): - """ - Test that calling a similarity search on a Pinecone vectorstore with langchain will - result in a 2-span trace with a vectorstore span and underlying OpenAI embedding interface span. - """ - import pinecone - - cassette_name = "openai_pinecone_similarity_search_39.yaml" if PY39 else "openai_pinecone_similarity_search.yaml" - with request_vcr.use_cassette(cassette_name): - pinecone.init( - api_key=os.getenv("PINECONE_API_KEY", ""), - environment=os.getenv("PINECONE_ENV", ""), - ) - embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002") - index = pinecone.Index(index_name="langchain-retrieval") - vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text") - vectorstore.similarity_search("Who was Alan Turing?", 1) - - -@pytest.mark.skipif(PY39, reason="Cassette specific to Python 3.10+") -@pytest.mark.snapshot -def test_pinecone_vectorstore_retrieval_chain(langchain, request_vcr): - """ - Test that calling a similarity search on a Pinecone vectorstore with langchain will - result in a 2-span trace with a vectorstore span and underlying OpenAI embedding interface span. - """ - import pinecone - - with request_vcr.use_cassette("openai_pinecone_vectorstore_retrieval_chain.yaml"): - pinecone.init( - api_key=os.getenv("PINECONE_API_KEY", ""), - environment=os.getenv("PINECONE_ENV", ""), - ) - embed = langchain.embeddings.OpenAIEmbeddings() - index = pinecone.Index(index_name="langchain-retrieval") - vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text") - - llm = langchain.llms.OpenAI() - qa_with_sources = langchain.chains.RetrievalQAWithSourcesChain.from_chain_type( - llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever() - ) - qa_with_sources("Who was Alan Turing?") - - -@pytest.mark.skipif(not PY39, reason="Cassette specific to Python 3.9") -@pytest.mark.snapshot -def test_pinecone_vectorstore_retrieval_chain_39(langchain, request_vcr): - """ - Test that calling a similarity search on a Pinecone vectorstore with langchain will - result in a 2-span trace with a vectorstore span and underlying OpenAI embedding interface span. - """ - import pinecone - - with request_vcr.use_cassette("openai_pinecone_vectorstore_retrieval_chain_39.yaml"): - pinecone.init( - api_key=os.getenv("PINECONE_API_KEY", ""), - environment=os.getenv("PINECONE_ENV", ""), - ) - embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002") - index = pinecone.Index(index_name="langchain-retrieval") - vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text") - - llm = langchain.llms.OpenAI() - qa_with_sources = langchain.chains.RetrievalQAWithSourcesChain.from_chain_type( - llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever() - ) - qa_with_sources("Who was Alan Turing?") - - -def test_vectorstore_similarity_search_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer): - import pinecone - - cassette_name = "openai_pinecone_similarity_search_39.yaml" if PY39 else "openai_pinecone_similarity_search.yaml" - with request_vcr.use_cassette(cassette_name): - pinecone.init( - api_key=os.getenv("PINECONE_API_KEY", ""), - environment=os.getenv("PINECONE_ENV", ""), - ) - embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002") - index = pinecone.Index(index_name="langchain-retrieval") - vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text") - vectorstore.similarity_search("Who was Alan Turing?", 1) - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.langchain", - "langchain.request.provider:pinecone", - "langchain.request.model:", - "langchain.request.type:similarity_search", - "langchain.request.api_key:...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [mock.call.distribution("request.duration", mock.ANY, tags=expected_tags)], - any_order=True, - ) - mock_logs.assert_not_called() - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_vectorstore_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer): - import pinecone - - cassette_name = "openai_pinecone_similarity_search_39.yaml" if PY39 else "openai_pinecone_similarity_search.yaml" - with request_vcr.use_cassette(cassette_name): - pinecone.init( - api_key=os.getenv("PINECONE_API_KEY", ""), - environment=os.getenv("PINECONE_ENV", ""), - ) - embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002") - index = pinecone.Index(index_name="langchain-retrieval") - vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text") - vectorstore.similarity_search("Who was Alan Turing?", 1) - traces = mock_tracer.pop_traces() - vectorstore_span = traces[0][0] - embeddings_span = traces[0][1] - - assert mock_logs.enqueue.call_count == 2 # This operation includes 1 vectorstore call and 1 embeddings call - mock_logs.assert_has_calls( - [ - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": "sampled langchain.embeddings.openai.OpenAIEmbeddings", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-embedding-ada-002,langchain.request.type:embedding,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(embeddings_span.trace_id)[2:], - "dd.span_id": str(embeddings_span.span_id), - "inputs": ["Who was Alan Turing?"], - } - ), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": "sampled langchain.vectorstores.pinecone.Pinecone", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "info", - "ddtags": "env:,version:,langchain.request.provider:pinecone,langchain.request.model:,langchain.request.type:similarity_search,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(vectorstore_span.trace_id)[2:], - "dd.span_id": str(vectorstore_span.span_id), - "query": "Who was Alan Turing?", - "k": 1, - "documents": mock.ANY, - } - ), - ] - ) - mock_metrics.increment.assert_not_called() - mock_metrics.distribution.assert_not_called() - mock_metrics.count.assert_not_called() - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_llm_logs_when_response_not_completed( - langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer -): - """Test that errors get logged even if the response is not returned.""" - with mock.patch("langchain.llms.openai.OpenAI._generate", side_effect=Exception("Mocked Error")): - with pytest.raises(Exception) as exc_info: - llm = langchain.llms.OpenAI(model="text-davinci-003") - llm("Can you please not return an error?") - assert str(exc_info.value) == "Mocked Error" - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.enqueue.assert_called_with( - { - "timestamp": mock.ANY, - "message": "sampled langchain.llms.openai.OpenAI", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "error", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(trace_id)[2:], - "dd.span_id": str(span_id), - "prompts": ["Can you please not return an error?"], - "choices": [], - } - ) - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_chat_model_logs_when_response_not_completed( - langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer -): - """Test that errors get logged even if the response is not returned.""" - with mock.patch("langchain.chat_models.openai.ChatOpenAI._generate", side_effect=Exception("Mocked Error")): - with pytest.raises(Exception) as exc_info: - chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256) - chat([langchain.schema.HumanMessage(content="Can you please not return an error?")]) - assert str(exc_info.value) == "Mocked Error" - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.enqueue.assert_called_with( - { - "timestamp": mock.ANY, - "message": "sampled langchain.chat_models.openai.ChatOpenAI", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "error", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:gpt-3.5-turbo,langchain.request.type:chat_model,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(trace_id)[2:], - "dd.span_id": str(span_id), - "messages": [[{"content": "Can you please not return an error?", "message_type": "HumanMessage"}]], - "choices": [], - } - ) - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_embedding_logs_when_response_not_completed( - langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer -): - """Test that errors get logged even if the response is not returned.""" - with mock.patch( - "langchain.embeddings.openai.OpenAIEmbeddings._embedding_func", - side_effect=Exception("Mocked Error"), - ): - with pytest.raises(Exception) as exc_info: - embeddings = langchain.embeddings.OpenAIEmbeddings() - embeddings.embed_query("Can you please not return an error?") - assert str(exc_info.value) == "Mocked Error" - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.enqueue.assert_called_with( - { - "timestamp": mock.ANY, - "message": "sampled langchain.embeddings.openai.OpenAIEmbeddings", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "error", - "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-embedding-ada-002,langchain.request.type:embedding,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(trace_id)[2:], - "dd.span_id": str(span_id), - "inputs": ["Can you please not return an error?"], - } - ) - - -@pytest.mark.parametrize( - "ddtrace_config_langchain", - [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)], -) -def test_vectorstore_logs_error(langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer): - """Test that errors get logged even if the response is not returned.""" - with mock.patch( - "langchain.embeddings.openai.OpenAIEmbeddings._embedding_func", - side_effect=Exception("Mocked Error"), - ): - with pytest.raises(Exception) as exc_info: - import pinecone - - pinecone.init( - api_key=os.getenv("PINECONE_API_KEY", ""), - environment=os.getenv("PINECONE_ENV", ""), - ) - embed = langchain.embeddings.OpenAIEmbeddings( - model="text-embedding-ada-002", openai_api_key=os.getenv("OPENAI_API_KEY", "") - ) - index = pinecone.Index(index_name="langchain-retrieval") - vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text") - vectorstore.similarity_search("Can you please not return an error?", 1) - assert str(exc_info.value) == "Mocked Error" - traces = mock_tracer.pop_traces() - vectorstore_span = traces[0][0] - assert mock_logs.enqueue.call_count == 2 # This operation includes 1 vectorstore call and 1 embeddings call - mock_logs.enqueue.assert_called_with( - { - "timestamp": mock.ANY, - "message": "sampled langchain.vectorstores.pinecone.Pinecone", - "hostname": mock.ANY, - "ddsource": "langchain", - "service": "tests.contrib.langchain", - "status": "error", - "ddtags": "env:,version:,langchain.request.provider:pinecone,langchain.request.model:,langchain.request.type:similarity_search,langchain.request.api_key:...key>", # noqa: E501 - "dd.trace_id": hex(vectorstore_span.trace_id)[2:], - "dd.span_id": str(vectorstore_span.span_id), - "query": "Can you please not return an error?", - "k": 1, - "documents": [], - } - ) diff --git a/tests/contrib/langchain/test_langchain_patch.py b/tests/contrib/langchain/test_langchain_patch.py index 10df4ab60e9..56c1697179f 100644 --- a/tests/contrib/langchain/test_langchain_patch.py +++ b/tests/contrib/langchain/test_langchain_patch.py @@ -1,6 +1,5 @@ from ddtrace.contrib.internal.langchain.constants import text_embedding_models from ddtrace.contrib.internal.langchain.constants import vectorstore_classes -from ddtrace.contrib.internal.langchain.patch import PATCH_LANGCHAIN_V0 from ddtrace.contrib.internal.langchain.patch import get_version from ddtrace.contrib.internal.langchain.patch import patch from ddtrace.contrib.internal.langchain.patch import unpatch @@ -15,36 +14,27 @@ class TestLangchainPatch(PatchTestCase.Base): __get_version__ = get_version def assert_module_patched(self, langchain): - if PATCH_LANGCHAIN_V0: - gated_langchain = langchain - self.assert_wrapped(langchain.llms.base.BaseLLM.generate) - self.assert_wrapped(langchain.llms.base.BaseLLM.agenerate) - self.assert_wrapped(langchain.chat_models.base.BaseChatModel.generate) - self.assert_wrapped(langchain.chat_models.base.BaseChatModel.agenerate) - self.assert_wrapped(langchain.chains.base.Chain.__call__) - self.assert_wrapped(langchain.chains.base.Chain.acall) - else: - try: - import langchain_community as gated_langchain - except ImportError: - gated_langchain = None + try: + import langchain_community as gated_langchain + except ImportError: + gated_langchain = None - import langchain_core - import langchain_openai - import langchain_pinecone + import langchain_core + import langchain_openai + import langchain_pinecone - self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.generate) - self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) - self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) - self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) - self.assert_wrapped(langchain.chains.base.Chain.invoke) - self.assert_wrapped(langchain.chains.base.Chain.ainvoke) - self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) - self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) - self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.batch) - self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.abatch) - self.assert_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents) - self.assert_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search) + self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.generate) + self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) + self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) + self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) + self.assert_wrapped(langchain.chains.base.Chain.invoke) + self.assert_wrapped(langchain.chains.base.Chain.ainvoke) + self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) + self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) + self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.batch) + self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.abatch) + self.assert_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents) + self.assert_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search) if not gated_langchain: return @@ -59,43 +49,31 @@ def assert_module_patched(self, langchain): self.assert_wrapped(vectorstore_interface.similarity_search) def assert_not_module_patched(self, langchain): - if PATCH_LANGCHAIN_V0: - from langchain import embeddings # noqa: F401 - from langchain import vectorstores # noqa: F401 + from langchain import chains # noqa: F401 + from langchain.chains import base # noqa: F401 - gated_langchain = langchain - self.assert_not_wrapped(langchain.llms.base.BaseLLM.generate) - self.assert_not_wrapped(langchain.llms.base.BaseLLM.agenerate) - self.assert_not_wrapped(langchain.chat_models.base.BaseChatModel.generate) - self.assert_not_wrapped(langchain.chat_models.base.BaseChatModel.agenerate) - self.assert_not_wrapped(langchain.chains.base.Chain.__call__) - self.assert_not_wrapped(langchain.chains.base.Chain.acall) - else: - from langchain import chains # noqa: F401 - from langchain.chains import base # noqa: F401 + try: + import langchain_community as gated_langchain + from langchain_community import embeddings # noqa: F401 + from langchain_community import vectorstores # noqa: F401 + except ImportError: + gated_langchain = None + import langchain_core + import langchain_openai + import langchain_pinecone - try: - import langchain_community as gated_langchain - from langchain_community import embeddings # noqa: F401 - from langchain_community import vectorstores # noqa: F401 - except ImportError: - gated_langchain = None - import langchain_core - import langchain_openai - import langchain_pinecone - - self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.generate) - self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) - self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) - self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) - self.assert_not_wrapped(langchain.chains.base.Chain.invoke) - self.assert_not_wrapped(langchain.chains.base.Chain.ainvoke) - self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) - self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) - self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.batch) - self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.abatch) - self.assert_not_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents) - self.assert_not_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search) + self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.generate) + self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) + self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) + self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) + self.assert_not_wrapped(langchain.chains.base.Chain.invoke) + self.assert_not_wrapped(langchain.chains.base.Chain.ainvoke) + self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) + self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) + self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.batch) + self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.abatch) + self.assert_not_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents) + self.assert_not_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search) if not gated_langchain: return @@ -110,37 +88,28 @@ def assert_not_module_patched(self, langchain): self.assert_not_wrapped(vectorstore_interface.similarity_search) def assert_not_module_double_patched(self, langchain): - if PATCH_LANGCHAIN_V0: - gated_langchain = langchain - self.assert_not_double_wrapped(langchain.llms.base.BaseLLM.generate) - self.assert_not_double_wrapped(langchain.llms.base.BaseLLM.agenerate) - self.assert_not_double_wrapped(langchain.chat_models.base.BaseChatModel.generate) - self.assert_not_double_wrapped(langchain.chat_models.base.BaseChatModel.agenerate) - self.assert_not_double_wrapped(langchain.chains.base.Chain.__call__) - self.assert_not_double_wrapped(langchain.chains.base.Chain.acall) - else: - from langchain.chains import base # noqa: F401 + from langchain.chains import base # noqa: F401 - try: - import langchain_community as gated_langchain - except ImportError: - gated_langchain = None - import langchain_core - import langchain_openai - import langchain_pinecone + try: + import langchain_community as gated_langchain + except ImportError: + gated_langchain = None + import langchain_core + import langchain_openai + import langchain_pinecone - self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.generate) - self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) - self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) - self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) - self.assert_not_double_wrapped(langchain.chains.base.Chain.invoke) - self.assert_not_double_wrapped(langchain.chains.base.Chain.ainvoke) - self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) - self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) - self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.batch) - self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.abatch) - self.assert_not_double_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents) - self.assert_not_double_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search) + self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.generate) + self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) + self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) + self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) + self.assert_not_double_wrapped(langchain.chains.base.Chain.invoke) + self.assert_not_double_wrapped(langchain.chains.base.Chain.ainvoke) + self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) + self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) + self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.batch) + self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.abatch) + self.assert_not_double_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents) + self.assert_not_double_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search) if not gated_langchain: return From 58b4dfa6d603317da20ffcfb38786dddb5985727 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 29 Jan 2025 16:34:00 -0500 Subject: [PATCH 12/63] chore(tracing): avoid using deprecated code internally [3.0] (#12113) Ensures deprecated tracing attributes are not used in ddtrace internals and tests. We should not log deprecation warnings when the tracer is used in an expected way. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- benchmarks/ddtrace_run/scenario.py | 2 +- benchmarks/otel_span/scenario.py | 2 +- benchmarks/span/scenario.py | 2 +- benchmarks/threading/scenario.py | 2 +- benchmarks/tracer/scenario.py | 2 +- ddtrace/_trace/_span_link.py | 2 +- ddtrace/_trace/pin.py | 20 +-- ddtrace/_trace/sampler.py | 4 +- ddtrace/_trace/trace_handlers.py | 2 +- ddtrace/_trace/tracer.py | 2 +- .../utils_botocore/aws_payload_tagging.py | 2 +- ddtrace/_trace/utils_botocore/span_tags.py | 2 +- ddtrace/appsec/_asm_request_context.py | 6 +- ddtrace/appsec/_capabilities.py | 4 +- .../_exploit_prevention/stack_traces.py | 4 +- ddtrace/appsec/_iast/_iast_request_context.py | 2 +- ddtrace/appsec/_iast/processor.py | 2 +- ddtrace/appsec/_iast/taint_sinks/_base.py | 2 +- ddtrace/appsec/_processor.py | 2 +- ddtrace/appsec/_remoteconfiguration.py | 6 +- ddtrace/appsec/_trace_utils.py | 4 +- ddtrace/bootstrap/preload.py | 2 +- ddtrace/context.py | 2 +- ddtrace/contrib/aiohttp/__init__.py | 2 +- ddtrace/contrib/bottle/__init__.py | 2 +- ddtrace/contrib/cherrypy/__init__.py | 4 +- ddtrace/contrib/falcon/__init__.py | 4 +- ddtrace/contrib/flask_cache/__init__.py | 8 +- ddtrace/contrib/gevent/__init__.py | 3 +- ddtrace/contrib/internal/asgi/middleware.py | 2 +- ddtrace/contrib/internal/asyncio/provider.py | 2 +- .../contrib/internal/avro/schema_iterator.py | 2 +- ddtrace/contrib/internal/aws_lambda/patch.py | 2 +- ddtrace/contrib/internal/cassandra/session.py | 2 +- ddtrace/contrib/internal/celery/utils.py | 2 +- ddtrace/contrib/internal/django/utils.py | 2 +- ddtrace/contrib/internal/dramatiq/patch.py | 2 +- ddtrace/contrib/internal/falcon/patch.py | 2 +- ddtrace/contrib/internal/flask_cache/patch.py | 2 +- ddtrace/contrib/internal/futures/threading.py | 2 +- ddtrace/contrib/internal/gevent/provider.py | 2 +- ddtrace/contrib/internal/graphql/patch.py | 2 +- .../internal/grpc/aio_client_interceptor.py | 2 +- .../internal/grpc/aio_server_interceptor.py | 2 +- ddtrace/contrib/internal/langchain/patch.py | 2 +- ddtrace/contrib/internal/langgraph/patch.py | 2 +- ddtrace/contrib/internal/logging/patch.py | 2 +- ddtrace/contrib/internal/mongoengine/trace.py | 2 +- .../internal/protobuf/schema_iterator.py | 5 +- ddtrace/contrib/internal/pylibmc/client.py | 2 +- ddtrace/contrib/internal/pymemcache/patch.py | 2 +- ddtrace/contrib/internal/pytest/plugin.py | 2 +- ddtrace/contrib/internal/selenium/patch.py | 6 +- ddtrace/contrib/internal/sqlalchemy/engine.py | 6 +- ddtrace/contrib/internal/starlette/patch.py | 2 +- .../contrib/internal/tornado/application.py | 2 +- .../contrib/internal/tornado/stack_context.py | 2 +- ddtrace/contrib/internal/trace_utils.py | 10 +- ddtrace/contrib/internal/unittest/patch.py | 33 ++--- ddtrace/contrib/internal/wsgi/wsgi.py | 4 +- ddtrace/contrib/logging/__init__.py | 2 +- ddtrace/contrib/tornado/__init__.py | 2 +- ddtrace/debugging/_debugger.py | 2 +- ddtrace/debugging/_exception/replay.py | 2 +- ddtrace/debugging/_origin/span.py | 2 +- ddtrace/debugging/_signal/model.py | 4 +- ddtrace/debugging/_signal/tracing.py | 2 +- ddtrace/ext/aws.py | 2 +- ddtrace/ext/test_visibility/api.py | 4 +- ddtrace/internal/ci_visibility/api/_base.py | 6 +- ddtrace/internal/ci_visibility/coverage.py | 2 +- ddtrace/internal/ci_visibility/filters.py | 2 +- ddtrace/internal/ci_visibility/git_client.py | 2 +- ddtrace/internal/ci_visibility/recorder.py | 2 +- ddtrace/internal/ci_visibility/utils.py | 4 +- ddtrace/internal/core/__init__.py | 2 +- ddtrace/internal/debug.py | 2 +- ddtrace/internal/opentelemetry/context.py | 2 +- ddtrace/internal/opentelemetry/span.py | 2 +- ddtrace/internal/opentelemetry/trace.py | 4 +- ddtrace/internal/processor/stats.py | 2 +- ddtrace/internal/remoteconfig/_pubsub.py | 2 +- ddtrace/internal/remoteconfig/_subscribers.py | 2 +- ddtrace/internal/runtime/runtime_metrics.py | 4 +- ddtrace/internal/test_visibility/_utils.py | 2 +- ddtrace/internal/test_visibility/api.py | 4 +- ddtrace/internal/tracemethods.py | 2 +- ddtrace/internal/writer/writer.py | 2 +- ddtrace/llmobs/_evaluators/runner.py | 2 +- ddtrace/llmobs/_integrations/anthropic.py | 2 +- ddtrace/llmobs/_integrations/base.py | 2 +- ddtrace/llmobs/_integrations/bedrock.py | 2 +- ddtrace/llmobs/_integrations/gemini.py | 2 +- ddtrace/llmobs/_integrations/langchain.py | 2 +- ddtrace/llmobs/_integrations/langgraph.py | 4 +- ddtrace/llmobs/_integrations/openai.py | 2 +- ddtrace/llmobs/_integrations/vertexai.py | 2 +- ddtrace/llmobs/_llmobs.py | 6 +- ddtrace/llmobs/_utils.py | 2 +- ddtrace/opentracer/span.py | 6 +- ddtrace/opentracer/span_context.py | 2 +- ddtrace/opentracer/tracer.py | 6 +- ddtrace/profiling/collector/_lock.py | 2 +- ddtrace/profiling/collector/pytorch.py | 2 +- ddtrace/profiling/collector/stack.pyi | 2 +- ddtrace/profiling/collector/stack.pyx | 2 +- ddtrace/profiling/exporter/http.py | 2 +- ddtrace/profiling/scheduler.py | 2 +- ddtrace/propagation/_database_monitoring.py | 2 +- ddtrace/propagation/http.py | 4 +- ddtrace/runtime/__init__.py | 2 +- ddtrace/span.py | 2 +- ddtrace/trace/__init__.py | 2 + docs/advanced_usage.rst | 30 ++--- docs/api.rst | 8 +- docs/basic_usage.rst | 12 +- docs/troubleshooting.rst | 2 +- ...ated-apis-internally-fd9c9ce9c52905af.yaml | 5 + scripts/profiles/flask-simple/app/app.py | 4 +- templates/integration/__init__.py | 2 +- .../appsec/appsec/test_appsec_trace_utils.py | 2 +- tests/appsec/appsec/test_processor.py | 2 +- tests/appsec/appsec/test_telemetry.py | 2 +- .../contrib_appsec/django_app/settings.py | 2 +- .../appsec/contrib_appsec/django_app/urls.py | 2 +- .../appsec/contrib_appsec/fastapi_app/app.py | 2 +- tests/appsec/contrib_appsec/flask_app/app.py | 3 +- .../fixtures/integration/main_configure.py | 2 +- .../integration/main_configure_right.py | 2 +- .../integration/main_configure_wrong.py | 2 +- .../iast_tdd_propagation/flask_orm_app.py | 2 +- .../flask_propagation_views.py | 2 +- .../flask_taint_sinks_views.py | 2 +- .../integrations/django_tests/conftest.py | 2 +- .../django_tests/django_app/settings.py | 2 +- .../django_tests/django_app/urls.py | 2 +- .../django_tests/django_app/views.py | 2 +- .../flask_tests/test_flask_remoteconfig.py | 2 +- tests/appsec/utils.py | 4 +- tests/ci_visibility/api_client/_util.py | 2 +- tests/ci_visibility/test_ci_visibility.py | 8 +- ...st_ci_visibility_check_enabled_features.py | 2 +- tests/ci_visibility/test_encoder.py | 2 +- tests/ci_visibility/util.py | 2 +- tests/commands/ddtrace_run_disabled.py | 2 +- tests/commands/ddtrace_run_dogstatsd.py | 2 +- tests/commands/ddtrace_run_enabled.py | 2 +- tests/commands/ddtrace_run_global_tags.py | 2 +- tests/commands/ddtrace_run_hostname.py | 2 +- .../aiohttp_jinja2/test_aiohttp_jinja2.py | 2 +- tests/contrib/aiomysql/test_aiomysql.py | 2 +- tests/contrib/asyncio/test_lazyimport.py | 2 +- tests/contrib/asyncio/test_propagation.py | 2 +- tests/contrib/asyncpg/test_asyncpg.py | 2 +- tests/contrib/aws_lambda/handlers.py | 2 +- tests/contrib/celery/test_integration.py | 2 +- tests/contrib/celery/test_utils.py | 2 +- tests/contrib/dbapi/test_dbapi.py | 2 +- tests/contrib/dbapi_async/test_dbapi_async.py | 2 +- tests/contrib/django/django_app/settings.py | 2 +- tests/contrib/django/django_app/urls.py | 2 +- tests/contrib/django/views.py | 2 +- tests/contrib/flask/app.py | 4 +- tests/contrib/flask/test_flask_appsec.py | 2 +- tests/contrib/flask_cache/test_utils.py | 2 +- tests/contrib/freezegun/test_freezegun.py | 4 +- tests/contrib/gevent/test_tracer.py | 2 +- tests/contrib/graphql/test_graphql.py | 2 +- tests/contrib/grpc/test_grpc.py | 2 +- tests/contrib/gunicorn/wsgi_mw_app.py | 2 +- tests/contrib/kafka/test_kafka.py | 2 +- tests/contrib/langgraph/conftest.py | 2 +- tests/contrib/logbook/test_logbook_logging.py | 8 +- tests/contrib/loguru/test_loguru_logging.py | 14 +-- tests/contrib/openai/conftest.py | 2 +- tests/contrib/pyramid/app/app.py | 2 +- .../pyramid/pserve_app/app/__init__.py | 2 +- tests/contrib/pytest/test_pytest.py | 4 +- tests/contrib/redis/test_redis_asyncio.py | 2 +- tests/contrib/sanic/run_server.py | 2 +- tests/contrib/snowflake/test_snowflake.py | 2 +- .../structlog/test_structlog_logging.py | 12 +- tests/contrib/tornado/test_config.py | 2 +- tests/contrib/tornado/test_stack_context.py | 2 +- tests/integration/test_context_snapshots.py | 2 +- tests/integration/test_debug.py | 28 ++--- tests/integration/test_encoding.py | 2 +- tests/integration/test_integration.py | 44 +++---- .../test_integration_civisibility.py | 2 +- .../integration/test_integration_snapshots.py | 18 +-- tests/integration/test_priority_sampling.py | 8 +- tests/integration/test_propagation.py | 2 +- tests/integration/test_sampling.py | 8 +- tests/integration/test_trace_stats.py | 6 +- tests/integration/utils.py | 2 +- tests/internal/peer_service/test_processor.py | 2 +- tests/internal/service_name/test_processor.py | 2 +- tests/internal/test_database_monitoring.py | 10 +- tests/llmobs/_utils.py | 2 +- tests/llmobs/test_llmobs_evaluator_runner.py | 2 +- tests/llmobs/test_llmobs_ragas_evaluators.py | 2 +- tests/llmobs/test_llmobs_service.py | 2 +- tests/llmobs/test_propagation.py | 12 +- .../opentracer/core/test_dd_compatibility.py | 2 +- tests/opentracer/core/test_tracer.py | 2 +- tests/profiling/collector/conftest.py | 2 +- tests/profiling/collector/test_stack.py | 2 +- tests/profiling/test_profiler.py | 12 +- tests/profiling_v2/collector/conftest.py | 2 +- .../collector/test_stack_asyncio.py | 2 +- tests/telemetry/test_telemetry.py | 4 +- tests/telemetry/test_telemetry_metrics_e2e.py | 2 +- tests/tracer/runtime/test_runtime_metrics.py | 2 +- tests/tracer/test_context.py | 4 +- tests/tracer/test_correlation_log_context.py | 20 +-- tests/tracer/test_encoders.py | 8 +- tests/tracer/test_filters.py | 2 +- tests/tracer/test_gitmetadata.py | 18 +-- tests/tracer/test_memory_leak.py | 6 +- tests/tracer/test_processors.py | 6 +- tests/tracer/test_propagation.py | 18 +-- tests/tracer/test_rand.py | 4 +- tests/tracer/test_sampler.py | 6 +- .../tracer/test_single_span_sampling_rules.py | 2 +- tests/tracer/test_span.py | 2 +- tests/tracer/test_trace_utils.py | 14 +-- tests/tracer/test_tracer.py | 114 +++++++++--------- tests/tracer/test_utils.py | 2 +- tests/tracer/test_writer.py | 2 +- tests/utils.py | 22 ++-- tests/webclient.py | 2 +- 231 files changed, 522 insertions(+), 507 deletions(-) create mode 100644 releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml diff --git a/benchmarks/ddtrace_run/scenario.py b/benchmarks/ddtrace_run/scenario.py index 72173b4773f..3318158c194 100644 --- a/benchmarks/ddtrace_run/scenario.py +++ b/benchmarks/ddtrace_run/scenario.py @@ -32,7 +32,7 @@ def run(self): env["DD_TRACE_API_VERSION"] = "v0.4" code += """ import httpretty -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.internal.telemetry import telemetry_writer httpretty.enable(allow_net_connect=False) diff --git a/benchmarks/otel_span/scenario.py b/benchmarks/otel_span/scenario.py index 8d0c9171cc1..7f1b544ee64 100644 --- a/benchmarks/otel_span/scenario.py +++ b/benchmarks/otel_span/scenario.py @@ -6,8 +6,8 @@ from opentelemetry.trace import set_tracer_provider from ddtrace import config -from ddtrace import tracer from ddtrace.opentelemetry import TracerProvider # Requires ``ddtrace>=1.11`` +from ddtrace.trace import tracer set_tracer_provider(TracerProvider()) diff --git a/benchmarks/span/scenario.py b/benchmarks/span/scenario.py index 8b0c18dd612..c0e02de7ad6 100644 --- a/benchmarks/span/scenario.py +++ b/benchmarks/span/scenario.py @@ -2,7 +2,7 @@ import bm.utils as utils from ddtrace import config -from ddtrace import tracer +from ddtrace.trace import tracer class Span(Scenario): diff --git a/benchmarks/threading/scenario.py b/benchmarks/threading/scenario.py index 8b66cf21127..0b4adfead07 100644 --- a/benchmarks/threading/scenario.py +++ b/benchmarks/threading/scenario.py @@ -39,7 +39,7 @@ def create_trace(self, tracer: Tracer) -> None: random.random() def run(self) -> Generator[Callable[[int], None], None, None]: - from ddtrace import tracer + from ddtrace.trace import tracer # configure global tracer to drop traces rather tracer.configure(writer=NoopWriter()) diff --git a/benchmarks/tracer/scenario.py b/benchmarks/tracer/scenario.py index ea1ae093637..704f08ba9b7 100644 --- a/benchmarks/tracer/scenario.py +++ b/benchmarks/tracer/scenario.py @@ -8,7 +8,7 @@ class Tracer(bm.Scenario): def run(self): # configure global tracer to drop traces rather than encoded and sent to # an agent - from ddtrace import tracer + from ddtrace.trace import tracer utils.drop_traces(tracer) utils.drop_telemetry_events() diff --git a/ddtrace/_trace/_span_link.py b/ddtrace/_trace/_span_link.py index f635af38207..83087ec56c3 100644 --- a/ddtrace/_trace/_span_link.py +++ b/ddtrace/_trace/_span_link.py @@ -15,7 +15,7 @@ SpanLinks can be set using :meth:`ddtrace.Span.link_span(...)` Ex:: - from ddtrace import tracer + from ddtrace.trace import tracer s1 = tracer.trace("s1") s2 = tracer.trace("s2") diff --git a/ddtrace/_trace/pin.py b/ddtrace/_trace/pin.py index 7dd83474749..dd41a1040a1 100644 --- a/ddtrace/_trace/pin.py +++ b/ddtrace/_trace/pin.py @@ -44,7 +44,7 @@ def __init__( # type: (...) -> None if tracer is not None and tracer is not ddtrace.tracer: deprecate( - "Initializing ddtrace.Pin with `tracer` argument is deprecated", + "Initializing ddtrace.trace.Pin with `tracer` argument is deprecated", message="All Pin instances should use the global tracer instance", removal_version="3.0.0", ) @@ -79,15 +79,15 @@ def __repr__(self): def _find(*objs): # type: (Any) -> Optional[Pin] """ - Return the first :class:`ddtrace.pin.Pin` found on any of the provided objects or `None` if none were found + Return the first :class:`ddtrace.trace.Pin` found on any of the provided objects or `None` if none were found >>> pin = Pin._find(wrapper, instance, conn) - :param objs: The objects to search for a :class:`ddtrace.pin.Pin` on + :param objs: The objects to search for a :class:`ddtrace.trace.Pin` on :type objs: List of objects - :rtype: :class:`ddtrace.pin.Pin`, None - :returns: The first found :class:`ddtrace.pin.Pin` or `None` is none was found + :rtype: :class:`ddtrace.trace.Pin`, None + :returns: The first found :class:`ddtrace.trace.Pin` or `None` is none was found """ for obj in objs: pin = Pin.get_from(obj) @@ -105,10 +105,10 @@ def get_from(obj): >>> pin = Pin.get_from(conn) - :param obj: The object to look for a :class:`ddtrace.pin.Pin` on + :param obj: The object to look for a :class:`ddtrace.trace.Pin` on :type obj: object - :rtype: :class:`ddtrace.pin.Pin`, None - :returns: :class:`ddtrace.pin.Pin` associated with the object, or None if none was found + :rtype: :class:`ddtrace.trace.Pin`, None + :returns: :class:`ddtrace.trace.Pin` associated with the object, or None if none was found """ if hasattr(obj, "__getddpin__"): return obj.__getddpin__() @@ -141,7 +141,7 @@ def override( """ if tracer is not None: deprecate( - "Calling ddtrace.Pin.override(...) with the `tracer` argument is deprecated", + "Calling ddtrace.trace.Pin.override(...) with the `tracer` argument is deprecated", message="All Pin instances should use the global tracer instance", removal_version="3.0.0", ) @@ -208,7 +208,7 @@ def clone( if tracer is not None: deprecate( - "Initializing ddtrace.Pin with `tracer` argument is deprecated", + "Initializing ddtrace.trace.Pin with `tracer` argument is deprecated", message="All Pin instances should use the global tracer instance", removal_version="3.0.0", ) diff --git a/ddtrace/_trace/sampler.py b/ddtrace/_trace/sampler.py index 96d61b9adcf..4bf3d1891c1 100644 --- a/ddtrace/_trace/sampler.py +++ b/ddtrace/_trace/sampler.py @@ -261,7 +261,9 @@ def __init__( if isinstance(rule, SamplingRule): self.rules.append(rule) elif config._raise: - raise TypeError("Rule {!r} must be a sub-class of type ddtrace.sampler.SamplingRules".format(rule)) + raise TypeError( + "Rule {!r} must be a sub-class of type ddtrace._trace.sampler.SamplingRules".format(rule) + ) # DEV: sampling rule must come last if effective_sample_rate is not None: diff --git a/ddtrace/_trace/trace_handlers.py b/ddtrace/_trace/trace_handlers.py index dab3f743146..89e31fa4e97 100644 --- a/ddtrace/_trace/trace_handlers.py +++ b/ddtrace/_trace/trace_handlers.py @@ -39,7 +39,7 @@ if TYPE_CHECKING: - from ddtrace import Span + from ddtrace._trace.span import Span log = get_logger(__name__) diff --git a/ddtrace/_trace/tracer.py b/ddtrace/_trace/tracer.py index 6e595bbe7c1..87f312bb18c 100644 --- a/ddtrace/_trace/tracer.py +++ b/ddtrace/_trace/tracer.py @@ -189,7 +189,7 @@ class Tracer(object): If you're running an application that will serve a single trace per thread, you can use the global tracer instance:: - from ddtrace import tracer + from ddtrace.trace import tracer trace = tracer.trace('app.request', 'web-server').finish() """ diff --git a/ddtrace/_trace/utils_botocore/aws_payload_tagging.py b/ddtrace/_trace/utils_botocore/aws_payload_tagging.py index dadb6749a12..6886b66db73 100644 --- a/ddtrace/_trace/utils_botocore/aws_payload_tagging.py +++ b/ddtrace/_trace/utils_botocore/aws_payload_tagging.py @@ -5,8 +5,8 @@ from typing import Dict from typing import Optional -from ddtrace import Span from ddtrace import config +from ddtrace._trace.span import Span from ddtrace.vendor.jsonpath_ng import parse diff --git a/ddtrace/_trace/utils_botocore/span_tags.py b/ddtrace/_trace/utils_botocore/span_tags.py index f90cbd60a51..fb69b147b95 100644 --- a/ddtrace/_trace/utils_botocore/span_tags.py +++ b/ddtrace/_trace/utils_botocore/span_tags.py @@ -3,8 +3,8 @@ from typing import Dict from typing import Optional -from ddtrace import Span from ddtrace import config +from ddtrace._trace.span import Span from ddtrace._trace.utils_botocore.aws_payload_tagging import AWSPayloadTagging from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY from ddtrace.constants import _SPAN_MEASURED_KEY diff --git a/ddtrace/appsec/_asm_request_context.py b/ddtrace/appsec/_asm_request_context.py index ff398d56b14..950015b3f80 100644 --- a/ddtrace/appsec/_asm_request_context.py +++ b/ddtrace/appsec/_asm_request_context.py @@ -12,7 +12,6 @@ from typing import Union from urllib import parse -from ddtrace._trace.span import Span from ddtrace.appsec._constants import APPSEC from ddtrace.appsec._constants import EXPLOIT_PREVENTION from ddtrace.appsec._constants import SPAN_DATA_NAMES @@ -27,6 +26,7 @@ from ddtrace.internal.constants import REQUEST_PATH_PARAMS from ddtrace.internal.logger import get_logger from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import Span if TYPE_CHECKING: @@ -63,7 +63,7 @@ class ASM_Environment: """ def __init__(self, span: Optional[Span] = None): - from ddtrace import tracer + from ddtrace.trace import tracer self.root = not in_asm_context() if self.root: @@ -178,7 +178,7 @@ def update_span_metrics(span: Span, name: str, value: Union[float, int]) -> None def flush_waf_triggers(env: ASM_Environment) -> None: # Make sure we find a root span to attach the triggers to if env.span is None: - from ddtrace import tracer + from ddtrace.trace import tracer current_span = tracer.current_span() if current_span is None: diff --git a/ddtrace/appsec/_capabilities.py b/ddtrace/appsec/_capabilities.py index c999b61cb97..a080d739dfb 100644 --- a/ddtrace/appsec/_capabilities.py +++ b/ddtrace/appsec/_capabilities.py @@ -59,7 +59,7 @@ def _asm_feature_is_required() -> bool: return (_FEATURE_REQUIRED & flags) != 0 -def _rc_capabilities(test_tracer: Optional[ddtrace.Tracer] = None) -> Flags: +def _rc_capabilities(test_tracer: Optional[ddtrace.trace.Tracer] = None) -> Flags: tracer = ddtrace.tracer if test_tracer is None else test_tracer value = Flags(0) if ddtrace.config._remote_config_enabled: @@ -74,7 +74,7 @@ def _rc_capabilities(test_tracer: Optional[ddtrace.Tracer] = None) -> Flags: return value -def _appsec_rc_capabilities(test_tracer: Optional[ddtrace.Tracer] = None) -> str: +def _appsec_rc_capabilities(test_tracer: Optional[ddtrace.trace.Tracer] = None) -> str: r"""return the bit representation of the composed capabilities in base64 bit 0: Reserved bit 1: ASM 1-click Activation diff --git a/ddtrace/appsec/_exploit_prevention/stack_traces.py b/ddtrace/appsec/_exploit_prevention/stack_traces.py index 6c8db41f578..776ccad7f01 100644 --- a/ddtrace/appsec/_exploit_prevention/stack_traces.py +++ b/ddtrace/appsec/_exploit_prevention/stack_traces.py @@ -5,9 +5,9 @@ from typing import Iterable from typing import Optional -from ddtrace._trace.span import Span from ddtrace.appsec._constants import STACK_TRACE from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import Span def report_stack( @@ -33,7 +33,7 @@ def report_stack( return False if span is None: - from ddtrace import tracer + from ddtrace.trace import tracer span = tracer.current_span() diff --git a/ddtrace/appsec/_iast/_iast_request_context.py b/ddtrace/appsec/_iast/_iast_request_context.py index e9c985d0b3d..176dceea4de 100644 --- a/ddtrace/appsec/_iast/_iast_request_context.py +++ b/ddtrace/appsec/_iast/_iast_request_context.py @@ -3,7 +3,6 @@ from typing import Dict from typing import Optional -from ddtrace._trace.span import Span from ddtrace.appsec._constants import APPSEC from ddtrace.appsec._constants import IAST from ddtrace.appsec._iast import _is_iast_enabled @@ -18,6 +17,7 @@ from ddtrace.internal import core from ddtrace.internal.logger import get_logger from ddtrace.internal.utils.formats import asbool +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/appsec/_iast/processor.py b/ddtrace/appsec/_iast/processor.py index 9a5e906faae..a3bf70b031e 100644 --- a/ddtrace/appsec/_iast/processor.py +++ b/ddtrace/appsec/_iast/processor.py @@ -1,9 +1,9 @@ from dataclasses import dataclass from ddtrace._trace.processor import SpanProcessor -from ddtrace._trace.span import Span from ddtrace.ext import SpanTypes from ddtrace.internal.logger import get_logger +from ddtrace.trace import Span from ._iast_request_context import _iast_end_request from ._iast_request_context import _iast_start_request diff --git a/ddtrace/appsec/_iast/taint_sinks/_base.py b/ddtrace/appsec/_iast/taint_sinks/_base.py index a934c8c5788..93c5fdfc371 100644 --- a/ddtrace/appsec/_iast/taint_sinks/_base.py +++ b/ddtrace/appsec/_iast/taint_sinks/_base.py @@ -4,11 +4,11 @@ from typing import Optional from typing import Text -from ddtrace import tracer from ddtrace.appsec._deduplications import deduplication from ddtrace.appsec._trace_utils import _asm_manual_keep from ddtrace.internal.logger import get_logger from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import tracer from .._iast_request_context import get_iast_reporter from .._iast_request_context import is_iast_request_enabled diff --git a/ddtrace/appsec/_processor.py b/ddtrace/appsec/_processor.py index 6102ba1ded2..f144eba6458 100644 --- a/ddtrace/appsec/_processor.py +++ b/ddtrace/appsec/_processor.py @@ -14,7 +14,6 @@ import weakref from ddtrace._trace.processor import SpanProcessor -from ddtrace._trace.span import Span from ddtrace.appsec import _asm_request_context from ddtrace.appsec._constants import APPSEC from ddtrace.appsec._constants import DEFAULT @@ -35,6 +34,7 @@ from ddtrace.internal.logger import get_logger from ddtrace.internal.rate_limiter import RateLimiter from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/appsec/_remoteconfiguration.py b/ddtrace/appsec/_remoteconfiguration.py index 723710d7cc3..7f70f0aee33 100644 --- a/ddtrace/appsec/_remoteconfiguration.py +++ b/ddtrace/appsec/_remoteconfiguration.py @@ -5,7 +5,6 @@ from typing import Mapping from typing import Optional -from ddtrace import Tracer from ddtrace.appsec._capabilities import _asm_feature_is_required from ddtrace.appsec._constants import PRODUCTS from ddtrace.internal.logger import get_logger @@ -17,6 +16,7 @@ from ddtrace.internal.telemetry import telemetry_writer from ddtrace.internal.telemetry.constants import TELEMETRY_APM_PRODUCT from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import Tracer log = get_logger(__name__) @@ -109,7 +109,7 @@ def _appsec_rules_data(features: Mapping[str, Any], test_tracer: Optional[Tracer # Tracer is a parameter for testing propose # Import tracer here to avoid a circular import if test_tracer is None: - from ddtrace import tracer + from ddtrace.trace import tracer else: tracer = test_tracer @@ -198,7 +198,7 @@ def _appsec_1click_activation(features: Mapping[str, Any], test_tracer: Optional # Tracer is a parameter for testing propose # Import tracer here to avoid a circular import if test_tracer is None: - from ddtrace import tracer + from ddtrace.trace import tracer else: tracer = test_tracer diff --git a/ddtrace/appsec/_trace_utils.py b/ddtrace/appsec/_trace_utils.py index 56f34d81f99..87400183607 100644 --- a/ddtrace/appsec/_trace_utils.py +++ b/ddtrace/appsec/_trace_utils.py @@ -1,8 +1,6 @@ from typing import Optional -from ddtrace import Tracer from ddtrace import constants -from ddtrace._trace.span import Span from ddtrace.appsec import _asm_request_context from ddtrace.appsec._asm_request_context import call_waf_callback from ddtrace.appsec._asm_request_context import get_blocked @@ -18,6 +16,8 @@ from ddtrace.internal._exceptions import BlockingException from ddtrace.internal.logger import get_logger from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import Span +from ddtrace.trace import Tracer log = get_logger(__name__) diff --git a/ddtrace/bootstrap/preload.py b/ddtrace/bootstrap/preload.py index 95dc8f4cd55..7980b9bf746 100644 --- a/ddtrace/bootstrap/preload.py +++ b/ddtrace/bootstrap/preload.py @@ -15,7 +15,7 @@ from ddtrace.internal.utils.formats import asbool # noqa:F401 from ddtrace.internal.utils.formats import parse_tags_str # noqa:F401 from ddtrace.settings.crashtracker import config as crashtracker_config -from ddtrace import tracer +from ddtrace.trace import tracer import typing as t diff --git a/ddtrace/context.py b/ddtrace/context.py index 72640327d92..843ef510c38 100644 --- a/ddtrace/context.py +++ b/ddtrace/context.py @@ -1,5 +1,5 @@ -from ddtrace._trace.context import Context # noqa: F401 from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning +from ddtrace.trace import Context # noqa: F401 from ddtrace.vendor.debtcollector import deprecate diff --git a/ddtrace/contrib/aiohttp/__init__.py b/ddtrace/contrib/aiohttp/__init__.py index 3075ca744fa..2bb498bdf9c 100644 --- a/ddtrace/contrib/aiohttp/__init__.py +++ b/ddtrace/contrib/aiohttp/__init__.py @@ -47,7 +47,7 @@ the provided ``trace_app`` function must be used:: from aiohttp import web - from ddtrace import tracer, patch + from ddtrace.trace import tracer, patch from ddtrace.contrib.aiohttp import trace_app # create your application diff --git a/ddtrace/contrib/bottle/__init__.py b/ddtrace/contrib/bottle/__init__.py index 12d046d8128..5ee1de17f3d 100644 --- a/ddtrace/contrib/bottle/__init__.py +++ b/ddtrace/contrib/bottle/__init__.py @@ -3,7 +3,7 @@ plugin to your app:: import bottle - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.bottle import TracePlugin app = bottle.Bottle() diff --git a/ddtrace/contrib/cherrypy/__init__.py b/ddtrace/contrib/cherrypy/__init__.py index 0ae66d24918..9a78ef7b47e 100644 --- a/ddtrace/contrib/cherrypy/__init__.py +++ b/ddtrace/contrib/cherrypy/__init__.py @@ -7,7 +7,7 @@ ~~~~~ To install the middleware, add:: - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.cherrypy import TraceMiddleware and create a `TraceMiddleware` object:: @@ -40,7 +40,7 @@ import cherrypy - from ddtrace import tracer, Pin + from ddtrace.trace import tracer, Pin from ddtrace.contrib.cherrypy import TraceMiddleware TraceMiddleware(cherrypy, tracer, service="my-cherrypy-app") diff --git a/ddtrace/contrib/falcon/__init__.py b/ddtrace/contrib/falcon/__init__.py index a521689273b..d86767b9d1d 100644 --- a/ddtrace/contrib/falcon/__init__.py +++ b/ddtrace/contrib/falcon/__init__.py @@ -2,7 +2,7 @@ To trace the falcon web framework, install the trace middleware:: import falcon - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.falcon import TraceMiddleware mw = TraceMiddleware(tracer, 'my-falcon-app') @@ -11,7 +11,7 @@ You can also use the autopatching functionality:: import falcon - from ddtrace import tracer, patch + from ddtrace.trace import tracer, patch patch(falcon=True) diff --git a/ddtrace/contrib/flask_cache/__init__.py b/ddtrace/contrib/flask_cache/__init__.py index d35ab94f6e6..f35b73111fb 100644 --- a/ddtrace/contrib/flask_cache/__init__.py +++ b/ddtrace/contrib/flask_cache/__init__.py @@ -5,9 +5,9 @@ The tracer supports both `Flask-Cache `_ and `Flask-Caching `_. -To install the tracer, ``from ddtrace import tracer`` needs to be added:: +To install the tracer, ``from ddtrace.trace import tracer`` needs to be added:: - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.flask_cache import get_traced_cache and the tracer needs to be initialized:: @@ -18,7 +18,7 @@ from flask import Flask - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.flask_cache import get_traced_cache app = Flask(__name__) @@ -35,7 +35,7 @@ def counter(): Use a specific ``Cache`` implementation with:: - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.flask_cache import get_traced_cache from flask_caching import Cache diff --git a/ddtrace/contrib/gevent/__init__.py b/ddtrace/contrib/gevent/__init__.py index 5ee22f591b4..d02588efad9 100644 --- a/ddtrace/contrib/gevent/__init__.py +++ b/ddtrace/contrib/gevent/__init__.py @@ -46,12 +46,11 @@ def worker_function(): from . import patch as _ # noqa: F401, I001 +from ddtrace._trace.provider import DefaultContextProvider as _DefaultContextProvider from ddtrace.contrib.internal.gevent.patch import get_version #noqa: F401 from ddtrace.contrib.internal.gevent.patch import patch #noqa: F401 from ddtrace.contrib.internal.gevent.patch import unpatch #noqa: F401 -from ...provider import DefaultContextProvider as _DefaultContextProvider - context_provider = _DefaultContextProvider() diff --git a/ddtrace/contrib/internal/asgi/middleware.py b/ddtrace/contrib/internal/asgi/middleware.py index 2b3e23eb78b..7da2b11b929 100644 --- a/ddtrace/contrib/internal/asgi/middleware.py +++ b/ddtrace/contrib/internal/asgi/middleware.py @@ -7,7 +7,6 @@ import ddtrace from ddtrace import config -from ddtrace._trace.span import Span from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils @@ -24,6 +23,7 @@ from ddtrace.internal.schema.span_attribute_schema import SpanDirection from ddtrace.internal.utils import get_blocked from ddtrace.internal.utils import set_blocked +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/contrib/internal/asyncio/provider.py b/ddtrace/contrib/internal/asyncio/provider.py index 6c16a178cd0..fac41470740 100644 --- a/ddtrace/contrib/internal/asyncio/provider.py +++ b/ddtrace/contrib/internal/asyncio/provider.py @@ -2,7 +2,7 @@ from ddtrace._trace.provider import BaseContextProvider from ddtrace._trace.provider import DatadogContextMixin -from ddtrace._trace.span import Span +from ddtrace.trace import Span from ddtrace.vendor.debtcollector import deprecate diff --git a/ddtrace/contrib/internal/avro/schema_iterator.py b/ddtrace/contrib/internal/avro/schema_iterator.py index a4339d05420..3bd9ef3492e 100644 --- a/ddtrace/contrib/internal/avro/schema_iterator.py +++ b/ddtrace/contrib/internal/avro/schema_iterator.py @@ -1,11 +1,11 @@ import avro from avro.schema import Schema as AvroSchema -from ddtrace._trace.span import Span from ddtrace.ext import schema as SCHEMA_TAGS from ddtrace.internal.datastreams import data_streams_processor from ddtrace.internal.datastreams.schemas.schema_builder import SchemaBuilder from ddtrace.internal.datastreams.schemas.schema_iterator import SchemaIterator +from ddtrace.trace import Span class SchemaExtractor(SchemaIterator): diff --git a/ddtrace/contrib/internal/aws_lambda/patch.py b/ddtrace/contrib/internal/aws_lambda/patch.py index e331cf8ead4..49ef1e5dd60 100644 --- a/ddtrace/contrib/internal/aws_lambda/patch.py +++ b/ddtrace/contrib/internal/aws_lambda/patch.py @@ -2,7 +2,6 @@ import os import signal -from ddtrace import tracer from ddtrace.constants import ERROR_MSG from ddtrace.constants import ERROR_TYPE from ddtrace.contrib.internal.aws_lambda._cold_start import is_cold_start @@ -12,6 +11,7 @@ from ddtrace.internal.utils import get_argument_value from ddtrace.internal.wrapping import unwrap from ddtrace.internal.wrapping import wrap +from ddtrace.trace import tracer def get_version(): diff --git a/ddtrace/contrib/internal/cassandra/session.py b/ddtrace/contrib/internal/cassandra/session.py index 3ccd44bb616..2cab838e2f2 100644 --- a/ddtrace/contrib/internal/cassandra/session.py +++ b/ddtrace/contrib/internal/cassandra/session.py @@ -20,7 +20,6 @@ from cassandra.query import SimpleStatement import wrapt -from ddtrace import Span from ddtrace import config from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY from ddtrace.constants import _SPAN_MEASURED_KEY @@ -40,6 +39,7 @@ from ddtrace.internal.utils import get_argument_value from ddtrace.internal.utils.formats import deep_getattr from ddtrace.trace import Pin +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/contrib/internal/celery/utils.py b/ddtrace/contrib/internal/celery/utils.py index 5c7a4c077e8..1bf2f56af93 100644 --- a/ddtrace/contrib/internal/celery/utils.py +++ b/ddtrace/contrib/internal/celery/utils.py @@ -2,9 +2,9 @@ from typing import Dict from weakref import WeakValueDictionary -from ddtrace._trace.span import Span from ddtrace.contrib.internal.trace_utils import set_flattened_tags from ddtrace.propagation.http import HTTPPropagator +from ddtrace.trace import Span from .constants import CTX_KEY from .constants import SPAN_KEY diff --git a/ddtrace/contrib/internal/django/utils.py b/ddtrace/contrib/internal/django/utils.py index a8d4c469e66..999d1530326 100644 --- a/ddtrace/contrib/internal/django/utils.py +++ b/ddtrace/contrib/internal/django/utils.py @@ -13,7 +13,6 @@ import xmltodict from ddtrace import config -from ddtrace._trace.span import Span from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY from ddtrace.constants import _SPAN_MEASURED_KEY from ddtrace.contrib import trace_utils @@ -29,6 +28,7 @@ from ddtrace.internal.utils.http import parse_form_params from ddtrace.internal.utils.importlib import func_name from ddtrace.propagation._utils import from_wsgi_header +from ddtrace.trace import Span try: diff --git a/ddtrace/contrib/internal/dramatiq/patch.py b/ddtrace/contrib/internal/dramatiq/patch.py index a6ecbbfd5d4..c55d20a63a3 100644 --- a/ddtrace/contrib/internal/dramatiq/patch.py +++ b/ddtrace/contrib/internal/dramatiq/patch.py @@ -6,12 +6,12 @@ import dramatiq from ddtrace import config -from ddtrace import tracer from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes from ddtrace.settings._config import Config +from ddtrace.trace import tracer def get_version() -> str: diff --git a/ddtrace/contrib/internal/falcon/patch.py b/ddtrace/contrib/internal/falcon/patch.py index 6cf6e47e7c7..568eb025312 100644 --- a/ddtrace/contrib/internal/falcon/patch.py +++ b/ddtrace/contrib/internal/falcon/patch.py @@ -4,9 +4,9 @@ import wrapt from ddtrace import config -from ddtrace import tracer from ddtrace.internal.utils.formats import asbool from ddtrace.internal.utils.version import parse_version +from ddtrace.trace import tracer from .middleware import TraceMiddleware diff --git a/ddtrace/contrib/internal/flask_cache/patch.py b/ddtrace/contrib/internal/flask_cache/patch.py index 9170bd4bd45..8ce907b21ff 100644 --- a/ddtrace/contrib/internal/flask_cache/patch.py +++ b/ddtrace/contrib/internal/flask_cache/patch.py @@ -20,7 +20,7 @@ if typing.TYPE_CHECKING: # pragma: no cover - from ddtrace import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 log = logging.Logger(__name__) diff --git a/ddtrace/contrib/internal/futures/threading.py b/ddtrace/contrib/internal/futures/threading.py index deea68e2c17..6e96a263a9a 100644 --- a/ddtrace/contrib/internal/futures/threading.py +++ b/ddtrace/contrib/internal/futures/threading.py @@ -1,7 +1,7 @@ from typing import Optional import ddtrace -from ddtrace._trace.context import Context +from ddtrace.trace import Context def _wrap_submit(func, args, kwargs): diff --git a/ddtrace/contrib/internal/gevent/provider.py b/ddtrace/contrib/internal/gevent/provider.py index be18498b8a4..c07b0512d6d 100644 --- a/ddtrace/contrib/internal/gevent/provider.py +++ b/ddtrace/contrib/internal/gevent/provider.py @@ -2,7 +2,7 @@ from ddtrace._trace.provider import BaseContextProvider from ddtrace._trace.provider import DatadogContextMixin -from ddtrace._trace.span import Span +from ddtrace.trace import Span from ddtrace.vendor.debtcollector import deprecate diff --git a/ddtrace/contrib/internal/graphql/patch.py b/ddtrace/contrib/internal/graphql/patch.py index 589bef80d4b..fe538303a52 100644 --- a/ddtrace/contrib/internal/graphql/patch.py +++ b/ddtrace/contrib/internal/graphql/patch.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING from typing import List -from ddtrace._trace.span import Span from ddtrace.internal.schema.span_attribute_schema import SpanDirection +from ddtrace.trace import Span if TYPE_CHECKING: # pragma: no cover diff --git a/ddtrace/contrib/internal/grpc/aio_client_interceptor.py b/ddtrace/contrib/internal/grpc/aio_client_interceptor.py index 76455b1627f..dec03c203f4 100644 --- a/ddtrace/contrib/internal/grpc/aio_client_interceptor.py +++ b/ddtrace/contrib/internal/grpc/aio_client_interceptor.py @@ -11,7 +11,6 @@ from grpc.aio._typing import ResponseIterableType from grpc.aio._typing import ResponseType -from ddtrace import Span from ddtrace import config from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY from ddtrace.constants import _SPAN_MEASURED_KEY @@ -30,6 +29,7 @@ from ddtrace.internal.schema.span_attribute_schema import SpanDirection from ddtrace.propagation.http import HTTPPropagator from ddtrace.trace import Pin +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/contrib/internal/grpc/aio_server_interceptor.py b/ddtrace/contrib/internal/grpc/aio_server_interceptor.py index d2e7efb0e00..54030a90e6d 100644 --- a/ddtrace/contrib/internal/grpc/aio_server_interceptor.py +++ b/ddtrace/contrib/internal/grpc/aio_server_interceptor.py @@ -13,7 +13,6 @@ from grpc.aio._typing import ResponseType import wrapt -from ddtrace import Span # noqa:F401 from ddtrace import config from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY from ddtrace.constants import _SPAN_MEASURED_KEY @@ -30,6 +29,7 @@ from ddtrace.internal.schema import schematize_url_operation from ddtrace.internal.schema.span_attribute_schema import SpanDirection from ddtrace.trace import Pin # noqa:F401 +from ddtrace.trace import Span # noqa:F401 Continuation = Callable[[grpc.HandlerCallDetails], Awaitable[grpc.RpcMethodHandler]] diff --git a/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py index 0d1ba2a8d47..75b88c3fbab 100644 --- a/ddtrace/contrib/internal/langchain/patch.py +++ b/ddtrace/contrib/internal/langchain/patch.py @@ -39,7 +39,6 @@ import wrapt -from ddtrace import Span from ddtrace import config from ddtrace.contrib.internal.langchain.constants import API_KEY from ddtrace.contrib.internal.langchain.constants import COMPLETION_TOKENS @@ -63,6 +62,7 @@ from ddtrace.llmobs._integrations import LangChainIntegration from ddtrace.llmobs._utils import safe_json from ddtrace.trace import Pin +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/contrib/internal/langgraph/patch.py b/ddtrace/contrib/internal/langgraph/patch.py index 1da216be9a3..2df7159161a 100644 --- a/ddtrace/contrib/internal/langgraph/patch.py +++ b/ddtrace/contrib/internal/langgraph/patch.py @@ -9,7 +9,7 @@ from ddtrace.contrib.trace_utils import wrap from ddtrace.internal.utils import get_argument_value from ddtrace.llmobs._integrations.langgraph import LangGraphIntegration -from ddtrace.pin import Pin +from ddtrace.trace import Pin def get_version(): diff --git a/ddtrace/contrib/internal/logging/patch.py b/ddtrace/contrib/internal/logging/patch.py index 11edd5d938f..fd356597bc0 100644 --- a/ddtrace/contrib/internal/logging/patch.py +++ b/ddtrace/contrib/internal/logging/patch.py @@ -80,7 +80,7 @@ def _w_makeRecord(func, instance, args, kwargs): # logs from internal logger may explicitly pass the current span to # avoid deadlocks in getting the current span while already in locked code. span_from_log = getattr(record, _LOG_SPAN_KEY, None) - if isinstance(span_from_log, ddtrace.Span): + if isinstance(span_from_log, ddtrace.trace.Span): span = span_from_log if tracer: diff --git a/ddtrace/contrib/internal/mongoengine/trace.py b/ddtrace/contrib/internal/mongoengine/trace.py index 93868e096ce..5539cf1d2e4 100644 --- a/ddtrace/contrib/internal/mongoengine/trace.py +++ b/ddtrace/contrib/internal/mongoengine/trace.py @@ -29,7 +29,7 @@ def __call__(self, *args, **kwargs): client = self.__wrapped__(*args, **kwargs) pin = ddtrace.trace.Pin.get_from(self) if pin: - # Calling ddtrace.pin.Pin(...) with the `tracer` argument generates a deprecation warning. + # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning. # Remove this if statement when the `tracer` argument is removed if pin.tracer is ddtrace.tracer: ddtrace.trace.Pin(service=pin.service).onto(client) diff --git a/ddtrace/contrib/internal/protobuf/schema_iterator.py b/ddtrace/contrib/internal/protobuf/schema_iterator.py index c783be51312..3c9d2bd4664 100644 --- a/ddtrace/contrib/internal/protobuf/schema_iterator.py +++ b/ddtrace/contrib/internal/protobuf/schema_iterator.py @@ -1,12 +1,13 @@ from google.protobuf.descriptor import FieldDescriptor -# from google._upb._message import Descriptor -from ddtrace._trace.span import Span from ddtrace.ext import schema as SCHEMA_TAGS from ddtrace.internal.datastreams import data_streams_processor from ddtrace.internal.datastreams.schemas.schema_builder import SchemaBuilder from ddtrace.internal.datastreams.schemas.schema_iterator import SchemaIterator +# from google._upb._message import Descriptor +from ddtrace.trace import Span + class SchemaExtractor(SchemaIterator): SERIALIZATION = "serialization" diff --git a/ddtrace/contrib/internal/pylibmc/client.py b/ddtrace/contrib/internal/pylibmc/client.py index 5321b533293..5c48e8465f8 100644 --- a/ddtrace/contrib/internal/pylibmc/client.py +++ b/ddtrace/contrib/internal/pylibmc/client.py @@ -51,7 +51,7 @@ def __init__(self, client=None, service=memcached.SERVICE, tracer=None, *args, * super(TracedClient, self).__init__(client) schematized_service = schematize_service_name(service) - # Calling ddtrace.pin.Pin(...) with the `tracer` argument generates a deprecation warning. + # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning. # Remove this if statement when the `tracer` argument is removed if tracer is ddtrace.tracer: pin = ddtrace.trace.Pin(service=schematized_service) diff --git a/ddtrace/contrib/internal/pymemcache/patch.py b/ddtrace/contrib/internal/pymemcache/patch.py index dd3687cd248..0a8521836e9 100644 --- a/ddtrace/contrib/internal/pymemcache/patch.py +++ b/ddtrace/contrib/internal/pymemcache/patch.py @@ -3,9 +3,9 @@ from ddtrace._trace.pin import _DD_PIN_NAME from ddtrace._trace.pin import _DD_PIN_PROXY_NAME -from ddtrace._trace.pin import Pin from ddtrace.ext import memcached as memcachedx from ddtrace.internal.schema import schematize_service_name +from ddtrace.trace import Pin from .client import WrappedClient from .client import WrappedHashClient diff --git a/ddtrace/contrib/internal/pytest/plugin.py b/ddtrace/contrib/internal/pytest/plugin.py index 52cf54a6f9c..6ca4ad91afe 100644 --- a/ddtrace/contrib/internal/pytest/plugin.py +++ b/ddtrace/contrib/internal/pytest/plugin.py @@ -145,7 +145,7 @@ def pytest_addhooks(pluginmanager): @pytest.fixture(scope="function") def ddspan(request): - """Return the :class:`ddtrace._trace.span.Span` instance associated with the + """Return the :class:`ddtrace.trace.Span` instance associated with the current test when Datadog CI Visibility is enabled. """ from ddtrace.internal.ci_visibility import CIVisibility as _CIVisibility diff --git a/ddtrace/contrib/internal/selenium/patch.py b/ddtrace/contrib/internal/selenium/patch.py index 5e8d2ed87bc..fc229011fd2 100644 --- a/ddtrace/contrib/internal/selenium/patch.py +++ b/ddtrace/contrib/internal/selenium/patch.py @@ -7,7 +7,7 @@ from ddtrace import config from ddtrace.internal.logger import get_logger from ddtrace.internal.wrapping.context import WrappingContext -import ddtrace.tracer +from ddtrace.trace import tracer if t.TYPE_CHECKING: @@ -87,7 +87,7 @@ def __return__(self, value: T) -> T: class SeleniumGetWrappingContext(SeleniumWrappingContextBase): def _handle_return(self) -> None: - root_span = ddtrace.tracer.current_root_span() + root_span = tracer.current_root_span() test_trace_id = root_span.trace_id if root_span is None or root_span.get_tag("type") != "test": @@ -127,7 +127,7 @@ def _handle_return(self) -> None: class SeleniumQuitWrappingContext(SeleniumWrappingContextBase): def _handle_enter(self) -> None: - root_span = ddtrace.tracer.current_root_span() + root_span = tracer.current_root_span() if root_span is None or root_span.get_tag("type") != "test": return diff --git a/ddtrace/contrib/internal/sqlalchemy/engine.py b/ddtrace/contrib/internal/sqlalchemy/engine.py index 6e123c97db8..a3dcb324700 100644 --- a/ddtrace/contrib/internal/sqlalchemy/engine.py +++ b/ddtrace/contrib/internal/sqlalchemy/engine.py @@ -2,7 +2,7 @@ To trace sqlalchemy queries, add instrumentation to the engine class or instance you are using:: - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.sqlalchemy import trace_engine from sqlalchemy import create_engine @@ -37,7 +37,7 @@ def trace_engine(engine, tracer=None, service=None): Add tracing instrumentation to the given sqlalchemy engine or instance. :param sqlalchemy.Engine engine: a SQLAlchemy engine class or instance - :param ddtrace.Tracer tracer: a tracer instance. will default to the global + :param ddtrace.trace.Tracer tracer: a tracer instance. will default to the global :param str service: the name of the service to trace. """ tracer = tracer or ddtrace.tracer # by default use global @@ -67,7 +67,7 @@ def __init__(self, tracer, service, engine): self.name = schematize_database_operation("%s.query" % self.vendor, database_provider=self.vendor) # attach the PIN - # Calling ddtrace.pin.Pin(...) with the `tracer` argument generates a deprecation warning. + # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning. # Remove this if statement when the `tracer` argument is removed if self.tracer is ddtrace.tracer: Pin(service=self.service).onto(engine) diff --git a/ddtrace/contrib/internal/starlette/patch.py b/ddtrace/contrib/internal/starlette/patch.py index e2ea8f9f4dc..02d47f8d47c 100644 --- a/ddtrace/contrib/internal/starlette/patch.py +++ b/ddtrace/contrib/internal/starlette/patch.py @@ -13,7 +13,6 @@ from wrapt import wrap_function_wrapper as _w from ddtrace import config -from ddtrace._trace.span import Span # noqa:F401 from ddtrace.appsec._iast import _is_iast_enabled from ddtrace.contrib import trace_utils from ddtrace.contrib.asgi import TraceMiddleware @@ -28,6 +27,7 @@ from ddtrace.internal.utils import set_argument_value from ddtrace.internal.utils.wrappers import unwrap as _u from ddtrace.trace import Pin +from ddtrace.trace import Span # noqa:F401 from ddtrace.vendor.packaging.version import parse as parse_version diff --git a/ddtrace/contrib/internal/tornado/application.py b/ddtrace/contrib/internal/tornado/application.py index 993a6d27c46..f36857b81b1 100644 --- a/ddtrace/contrib/internal/tornado/application.py +++ b/ddtrace/contrib/internal/tornado/application.py @@ -56,7 +56,7 @@ def tracer_config(__init__, app, args, kwargs): # configure the PIN object for template rendering # Required for backwards compatibility. Remove the else clause when - # the `ddtrace.Pin` object no longer accepts the Pin argument. + # the `ddtrace.trace.Pin` object no longer accepts the Pin argument. if tracer is ddtrace.tracer: ddtrace.trace.Pin(service=service).onto(template) else: diff --git a/ddtrace/contrib/internal/tornado/stack_context.py b/ddtrace/contrib/internal/tornado/stack_context.py index 7f0910eedeb..a6978c7f25c 100644 --- a/ddtrace/contrib/internal/tornado/stack_context.py +++ b/ddtrace/contrib/internal/tornado/stack_context.py @@ -3,7 +3,7 @@ from ddtrace._trace.provider import BaseContextProvider from ddtrace._trace.provider import DefaultContextProvider -from ddtrace.span import Span +from ddtrace.trace import Span # tornado.stack_context deprecated in Tornado 5 removed in Tornado 6 diff --git a/ddtrace/contrib/internal/trace_utils.py b/ddtrace/contrib/internal/trace_utils.py index 5781c3f30df..e89dc39f1d7 100644 --- a/ddtrace/contrib/internal/trace_utils.py +++ b/ddtrace/contrib/internal/trace_utils.py @@ -40,9 +40,9 @@ if TYPE_CHECKING: # pragma: no cover - from ddtrace import Span # noqa:F401 - from ddtrace import Tracer # noqa:F401 from ddtrace.settings import IntegrationConfig # noqa:F401 + from ddtrace.trace import Span # noqa:F401 + from ddtrace.trace import Tracer # noqa:F401 log = get_logger(__name__) @@ -130,7 +130,7 @@ def _store_headers(headers, span, integration_config, request_or_response): :param headers: A dict of http headers to be stored in the span :type headers: dict or list :param span: The Span instance where tags will be stored - :type span: ddtrace._trace.span.Span + :type span: ddtrace.trace.Span :param integration_config: An integration specific config object. :type integration_config: ddtrace.settings.IntegrationConfig """ @@ -257,7 +257,7 @@ def _store_request_headers(headers, span, integration_config): :param headers: All the request's http headers, will be filtered through the whitelist :type headers: dict or list :param span: The Span instance where tags will be stored - :type span: ddtrace.Span + :type span: ddtrace.trace.Span :param integration_config: An integration specific config object. :type integration_config: ddtrace.settings.IntegrationConfig """ @@ -271,7 +271,7 @@ def _store_response_headers(headers, span, integration_config): :param headers: All the response's http headers, will be filtered through the whitelist :type headers: dict or list :param span: The Span instance where tags will be stored - :type span: ddtrace.Span + :type span: ddtrace.trace.Span :param integration_config: An integration specific config object. :type integration_config: ddtrace.settings.IntegrationConfig """ diff --git a/ddtrace/contrib/internal/unittest/patch.py b/ddtrace/contrib/internal/unittest/patch.py index 74ce8d1d6a0..3f808090f55 100644 --- a/ddtrace/contrib/internal/unittest/patch.py +++ b/ddtrace/contrib/internal/unittest/patch.py @@ -129,7 +129,7 @@ def _is_marked_as_unskippable(test_object) -> bool: ) -def _update_skipped_elements_and_set_tags(test_module_span: ddtrace.Span, test_session_span: ddtrace.Span): +def _update_skipped_elements_and_set_tags(test_module_span: ddtrace.trace.Span, test_session_span: ddtrace.trace.Span): global _global_skipped_elements _global_skipped_elements += 1 @@ -141,7 +141,7 @@ def _update_skipped_elements_and_set_tags(test_module_span: ddtrace.Span, test_s test_session_span.set_tag_str(test.ITR_DD_CI_ITR_TESTS_SKIPPED, "true") -def _store_test_span(item, span: ddtrace.Span): +def _store_test_span(item, span: ddtrace.trace.Span): """Store datadog span at `unittest` test instance.""" item._datadog_span = span @@ -172,7 +172,7 @@ def _is_test(item) -> bool: return True -def _extract_span(item) -> Union[ddtrace.Span, None]: +def _extract_span(item) -> Union[ddtrace.trace.Span, None]: return getattr(item, "_datadog_span", None) @@ -187,23 +187,23 @@ def _extract_test_method_name(test_object) -> str: return getattr(test_object, "_testMethodName", "") -def _extract_session_span() -> Union[ddtrace.Span, None]: +def _extract_session_span() -> Union[ddtrace.trace.Span, None]: return getattr(_CIVisibility, "_datadog_session_span", None) -def _extract_module_span(module_identifier: str) -> Union[ddtrace.Span, None]: +def _extract_module_span(module_identifier: str) -> Union[ddtrace.trace.Span, None]: if hasattr(_CIVisibility, "_unittest_data") and module_identifier in _CIVisibility._unittest_data["modules"]: return _CIVisibility._unittest_data["modules"][module_identifier].get("module_span") return None -def _extract_suite_span(suite_identifier: str) -> Union[ddtrace.Span, None]: +def _extract_suite_span(suite_identifier: str) -> Union[ddtrace.trace.Span, None]: if hasattr(_CIVisibility, "_unittest_data") and suite_identifier in _CIVisibility._unittest_data["suites"]: return _CIVisibility._unittest_data["suites"][suite_identifier].get("suite_span") return None -def _update_status_item(item: ddtrace.Span, status: str): +def _update_status_item(item: ddtrace.trace.Span, status: str): """ Sets the status for each Span implementing the test FAIL logic override. """ @@ -266,7 +266,7 @@ def _generate_session_resource(test_command: str) -> str: return "{}".format(test_command) -def _set_test_skipping_tags_to_span(span: ddtrace.Span): +def _set_test_skipping_tags_to_span(span: ddtrace.trace.Span): span.set_tag_str(test.ITR_TEST_SKIPPING_ENABLED, "true") span.set_tag_str(test.ITR_TEST_SKIPPING_TYPE, TEST) span.set_tag_str(test.ITR_TEST_SKIPPING_TESTS_SKIPPED, "false") @@ -368,7 +368,10 @@ def _finish_remaining_suites_and_modules(seen_suites: dict, seen_modules: dict): def _update_remaining_suites_and_modules( - test_module_suite_path: str, test_module_path: str, test_module_span: ddtrace.Span, test_suite_span: ddtrace.Span + test_module_suite_path: str, + test_module_path: str, + test_module_span: ddtrace.trace.Span, + test_suite_span: ddtrace.trace.Span, ): """ Updates the remaining test suite and test counter and finishes spans when these have finished their execution. @@ -384,7 +387,7 @@ def _update_remaining_suites_and_modules( _finish_span(test_module_span) -def _update_test_skipping_count_span(span: ddtrace.Span): +def _update_test_skipping_count_span(span: ddtrace.trace.Span): if _CIVisibility.test_skipping_enabled(): span.set_metric(test.ITR_TEST_SKIPPING_COUNT, _global_skipped_elements) @@ -622,7 +625,7 @@ def collect_text_test_runner_session(func, instance: unittest.TestSuite, args: t return result -def _start_test_session_span(instance) -> ddtrace.Span: +def _start_test_session_span(instance) -> ddtrace.trace.Span: """ Starts a test session span and sets the required tags for a `unittest` session instance. """ @@ -663,7 +666,7 @@ def _start_test_session_span(instance) -> ddtrace.Span: return test_session_span -def _start_test_module_span(instance) -> ddtrace.Span: +def _start_test_module_span(instance) -> ddtrace.trace.Span: """ Starts a test module span and sets the required tags for a `unittest` module instance. """ @@ -706,7 +709,7 @@ def _start_test_module_span(instance) -> ddtrace.Span: return test_module_span -def _start_test_suite_span(instance) -> ddtrace.Span: +def _start_test_suite_span(instance) -> ddtrace.trace.Span: """ Starts a test suite span and sets the required tags for a `unittest` suite instance. """ @@ -742,7 +745,7 @@ def _start_test_suite_span(instance) -> ddtrace.Span: return test_suite_span -def _start_test_span(instance, test_suite_span: ddtrace.Span) -> ddtrace.Span: +def _start_test_span(instance, test_suite_span: ddtrace.trace.Span) -> ddtrace.trace.Span: """ Starts a test span and sets the required tags for a `unittest` test instance. """ @@ -787,7 +790,7 @@ def _start_test_span(instance, test_suite_span: ddtrace.Span) -> ddtrace.Span: return span -def _finish_span(current_span: ddtrace.Span): +def _finish_span(current_span: ddtrace.trace.Span): """ Finishes active span and populates span status upwards """ diff --git a/ddtrace/contrib/internal/wsgi/wsgi.py b/ddtrace/contrib/internal/wsgi/wsgi.py index 44e1646f5f9..f5558792061 100644 --- a/ddtrace/contrib/internal/wsgi/wsgi.py +++ b/ddtrace/contrib/internal/wsgi/wsgi.py @@ -11,10 +11,10 @@ from typing import Mapping # noqa:F401 from typing import Optional # noqa:F401 - from ddtrace import Span # noqa:F401 - from ddtrace import Tracer # noqa:F401 from ddtrace.settings import Config # noqa:F401 from ddtrace.trace import Pin # noqa:F401 + from ddtrace.trace import Span # noqa:F401 + from ddtrace.trace import Tracer # noqa:F401 from urllib.parse import quote diff --git a/ddtrace/contrib/logging/__init__.py b/ddtrace/contrib/logging/__init__.py index 75454ce7c55..9dcb3befe8c 100644 --- a/ddtrace/contrib/logging/__init__.py +++ b/ddtrace/contrib/logging/__init__.py @@ -33,7 +33,7 @@ Make sure that your log format exactly matches the following:: import logging - from ddtrace import tracer + from ddtrace.trace import tracer FORMAT = ('%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] ' '[dd.service=%(dd.service)s dd.env=%(dd.env)s ' diff --git a/ddtrace/contrib/tornado/__init__.py b/ddtrace/contrib/tornado/__init__.py index 403739448be..98a3cec1fa6 100644 --- a/ddtrace/contrib/tornado/__init__.py +++ b/ddtrace/contrib/tornado/__init__.py @@ -8,7 +8,7 @@ The following is an example:: # patch before importing tornado and concurrent.futures - from ddtrace import tracer, patch + from ddtrace.trace import tracer, patch patch(tornado=True) import tornado.web diff --git a/ddtrace/debugging/_debugger.py b/ddtrace/debugging/_debugger.py index c36bb94fdfb..bbfa19ac2c2 100644 --- a/ddtrace/debugging/_debugger.py +++ b/ddtrace/debugging/_debugger.py @@ -23,7 +23,6 @@ import ddtrace from ddtrace import config as ddconfig -from ddtrace._trace.tracer import Tracer from ddtrace.debugging._config import di_config from ddtrace.debugging._function.discovery import FunctionDiscovery from ddtrace.debugging._function.store import FullyNamedContextWrappedFunction @@ -55,6 +54,7 @@ from ddtrace.internal.remoteconfig.worker import remoteconfig_poller from ddtrace.internal.service import Service from ddtrace.internal.wrapping.context import WrappingContext +from ddtrace.trace import Tracer log = get_logger(__name__) diff --git a/ddtrace/debugging/_exception/replay.py b/ddtrace/debugging/_exception/replay.py index c9da69bb5b2..424bdcbd147 100644 --- a/ddtrace/debugging/_exception/replay.py +++ b/ddtrace/debugging/_exception/replay.py @@ -8,7 +8,6 @@ import typing as t import uuid -from ddtrace._trace.span import Span from ddtrace.debugging._probe.model import LiteralTemplateSegment from ddtrace.debugging._probe.model import LogLineProbe from ddtrace.debugging._signal.snapshot import DEFAULT_CAPTURE_LIMITS @@ -22,6 +21,7 @@ from ddtrace.internal.rate_limiter import RateLimitExceeded from ddtrace.internal.utils.time import HourGlass from ddtrace.settings.exception_replay import config +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/debugging/_origin/span.py b/ddtrace/debugging/_origin/span.py index e7831c38ffb..9044797d252 100644 --- a/ddtrace/debugging/_origin/span.py +++ b/ddtrace/debugging/_origin/span.py @@ -31,7 +31,7 @@ from ddtrace.internal.utils.inspection import functions_for_code from ddtrace.internal.wrapping.context import WrappingContext from ddtrace.settings.code_origin import config as co_config -from ddtrace.span import Span +from ddtrace.trace import Span def frame_stack(frame: FrameType) -> t.Iterator[FrameType]: diff --git a/ddtrace/debugging/_signal/model.py b/ddtrace/debugging/_signal/model.py index 9c9448677c0..5d41c64f2ff 100644 --- a/ddtrace/debugging/_signal/model.py +++ b/ddtrace/debugging/_signal/model.py @@ -18,8 +18,6 @@ from typing import cast from uuid import uuid4 -from ddtrace._trace.context import Context -from ddtrace._trace.span import Span from ddtrace.debugging._expressions import DDExpressionEvaluationError from ddtrace.debugging._probe.model import Probe from ddtrace.debugging._probe.model import ProbeConditionMixin @@ -31,6 +29,8 @@ from ddtrace.internal.metrics import Metrics from ddtrace.internal.rate_limiter import BudgetRateLimiterWithJitter as RateLimiter from ddtrace.internal.rate_limiter import RateLimitExceeded +from ddtrace.trace import Context +from ddtrace.trace import Span @dataclass diff --git a/ddtrace/debugging/_signal/tracing.py b/ddtrace/debugging/_signal/tracing.py index d509e336d52..37d90c918c1 100644 --- a/ddtrace/debugging/_signal/tracing.py +++ b/ddtrace/debugging/_signal/tracing.py @@ -3,7 +3,6 @@ import typing as t import ddtrace -from ddtrace._trace.span import Span from ddtrace.constants import _ORIGIN_KEY from ddtrace.debugging._expressions import DDExpressionEvaluationError from ddtrace.debugging._probe.model import Probe @@ -20,6 +19,7 @@ from ddtrace.internal.compat import ExcInfoType from ddtrace.internal.logger import get_logger from ddtrace.internal.safety import _isinstance +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/ext/aws.py b/ddtrace/ext/aws.py index 4c4bc8c0dea..acc0a6425e9 100644 --- a/ddtrace/ext/aws.py +++ b/ddtrace/ext/aws.py @@ -4,7 +4,7 @@ if TYPE_CHECKING: # pragma: no cover - from ddtrace._trace.span import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 def truncate_arg_value(value, max_len=1024): diff --git a/ddtrace/ext/test_visibility/api.py b/ddtrace/ext/test_visibility/api.py index cdcbb7a672c..c6e96406e88 100644 --- a/ddtrace/ext/test_visibility/api.py +++ b/ddtrace/ext/test_visibility/api.py @@ -40,11 +40,13 @@ from ddtrace.ext.test_visibility._utils import _set_item_tags from ddtrace.internal import core from ddtrace.internal.logger import get_logger as _get_logger -import ddtrace.tracing # noqa: F401 -- this triggers the registration of trace handlers log = _get_logger(__name__) +# this triggers the registration of trace handlers after civis startup +import ddtrace._trace.trace_handlers # noqa: F401, E402 + class TestStatus(Enum): __test__ = False diff --git a/ddtrace/internal/ci_visibility/api/_base.py b/ddtrace/internal/ci_visibility/api/_base.py index 1e56d6b00b6..d31c79faffe 100644 --- a/ddtrace/internal/ci_visibility/api/_base.py +++ b/ddtrace/internal/ci_visibility/api/_base.py @@ -13,8 +13,6 @@ from typing import TypeVar from typing import Union -from ddtrace import Span -from ddtrace import Tracer from ddtrace.constants import SPAN_KIND from ddtrace.ext import SpanTypes from ddtrace.ext import test @@ -40,6 +38,8 @@ from ddtrace.internal.logger import get_logger from ddtrace.internal.test_visibility._atr_mixins import AutoTestRetriesSettings from ddtrace.internal.test_visibility.coverage_lines import CoverageLines +from ddtrace.trace import Span +from ddtrace.trace import Tracer if typing.TYPE_CHECKING: @@ -76,7 +76,7 @@ class TestVisibilitySessionSettings: def __post_init__(self): if not isinstance(self.tracer, Tracer): - raise TypeError("tracer must be a ddtrace.Tracer") + raise TypeError("tracer must be a ddtrace.trace.Tracer") if not isinstance(self.workspace_path, Path): raise TypeError("root_dir must be a pathlib.Path") if not self.workspace_path.is_absolute(): diff --git a/ddtrace/internal/ci_visibility/coverage.py b/ddtrace/internal/ci_visibility/coverage.py index 3d561a4f7ae..7dde0d3b009 100644 --- a/ddtrace/internal/ci_visibility/coverage.py +++ b/ddtrace/internal/ci_visibility/coverage.py @@ -131,7 +131,7 @@ def _switch_coverage_context( def _report_coverage_to_span( - coverage_data: Coverage, span: ddtrace.Span, root_dir: str, framework: Optional[TEST_FRAMEWORKS] = None + coverage_data: Coverage, span: ddtrace.trace.Span, root_dir: str, framework: Optional[TEST_FRAMEWORKS] = None ): # Experimental feature to use internal coverage collection if USE_DD_COVERAGE: diff --git a/ddtrace/internal/ci_visibility/filters.py b/ddtrace/internal/ci_visibility/filters.py index f1b22d97e13..a1a95c2cb27 100644 --- a/ddtrace/internal/ci_visibility/filters.py +++ b/ddtrace/internal/ci_visibility/filters.py @@ -12,7 +12,7 @@ if TYPE_CHECKING: - from ddtrace import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 class TraceCiVisibilityFilter(TraceFilter): diff --git a/ddtrace/internal/ci_visibility/git_client.py b/ddtrace/internal/ci_visibility/git_client.py index 6152fa12679..469268f5171 100644 --- a/ddtrace/internal/ci_visibility/git_client.py +++ b/ddtrace/internal/ci_visibility/git_client.py @@ -11,7 +11,6 @@ from typing import Tuple # noqa:F401 from urllib.parse import urljoin -from ddtrace import Tracer # noqa: F401 from ddtrace.ext import ci from ddtrace.ext.git import _build_git_packfiles_with_details from ddtrace.ext.git import _extract_clone_defaultremotename_with_details @@ -29,6 +28,7 @@ from ddtrace.internal.compat import JSONDecodeError from ddtrace.internal.logger import get_logger from ddtrace.internal.utils.retry import fibonacci_backoff_with_jitter +from ddtrace.trace import Tracer # noqa: F401 from .. import compat from .. import telemetry diff --git a/ddtrace/internal/ci_visibility/recorder.py b/ddtrace/internal/ci_visibility/recorder.py index 34cc543f11d..a8474ca0fd9 100644 --- a/ddtrace/internal/ci_visibility/recorder.py +++ b/ddtrace/internal/ci_visibility/recorder.py @@ -12,7 +12,6 @@ from typing import Union # noqa:F401 import ddtrace -from ddtrace import Tracer from ddtrace import config as ddconfig from ddtrace.contrib import trace_utils from ddtrace.ext import ci @@ -85,6 +84,7 @@ from ddtrace.internal.utils.formats import asbool from ddtrace.internal.utils.http import verify_url from ddtrace.internal.writer.writer import Response +from ddtrace.trace import Tracer if TYPE_CHECKING: # pragma: no cover diff --git a/ddtrace/internal/ci_visibility/utils.py b/ddtrace/internal/ci_visibility/utils.py index d111305e317..770c574e98d 100644 --- a/ddtrace/internal/ci_visibility/utils.py +++ b/ddtrace/internal/ci_visibility/utils.py @@ -50,7 +50,7 @@ def get_source_lines_for_test_method( def _add_start_end_source_file_path_data_to_span( - span: ddtrace.Span, test_method_object, test_name: str, repo_directory: str + span: ddtrace.trace.Span, test_method_object, test_name: str, repo_directory: str ): if not test_method_object: log.debug( @@ -75,7 +75,7 @@ def _add_start_end_source_file_path_data_to_span( span.set_tag(test.SOURCE_END, end_line) -def _add_pct_covered_to_span(coverage_data: dict, span: ddtrace.Span): +def _add_pct_covered_to_span(coverage_data: dict, span: ddtrace.trace.Span): if not coverage_data or PCT_COVERED_KEY not in coverage_data: log.warning("Tried to add total covered percentage to session span but no data was found") return diff --git a/ddtrace/internal/core/__init__.py b/ddtrace/internal/core/__init__.py index 3c2169d4cb1..0235925dcde 100644 --- a/ddtrace/internal/core/__init__.py +++ b/ddtrace/internal/core/__init__.py @@ -276,7 +276,7 @@ def span(self) -> "Span": if self._inner_span is None: log.warning("No span found in ExecutionContext %s", self.identifier) # failsafe - from ddtrace import tracer + from ddtrace.trace import tracer self._inner_span = tracer.current_span() or tracer.trace("default") return self._inner_span diff --git a/ddtrace/internal/debug.py b/ddtrace/internal/debug.py index ec4048b59d0..2a285423e4c 100644 --- a/ddtrace/internal/debug.py +++ b/ddtrace/internal/debug.py @@ -22,7 +22,7 @@ if TYPE_CHECKING: # pragma: no cover - from ddtrace import Tracer # noqa:F401 + from ddtrace.trace import Tracer # noqa:F401 logger = get_logger(__name__) diff --git a/ddtrace/internal/opentelemetry/context.py b/ddtrace/internal/opentelemetry/context.py index d0f7294eed5..63aacdc1c3b 100644 --- a/ddtrace/internal/opentelemetry/context.py +++ b/ddtrace/internal/opentelemetry/context.py @@ -1,9 +1,9 @@ -from ddtrace import tracer as ddtracer from ddtrace._trace.context import Context as DDContext from ddtrace._trace.provider import BaseContextProvider as DDBaseContextProvider # noqa:F401 from ddtrace._trace.span import Span as DDSpan from ddtrace.internal.logger import get_logger from ddtrace.propagation.http import _TraceContext +from ddtrace.trace import tracer as ddtracer log = get_logger(__name__) diff --git a/ddtrace/internal/opentelemetry/span.py b/ddtrace/internal/opentelemetry/span.py index acb5e066311..321368d0d81 100644 --- a/ddtrace/internal/opentelemetry/span.py +++ b/ddtrace/internal/opentelemetry/span.py @@ -11,7 +11,6 @@ from opentelemetry.trace.span import TraceState from ddtrace import config -from ddtrace import tracer as ddtracer from ddtrace.constants import ERROR_MSG from ddtrace.constants import ERROR_STACK from ddtrace.constants import ERROR_TYPE @@ -20,6 +19,7 @@ from ddtrace.internal.utils.formats import flatten_key_value from ddtrace.internal.utils.formats import is_sequence from ddtrace.internal.utils.http import w3c_tracestate_add_p +from ddtrace.trace import tracer as ddtracer if TYPE_CHECKING: diff --git a/ddtrace/internal/opentelemetry/trace.py b/ddtrace/internal/opentelemetry/trace.py index 21d9be57266..20a9e86f6e0 100644 --- a/ddtrace/internal/opentelemetry/trace.py +++ b/ddtrace/internal/opentelemetry/trace.py @@ -30,8 +30,8 @@ from opentelemetry.trace import Link as OtelLink # noqa:F401 from opentelemetry.util.types import AttributeValue as OtelAttributeValue # noqa:F401 - from ddtrace import Tracer as DDTracer # noqa:F401 from ddtrace._trace.span import _MetaDictType # noqa:F401 + from ddtrace.trace import Tracer as DDTracer # noqa:F401 log = get_logger(__name__) @@ -103,7 +103,7 @@ def start_span( curr_otel_span = get_current_span(context) if curr_otel_span is INVALID_SPAN: # There is no active datadog/otel span - dd_active = None # type: Optional[Union[ddtrace.trace.Context, ddtrace.Span]] + dd_active = None # type: Optional[Union[ddtrace.trace.Context, ddtrace.trace.Span]] elif isinstance(curr_otel_span, Span): # Get underlying ddtrace span from the active otel span dd_active = curr_otel_span._ddspan diff --git a/ddtrace/internal/processor/stats.py b/ddtrace/internal/processor/stats.py index 295a6e289a2..3addd561c79 100644 --- a/ddtrace/internal/processor/stats.py +++ b/ddtrace/internal/processor/stats.py @@ -29,7 +29,7 @@ from typing import Optional # noqa:F401 from typing import Union # noqa:F401 - from ddtrace import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 log = get_logger(__name__) diff --git a/ddtrace/internal/remoteconfig/_pubsub.py b/ddtrace/internal/remoteconfig/_pubsub.py index f6b366fa792..6db1690e4d0 100644 --- a/ddtrace/internal/remoteconfig/_pubsub.py +++ b/ddtrace/internal/remoteconfig/_pubsub.py @@ -73,8 +73,8 @@ def __init__(self, _preprocess_results, callback, name="Default"): from typing import Any # noqa:F401 from typing import Optional # noqa:F401 - from ddtrace import Tracer # noqa:F401 from ddtrace.internal.remoteconfig._connectors import PublisherSubscriberConnector # noqa:F401 + from ddtrace.trace import Tracer # noqa:F401 log = get_logger(__name__) diff --git a/ddtrace/internal/remoteconfig/_subscribers.py b/ddtrace/internal/remoteconfig/_subscribers.py index 6a112f54d66..c5a5aa7eb61 100644 --- a/ddtrace/internal/remoteconfig/_subscribers.py +++ b/ddtrace/internal/remoteconfig/_subscribers.py @@ -10,9 +10,9 @@ from typing import Callable # noqa:F401 from typing import Optional # noqa:F401 - from ddtrace import Tracer # noqa:F401 from ddtrace.internal.remoteconfig._connectors import PublisherSubscriberConnector # noqa:F401 from ddtrace.internal.remoteconfig._connectors import SharedDataType # noqa:F401 + from ddtrace.trace import Tracer # noqa:F401 log = get_logger(__name__) diff --git a/ddtrace/internal/runtime/runtime_metrics.py b/ddtrace/internal/runtime/runtime_metrics.py index 4f214b54645..a71cd2cb805 100644 --- a/ddtrace/internal/runtime/runtime_metrics.py +++ b/ddtrace/internal/runtime/runtime_metrics.py @@ -78,7 +78,7 @@ def __init__(self, interval=_get_interval_or_default(), tracer=ddtrace.tracer, d self._dogstatsd_client: DogStatsd = get_dogstatsd_client( self.dogstatsd_url or ddtrace.internal.agent.get_stats_url() ) - self.tracer: Optional[ddtrace.Tracer] = tracer + self.tracer: Optional[ddtrace.trace.Tracer] = tracer self._runtime_metrics: RuntimeMetrics = RuntimeMetrics() self._services: Set[str] = set() @@ -114,7 +114,7 @@ def _restart(cls): @classmethod def enable(cls, flush_interval=None, tracer=None, dogstatsd_url=None): - # type: (Optional[float], Optional[ddtrace.Tracer], Optional[str]) -> None + # type: (Optional[float], Optional[ddtrace.trace.Tracer], Optional[str]) -> None with cls._lock: if cls._instance is not None: return diff --git a/ddtrace/internal/test_visibility/_utils.py b/ddtrace/internal/test_visibility/_utils.py index 14cbd946aeb..0e22a15dc94 100644 --- a/ddtrace/internal/test_visibility/_utils.py +++ b/ddtrace/internal/test_visibility/_utils.py @@ -1,7 +1,7 @@ -from ddtrace import Span from ddtrace.ext.test_visibility._test_visibility_base import TestVisibilityItemId from ddtrace.internal import core from ddtrace.internal.logger import get_logger +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/internal/test_visibility/api.py b/ddtrace/internal/test_visibility/api.py index 4c11135b76d..041f929e3a9 100644 --- a/ddtrace/internal/test_visibility/api.py +++ b/ddtrace/internal/test_visibility/api.py @@ -2,8 +2,6 @@ import typing as t from typing import NamedTuple -from ddtrace import Span -from ddtrace import Tracer from ddtrace.ext.test_visibility import api as ext_api from ddtrace.ext.test_visibility._test_visibility_base import TestSessionId from ddtrace.ext.test_visibility._utils import _catch_and_log_exceptions @@ -21,6 +19,8 @@ from ddtrace.internal.test_visibility._internal_item_ids import InternalTestId from ddtrace.internal.test_visibility._itr_mixins import ITRMixin from ddtrace.internal.test_visibility._utils import _get_item_span +from ddtrace.trace import Span +from ddtrace.trace import Tracer log = get_logger(__name__) diff --git a/ddtrace/internal/tracemethods.py b/ddtrace/internal/tracemethods.py index cdf16c3b785..5328797c09f 100644 --- a/ddtrace/internal/tracemethods.py +++ b/ddtrace/internal/tracemethods.py @@ -172,7 +172,7 @@ def _(m): def trace_wrapper(wrapped, instance, args, kwargs): - from ddtrace import tracer + from ddtrace.trace import tracer resource = wrapped.__name__ if hasattr(instance, "__class__") and instance.__class__ is not type(None): # noqa: E721 diff --git a/ddtrace/internal/writer/writer.py b/ddtrace/internal/writer/writer.py index 357fcf3917f..da3f09a99b1 100644 --- a/ddtrace/internal/writer/writer.py +++ b/ddtrace/internal/writer/writer.py @@ -43,7 +43,7 @@ from typing import Any # noqa:F401 from typing import Tuple # noqa:F401 - from ddtrace import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 from .agent import ConnectionType # noqa:F401 diff --git a/ddtrace/llmobs/_evaluators/runner.py b/ddtrace/llmobs/_evaluators/runner.py index 056a80000e4..3d800fe67a6 100644 --- a/ddtrace/llmobs/_evaluators/runner.py +++ b/ddtrace/llmobs/_evaluators/runner.py @@ -2,7 +2,6 @@ import os from typing import Dict -from ddtrace import Span from ddtrace.internal import forksafe from ddtrace.internal.logger import get_logger from ddtrace.internal.periodic import PeriodicService @@ -12,6 +11,7 @@ from ddtrace.llmobs._evaluators.ragas.context_precision import RagasContextPrecisionEvaluator from ddtrace.llmobs._evaluators.ragas.faithfulness import RagasFaithfulnessEvaluator from ddtrace.llmobs._evaluators.sampler import EvaluatorRunnerSampler +from ddtrace.trace import Span logger = get_logger(__name__) diff --git a/ddtrace/llmobs/_integrations/anthropic.py b/ddtrace/llmobs/_integrations/anthropic.py index dfb39c0f7e9..a3224a083cd 100644 --- a/ddtrace/llmobs/_integrations/anthropic.py +++ b/ddtrace/llmobs/_integrations/anthropic.py @@ -5,7 +5,6 @@ from typing import List from typing import Optional -from ddtrace._trace.span import Span from ddtrace.internal.logger import get_logger from ddtrace.llmobs._constants import INPUT_MESSAGES from ddtrace.llmobs._constants import INPUT_TOKENS_METRIC_KEY @@ -19,6 +18,7 @@ from ddtrace.llmobs._constants import TOTAL_TOKENS_METRIC_KEY from ddtrace.llmobs._integrations.base import BaseLLMIntegration from ddtrace.llmobs._utils import _get_attr +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/llmobs/_integrations/base.py b/ddtrace/llmobs/_integrations/base.py index 6b205202efd..a098c899014 100644 --- a/ddtrace/llmobs/_integrations/base.py +++ b/ddtrace/llmobs/_integrations/base.py @@ -8,7 +8,6 @@ from ddtrace import config from ddtrace._trace.sampler import RateSampler -from ddtrace._trace.span import Span from ddtrace.constants import _SPAN_MEASURED_KEY from ddtrace.contrib.internal.trace_utils import int_service from ddtrace.ext import SpanTypes @@ -26,6 +25,7 @@ from ddtrace.llmobs._utils import _get_llmobs_parent_id from ddtrace.settings import IntegrationConfig from ddtrace.trace import Pin +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/llmobs/_integrations/bedrock.py b/ddtrace/llmobs/_integrations/bedrock.py index d2d57b50ed3..ac6092cbe1a 100644 --- a/ddtrace/llmobs/_integrations/bedrock.py +++ b/ddtrace/llmobs/_integrations/bedrock.py @@ -3,7 +3,6 @@ from typing import List from typing import Optional -from ddtrace._trace.span import Span from ddtrace.internal.logger import get_logger from ddtrace.llmobs._constants import INPUT_MESSAGES from ddtrace.llmobs._constants import INPUT_TOKENS_METRIC_KEY @@ -19,6 +18,7 @@ from ddtrace.llmobs._constants import TOTAL_TOKENS_METRIC_KEY from ddtrace.llmobs._integrations import BaseLLMIntegration from ddtrace.llmobs._utils import _get_llmobs_parent_id +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/llmobs/_integrations/gemini.py b/ddtrace/llmobs/_integrations/gemini.py index 491187475f0..ecec71e0645 100644 --- a/ddtrace/llmobs/_integrations/gemini.py +++ b/ddtrace/llmobs/_integrations/gemini.py @@ -4,7 +4,6 @@ from typing import List from typing import Optional -from ddtrace import Span from ddtrace.internal.utils import get_argument_value from ddtrace.llmobs._constants import INPUT_MESSAGES from ddtrace.llmobs._constants import METADATA @@ -19,6 +18,7 @@ from ddtrace.llmobs._integrations.utils import get_system_instructions_from_google_model from ddtrace.llmobs._integrations.utils import llmobs_get_metadata_google from ddtrace.llmobs._utils import _get_attr +from ddtrace.trace import Span class GeminiIntegration(BaseLLMIntegration): diff --git a/ddtrace/llmobs/_integrations/langchain.py b/ddtrace/llmobs/_integrations/langchain.py index 6b09038bd90..c6a77fad3bc 100644 --- a/ddtrace/llmobs/_integrations/langchain.py +++ b/ddtrace/llmobs/_integrations/langchain.py @@ -7,7 +7,6 @@ from typing import Union from ddtrace import config -from ddtrace._trace.span import Span from ddtrace.constants import ERROR_TYPE from ddtrace.internal.logger import get_logger from ddtrace.internal.utils import ArgumentError @@ -30,6 +29,7 @@ from ddtrace.llmobs._integrations.base import BaseLLMIntegration from ddtrace.llmobs._integrations.utils import format_langchain_io from ddtrace.llmobs.utils import Document +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/llmobs/_integrations/langgraph.py b/ddtrace/llmobs/_integrations/langgraph.py index a45e822e0a2..08f3943e57e 100644 --- a/ddtrace/llmobs/_integrations/langgraph.py +++ b/ddtrace/llmobs/_integrations/langgraph.py @@ -3,7 +3,6 @@ from typing import List from typing import Optional -from ddtrace import tracer from ddtrace.ext import SpanTypes from ddtrace.internal.utils import get_argument_value from ddtrace.llmobs._constants import INPUT_VALUE @@ -16,7 +15,8 @@ from ddtrace.llmobs._utils import _get_attr from ddtrace.llmobs._utils import _get_llmobs_parent_id from ddtrace.llmobs._utils import _get_nearest_llmobs_ancestor -from ddtrace.span import Span +from ddtrace.trace import Span +from ddtrace.trace import tracer class LangGraphIntegration(BaseLLMIntegration): diff --git a/ddtrace/llmobs/_integrations/openai.py b/ddtrace/llmobs/_integrations/openai.py index ea660f53f68..7ed3aace08a 100644 --- a/ddtrace/llmobs/_integrations/openai.py +++ b/ddtrace/llmobs/_integrations/openai.py @@ -6,7 +6,6 @@ from typing import Tuple from ddtrace import config -from ddtrace._trace.span import Span from ddtrace.internal.constants import COMPONENT from ddtrace.internal.utils.version import parse_version from ddtrace.llmobs._constants import INPUT_DOCUMENTS @@ -25,6 +24,7 @@ from ddtrace.llmobs._utils import _get_attr from ddtrace.llmobs.utils import Document from ddtrace.trace import Pin +from ddtrace.trace import Span class OpenAIIntegration(BaseLLMIntegration): diff --git a/ddtrace/llmobs/_integrations/vertexai.py b/ddtrace/llmobs/_integrations/vertexai.py index 933cd685a1f..88d38f1975e 100644 --- a/ddtrace/llmobs/_integrations/vertexai.py +++ b/ddtrace/llmobs/_integrations/vertexai.py @@ -4,7 +4,6 @@ from typing import List from typing import Optional -from ddtrace import Span from ddtrace.internal.utils import ArgumentError from ddtrace.internal.utils import get_argument_value from ddtrace.llmobs._constants import INPUT_MESSAGES @@ -20,6 +19,7 @@ from ddtrace.llmobs._integrations.utils import get_system_instructions_from_google_model from ddtrace.llmobs._integrations.utils import llmobs_get_metadata_google from ddtrace.llmobs._utils import _get_attr +from ddtrace.trace import Span class VertexAIIntegration(BaseLLMIntegration): diff --git a/ddtrace/llmobs/_llmobs.py b/ddtrace/llmobs/_llmobs.py index acb214b019d..79c1a494b04 100644 --- a/ddtrace/llmobs/_llmobs.py +++ b/ddtrace/llmobs/_llmobs.py @@ -8,10 +8,8 @@ from typing import Union import ddtrace -from ddtrace import Span from ddtrace import config from ddtrace import patch -from ddtrace._trace.context import Context from ddtrace.constants import ERROR_MSG from ddtrace.constants import ERROR_STACK from ddtrace.constants import ERROR_TYPE @@ -68,6 +66,8 @@ from ddtrace.llmobs.utils import ExportedLLMObsSpan from ddtrace.llmobs.utils import Messages from ddtrace.propagation.http import HTTPPropagator +from ddtrace.trace import Context +from ddtrace.trace import Span log = get_logger(__name__) @@ -295,7 +295,7 @@ def enable( api_key: Optional[str] = None, env: Optional[str] = None, service: Optional[str] = None, - _tracer: Optional[ddtrace.Tracer] = None, + _tracer: Optional[ddtrace.trace.Tracer] = None, ) -> None: """ Enable LLM Observability tracing. diff --git a/ddtrace/llmobs/_utils.py b/ddtrace/llmobs/_utils.py index c2f44689a05..8861820002c 100644 --- a/ddtrace/llmobs/_utils.py +++ b/ddtrace/llmobs/_utils.py @@ -5,7 +5,6 @@ from typing import Union import ddtrace -from ddtrace import Span from ddtrace import config from ddtrace.ext import SpanTypes from ddtrace.internal.logger import get_logger @@ -21,6 +20,7 @@ from ddtrace.llmobs._constants import PROPAGATED_PARENT_ID_KEY from ddtrace.llmobs._constants import SESSION_ID from ddtrace.llmobs._constants import VERTEXAI_APM_SPAN_NAME +from ddtrace.trace import Span log = get_logger(__name__) diff --git a/ddtrace/opentracer/span.py b/ddtrace/opentracer/span.py index 8be50b9cd4b..75bb522d06f 100644 --- a/ddtrace/opentracer/span.py +++ b/ddtrace/opentracer/span.py @@ -9,20 +9,20 @@ from opentracing import Span as OpenTracingSpan from opentracing.ext import tags as OTTags -from ddtrace._trace.context import Context as DatadogContext # noqa:F401 -from ddtrace._trace.span import Span as DatadogSpan from ddtrace.constants import ERROR_MSG from ddtrace.constants import ERROR_STACK from ddtrace.constants import ERROR_TYPE from ddtrace.internal.compat import NumericType # noqa:F401 from ddtrace.internal.constants import SPAN_API_OPENTRACING +from ddtrace.trace import Context as DatadogContext # noqa:F401 +from ddtrace.trace import Span as DatadogSpan from .span_context import SpanContext from .tags import Tags if TYPE_CHECKING: # pragma: no cover - from ddtrace._trace.tracer import Tracer # noqa:F401 + from ddtrace.trace import Tracer # noqa:F401 _TagNameType = Union[Text, bytes] diff --git a/ddtrace/opentracer/span_context.py b/ddtrace/opentracer/span_context.py index 63cee94f4d3..171142d18a8 100644 --- a/ddtrace/opentracer/span_context.py +++ b/ddtrace/opentracer/span_context.py @@ -4,8 +4,8 @@ from opentracing import SpanContext as OpenTracingSpanContext -from ddtrace._trace.context import Context as DatadogContext from ddtrace.internal.compat import NumericType # noqa:F401 +from ddtrace.trace import Context as DatadogContext class SpanContext(OpenTracingSpanContext): diff --git a/ddtrace/opentracer/tracer.py b/ddtrace/opentracer/tracer.py index 2c8ac4a5d65..ca10cb8125a 100644 --- a/ddtrace/opentracer/tracer.py +++ b/ddtrace/opentracer/tracer.py @@ -11,13 +11,13 @@ from opentracing.scope_managers import ThreadLocalScopeManager import ddtrace -from ddtrace import Tracer as DatadogTracer from ddtrace import config as ddconfig -from ddtrace._trace.context import Context as DatadogContext # noqa:F401 -from ddtrace._trace.span import Span as DatadogSpan from ddtrace.internal.constants import SPAN_API_OPENTRACING from ddtrace.internal.utils.config import get_application_name from ddtrace.settings import ConfigException +from ddtrace.trace import Context as DatadogContext # noqa:F401 +from ddtrace.trace import Span as DatadogSpan +from ddtrace.trace import Tracer as DatadogTracer from ddtrace.vendor.debtcollector import deprecate from ..internal.logger import get_logger diff --git a/ddtrace/profiling/collector/_lock.py b/ddtrace/profiling/collector/_lock.py index ec0c438b2b9..3d9e974734a 100644 --- a/ddtrace/profiling/collector/_lock.py +++ b/ddtrace/profiling/collector/_lock.py @@ -10,7 +10,6 @@ import wrapt -from ddtrace._trace.tracer import Tracer from ddtrace.internal.datadog.profiling import ddup from ddtrace.internal.logger import get_logger from ddtrace.profiling import _threading @@ -20,6 +19,7 @@ from ddtrace.profiling.collector import _traceback from ddtrace.profiling.recorder import Recorder from ddtrace.settings.profiling import config +from ddtrace.trace import Tracer LOG = get_logger(__name__) diff --git a/ddtrace/profiling/collector/pytorch.py b/ddtrace/profiling/collector/pytorch.py index 3d9e636871d..8d2bee1e965 100644 --- a/ddtrace/profiling/collector/pytorch.py +++ b/ddtrace/profiling/collector/pytorch.py @@ -7,12 +7,12 @@ import wrapt -from ddtrace._trace.tracer import Tracer from ddtrace.internal.datadog.profiling import ddup from ddtrace.profiling import _threading from ddtrace.profiling import collector from ddtrace.profiling.recorder import Recorder from ddtrace.settings.profiling import config +from ddtrace.trace import Tracer LOG = logging.getLogger(__name__) diff --git a/ddtrace/profiling/collector/stack.pyi b/ddtrace/profiling/collector/stack.pyi index e1181c96b05..237744eb9d4 100644 --- a/ddtrace/profiling/collector/stack.pyi +++ b/ddtrace/profiling/collector/stack.pyi @@ -4,4 +4,4 @@ import ddtrace from ddtrace.profiling import collector class StackCollector(collector.PeriodicCollector): - tracer: typing.Optional[ddtrace.Tracer] + tracer: typing.Optional[ddtrace.trace.Tracer] diff --git a/ddtrace/profiling/collector/stack.pyx b/ddtrace/profiling/collector/stack.pyx index 46b24e39c33..ba44257197c 100644 --- a/ddtrace/profiling/collector/stack.pyx +++ b/ddtrace/profiling/collector/stack.pyx @@ -10,7 +10,7 @@ import typing from ddtrace.internal._unpatched import _threading as ddtrace_threading from ddtrace._trace import context from ddtrace._trace import span as ddspan -from ddtrace._trace.tracer import Tracer +from ddtrace.trace import Tracer from ddtrace.internal._threads import periodic_threads from ddtrace.internal.datadog.profiling import ddup from ddtrace.internal.datadog.profiling import stack_v2 diff --git a/ddtrace/profiling/exporter/http.py b/ddtrace/profiling/exporter/http.py index b4ec6994d72..7ba1ef42eb0 100644 --- a/ddtrace/profiling/exporter/http.py +++ b/ddtrace/profiling/exporter/http.py @@ -40,7 +40,7 @@ class PprofHTTPExporter(pprof.PprofExporter): def __init__( self, - tracer: ddtrace.Tracer = ddtrace.tracer, + tracer: ddtrace.trace.Tracer = ddtrace.tracer, enable_code_provenance: bool = True, api_key: typing.Optional[str] = None, timeout: float = config.api_timeout, diff --git a/ddtrace/profiling/scheduler.py b/ddtrace/profiling/scheduler.py index 98ab424c42b..aa3db25e049 100644 --- a/ddtrace/profiling/scheduler.py +++ b/ddtrace/profiling/scheduler.py @@ -9,12 +9,12 @@ from typing import Sequence # noqa F401 import ddtrace -from ddtrace._trace.tracer import Tracer from ddtrace.internal import periodic from ddtrace.internal.datadog.profiling import ddup from ddtrace.profiling import _traceback from ddtrace.profiling import exporter from ddtrace.settings.profiling import config +from ddtrace.trace import Tracer from .exporter import Exporter from .recorder import EventsType diff --git a/ddtrace/propagation/_database_monitoring.py b/ddtrace/propagation/_database_monitoring.py index 817d23c4ebf..ae03aa5c4fe 100644 --- a/ddtrace/propagation/_database_monitoring.py +++ b/ddtrace/propagation/_database_monitoring.py @@ -17,7 +17,7 @@ if TYPE_CHECKING: from typing import Optional # noqa:F401 - from ddtrace import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 import sys diff --git a/ddtrace/propagation/http.py b/ddtrace/propagation/http.py index fdaf97410ad..3179e1980bb 100644 --- a/ddtrace/propagation/http.py +++ b/ddtrace/propagation/http.py @@ -12,7 +12,7 @@ import urllib.parse import ddtrace -from ddtrace._trace.span import Span # noqa:F401 +from ddtrace.trace import Span # noqa:F401 if sys.version_info >= (3, 8): @@ -23,12 +23,12 @@ from ddtrace import config from ddtrace._trace._span_link import SpanLink -from ddtrace._trace.context import Context from ddtrace._trace.span import _get_64_highest_order_bits_as_hex from ddtrace._trace.span import _get_64_lowest_order_bits_as_int from ddtrace._trace.span import _MetaDictType from ddtrace.appsec._constants import APPSEC from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import Context from ..constants import AUTO_KEEP from ..constants import AUTO_REJECT diff --git a/ddtrace/runtime/__init__.py b/ddtrace/runtime/__init__.py index dc6a3ae745c..1ae6fc97191 100644 --- a/ddtrace/runtime/__init__.py +++ b/ddtrace/runtime/__init__.py @@ -26,7 +26,7 @@ class RuntimeMetrics(metaclass=_RuntimeMetricsStatus): @staticmethod def enable(tracer=None, dogstatsd_url=None, flush_interval=None): - # type: (Optional[ddtrace.Tracer], Optional[str], Optional[float]) -> None + # type: (Optional[ddtrace.trace.Tracer], Optional[str], Optional[float]) -> None """ Enable the runtime metrics collection service. diff --git a/ddtrace/span.py b/ddtrace/span.py index bf1832d1fa0..48f1835262c 100644 --- a/ddtrace/span.py +++ b/ddtrace/span.py @@ -1,5 +1,5 @@ -from ddtrace._trace.span import Span # noqa: F401 from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning +from ddtrace.trace import Span # noqa: F401 from ddtrace.vendor.debtcollector import deprecate diff --git a/ddtrace/trace/__init__.py b/ddtrace/trace/__init__.py index f709310d589..3d50f66ec5a 100644 --- a/ddtrace/trace/__init__.py +++ b/ddtrace/trace/__init__.py @@ -1,6 +1,7 @@ from ddtrace._trace.context import Context from ddtrace._trace.filters import TraceFilter from ddtrace._trace.pin import Pin +from ddtrace._trace.provider import BaseContextProvider from ddtrace._trace.span import Span from ddtrace._trace.tracer import Tracer @@ -9,6 +10,7 @@ tracer = Tracer() __all__ = [ + "BaseContextProvider", "Context", "Pin", "TraceFilter", diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst index 64e0095abb1..6c30c6b5310 100644 --- a/docs/advanced_usage.rst +++ b/docs/advanced_usage.rst @@ -10,7 +10,7 @@ If the Datadog Agent is on a separate host from your application, you can modify the default ``ddtrace.tracer`` object to utilize another hostname and port. Here is a small example showcasing this:: - from ddtrace import tracer + from ddtrace.trace import tracer tracer.configure(hostname=, port=, https=) @@ -18,7 +18,7 @@ By default, these will be set to ``localhost``, ``8126``, and ``False`` respecti You can also use a Unix Domain Socket to connect to the agent:: - from ddtrace import tracer + from ddtrace.trace import tracer tracer.configure(uds_path="/path/to/socket") @@ -29,7 +29,7 @@ You can also use a Unix Domain Socket to connect to the agent:: Context ------- -The :class:`ddtrace.context.Context` object is used to represent the state of +The :class:`ddtrace.trace.Context` object is used to represent the state of a trace at a point in time. This state includes the trace id, active span id, distributed sampling decision and more. It is used to propagate the trace across execution boundaries like processes @@ -46,7 +46,7 @@ Tracing Context Management -------------------------- In ``ddtrace`` "context management" is the management of which -:class:`ddtrace.Span` or :class:`ddtrace.context.Context` is active in an +:class:`ddtrace.trace.Span` or :class:`ddtrace.trace.Context` is active in an execution (thread, task, etc). There can only be one active span or context per execution at a time. @@ -97,7 +97,7 @@ To continue a trace across threads the context needs to be passed between threads:: import threading, time - from ddtrace import tracer + from ddtrace.trace import tracer def _target(trace_ctx): tracer.context_provider.activate(trace_ctx) @@ -116,7 +116,7 @@ When the :ref:`futures` integration is enabled, the context is automatically pro to :class:`~concurrent.futures.ThreadPoolExecutor` tasks:: from concurrent.futures import ThreadPoolExecutor - from ddtrace import tracer + from ddtrace.trace import tracer @tracer.wrap() def eat(dessert): # each task will get its own span, child of the eat_all_the_things span @@ -140,7 +140,7 @@ span has to be propagated as a context:: from multiprocessing import Process import time - from ddtrace import tracer + from ddtrace.trace import tracer def _target(ctx): tracer.context_provider.activate(ctx) @@ -159,8 +159,8 @@ span has to be propagated as a context:: .. important:: - A :class:`ddtrace.Span` should only be accessed or modified in the process - that it was created in. Using a :class:`ddtrace.Span` from within a child process + A :class:`ddtrace.trace.Span` should only be accessed or modified in the process + that it was created in. Using a :class:`ddtrace.trace.Span` from within a child process could result in a deadlock or unexpected behavior. @@ -173,7 +173,7 @@ to contexts to avoid memory leaks. Here's an example of tracing some work done in a child process:: import os, sys, time - from ddtrace import tracer + from ddtrace.trace import tracer span = tracer.trace("work") @@ -208,7 +208,7 @@ Manual Management Parenting can be managed manually by using ``tracer.start_span()`` which by default does not activate spans when they are created. See the documentation -for :meth:`ddtrace.Tracer.start_span`. +for :meth:`ddtrace.trace.Tracer.start_span`. Context Providers @@ -221,7 +221,7 @@ context management. If there is a case where the default is insufficient then a custom context provider can be used. It must implement the -:class:`ddtrace.provider.BaseContextProvider` interface and can be configured +:class:`ddtrace.trace.BaseContextProvider` interface and can be configured with:: tracer.configure(context_provider=MyContextProvider) @@ -331,7 +331,7 @@ It is possible to filter or modify traces before they are sent to the Agent by configuring the tracer with a filters list. For instance, to filter out all traces of incoming requests to a specific url:: - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.trace import TraceFilter class FilterbyName(TraceFilter): @@ -350,11 +350,11 @@ and the resulting trace will either be sent to the Agent or discarded. **Writing a custom filter** Create a filter by implementing a class with a ``process_trace`` method and -providing it to the filters parameter of :meth:`ddtrace.Tracer.configure()`. +providing it to the filters parameter of :meth:`ddtrace.trace.Tracer.configure()`. ``process_trace`` should either return a trace to be fed to the next step of the pipeline or ``None`` if the trace should be discarded:: - from ddtrace import Span, tracer + from ddtrace.trace import Span, tracer from ddtrace.trace import TraceFilter class FilterExample(TraceFilter): diff --git a/docs/api.rst b/docs/api.rst index d4b4e80674a..259629e711b 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -13,10 +13,10 @@ Tracing .. autofunction:: ddtrace.patch -.. autoclass:: ddtrace.Tracer +.. autoclass:: ddtrace.trace.Tracer :members: -.. autoclass:: ddtrace.Span +.. autoclass:: ddtrace.trace.Span :members: .. autoclass:: ddtrace.trace.Pin @@ -26,10 +26,10 @@ Tracing :members: :undoc-members: -.. autoclass:: ddtrace.sampler.DatadogSampler +.. autoclass:: ddtrace._trace.sampler.DatadogSampler :members: -.. autoclass:: ddtrace.sampler.SamplingRule +.. autoclass:: ddtrace._trace.sampler.SamplingRule :members: .. autoclass:: ddtrace.propagation.http.HTTPPropagator diff --git a/docs/basic_usage.rst b/docs/basic_usage.rst index 7f8f6cbb9cb..bc50ddef6b0 100644 --- a/docs/basic_usage.rst +++ b/docs/basic_usage.rst @@ -35,13 +35,13 @@ in your application:: # ... # ... -API documentation can be found here :py:meth:`ddtrace.Tracer.wrap`. +API documentation can be found here :py:meth:`ddtrace.trace.Tracer.wrap`. Context Manager --------------- -To trace an arbitrary block of code, you can use :py:meth:`ddtrace.Tracer.trace` -that returns a :py:mod:`ddtrace.Span` which can be used as a context manager:: +To trace an arbitrary block of code, you can use :py:meth:`ddtrace.trace.Tracer.trace` +that returns a :py:mod:`ddtrace.trace.Span` which can be used as a context manager:: # trace some interesting operation with tracer.trace('interesting.operations'): @@ -49,7 +49,7 @@ that returns a :py:mod:`ddtrace.Span` which can be used as a context manager:: # ... # ... -API documentation can be found here :py:meth:`ddtrace.Tracer`. +API documentation can be found here :py:meth:`ddtrace.trace.Tracer`. Using the API ------------- @@ -67,8 +67,8 @@ manual API to provide complete control over starting and stopping spans is avail API details for creating and finishing spans can be found here: -- :py:meth:`ddtrace.Tracer.trace` -- :py:meth:`ddtrace.Span.finish`. +- :py:meth:`ddtrace.trace.Tracer.trace` +- :py:meth:`ddtrace.trace.Span.finish`. Profiling diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index f471b6433b5..0dac5702140 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -66,7 +66,7 @@ This can be a problem for users who want to see error details from a child span While this is default behavior for integrations, users can add a trace filter to propagate the error details up to the root span:: - from ddtrace import Span, tracer + from ddtrace.trace import Span, tracer from ddtrace.trace import TraceFilter diff --git a/releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml b/releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml new file mode 100644 index 00000000000..66e0ccb0ee5 --- /dev/null +++ b/releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml @@ -0,0 +1,5 @@ +--- +other: + - | + tracing: Ensures the ddtrace library does not use deprecated APIs internally. + Deprecation warnings should only be logged when the user's code is using deprecated APIs. diff --git a/scripts/profiles/flask-simple/app/app.py b/scripts/profiles/flask-simple/app/app.py index de49491c96f..74402af5c85 100644 --- a/scripts/profiles/flask-simple/app/app.py +++ b/scripts/profiles/flask-simple/app/app.py @@ -11,14 +11,14 @@ @app.route("/") def entry_point(): if environ.get("DUPLICATE_TAGS_SCENARIO", None): - from ddtrace import tracer + from ddtrace.trace import tracer span = tracer.current_span() if span: for _ in range(100): span.set_tag(_, "a" * 100) elif environ.get("UNIQUE_TAGS_SCENARIO", None): - from ddtrace import tracer + from ddtrace.trace import tracer span = tracer.current_span() if span: diff --git a/templates/integration/__init__.py b/templates/integration/__init__.py index ef19d262e58..8eaf8b9c136 100644 --- a/templates/integration/__init__.py +++ b/templates/integration/__init__.py @@ -35,7 +35,7 @@ ``Pin`` API:: import foo - from ddtrace import Pin + from ddtrace.trace import Pin myfoo = foo.Foo() Pin.override(myfoo, service="myfoo") diff --git a/tests/appsec/appsec/test_appsec_trace_utils.py b/tests/appsec/appsec/test_appsec_trace_utils.py index b4dbf97c8e2..3c70b4267ed 100644 --- a/tests/appsec/appsec/test_appsec_trace_utils.py +++ b/tests/appsec/appsec/test_appsec_trace_utils.py @@ -238,7 +238,7 @@ def test_set_user_blocked(self): assert is_blocked(span) def test_no_span_doesnt_raise(self): - from ddtrace import tracer + from ddtrace.trace import tracer with self._caplog.at_level(logging.DEBUG): try: diff --git a/tests/appsec/appsec/test_processor.py b/tests/appsec/appsec/test_processor.py index 117a55175f9..fbfb11af75c 100644 --- a/tests/appsec/appsec/test_processor.py +++ b/tests/appsec/appsec/test_processor.py @@ -706,7 +706,7 @@ def test_required_addresses(): @pytest.mark.parametrize("ephemeral", ["LFI_ADDRESS", "PROCESSOR_SETTINGS"]) @mock.patch("ddtrace.appsec._ddwaf.DDWaf.run") def test_ephemeral_addresses(mock_run, persistent, ephemeral): - from ddtrace import tracer + from ddtrace.trace import tracer processor = AppSecSpanProcessor() processor._update_rules(CUSTOM_RULE_METHOD) diff --git a/tests/appsec/appsec/test_telemetry.py b/tests/appsec/appsec/test_telemetry.py index 10c8a0c0307..5ac21ceaa2e 100644 --- a/tests/appsec/appsec/test_telemetry.py +++ b/tests/appsec/appsec/test_telemetry.py @@ -4,7 +4,6 @@ import mock import pytest -from ddtrace import tracer import ddtrace.appsec._asm_request_context as asm_request_context from ddtrace.appsec._ddwaf import version import ddtrace.appsec._ddwaf.ddwaf_types @@ -15,6 +14,7 @@ from ddtrace.internal.telemetry.constants import TELEMETRY_NAMESPACE from ddtrace.internal.telemetry.constants import TELEMETRY_TYPE_DISTRIBUTION from ddtrace.internal.telemetry.constants import TELEMETRY_TYPE_GENERATE_METRICS +from ddtrace.trace import tracer import tests.appsec.rules as rules from tests.appsec.utils import asm_context from tests.utils import override_global_config diff --git a/tests/appsec/contrib_appsec/django_app/settings.py b/tests/appsec/contrib_appsec/django_app/settings.py index 859201f840a..ce134a597f0 100644 --- a/tests/appsec/contrib_appsec/django_app/settings.py +++ b/tests/appsec/contrib_appsec/django_app/settings.py @@ -2,7 +2,7 @@ import django -from ddtrace import tracer +from ddtrace.trace import tracer from tests.webclient import PingFilter diff --git a/tests/appsec/contrib_appsec/django_app/urls.py b/tests/appsec/contrib_appsec/django_app/urls.py index 1b691d43a53..3ca8557c550 100644 --- a/tests/appsec/contrib_appsec/django_app/urls.py +++ b/tests/appsec/contrib_appsec/django_app/urls.py @@ -11,8 +11,8 @@ from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt -from ddtrace import tracer import ddtrace.constants +from ddtrace.trace import tracer # django.conf.urls.url was deprecated in django 3 and removed in django 4 diff --git a/tests/appsec/contrib_appsec/fastapi_app/app.py b/tests/appsec/contrib_appsec/fastapi_app/app.py index 3403df6f844..c636e65b7c3 100644 --- a/tests/appsec/contrib_appsec/fastapi_app/app.py +++ b/tests/appsec/contrib_appsec/fastapi_app/app.py @@ -11,8 +11,8 @@ from fastapi.responses import StreamingResponse from pydantic import BaseModel -from ddtrace import tracer import ddtrace.constants +from ddtrace.trace import tracer fake_secret_token = "DataDog" diff --git a/tests/appsec/contrib_appsec/flask_app/app.py b/tests/appsec/contrib_appsec/flask_app/app.py index 83fb1ce9721..32228375f37 100644 --- a/tests/appsec/contrib_appsec/flask_app/app.py +++ b/tests/appsec/contrib_appsec/flask_app/app.py @@ -6,10 +6,9 @@ from flask import Flask from flask import request -from ddtrace import tracer - # from ddtrace.appsec.iast import ddtrace_iast_flask_patch import ddtrace.constants +from ddtrace.trace import tracer from tests.webclient import PingFilter diff --git a/tests/appsec/iast/fixtures/integration/main_configure.py b/tests/appsec/iast/fixtures/integration/main_configure.py index aa7de99e22c..bc9933a7679 100644 --- a/tests/appsec/iast/fixtures/integration/main_configure.py +++ b/tests/appsec/iast/fixtures/integration/main_configure.py @@ -4,9 +4,9 @@ import os import sys -from ddtrace import tracer from ddtrace.appsec._iast._utils import _is_iast_enabled from ddtrace.ext import SpanTypes +from ddtrace.trace import tracer logger = logging.getLogger(__name__) diff --git a/tests/appsec/iast/fixtures/integration/main_configure_right.py b/tests/appsec/iast/fixtures/integration/main_configure_right.py index b1789deef97..c7fa96cc2fd 100644 --- a/tests/appsec/iast/fixtures/integration/main_configure_right.py +++ b/tests/appsec/iast/fixtures/integration/main_configure_right.py @@ -4,8 +4,8 @@ import os import sys -from ddtrace import tracer from ddtrace.ext import SpanTypes +from ddtrace.trace import tracer logger = logging.getLogger(__name__) diff --git a/tests/appsec/iast/fixtures/integration/main_configure_wrong.py b/tests/appsec/iast/fixtures/integration/main_configure_wrong.py index 92828790b03..cb2a031946e 100644 --- a/tests/appsec/iast/fixtures/integration/main_configure_wrong.py +++ b/tests/appsec/iast/fixtures/integration/main_configure_wrong.py @@ -4,8 +4,8 @@ import os import sys -from ddtrace import tracer from ddtrace.ext import SpanTypes +from ddtrace.trace import tracer logger = logging.getLogger(__name__) diff --git a/tests/appsec/iast_tdd_propagation/flask_orm_app.py b/tests/appsec/iast_tdd_propagation/flask_orm_app.py index b4e7e0d2095..8dea94567a5 100644 --- a/tests/appsec/iast_tdd_propagation/flask_orm_app.py +++ b/tests/appsec/iast_tdd_propagation/flask_orm_app.py @@ -11,8 +11,8 @@ from flask import Flask from flask import request -from ddtrace import tracer from ddtrace.appsec.iast import ddtrace_iast_flask_patch +from ddtrace.trace import tracer from tests.appsec.iast.taint_sinks.conftest import _get_span_report from tests.utils import override_env diff --git a/tests/appsec/iast_tdd_propagation/flask_propagation_views.py b/tests/appsec/iast_tdd_propagation/flask_propagation_views.py index ae1ce2af489..83dcbfa41bf 100644 --- a/tests/appsec/iast_tdd_propagation/flask_propagation_views.py +++ b/tests/appsec/iast_tdd_propagation/flask_propagation_views.py @@ -3,8 +3,8 @@ from flask import Flask from flask import request -from ddtrace import tracer from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted +from ddtrace.trace import tracer class ResultResponse: diff --git a/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py b/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py index 396aa0db63c..11d6ee3e0f2 100644 --- a/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py +++ b/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py @@ -5,8 +5,8 @@ from flask import Flask from flask import request -from ddtrace import tracer from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted +from ddtrace.trace import tracer from tests.appsec.iast.taint_sinks.conftest import _get_span_report diff --git a/tests/appsec/integrations/django_tests/conftest.py b/tests/appsec/integrations/django_tests/conftest.py index e24eb07081e..d150edf68be 100644 --- a/tests/appsec/integrations/django_tests/conftest.py +++ b/tests/appsec/integrations/django_tests/conftest.py @@ -4,9 +4,9 @@ from django.conf import settings import pytest -from ddtrace import Pin from ddtrace.appsec._iast import enable_iast_propagation from ddtrace.contrib.internal.django.patch import patch +from ddtrace.trace import Pin from tests.appsec.iast.conftest import _end_iast_context_and_oce from tests.appsec.iast.conftest import _start_iast_context_and_oce from tests.utils import DummyTracer diff --git a/tests/appsec/integrations/django_tests/django_app/settings.py b/tests/appsec/integrations/django_tests/django_app/settings.py index 9883d69f5ba..9464c37fd43 100644 --- a/tests/appsec/integrations/django_tests/django_app/settings.py +++ b/tests/appsec/integrations/django_tests/django_app/settings.py @@ -1,6 +1,6 @@ import os -from ddtrace import tracer +from ddtrace.trace import tracer from tests.webclient import PingFilter diff --git a/tests/appsec/integrations/django_tests/django_app/urls.py b/tests/appsec/integrations/django_tests/django_app/urls.py index c9dffbde8d8..dd1d069ad77 100644 --- a/tests/appsec/integrations/django_tests/django_app/urls.py +++ b/tests/appsec/integrations/django_tests/django_app/urls.py @@ -2,7 +2,7 @@ from django.http import HttpResponse from django.urls import path -from ddtrace import tracer +from ddtrace.trace import tracer from tests.appsec.integrations.django_tests.django_app import views diff --git a/tests/appsec/integrations/django_tests/django_app/views.py b/tests/appsec/integrations/django_tests/django_app/views.py index 74cc239cf34..693a9eab365 100644 --- a/tests/appsec/integrations/django_tests/django_app/views.py +++ b/tests/appsec/integrations/django_tests/django_app/views.py @@ -9,12 +9,12 @@ from django.http import HttpResponse from django.http import JsonResponse -from ddtrace import tracer from ddtrace.appsec import _asm_request_context from ddtrace.appsec._iast._taint_tracking import OriginType from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast.reporter import IastSpanReporter from ddtrace.appsec._trace_utils import block_request_if_user_blocked +from ddtrace.trace import tracer def assert_origin(parameter: Any, origin_type: Any) -> None: diff --git a/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py b/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py index 3c9b934416a..be495989f5d 100644 --- a/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py +++ b/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py @@ -10,9 +10,9 @@ import pytest -from ddtrace import tracer from ddtrace.internal.compat import httplib from ddtrace.internal.compat import parse +from ddtrace.trace import tracer from tests.appsec.appsec_utils import gunicorn_server from tests.appsec.integrations.flask_tests.utils import _PORT from tests.appsec.integrations.flask_tests.utils import _multi_requests diff --git a/tests/appsec/utils.py b/tests/appsec/utils.py index 7d79455361f..9fe95b06a93 100644 --- a/tests/appsec/utils.py +++ b/tests/appsec/utils.py @@ -2,10 +2,10 @@ import sys import typing -from ddtrace import tracer as default_tracer -from ddtrace._trace.span import Span from ddtrace.ext import SpanTypes import ddtrace.internal.core as core +from ddtrace.trace import Span +from ddtrace.trace import tracer as default_tracer from tests.utils import override_global_config diff --git a/tests/ci_visibility/api_client/_util.py b/tests/ci_visibility/api_client/_util.py index 403482688a9..8a7d1871b96 100644 --- a/tests/ci_visibility/api_client/_util.py +++ b/tests/ci_visibility/api_client/_util.py @@ -344,7 +344,7 @@ def _get_mock_civisibility(requests_mode, suite_skipping_mode): "runtime.version": "11.5.2", } mock_civisibility._git_client = mock.Mock(spec=CIVisibilityGitClient) - mock_civisibility.tracer = mock.Mock(spec=ddtrace.Tracer) + mock_civisibility.tracer = mock.Mock(spec=ddtrace.trace.Tracer) mock_civisibility.tracer._agent_url = "http://notahost:1234" return mock_civisibility diff --git a/tests/ci_visibility/test_ci_visibility.py b/tests/ci_visibility/test_ci_visibility.py index 525d9b014fa..1db4f068c7a 100644 --- a/tests/ci_visibility/test_ci_visibility.py +++ b/tests/ci_visibility/test_ci_visibility.py @@ -14,7 +14,6 @@ import pytest import ddtrace -from ddtrace._trace.span import Span from ddtrace.constants import AUTO_KEEP from ddtrace.ext import ci from ddtrace.ext.git import _build_git_packfiles_with_details @@ -32,6 +31,7 @@ from ddtrace.internal.ci_visibility.recorder import _extract_repository_name_from_url import ddtrace.internal.test_visibility._internal_item_ids from ddtrace.internal.utils.http import Response +from ddtrace.trace import Span from tests.ci_visibility.api_client._util import _make_fqdn_suite_ids from tests.ci_visibility.api_client._util import _make_fqdn_test_ids from tests.ci_visibility.util import _ci_override_env @@ -685,7 +685,7 @@ def test_civisibilitywriter_evp_proxy_url(self): ), mock.patch( "ddtrace.internal.agent.get_trace_url", return_value="http://evpproxy.bar:1234" ), mock.patch("ddtrace.settings._config.Config", _get_default_civisibility_ddconfig()), mock.patch( - "ddtrace.tracer", ddtrace.Tracer() + "ddtrace.tracer", ddtrace.trace.Tracer() ), mock.patch( "ddtrace.internal.ci_visibility.recorder.CIVisibility._agent_evp_proxy_is_available", return_value=True ), _dummy_noop_git_client(), mock.patch( @@ -705,7 +705,7 @@ def test_civisibilitywriter_only_traces(self): ) ), mock.patch( "ddtrace.internal.agent.get_trace_url", return_value="http://onlytraces:1234" - ), mock.patch("ddtrace.tracer", ddtrace.Tracer()), mock.patch( + ), mock.patch("ddtrace.tracer", ddtrace.trace.Tracer()), mock.patch( "ddtrace.internal.ci_visibility.recorder.CIVisibility._agent_evp_proxy_is_available", return_value=False ), mock.patch( "ddtrace.internal.ci_visibility.writer.config", ddtrace.settings.Config() @@ -1119,7 +1119,7 @@ def test_civisibility_enable_respects_passed_in_tracer(): ), _dummy_noop_git_client(), mock.patch( "ddtrace.internal.ci_visibility.recorder.ddconfig", _get_default_civisibility_ddconfig() ), mock.patch("ddtrace.internal.ci_visibility.writer.config", ddtrace.settings.Config()): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(partial_flush_enabled=False, partial_flush_min_spans=100) CIVisibility.enable(tracer=tracer) assert CIVisibility._instance.tracer._partial_flush_enabled is False diff --git a/tests/ci_visibility/test_ci_visibility_check_enabled_features.py b/tests/ci_visibility/test_ci_visibility_check_enabled_features.py index 1402510bc73..24592d0bed2 100644 --- a/tests/ci_visibility/test_ci_visibility_check_enabled_features.py +++ b/tests/ci_visibility/test_ci_visibility_check_enabled_features.py @@ -46,7 +46,7 @@ def _get_mock_civisibility(): "runtime.version": "11.5.2", } mock_civisibility._git_client = mock.Mock(spec=CIVisibilityGitClient) - mock_civisibility.tracer = mock.Mock(spec=ddtrace.Tracer) + mock_civisibility.tracer = mock.Mock(spec=ddtrace.trace.Tracer) mock_civisibility.tracer._agent_url = "http://notahost:1234" return mock_civisibility diff --git a/tests/ci_visibility/test_encoder.py b/tests/ci_visibility/test_encoder.py index 4a1d0fe2331..b503c4528df 100644 --- a/tests/ci_visibility/test_encoder.py +++ b/tests/ci_visibility/test_encoder.py @@ -3,7 +3,6 @@ import msgpack -from ddtrace._trace.span import Span from ddtrace.internal.ci_visibility.constants import COVERAGE_TAG_NAME from ddtrace.internal.ci_visibility.constants import ITR_CORRELATION_ID_TAG_NAME from ddtrace.internal.ci_visibility.constants import SESSION_ID @@ -11,6 +10,7 @@ from ddtrace.internal.ci_visibility.encoder import CIVisibilityCoverageEncoderV02 from ddtrace.internal.ci_visibility.encoder import CIVisibilityEncoderV01 from ddtrace.internal.encoding import JSONEncoder +from ddtrace.trace import Span from tests.contrib.pytest.test_pytest import PytestTestCaseBase diff --git a/tests/ci_visibility/util.py b/tests/ci_visibility/util.py index 87d818191c5..dc0b886ca64 100644 --- a/tests/ci_visibility/util.py +++ b/tests/ci_visibility/util.py @@ -209,5 +209,5 @@ def _ci_override_env( new_vars: t.Optional[t.Dict[str, str]] = None, mock_ci_env=False, replace_os_env=True, full_clear=False ): env_vars = _get_default_ci_env_vars(new_vars, mock_ci_env, full_clear) - with override_env(env_vars, replace_os_env=replace_os_env), mock.patch("ddtrace.tracer", ddtrace.Tracer()): + with override_env(env_vars, replace_os_env=replace_os_env), mock.patch("ddtrace.tracer", ddtrace.trace.Tracer()): yield diff --git a/tests/commands/ddtrace_run_disabled.py b/tests/commands/ddtrace_run_disabled.py index e00fc46a2d1..1390948d1eb 100644 --- a/tests/commands/ddtrace_run_disabled.py +++ b/tests/commands/ddtrace_run_disabled.py @@ -1,5 +1,5 @@ from ddtrace import _monkey -from ddtrace import tracer +from ddtrace.trace import tracer if __name__ == "__main__": diff --git a/tests/commands/ddtrace_run_dogstatsd.py b/tests/commands/ddtrace_run_dogstatsd.py index 5af8bd96b97..c11bd1247c0 100644 --- a/tests/commands/ddtrace_run_dogstatsd.py +++ b/tests/commands/ddtrace_run_dogstatsd.py @@ -1,6 +1,6 @@ from __future__ import print_function -from ddtrace import tracer +from ddtrace.trace import tracer if __name__ == "__main__": diff --git a/tests/commands/ddtrace_run_enabled.py b/tests/commands/ddtrace_run_enabled.py index a9eaa840b85..07af9ac7038 100644 --- a/tests/commands/ddtrace_run_enabled.py +++ b/tests/commands/ddtrace_run_enabled.py @@ -1,4 +1,4 @@ -from ddtrace import tracer +from ddtrace.trace import tracer if __name__ == "__main__": diff --git a/tests/commands/ddtrace_run_global_tags.py b/tests/commands/ddtrace_run_global_tags.py index 3bb2f7f8924..2441d80f93a 100644 --- a/tests/commands/ddtrace_run_global_tags.py +++ b/tests/commands/ddtrace_run_global_tags.py @@ -1,4 +1,4 @@ -from ddtrace import tracer +from ddtrace.trace import tracer if __name__ == "__main__": diff --git a/tests/commands/ddtrace_run_hostname.py b/tests/commands/ddtrace_run_hostname.py index cafc93eec35..1350016236e 100644 --- a/tests/commands/ddtrace_run_hostname.py +++ b/tests/commands/ddtrace_run_hostname.py @@ -1,4 +1,4 @@ -from ddtrace import tracer +from ddtrace.trace import tracer if __name__ == "__main__": diff --git a/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py b/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py index 8889d828752..089c799ebe0 100644 --- a/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py +++ b/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py @@ -1,9 +1,9 @@ import aiohttp_jinja2 import pytest -from ddtrace import tracer from ddtrace.constants import ERROR_MSG from ddtrace.trace import Pin +from ddtrace.trace import tracer from tests.contrib.aiohttp.app.web import set_filesystem_loader from tests.contrib.aiohttp.app.web import set_package_loader import tests.contrib.aiohttp.conftest # noqa:F401 diff --git a/tests/contrib/aiomysql/test_aiomysql.py b/tests/contrib/aiomysql/test_aiomysql.py index 0bf8839dc96..8199b5c16a1 100644 --- a/tests/contrib/aiomysql/test_aiomysql.py +++ b/tests/contrib/aiomysql/test_aiomysql.py @@ -5,11 +5,11 @@ import pymysql import pytest -from ddtrace import Tracer from ddtrace.contrib.internal.aiomysql.patch import patch from ddtrace.contrib.internal.aiomysql.patch import unpatch from ddtrace.internal.schema import DEFAULT_SPAN_SERVICE_NAME from ddtrace.trace import Pin +from ddtrace.trace import Tracer from tests.contrib import shared_tests_async as shared_tests from tests.contrib.asyncio.utils import AsyncioTestCase from tests.contrib.asyncio.utils import mark_asyncio diff --git a/tests/contrib/asyncio/test_lazyimport.py b/tests/contrib/asyncio/test_lazyimport.py index 07c96bc799f..ec54022de40 100644 --- a/tests/contrib/asyncio/test_lazyimport.py +++ b/tests/contrib/asyncio/test_lazyimport.py @@ -4,7 +4,7 @@ @pytest.mark.subprocess() def test_lazy_import(): import ddtrace.auto # noqa: F401,I001 - from ddtrace import tracer # noqa: I001 + from ddtrace.trace import tracer # noqa: I001 assert tracer.context_provider.active() is None span = tracer.trace("itsatest", service="test", resource="resource", span_type="http") diff --git a/tests/contrib/asyncio/test_propagation.py b/tests/contrib/asyncio/test_propagation.py index fa78e975c9f..fd962e544ea 100644 --- a/tests/contrib/asyncio/test_propagation.py +++ b/tests/contrib/asyncio/test_propagation.py @@ -3,10 +3,10 @@ import pytest -from ddtrace._trace.context import Context from ddtrace._trace.provider import DefaultContextProvider from ddtrace.contrib.internal.asyncio.patch import patch from ddtrace.contrib.internal.asyncio.patch import unpatch +from ddtrace.trace import Context from tests.opentracer.utils import init_tracer diff --git a/tests/contrib/asyncpg/test_asyncpg.py b/tests/contrib/asyncpg/test_asyncpg.py index c60bfae1456..5e5b649faaf 100644 --- a/tests/contrib/asyncpg/test_asyncpg.py +++ b/tests/contrib/asyncpg/test_asyncpg.py @@ -5,11 +5,11 @@ import mock import pytest -from ddtrace import tracer from ddtrace.contrib.internal.asyncpg.patch import patch from ddtrace.contrib.internal.asyncpg.patch import unpatch from ddtrace.contrib.internal.trace_utils import iswrapped from ddtrace.trace import Pin +from ddtrace.trace import tracer from tests.contrib.asyncio.utils import AsyncioTestCase from tests.contrib.asyncio.utils import mark_asyncio from tests.contrib.config import POSTGRES_CONFIG diff --git a/tests/contrib/aws_lambda/handlers.py b/tests/contrib/aws_lambda/handlers.py index 99870cf0166..3a0775f2abb 100644 --- a/tests/contrib/aws_lambda/handlers.py +++ b/tests/contrib/aws_lambda/handlers.py @@ -2,7 +2,7 @@ from datadog_lambda.wrapper import datadog_lambda_wrapper -from ddtrace import tracer +from ddtrace.trace import tracer @datadog_lambda_wrapper diff --git a/tests/contrib/celery/test_integration.py b/tests/contrib/celery/test_integration.py index 717ed1de359..2ac6e1a61d0 100644 --- a/tests/contrib/celery/test_integration.py +++ b/tests/contrib/celery/test_integration.py @@ -8,12 +8,12 @@ import mock import pytest -from ddtrace._trace.context import Context from ddtrace.constants import ERROR_MSG from ddtrace.contrib.internal.celery.patch import patch from ddtrace.contrib.internal.celery.patch import unpatch import ddtrace.internal.forksafe as forksafe from ddtrace.propagation.http import HTTPPropagator +from ddtrace.trace import Context from ddtrace.trace import Pin from tests.opentracer.utils import init_tracer from tests.utils import flaky diff --git a/tests/contrib/celery/test_utils.py b/tests/contrib/celery/test_utils.py index 3c9e0f09d16..8b498d33350 100644 --- a/tests/contrib/celery/test_utils.py +++ b/tests/contrib/celery/test_utils.py @@ -3,12 +3,12 @@ from mock import Mock import pytest -from ddtrace._trace.span import Span from ddtrace.contrib.internal.celery.utils import attach_span from ddtrace.contrib.internal.celery.utils import detach_span from ddtrace.contrib.internal.celery.utils import retrieve_span from ddtrace.contrib.internal.celery.utils import retrieve_task_id from ddtrace.contrib.internal.celery.utils import set_tags_from_context +from ddtrace.trace import Span @pytest.fixture diff --git a/tests/contrib/dbapi/test_dbapi.py b/tests/contrib/dbapi/test_dbapi.py index 1f6be1d66f5..c60e49c56af 100644 --- a/tests/contrib/dbapi/test_dbapi.py +++ b/tests/contrib/dbapi/test_dbapi.py @@ -1,7 +1,6 @@ import mock import pytest -from ddtrace._trace.span import Span # noqa:F401 from ddtrace.contrib.dbapi import FetchTracedCursor from ddtrace.contrib.dbapi import TracedConnection from ddtrace.contrib.dbapi import TracedCursor @@ -9,6 +8,7 @@ from ddtrace.settings import Config from ddtrace.settings.integration import IntegrationConfig from ddtrace.trace import Pin +from ddtrace.trace import Span # noqa:F401 from tests.utils import TracerTestCase from tests.utils import assert_is_measured from tests.utils import assert_is_not_measured diff --git a/tests/contrib/dbapi_async/test_dbapi_async.py b/tests/contrib/dbapi_async/test_dbapi_async.py index 7343e875829..ceb2b0cf6a1 100644 --- a/tests/contrib/dbapi_async/test_dbapi_async.py +++ b/tests/contrib/dbapi_async/test_dbapi_async.py @@ -1,7 +1,6 @@ import mock import pytest -from ddtrace._trace.span import Span # noqa:F401 from ddtrace.contrib.dbapi_async import FetchTracedAsyncCursor from ddtrace.contrib.dbapi_async import TracedAsyncConnection from ddtrace.contrib.dbapi_async import TracedAsyncCursor @@ -9,6 +8,7 @@ from ddtrace.settings import Config from ddtrace.settings.integration import IntegrationConfig from ddtrace.trace import Pin +from ddtrace.trace import Span # noqa:F401 from tests.contrib.asyncio.utils import AsyncioTestCase from tests.contrib.asyncio.utils import mark_asyncio from tests.utils import assert_is_measured diff --git a/tests/contrib/django/django_app/settings.py b/tests/contrib/django/django_app/settings.py index 664690d71e1..431d9d7b4c4 100644 --- a/tests/contrib/django/django_app/settings.py +++ b/tests/contrib/django/django_app/settings.py @@ -2,7 +2,7 @@ import django -from ddtrace import tracer +from ddtrace.trace import tracer from tests.webclient import PingFilter diff --git a/tests/contrib/django/django_app/urls.py b/tests/contrib/django/django_app/urls.py index 523a250d0c8..43d31c73613 100644 --- a/tests/contrib/django/django_app/urls.py +++ b/tests/contrib/django/django_app/urls.py @@ -11,7 +11,7 @@ from django.views.decorators.cache import cache_page from django.views.generic import TemplateView -from ddtrace import tracer +from ddtrace.trace import tracer from .. import views diff --git a/tests/contrib/django/views.py b/tests/contrib/django/views.py index f1989c374d7..dd45ce7e312 100644 --- a/tests/contrib/django/views.py +++ b/tests/contrib/django/views.py @@ -15,8 +15,8 @@ from django.views.generic import TemplateView from django.views.generic import View -from ddtrace import tracer from ddtrace.contrib.internal.trace_utils import set_user +from ddtrace.trace import tracer class UserList(ListView): diff --git a/tests/contrib/flask/app.py b/tests/contrib/flask/app.py index d76ec8fb8b1..1e8e7b07683 100644 --- a/tests/contrib/flask/app.py +++ b/tests/contrib/flask/app.py @@ -6,9 +6,9 @@ from flask import Flask from flask import request -from ddtrace import tracer from ddtrace.appsec._trace_utils import block_request_if_user_blocked from ddtrace.contrib.internal.trace_utils import set_user +from ddtrace.trace import tracer from tests.webclient import PingFilter @@ -60,7 +60,7 @@ def body(): @app.route("/checkuser/") def checkuser(user_id): - from ddtrace import tracer + from ddtrace.trace import tracer block_request_if_user_blocked(tracer, user_id) return "Ok", 200 diff --git a/tests/contrib/flask/test_flask_appsec.py b/tests/contrib/flask/test_flask_appsec.py index 6937b9e4c03..edead3d10db 100644 --- a/tests/contrib/flask/test_flask_appsec.py +++ b/tests/contrib/flask/test_flask_appsec.py @@ -60,7 +60,7 @@ def test_route(): def test_flask_userblock_json(self): @self.app.route("/checkuser/") def test_route(user_id): - from ddtrace import tracer + from ddtrace.trace import tracer block_request_if_user_blocked(tracer, user_id) return "Ok", 200 diff --git a/tests/contrib/flask_cache/test_utils.py b/tests/contrib/flask_cache/test_utils.py index aa4d529c05f..fc5d640b5cf 100644 --- a/tests/contrib/flask_cache/test_utils.py +++ b/tests/contrib/flask_cache/test_utils.py @@ -2,11 +2,11 @@ from flask import Flask -from ddtrace._trace.tracer import Tracer from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache from ddtrace.contrib.internal.flask_cache.utils import _extract_client from ddtrace.contrib.internal.flask_cache.utils import _extract_conn_tags from ddtrace.contrib.internal.flask_cache.utils import _resource_from_cache_prefix +from ddtrace.trace import Tracer from ..config import MEMCACHED_CONFIG from ..config import REDIS_CONFIG diff --git a/tests/contrib/freezegun/test_freezegun.py b/tests/contrib/freezegun/test_freezegun.py index 95198486598..f5f17f1749c 100644 --- a/tests/contrib/freezegun/test_freezegun.py +++ b/tests/contrib/freezegun/test_freezegun.py @@ -4,8 +4,8 @@ import pytest -from ddtrace import tracer as dd_tracer from ddtrace.internal.utils.time import StopWatch +from ddtrace.trace import tracer as dd_tracer from tests.contrib.pytest.test_pytest import PytestTestCaseBase @@ -88,7 +88,7 @@ def test_freezegun_pytest_plugin(self): import freezegun - from ddtrace import tracer as dd_tracer + from ddtrace.trace import tracer as dd_tracer def test_pytest_patched_freezegun(): with freezegun.freeze_time("2020-01-01"): diff --git a/tests/contrib/gevent/test_tracer.py b/tests/contrib/gevent/test_tracer.py index d804a4e9c59..dc72ccc08ca 100644 --- a/tests/contrib/gevent/test_tracer.py +++ b/tests/contrib/gevent/test_tracer.py @@ -8,7 +8,7 @@ from ddtrace.constants import ERROR_MSG from ddtrace.constants import _SAMPLING_PRIORITY_KEY from ddtrace.constants import USER_KEEP -from ddtrace._trace.context import Context +from ddtrace.trace import Context from ddtrace.contrib.internal.gevent.patch import patch from ddtrace.contrib.internal.gevent.patch import unpatch from tests.opentracer.utils import init_tracer diff --git a/tests/contrib/graphql/test_graphql.py b/tests/contrib/graphql/test_graphql.py index f6eca690b36..7072b35bc81 100644 --- a/tests/contrib/graphql/test_graphql.py +++ b/tests/contrib/graphql/test_graphql.py @@ -3,10 +3,10 @@ import graphql import pytest -from ddtrace import tracer from ddtrace.contrib.internal.graphql.patch import _graphql_version as graphql_version from ddtrace.contrib.internal.graphql.patch import patch from ddtrace.contrib.internal.graphql.patch import unpatch +from ddtrace.trace import tracer from tests.utils import override_config from tests.utils import snapshot diff --git a/tests/contrib/grpc/test_grpc.py b/tests/contrib/grpc/test_grpc.py index 1ad7900d33b..d0559f2dff5 100644 --- a/tests/contrib/grpc/test_grpc.py +++ b/tests/contrib/grpc/test_grpc.py @@ -630,8 +630,8 @@ def intercept_unary_unary(self, continuation, client_call_details, request): def test_handle_response_future_like(): - from ddtrace._trace.span import Span from ddtrace.contrib.internal.grpc.client_interceptor import _handle_response + from ddtrace.trace import Span span = Span(None) diff --git a/tests/contrib/gunicorn/wsgi_mw_app.py b/tests/contrib/gunicorn/wsgi_mw_app.py index 9cf9927ff34..0de0e4e9ae4 100644 --- a/tests/contrib/gunicorn/wsgi_mw_app.py +++ b/tests/contrib/gunicorn/wsgi_mw_app.py @@ -10,10 +10,10 @@ import json -from ddtrace import tracer from ddtrace.contrib.internal.wsgi.wsgi import DDWSGIMiddleware from ddtrace.profiling import bootstrap import ddtrace.profiling.auto # noqa:F401 +from ddtrace.trace import tracer from tests.webclient import PingFilter diff --git a/tests/contrib/kafka/test_kafka.py b/tests/contrib/kafka/test_kafka.py index d5858574ef9..c67bdd08b01 100644 --- a/tests/contrib/kafka/test_kafka.py +++ b/tests/contrib/kafka/test_kafka.py @@ -11,7 +11,6 @@ import mock import pytest -from ddtrace import Tracer from ddtrace.contrib.internal.kafka.patch import TracedConsumer from ddtrace.contrib.internal.kafka.patch import patch from ddtrace.contrib.internal.kafka.patch import unpatch @@ -23,6 +22,7 @@ from ddtrace.internal.utils.retry import fibonacci_backoff_with_jitter from ddtrace.trace import Pin from ddtrace.trace import TraceFilter +from ddtrace.trace import Tracer from tests.contrib.config import KAFKA_CONFIG from tests.datastreams.test_public_api import MockedTracer from tests.utils import DummyTracer diff --git a/tests/contrib/langgraph/conftest.py b/tests/contrib/langgraph/conftest.py index a521ff367fb..13e1a5f9242 100644 --- a/tests/contrib/langgraph/conftest.py +++ b/tests/contrib/langgraph/conftest.py @@ -7,12 +7,12 @@ from langgraph.graph import StateGraph import pytest -from ddtrace import Pin from ddtrace.contrib.internal.langgraph.patch import patch from ddtrace.contrib.internal.langgraph.patch import unpatch from ddtrace.llmobs import LLMObs as llmobs_service from ddtrace.llmobs._constants import AGENTLESS_BASE_URL from ddtrace.llmobs._writer import LLMObsSpanWriter +from ddtrace.trace import Pin from tests.utils import DummyTracer from tests.utils import override_global_config diff --git a/tests/contrib/logbook/test_logbook_logging.py b/tests/contrib/logbook/test_logbook_logging.py index d9d67da82f4..757d7a557a2 100644 --- a/tests/contrib/logbook/test_logbook_logging.py +++ b/tests/contrib/logbook/test_logbook_logging.py @@ -3,13 +3,13 @@ import pytest from ddtrace import config -from ddtrace import tracer from ddtrace.constants import ENV_KEY from ddtrace.constants import SERVICE_KEY from ddtrace.constants import VERSION_KEY from ddtrace.contrib.internal.logbook.patch import patch from ddtrace.contrib.internal.logbook.patch import unpatch from ddtrace.internal.constants import MAX_UINT_64BITS +from ddtrace.trace import tracer from tests.utils import override_global_config @@ -77,9 +77,9 @@ def test_log_trace(): from logbook import TestHandler from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.logbook.patch import patch from ddtrace.contrib.internal.logbook.patch import unpatch + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" @@ -115,10 +115,10 @@ def test_log_trace_128bit_trace_ids(): from logbook import TestHandler from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.logbook.patch import patch from ddtrace.contrib.internal.logbook.patch import unpatch from ddtrace.internal.constants import MAX_UINT_64BITS + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" @@ -150,10 +150,10 @@ def test_log_DD_TAGS(): import logbook from logbook import TestHandler - from ddtrace import tracer from ddtrace.contrib.internal.logbook.patch import patch from ddtrace.contrib.internal.logbook.patch import unpatch from ddtrace.internal.constants import MAX_UINT_64BITS + from ddtrace.trace import tracer handler = TestHandler() diff --git a/tests/contrib/loguru/test_loguru_logging.py b/tests/contrib/loguru/test_loguru_logging.py index 7ea8baddddb..a11fe4b7d58 100644 --- a/tests/contrib/loguru/test_loguru_logging.py +++ b/tests/contrib/loguru/test_loguru_logging.py @@ -5,13 +5,13 @@ import pytest from ddtrace import config -from ddtrace import tracer from ddtrace.constants import ENV_KEY from ddtrace.constants import SERVICE_KEY from ddtrace.constants import VERSION_KEY from ddtrace.contrib.internal.loguru.patch import patch from ddtrace.contrib.internal.loguru.patch import unpatch from ddtrace.internal.constants import MAX_UINT_64BITS +from ddtrace.trace import tracer from tests.utils import override_global_config @@ -69,7 +69,7 @@ def test_log_no_trace(captured_logs): def test_log_with_default_sink(ddtrace_run_python_code_in_subprocess): code = """ from loguru import logger -from ddtrace import tracer +from ddtrace.trace import tracer with tracer.trace("test.logging") as span: logger.info("Hello!") @@ -94,7 +94,7 @@ def test_log_with_default_sink(ddtrace_run_python_code_in_subprocess): def test_log_with_default_sink_and_configure(ddtrace_run_python_code_in_subprocess): code = """ from loguru import logger -from ddtrace import tracer +from ddtrace.trace import tracer logger.configure(patcher=lambda r: r.update({"extra": {"dd.new": "cc"}})) @@ -132,7 +132,7 @@ def test_log_trace(): from loguru import logger from ddtrace import config - from ddtrace import tracer + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" @@ -171,8 +171,8 @@ def test_log_trace_128bit_trace_ids(): from loguru import logger from ddtrace import config - from ddtrace import tracer from ddtrace.internal.constants import MAX_UINT_64BITS + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" @@ -203,8 +203,8 @@ def test_log_DD_TAGS(): from loguru import logger - from ddtrace import tracer from ddtrace.internal.constants import MAX_UINT_64BITS + from ddtrace.trace import tracer captured_logs = [] logger.remove() @@ -253,8 +253,8 @@ def serialize(record): from loguru import logger from ddtrace import config - from ddtrace import tracer from ddtrace.internal.constants import MAX_UINT_64BITS + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" diff --git a/tests/contrib/openai/conftest.py b/tests/contrib/openai/conftest.py index 64a046a37ba..615a4e773b1 100644 --- a/tests/contrib/openai/conftest.py +++ b/tests/contrib/openai/conftest.py @@ -19,7 +19,7 @@ if TYPE_CHECKING: - from ddtrace import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 def pytest_configure(config): diff --git a/tests/contrib/pyramid/app/app.py b/tests/contrib/pyramid/app/app.py index e83acbe5197..0a73af7c602 100644 --- a/tests/contrib/pyramid/app/app.py +++ b/tests/contrib/pyramid/app/app.py @@ -3,7 +3,7 @@ from pyramid.config import Configurator from pyramid.response import Response -from ddtrace import tracer +from ddtrace.trace import tracer from tests.webclient import PingFilter diff --git a/tests/contrib/pyramid/pserve_app/app/__init__.py b/tests/contrib/pyramid/pserve_app/app/__init__.py index dd10de6c5ad..fa191fb9da4 100644 --- a/tests/contrib/pyramid/pserve_app/app/__init__.py +++ b/tests/contrib/pyramid/pserve_app/app/__init__.py @@ -1,8 +1,8 @@ from pyramid.config import Configurator from pyramid.response import Response -from ddtrace import tracer from ddtrace.trace import TraceFilter +from ddtrace.trace import tracer class PingFilter(TraceFilter): diff --git a/tests/contrib/pytest/test_pytest.py b/tests/contrib/pytest/test_pytest.py index 3918b82174b..b4c91c1735c 100644 --- a/tests/contrib/pytest/test_pytest.py +++ b/tests/contrib/pytest/test_pytest.py @@ -35,11 +35,11 @@ def _get_spans_from_list( - spans: t.List[ddtrace.Span], + spans: t.List[ddtrace.trace.Span], span_type: str, name: str = None, status: t.Optional[str] = None, -) -> t.List[ddtrace.Span]: +) -> t.List[ddtrace.trace.Span]: _names_map = { "session": ("test_session_end",), "module": ("test_module_end", "test.module"), diff --git a/tests/contrib/redis/test_redis_asyncio.py b/tests/contrib/redis/test_redis_asyncio.py index 77a809392cd..b1bd5858e04 100644 --- a/tests/contrib/redis/test_redis_asyncio.py +++ b/tests/contrib/redis/test_redis_asyncio.py @@ -7,10 +7,10 @@ import redis.asyncio from wrapt import ObjectProxy -from ddtrace import tracer from ddtrace.contrib.internal.redis.patch import patch from ddtrace.contrib.internal.redis.patch import unpatch from ddtrace.trace import Pin +from ddtrace.trace import tracer from tests.utils import override_config from ..config import REDIS_CONFIG diff --git a/tests/contrib/sanic/run_server.py b/tests/contrib/sanic/run_server.py index cf8d1142d05..8e19b76ed5c 100644 --- a/tests/contrib/sanic/run_server.py +++ b/tests/contrib/sanic/run_server.py @@ -5,7 +5,7 @@ from sanic import Sanic from sanic.response import json -from ddtrace import tracer +from ddtrace.trace import tracer from tests.webclient import PingFilter diff --git a/tests/contrib/snowflake/test_snowflake.py b/tests/contrib/snowflake/test_snowflake.py index 9762804651d..2e75867c757 100644 --- a/tests/contrib/snowflake/test_snowflake.py +++ b/tests/contrib/snowflake/test_snowflake.py @@ -6,10 +6,10 @@ import responses import snowflake.connector -from ddtrace import tracer from ddtrace.contrib.internal.snowflake.patch import patch from ddtrace.contrib.internal.snowflake.patch import unpatch from ddtrace.trace import Pin +from ddtrace.trace import tracer from tests.opentracer.utils import init_tracer from tests.utils import override_config from tests.utils import snapshot diff --git a/tests/contrib/structlog/test_structlog_logging.py b/tests/contrib/structlog/test_structlog_logging.py index da37f23be33..0e9b74d092b 100644 --- a/tests/contrib/structlog/test_structlog_logging.py +++ b/tests/contrib/structlog/test_structlog_logging.py @@ -4,13 +4,13 @@ import structlog from ddtrace import config -from ddtrace import tracer from ddtrace.constants import ENV_KEY from ddtrace.constants import SERVICE_KEY from ddtrace.constants import VERSION_KEY from ddtrace.contrib.internal.structlog.patch import patch from ddtrace.contrib.internal.structlog.patch import unpatch from ddtrace.internal.constants import MAX_UINT_64BITS +from ddtrace.trace import tracer from tests.utils import override_global_config @@ -86,9 +86,9 @@ def test_log_trace(): import structlog from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.structlog.patch import patch from ddtrace.contrib.internal.structlog.patch import unpatch + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" @@ -131,10 +131,10 @@ def test_log_trace_128bit_trace_ids(): import structlog from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.structlog.patch import patch from ddtrace.contrib.internal.structlog.patch import unpatch from ddtrace.internal.constants import MAX_UINT_64BITS + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" @@ -174,12 +174,12 @@ def test_log_DD_TAGS(): import structlog - from ddtrace import tracer from ddtrace.constants import ENV_KEY from ddtrace.constants import SERVICE_KEY from ddtrace.constants import VERSION_KEY from ddtrace.contrib.internal.structlog.patch import patch from ddtrace.contrib.internal.structlog.patch import unpatch + from ddtrace.trace import tracer patch() @@ -221,9 +221,9 @@ def test_tuple_processor_list(): import structlog from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.structlog.patch import patch from ddtrace.contrib.internal.structlog.patch import unpatch + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" @@ -263,9 +263,9 @@ def test_no_configured_processor(): import structlog from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.structlog.patch import patch from ddtrace.contrib.internal.structlog.patch import unpatch + from ddtrace.trace import tracer config.service = "logging" config.env = "global.env" diff --git a/tests/contrib/tornado/test_config.py b/tests/contrib/tornado/test_config.py index fba648b23d7..aaa87fcb2ec 100644 --- a/tests/contrib/tornado/test_config.py +++ b/tests/contrib/tornado/test_config.py @@ -1,5 +1,5 @@ -from ddtrace._trace.tracer import Tracer from ddtrace.trace import TraceFilter +from ddtrace.trace import Tracer from tests.utils import DummyWriter from .utils import TornadoTestCase diff --git a/tests/contrib/tornado/test_stack_context.py b/tests/contrib/tornado/test_stack_context.py index 5d7035c3df5..094b36d70dc 100644 --- a/tests/contrib/tornado/test_stack_context.py +++ b/tests/contrib/tornado/test_stack_context.py @@ -1,8 +1,8 @@ import pytest import tornado -from ddtrace._trace.context import Context from ddtrace.contrib.internal.tornado.stack_context import TracerStackContext +from ddtrace.trace import Context from .utils import TornadoTestCase from .web.compat import sleep diff --git a/tests/integration/test_context_snapshots.py b/tests/integration/test_context_snapshots.py index 612422064a0..8018f1b11cb 100644 --- a/tests/integration/test_context_snapshots.py +++ b/tests/integration/test_context_snapshots.py @@ -15,7 +15,7 @@ def test_context_multiprocess(run_python_code_in_subprocess): from multiprocessing import Process import time -from ddtrace import tracer +from ddtrace.trace import tracer def _target(ctx): diff --git a/tests/integration/test_debug.py b/tests/integration/test_debug.py index 18c28e51620..e87014c28b9 100644 --- a/tests/integration/test_debug.py +++ b/tests/integration/test_debug.py @@ -11,10 +11,10 @@ import ddtrace import ddtrace._trace.sampler -from ddtrace._trace.span import Span from ddtrace.internal import debug from ddtrace.internal.writer import AgentWriter from ddtrace.internal.writer import TraceWriter +from ddtrace.trace import Span from tests.integration.utils import AGENT_VERSION from tests.subprocesstest import SubprocessTestCase from tests.subprocesstest import run_in_subprocess @@ -118,8 +118,8 @@ def test_standard_tags(): def test_debug_post_configure(): import re - from ddtrace import tracer from ddtrace.internal import debug + from ddtrace.trace import tracer tracer._configure( hostname="0.0.0.0", @@ -143,8 +143,8 @@ def test_debug_post_configure(): def test_debug_post_configure_uds(): import re - from ddtrace import tracer from ddtrace.internal import debug + from ddtrace.trace import tracer tracer._configure(uds_path="/file.sock") @@ -201,7 +201,7 @@ def test_trace_agent_url(self): ) ) def test_tracer_loglevel_info_connection(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() logging.basicConfig(level=logging.INFO) with mock.patch.object(logging.Logger, "log") as mock_logger: # shove an unserializable object into the config log output @@ -217,7 +217,7 @@ def test_tracer_loglevel_info_connection(self): ) ) def test_tracer_loglevel_info_no_connection(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() logging.basicConfig(level=logging.INFO) with mock.patch.object(logging.Logger, "log") as mock_logger: tracer._configure() @@ -231,7 +231,7 @@ def test_tracer_loglevel_info_no_connection(self): ) ) def test_tracer_log_disabled_error(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() with mock.patch.object(logging.Logger, "log") as mock_logger: tracer._configure() assert mock_logger.mock_calls == [] @@ -243,7 +243,7 @@ def test_tracer_log_disabled_error(self): ) ) def test_tracer_log_disabled(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() with mock.patch.object(logging.Logger, "log") as mock_logger: tracer._configure() assert mock_logger.mock_calls == [] @@ -255,7 +255,7 @@ def test_tracer_log_disabled(self): ) def test_tracer_info_level_log(self): logging.basicConfig(level=logging.INFO) - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() with mock.patch.object(logging.Logger, "log") as mock_logger: tracer._configure() assert mock_logger.mock_calls == [] @@ -301,14 +301,14 @@ def test_to_json(): def test_agentless(monkeypatch): monkeypatch.setenv("AWS_LAMBDA_FUNCTION_NAME", "something") - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() info = debug.collect(tracer) assert info.get("agent_url") == "AGENTLESS" def test_custom_writer(): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() class CustomWriter(TraceWriter): def recreate(self) -> TraceWriter: @@ -330,7 +330,7 @@ def flush_queue(self) -> None: def test_different_samplers(): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(sampler=ddtrace._trace.sampler.RateSampler()) info = debug.collect(tracer) @@ -338,7 +338,7 @@ def test_different_samplers(): def test_startup_logs_sampling_rules(): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() sampler = ddtrace._trace.sampler.DatadogSampler(rules=[ddtrace._trace.sampler.SamplingRule(sample_rate=1.0)]) tracer._configure(sampler=sampler) f = debug.collect(tracer) @@ -427,7 +427,7 @@ def test_debug_span_log(): def test_partial_flush_log(): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure( partial_flush_enabled=True, @@ -450,7 +450,7 @@ def test_partial_flush_log(): ) ) def test_partial_flush_log_subprocess(): - from ddtrace import tracer + from ddtrace.trace import tracer assert tracer._partial_flush_enabled is True assert tracer._partial_flush_min_spans == 2 diff --git a/tests/integration/test_encoding.py b/tests/integration/test_encoding.py index 7138ff94e00..e3f5037e7b3 100644 --- a/tests/integration/test_encoding.py +++ b/tests/integration/test_encoding.py @@ -4,7 +4,7 @@ import mock import pytest -from ddtrace import Tracer +from ddtrace.trace import Tracer AGENT_VERSION = os.environ.get("AGENT_VERSION") diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index 32484ac65c0..4354f3acdf9 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -7,9 +7,9 @@ import mock import pytest -from ddtrace import Tracer from ddtrace.internal.atexit import register_on_exit_signal from ddtrace.internal.runtime import container +from ddtrace.trace import Tracer from tests.integration.utils import import_ddtrace_in_subprocess from tests.integration.utils import parametrize_with_all_encodings from tests.integration.utils import skip_if_testagent @@ -21,7 +21,7 @@ @pytest.mark.subprocess() def test_configure_keeps_api_hostname_and_port(): - from ddtrace import tracer + from ddtrace.trace import tracer from tests.integration.utils import AGENT_VERSION assert tracer._writer.agent_url == "http://localhost:{}".format("9126" if AGENT_VERSION == "testagent" else "8126") @@ -96,7 +96,7 @@ def target(): def test_single_trace_uds(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t sockdir = "/tmp/ddagent/trace.sock" t._configure(uds_path=sockdir) @@ -114,7 +114,7 @@ def test_uds_wrong_socket_path(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t encoding = os.environ["DD_TRACE_API_VERSION"] t._configure(uds_path="/tmp/ddagent/nosockethere") @@ -146,7 +146,7 @@ def test_payload_too_large(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t from tests.integration.test_integration import FOUR_KB from tests.utils import AnyInt from tests.utils import AnyStr @@ -185,7 +185,7 @@ def test_payload_too_large(): def test_resource_name_too_large(): import pytest - from ddtrace import tracer as t + from ddtrace.trace import tracer as t from tests.integration.test_integration import FOUR_KB assert t._writer._buffer_size == FOUR_KB @@ -205,7 +205,7 @@ def test_resource_name_too_large(): def test_large_payload_is_sent_without_warning_logs(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t with mock.patch("ddtrace.internal.writer.writer.log") as log: for _ in range(10000): @@ -221,7 +221,7 @@ def test_large_payload_is_sent_without_warning_logs(): def test_child_spans_do_not_cause_warning_logs(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t with mock.patch("ddtrace.internal.writer.writer.log") as log: spans = [] @@ -239,7 +239,7 @@ def test_child_spans_do_not_cause_warning_logs(): def test_metrics(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t from tests.utils import AnyInt from tests.utils import override_global_config @@ -287,7 +287,7 @@ def test_metrics(): def test_metrics_partial_flush_disabled(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t from tests.utils import AnyInt from tests.utils import override_global_config @@ -331,8 +331,8 @@ def test_metrics_partial_flush_disabled(): def test_single_trace_too_large(): import mock - from ddtrace import tracer as t from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer as t from tests.utils import AnyInt from tests.utils import AnyStr @@ -368,7 +368,7 @@ def test_single_trace_too_large(): def test_single_trace_too_large_partial_flush_disabled(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t from tests.utils import AnyInt with mock.patch("ddtrace.internal.writer.writer.log") as log: @@ -389,7 +389,7 @@ def test_trace_generates_error_logs_when_hostname_invalid(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t t._configure(hostname="bad", port=1111) @@ -415,8 +415,8 @@ def test_validate_headers_in_payload_to_intake(): import mock from ddtrace import __version__ - from ddtrace import tracer as t from ddtrace.internal.runtime import container + from ddtrace.trace import tracer as t t._writer._put = mock.Mock(wraps=t._writer._put) t.trace("op").finish() @@ -438,7 +438,7 @@ def test_validate_headers_in_payload_to_intake(): def test_inode_entity_id_header_present(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t t._writer._put = mock.Mock(wraps=t._writer._put) with mock.patch("container.get_container_info") as gcimock: @@ -456,7 +456,7 @@ def test_inode_entity_id_header_present(): def test_external_env_header_present(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t mocked_external_env = "it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759" @@ -476,7 +476,7 @@ def test_external_env_header_present(): def test_validate_headers_in_payload_to_intake_with_multiple_traces(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t t._writer._put = mock.Mock(wraps=t._writer._put) for _ in range(100): @@ -492,7 +492,7 @@ def test_validate_headers_in_payload_to_intake_with_multiple_traces(): def test_validate_headers_in_payload_to_intake_with_nested_spans(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t t._writer._put = mock.Mock(wraps=t._writer._put) for _ in range(10): @@ -509,7 +509,7 @@ def test_validate_headers_in_payload_to_intake_with_nested_spans(): def test_trace_with_invalid_client_endpoint_generates_error_log(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t for client in t._writer._clients: client.ENDPOINT = "/bad" @@ -619,8 +619,8 @@ def encode_traces(self, traces): def test_api_version_downgrade_generates_no_warning_logs(): import mock - from ddtrace import tracer as t from ddtrace.internal.utils.http import Response + from ddtrace.trace import tracer as t t._writer.api_version = "v0.5" t._writer._downgrade(Response(status=404), t._writer._clients[0]) @@ -634,8 +634,8 @@ def test_api_version_downgrade_generates_no_warning_logs(): @pytest.mark.subprocess() def test_synchronous_writer_shutdown_raises_no_exception(): - from ddtrace import tracer from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer tracer._configure(writer=AgentWriter(tracer._writer.agent_url, sync_mode=True)) tracer.shutdown() @@ -758,7 +758,7 @@ def test_writer_configured_correctly_from_env_defaults_under_ddtrace_run(ddtrace def test_partial_flush_log(): import mock - from ddtrace import tracer as t + from ddtrace.trace import tracer as t partial_flush_min_spans = 2 t._configure( diff --git a/tests/integration/test_integration_civisibility.py b/tests/integration/test_integration_civisibility.py index a95bcc2bccb..cc633d12018 100644 --- a/tests/integration/test_integration_civisibility.py +++ b/tests/integration/test_integration_civisibility.py @@ -75,10 +75,10 @@ def test_civisibility_intake_with_apikey(): def test_civisibility_intake_payloads(): import mock - from ddtrace import tracer as t from ddtrace.internal.ci_visibility.constants import COVERAGE_TAG_NAME from ddtrace.internal.ci_visibility.recorder import CIVisibilityWriter from ddtrace.internal.utils.http import Response + from ddtrace.trace import tracer as t from tests.utils import override_env with override_env(dict(DD_API_KEY="foobar.baz")): diff --git a/tests/integration/test_integration_snapshots.py b/tests/integration/test_integration_snapshots.py index dc80f9508ca..0ba978fa260 100644 --- a/tests/integration/test_integration_snapshots.py +++ b/tests/integration/test_integration_snapshots.py @@ -5,8 +5,8 @@ import mock import pytest -from ddtrace import Tracer -from ddtrace import tracer +from ddtrace.trace import Tracer +from ddtrace.trace import tracer from tests.integration.utils import AGENT_VERSION from tests.integration.utils import mark_snapshot from tests.integration.utils import parametrize_with_all_encodings @@ -20,7 +20,7 @@ @snapshot(include_tracer=True) @pytest.mark.subprocess() def test_single_trace_single_span(tracer): - from ddtrace import tracer + from ddtrace.trace import tracer s = tracer.trace("operation", service="my-svc") s.set_tag("k", "v") @@ -35,7 +35,7 @@ def test_single_trace_single_span(tracer): @snapshot(include_tracer=True) @pytest.mark.subprocess() def test_multiple_traces(tracer): - from ddtrace import tracer + from ddtrace.trace import tracer with tracer.trace("operation1", service="my-svc") as s: s.set_tag("k", "v") @@ -61,8 +61,8 @@ def test_multiple_traces(tracer): def test_filters(): import os - from ddtrace import tracer from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer writer = os.environ.get("DD_WRITER_MODE", "default") @@ -101,8 +101,8 @@ def process_trace(self, trace): @pytest.mark.subprocess() @snapshot(async_mode=False) def test_synchronous_writer(): - from ddtrace import tracer from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer writer = AgentWriter(tracer._writer.agent_url, sync_mode=True) tracer._configure(writer=writer) @@ -171,7 +171,7 @@ def test_wrong_span_name_type_not_sent(): """Span names should be a text type.""" import mock - from ddtrace import tracer + from ddtrace.trace import tracer with mock.patch("ddtrace._trace.span.log") as log: with tracer.trace(123): @@ -227,10 +227,10 @@ def test_trace_with_wrong_metrics_types_not_sent(encoding, metrics, monkeypatch) @pytest.mark.subprocess() @pytest.mark.snapshot() def test_tracetagsprocessor_only_adds_new_tags(): - from ddtrace import tracer from ddtrace.constants import _SAMPLING_PRIORITY_KEY from ddtrace.constants import AUTO_KEEP from ddtrace.constants import USER_KEEP + from ddtrace.trace import tracer with tracer.trace(name="web.request") as span: span.context.sampling_priority = AUTO_KEEP @@ -261,7 +261,7 @@ def test_env_vars(use_ddtracerun, ddtrace_run_python_code_in_subprocess, run_pyt fn( """ -from ddtrace import tracer +from ddtrace.trace import tracer tracer.trace("test-op").finish() """, env=env, diff --git a/tests/integration/test_priority_sampling.py b/tests/integration/test_priority_sampling.py index 8ea46591a1a..57b64a2fe5c 100644 --- a/tests/integration/test_priority_sampling.py +++ b/tests/integration/test_priority_sampling.py @@ -8,7 +8,7 @@ from ddtrace.internal.encoding import JSONEncoder from ddtrace.internal.encoding import MsgpackEncoderV04 as Encoder from ddtrace.internal.writer import AgentWriter -from ddtrace.tracer import Tracer +from ddtrace.trace import Tracer from tests.integration.utils import AGENT_VERSION from tests.integration.utils import parametrize_with_all_encodings from tests.integration.utils import skip_if_testagent @@ -54,7 +54,7 @@ def _prime_tracer_with_priority_sample_rate_from_agent(t, service, env): def test_priority_sampling_rate_honored(): import time - from ddtrace import tracer as t + from ddtrace.trace import tracer as t from tests.integration.test_priority_sampling import _prime_tracer_with_priority_sample_rate_from_agent from tests.integration.test_priority_sampling import _turn_tracer_into_dummy @@ -95,7 +95,7 @@ def test_priority_sampling_rate_honored(): def test_priority_sampling_response(): import time - from ddtrace import tracer as t + from ddtrace.trace import tracer as t from tests.integration.test_priority_sampling import _prime_tracer_with_priority_sample_rate_from_agent _id = time.time() @@ -136,7 +136,7 @@ def test_agent_sample_rate_keep(): @pytest.mark.snapshot(agent_sample_rate_by_service={"service:test,env:": 0.0001}) def test_agent_sample_rate_reject(): """Ensure that the agent sample rate is respected when a trace is auto rejected.""" - from ddtrace.tracer import Tracer + from ddtrace.trace import Tracer tracer = Tracer() diff --git a/tests/integration/test_propagation.py b/tests/integration/test_propagation.py index bcad0ed4432..0bea4251f57 100644 --- a/tests/integration/test_propagation.py +++ b/tests/integration/test_propagation.py @@ -1,8 +1,8 @@ import pytest -from ddtrace import tracer from ddtrace.constants import MANUAL_DROP_KEY from ddtrace.propagation.http import HTTPPropagator +from ddtrace.trace import tracer from tests.integration.utils import AGENT_VERSION diff --git a/tests/integration/test_sampling.py b/tests/integration/test_sampling.py index 442ed6e4d88..053064c8cd8 100644 --- a/tests/integration/test_sampling.py +++ b/tests/integration/test_sampling.py @@ -306,8 +306,8 @@ def test_rate_limiter_on_spans(tracer): """ Ensure that the rate limiter is applied to spans """ - from ddtrace import tracer - from ddtrace.sampler import DatadogSampler + from ddtrace._trace.sampler import DatadogSampler + from ddtrace.trace import tracer # Rate limit is only applied if a sample rate or trace sample rule is set tracer._configure(sampler=DatadogSampler(default_sample_rate=1, rate_limit=10)) @@ -339,8 +339,8 @@ def test_rate_limiter_on_long_running_spans(tracer): """ import mock - from ddtrace import tracer - from ddtrace.sampler import DatadogSampler + from ddtrace._trace.sampler import DatadogSampler + from ddtrace.trace import tracer tracer._configure(sampler=DatadogSampler(rate_limit=5)) diff --git a/tests/integration/test_trace_stats.py b/tests/integration/test_trace_stats.py index 37982dbf7b2..21b2eac8419 100644 --- a/tests/integration/test_trace_stats.py +++ b/tests/integration/test_trace_stats.py @@ -80,7 +80,7 @@ def test_compute_stats_default_and_configure(run_python_code_in_subprocess, envv env.update({envvar: "true"}) out, err, status, _ = run_python_code_in_subprocess( """ -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace import config from ddtrace.internal.processor.stats import SpanStatsProcessorV06 assert config._trace_compute_stats is True @@ -104,8 +104,8 @@ def test_apm_opt_out_compute_stats_and_configure(): Ensure stats computation is disabled, but reported as enabled, if APM is opt-out. """ - from ddtrace import tracer as t from ddtrace.internal.processor.stats import SpanStatsProcessorV06 + from ddtrace.trace import tracer as t # Test via `configure` assert not t._compute_stats @@ -124,7 +124,7 @@ def test_apm_opt_out_compute_stats_and_configure_env(run_python_code_in_subproce env.update({"DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED": "true", "DD_APPSEC_ENABLED": "true"}) out, err, status, _ = run_python_code_in_subprocess( """ -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace import config from ddtrace.internal.processor.stats import SpanStatsProcessorV06 # the stats computation is disabled (completely, for both agent and tracer) diff --git a/tests/integration/utils.py b/tests/integration/utils.py index 21822ea6e59..5b87161e2d0 100644 --- a/tests/integration/utils.py +++ b/tests/integration/utils.py @@ -5,7 +5,7 @@ import mock import pytest -from ddtrace import Tracer +from ddtrace.trace import Tracer AGENT_VERSION = os.environ.get("AGENT_VERSION") diff --git a/tests/internal/peer_service/test_processor.py b/tests/internal/peer_service/test_processor.py index 9170d639a1b..d45b97e204e 100644 --- a/tests/internal/peer_service/test_processor.py +++ b/tests/internal/peer_service/test_processor.py @@ -3,11 +3,11 @@ import mock import pytest -from ddtrace._trace.span import Span from ddtrace.constants import SPAN_KIND from ddtrace.ext import SpanKind from ddtrace.internal.peer_service.processor import PeerServiceProcessor from ddtrace.settings.peer_service import PeerServiceConfig +from ddtrace.trace import Span @pytest.fixture diff --git a/tests/internal/service_name/test_processor.py b/tests/internal/service_name/test_processor.py index a765491c67c..158f5e1e621 100644 --- a/tests/internal/service_name/test_processor.py +++ b/tests/internal/service_name/test_processor.py @@ -27,7 +27,7 @@ def test_base_service(ddtrace_run_python_code_in_subprocess, schema_version, glo from ddtrace import config from ddtrace.constants import _BASE_SERVICE_KEY from ddtrace.internal.schema.processor import BaseServiceProcessor -from ddtrace._trace.span import Span +from ddtrace.trace import Span from tests.internal.service_name.test_processor import processor def test(processor): diff --git a/tests/internal/test_database_monitoring.py b/tests/internal/test_database_monitoring.py index 89b069a489e..33afb475710 100644 --- a/tests/internal/test_database_monitoring.py +++ b/tests/internal/test_database_monitoring.py @@ -34,8 +34,8 @@ def test_propagation_mode_configuration(): @pytest.mark.subprocess(env=dict(DD_DBM_PROPAGATION_MODE="disabled")) def test_get_dbm_comment_disabled_mode(): - from ddtrace import tracer from ddtrace.propagation import _database_monitoring + from ddtrace.trace import tracer with tracer.trace("dbspan", service="orders-db") as dbspan: # when dbm propagation mode is disabled sqlcomments should NOT be generated @@ -62,8 +62,8 @@ def test_get_dbm_comment_disabled_mode(): ) ) def test_dbm_propagation_service_mode(): - from ddtrace import tracer from ddtrace.propagation import _database_monitoring + from ddtrace.trace import tracer with tracer.trace("dbspan", service="orders-db") as dbspan: # when dbm propagation is service mode sql comments should be generated with dbm tags @@ -90,8 +90,8 @@ def test_dbm_propagation_service_mode(): ) ) def test_dbm_propagation_full_mode(): - from ddtrace import tracer from ddtrace.propagation import _database_monitoring + from ddtrace.trace import tracer with tracer.trace("dbspan", service="orders-db") as dbspan: # since inject() below will call the sampler we just call the sampler here @@ -130,8 +130,8 @@ def test_dbm_propagation_full_mode(): ) ) def test_dbm_dddbs_peer_service_enabled(): - from ddtrace import tracer from ddtrace.propagation import _database_monitoring + from ddtrace.trace import tracer with tracer.trace("dbname") as dbspan_no_service: # when dbm propagation mode is full sql comments should be generated with dbm tags and traceparent keys @@ -166,8 +166,8 @@ def test_dbm_dddbs_peer_service_enabled(): ) ) def test_dbm_peer_entity_tags(): - from ddtrace import tracer from ddtrace.propagation import _database_monitoring + from ddtrace.trace import tracer with tracer.trace("dbname") as dbspan: dbspan.set_tag("out.host", "some-hostname") diff --git a/tests/llmobs/_utils.py b/tests/llmobs/_utils.py index f9cff969c8a..3bbc4ffcef2 100644 --- a/tests/llmobs/_utils.py +++ b/tests/llmobs/_utils.py @@ -9,10 +9,10 @@ vcr = None import ddtrace -from ddtrace._trace.span import Span from ddtrace.ext import SpanTypes from ddtrace.llmobs._utils import _get_span_name from ddtrace.llmobs._writer import LLMObsEvaluationMetricEvent +from ddtrace.trace import Span if vcr: diff --git a/tests/llmobs/test_llmobs_evaluator_runner.py b/tests/llmobs/test_llmobs_evaluator_runner.py index eaf381367d0..6b13ce38718 100644 --- a/tests/llmobs/test_llmobs_evaluator_runner.py +++ b/tests/llmobs/test_llmobs_evaluator_runner.py @@ -5,10 +5,10 @@ import mock import pytest -from ddtrace._trace.span import Span from ddtrace.llmobs._evaluators.runner import EvaluatorRunner from ddtrace.llmobs._evaluators.sampler import EvaluatorRunnerSampler from ddtrace.llmobs._evaluators.sampler import EvaluatorRunnerSamplingRule +from ddtrace.trace import Span from tests.llmobs._utils import DummyEvaluator from tests.llmobs._utils import _dummy_evaluator_eval_metric_event from tests.utils import override_env diff --git a/tests/llmobs/test_llmobs_ragas_evaluators.py b/tests/llmobs/test_llmobs_ragas_evaluators.py index cc02709baff..9766c18c1e5 100644 --- a/tests/llmobs/test_llmobs_ragas_evaluators.py +++ b/tests/llmobs/test_llmobs_ragas_evaluators.py @@ -6,7 +6,7 @@ from ddtrace.llmobs._evaluators.ragas.answer_relevancy import RagasAnswerRelevancyEvaluator from ddtrace.llmobs._evaluators.ragas.context_precision import RagasContextPrecisionEvaluator from ddtrace.llmobs._evaluators.ragas.faithfulness import RagasFaithfulnessEvaluator -from ddtrace.span import Span +from ddtrace.trace import Span from tests.llmobs._utils import _expected_llmobs_llm_span_event from tests.llmobs._utils import _expected_ragas_answer_relevancy_spans from tests.llmobs._utils import _expected_ragas_context_precision_spans diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py index c43bee68ae2..7c3c78a6085 100644 --- a/tests/llmobs/test_llmobs_service.py +++ b/tests/llmobs/test_llmobs_service.py @@ -7,7 +7,6 @@ import pytest import ddtrace -from ddtrace._trace.context import Context from ddtrace.ext import SpanTypes from ddtrace.internal.service import ServiceStatus from ddtrace.llmobs import LLMObs as llmobs_service @@ -32,6 +31,7 @@ from ddtrace.llmobs._writer import LLMObsAgentlessEventClient from ddtrace.llmobs._writer import LLMObsProxiedEventClient from ddtrace.llmobs.utils import Prompt +from ddtrace.trace import Context from tests.llmobs._utils import _expected_llmobs_eval_metric_event from tests.llmobs._utils import _expected_llmobs_llm_span_event from tests.llmobs._utils import _expected_llmobs_non_llm_span_event diff --git a/tests/llmobs/test_propagation.py b/tests/llmobs/test_propagation.py index e3ab9c80d66..7d7c6a59bbb 100644 --- a/tests/llmobs/test_propagation.py +++ b/tests/llmobs/test_propagation.py @@ -58,7 +58,7 @@ def test_propagate_correct_llmobs_parent_id_simple(run_python_code_in_subprocess code = """ import json -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.ext import SpanTypes from ddtrace.propagation.http import HTTPPropagator @@ -94,7 +94,7 @@ def test_propagate_llmobs_parent_id_complex(run_python_code_in_subprocess): code = """ import json -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.ext import SpanTypes from ddtrace.propagation.http import HTTPPropagator @@ -132,7 +132,7 @@ def test_no_llmobs_parent_id_propagated_if_no_llmobs_spans(run_python_code_in_su code = """ import json -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.propagation.http import HTTPPropagator with tracer.trace("Non-LLMObs span") as root_span: @@ -198,7 +198,7 @@ def test_activate_distributed_headers_propagate_correct_llmobs_parent_id_simple( code = """ import json -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.ext import SpanTypes from ddtrace.llmobs import LLMObs @@ -233,7 +233,7 @@ def test_activate_distributed_headers_propagate_llmobs_parent_id_complex(run_pyt code = """ import json -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.ext import SpanTypes from ddtrace.llmobs import LLMObs @@ -271,7 +271,7 @@ def test_activate_distributed_headers_does_not_propagate_if_no_llmobs_spans(run_ code = """ import json -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.llmobs import LLMObs LLMObs.enable(ml_app="test-app", api_key="") diff --git a/tests/opentracer/core/test_dd_compatibility.py b/tests/opentracer/core/test_dd_compatibility.py index ba4e84ce6d8..4ba14b0618f 100644 --- a/tests/opentracer/core/test_dd_compatibility.py +++ b/tests/opentracer/core/test_dd_compatibility.py @@ -19,7 +19,7 @@ def test_custom_ddtracer(self): """A user should be able to specify their own Datadog tracer instance if they wish. """ - custom_dd_tracer = ddtrace.Tracer() + custom_dd_tracer = ddtrace.trace.Tracer() tracer = ddtrace.opentracer.Tracer(dd_tracer=custom_dd_tracer) assert tracer._dd_tracer is custom_dd_tracer diff --git a/tests/opentracer/core/test_tracer.py b/tests/opentracer/core/test_tracer.py index c96339ed0e3..a0a18ff0dd8 100644 --- a/tests/opentracer/core/test_tracer.py +++ b/tests/opentracer/core/test_tracer.py @@ -9,13 +9,13 @@ import pytest import ddtrace -from ddtrace import Tracer as DDTracer from ddtrace.constants import AUTO_KEEP from ddtrace.opentracer import Tracer from ddtrace.opentracer import set_global_tracer from ddtrace.opentracer.span_context import SpanContext from ddtrace.propagation.http import HTTP_HEADER_TRACE_ID from ddtrace.settings import ConfigException +from ddtrace.trace import Tracer as DDTracer from tests.utils import override_global_config diff --git a/tests/profiling/collector/conftest.py b/tests/profiling/collector/conftest.py index bf2ce222169..a774b20f7da 100644 --- a/tests/profiling/collector/conftest.py +++ b/tests/profiling/collector/conftest.py @@ -7,7 +7,7 @@ @pytest.fixture def tracer(monkeypatch): monkeypatch.setenv("DD_TRACE_STARTUP_LOGS", "0") - return ddtrace.Tracer() + return ddtrace.trace.Tracer() @pytest.fixture diff --git a/tests/profiling/collector/test_stack.py b/tests/profiling/collector/test_stack.py index 86ee91e2ac4..65478222932 100644 --- a/tests/profiling/collector/test_stack.py +++ b/tests/profiling/collector/test_stack.py @@ -447,7 +447,7 @@ def test_exception_collection(): @pytest.mark.skipif(not stack.FEATURES["stack-exceptions"], reason="Stack exceptions not supported") def test_exception_collection_trace( - tracer, # type: ddtrace.Tracer + tracer, # type: ddtrace.trace.Tracer ): # type: (...) -> None r = recorder.Recorder() diff --git a/tests/profiling/test_profiler.py b/tests/profiling/test_profiler.py index b46970f2591..0aba1240b7d 100644 --- a/tests/profiling/test_profiler.py +++ b/tests/profiling/test_profiler.py @@ -236,8 +236,8 @@ def _check_url(prof, url, api_key, endpoint_path="profiling/v1/input"): def test_tracer_url(): import os - from ddtrace import tracer as t from ddtrace.profiling import profiler + from ddtrace.trace import tracer as t from tests.profiling.test_profiler import _check_url t._configure(hostname="foobar") @@ -249,8 +249,8 @@ def test_tracer_url(): def test_tracer_url_https(): import os - from ddtrace import tracer as t from ddtrace.profiling import profiler + from ddtrace.trace import tracer as t from tests.profiling.test_profiler import _check_url t._configure(hostname="foobar", https=True) @@ -262,8 +262,8 @@ def test_tracer_url_https(): def test_tracer_url_uds_hostname(): import os - from ddtrace import tracer as t from ddtrace.profiling import profiler + from ddtrace.trace import tracer as t from tests.profiling.test_profiler import _check_url t._configure(hostname="foobar", uds_path="/foobar") @@ -275,8 +275,8 @@ def test_tracer_url_uds_hostname(): def test_tracer_url_uds(): import os - from ddtrace import tracer as t from ddtrace.profiling import profiler + from ddtrace.trace import tracer as t from tests.profiling.test_profiler import _check_url t._configure(uds_path="/foobar") @@ -288,8 +288,8 @@ def test_tracer_url_uds(): def test_tracer_url_configure_after(): import os - from ddtrace import tracer as t from ddtrace.profiling import profiler + from ddtrace.trace import tracer as t from tests.profiling.test_profiler import _check_url prof = profiler.Profiler(tracer=t) @@ -306,8 +306,8 @@ def test_env_no_api_key(): def test_env_endpoint_url(): import os - from ddtrace import tracer as t from ddtrace.profiling import profiler + from ddtrace.trace import tracer as t from tests.profiling.test_profiler import _check_url prof = profiler.Profiler(tracer=t) diff --git a/tests/profiling_v2/collector/conftest.py b/tests/profiling_v2/collector/conftest.py index b2ba1ced203..311c286c11e 100644 --- a/tests/profiling_v2/collector/conftest.py +++ b/tests/profiling_v2/collector/conftest.py @@ -5,4 +5,4 @@ @pytest.fixture def tracer(): - return ddtrace.Tracer() + return ddtrace.trace.Tracer() diff --git a/tests/profiling_v2/collector/test_stack_asyncio.py b/tests/profiling_v2/collector/test_stack_asyncio.py index d28ad54e586..d70278e767c 100644 --- a/tests/profiling_v2/collector/test_stack_asyncio.py +++ b/tests/profiling_v2/collector/test_stack_asyncio.py @@ -16,9 +16,9 @@ def test_asyncio(): import uuid from ddtrace import ext - from ddtrace import tracer from ddtrace.internal.datadog.profiling import stack_v2 from ddtrace.profiling import profiler + from ddtrace.trace import tracer from tests.profiling.collector import _asyncio_compat from tests.profiling.collector import pprof_utils diff --git a/tests/telemetry/test_telemetry.py b/tests/telemetry/test_telemetry.py index e2aa4552631..82c960cfead 100644 --- a/tests/telemetry/test_telemetry.py +++ b/tests/telemetry/test_telemetry.py @@ -147,7 +147,7 @@ def test_app_started_error_handled_exception(test_agent_session, run_python_code import logging logging.basicConfig() -from ddtrace import tracer +from ddtrace.trace import tracer from ddtrace.trace import TraceFilter class FailingFilture(TraceFilter): @@ -325,7 +325,7 @@ def test_instrumentation_telemetry_disabled(test_agent_session, run_python_code_ env["DD_INSTRUMENTATION_TELEMETRY_ENABLED"] = "false" code = """ -from ddtrace import tracer +from ddtrace.trace import tracer # We want to import the telemetry module even when telemetry is disabled. import sys diff --git a/tests/telemetry/test_telemetry_metrics_e2e.py b/tests/telemetry/test_telemetry_metrics_e2e.py index 30033458cef..591e61f1cc8 100644 --- a/tests/telemetry/test_telemetry_metrics_e2e.py +++ b/tests/telemetry/test_telemetry_metrics_e2e.py @@ -87,7 +87,7 @@ def test_telemetry_metrics_enabled_on_gunicorn_child_process(test_agent_session) def test_span_creation_and_finished_metrics_datadog(test_agent_session, ddtrace_run_python_code_in_subprocess): code = """ -from ddtrace import tracer +from ddtrace.trace import tracer for _ in range(10): with tracer.trace('span1'): pass diff --git a/tests/tracer/runtime/test_runtime_metrics.py b/tests/tracer/runtime/test_runtime_metrics.py index 9039da147a5..9204dc49426 100644 --- a/tests/tracer/runtime/test_runtime_metrics.py +++ b/tests/tracer/runtime/test_runtime_metrics.py @@ -116,8 +116,8 @@ def test_runtime_tags_dd_tags(): @pytest.mark.subprocess() def test_runtime_tags_manual_tracer_tags(): - from ddtrace import tracer from ddtrace.internal.runtime.runtime_metrics import RuntimeTags + from ddtrace.trace import tracer tracer.set_tags({"manual": "tag"}) diff --git a/tests/tracer/test_context.py b/tests/tracer/test_context.py index 15b2f870fae..9829de88def 100644 --- a/tests/tracer/test_context.py +++ b/tests/tracer/test_context.py @@ -5,8 +5,8 @@ import pytest from ddtrace._trace._span_link import SpanLink -from ddtrace._trace.context import Context -from ddtrace._trace.span import Span +from ddtrace.trace import Context +from ddtrace.trace import Span @pytest.mark.parametrize( diff --git a/tests/tracer/test_correlation_log_context.py b/tests/tracer/test_correlation_log_context.py index 51f7cfb07e6..b7200b8b38f 100644 --- a/tests/tracer/test_correlation_log_context.py +++ b/tests/tracer/test_correlation_log_context.py @@ -1,8 +1,8 @@ import pytest -from ddtrace import Tracer from ddtrace import config -from ddtrace import tracer +from ddtrace.trace import Tracer +from ddtrace.trace import tracer def global_config(config): @@ -33,8 +33,8 @@ def format_trace_id(span): @pytest.mark.subprocess() def test_get_log_correlation_service(): """Ensure expected DDLogRecord service is generated via get_correlation_log_record.""" - from ddtrace import Tracer - from ddtrace import tracer + from ddtrace.trace import Tracer + from ddtrace.trace import tracer from tests.tracer.test_correlation_log_context import format_trace_id from tests.utils import override_global_config @@ -64,8 +64,8 @@ def test_get_log_correlation_service(): @pytest.mark.subprocess() def test_get_log_correlation_context_basic(): """Ensure expected DDLogRecord is generated via get_correlation_log_record.""" - from ddtrace import Tracer - from ddtrace.context import Context + from ddtrace.trace import Context + from ddtrace.trace import Tracer from tests.tracer.test_correlation_log_context import format_trace_id from tests.utils import override_global_config @@ -130,7 +130,7 @@ def test_get_log_correlation_context_opentracer(): @pytest.mark.subprocess() def test_get_log_correlation_context_no_active_span(): """Ensure empty DDLogRecord generated if no active span.""" - from ddtrace import Tracer + from ddtrace.trace import Tracer tracer = Tracer() dd_log_record = tracer.get_log_correlation_context() @@ -146,7 +146,7 @@ def test_get_log_correlation_context_no_active_span(): @pytest.mark.subprocess() def test_get_log_correlation_context_disabled_tracer(): """Ensure get_correlation_log_record returns None if tracer is disabled.""" - from ddtrace import Tracer + from ddtrace.trace import Tracer tracer = Tracer() tracer.enabled = False @@ -164,9 +164,9 @@ def test_get_log_correlation_context_disabled_tracer(): @pytest.mark.subprocess() def test_custom_logging_injection_global_config(): """Ensure custom log injection via get_correlation_log_record returns proper tracer information.""" - from ddtrace import tracer from ddtrace._trace.provider import _DD_CONTEXTVAR from ddtrace.contrib.internal.structlog.patch import patch + from ddtrace.trace import tracer from tests.tracer.test_correlation_log_context import format_trace_id from tests.tracer.test_correlation_log_context import tracer_injection from tests.utils import override_global_config @@ -231,8 +231,8 @@ def test_custom_logging_injection_no_span(): @pytest.mark.subprocess() def test_custom_logging_injection(): """Ensure custom log injection via get_correlation_log_record returns proper active span information.""" - from ddtrace import tracer from ddtrace.contrib.internal.structlog.patch import patch + from ddtrace.trace import tracer from tests.tracer.test_correlation_log_context import format_trace_id from tests.tracer.test_correlation_log_context import tracer_injection diff --git a/tests/tracer/test_encoders.py b/tests/tracer/test_encoders.py index 00321a59924..fa625cc6edb 100644 --- a/tests/tracer/test_encoders.py +++ b/tests/tracer/test_encoders.py @@ -19,8 +19,6 @@ from ddtrace._trace._span_link import SpanLink from ddtrace._trace._span_pointer import _SpanPointerDirection -from ddtrace._trace.context import Context -from ddtrace._trace.span import Span from ddtrace.constants import _ORIGIN_KEY as ORIGIN_KEY from ddtrace.ext import SpanTypes from ddtrace.ext.ci import CI_APP_TEST_ORIGIN @@ -34,6 +32,8 @@ from ddtrace.internal.encoding import MsgpackEncoderV04 from ddtrace.internal.encoding import MsgpackEncoderV05 from ddtrace.internal.encoding import _EncoderBase +from ddtrace.trace import Context +from ddtrace.trace import Span from tests.utils import DummyTracer @@ -845,8 +845,8 @@ def test_json_encoder_traces_bytes(): import json import os - from ddtrace._trace.span import Span import ddtrace.internal.encoding as encoding + from ddtrace.trace import Span encoder_class_name = os.getenv("encoder_cls") @@ -879,7 +879,7 @@ def test_v03_trace_api_deprecation(): with warnings.catch_warnings(record=True) as warns: warnings.simplefilter("always") - from ddtrace import tracer + from ddtrace.trace import tracer assert tracer._writer._api_version == "v0.4" assert len(warns) == 1, warns diff --git a/tests/tracer/test_filters.py b/tests/tracer/test_filters.py index d632ceb4998..3c1ee310f27 100644 --- a/tests/tracer/test_filters.py +++ b/tests/tracer/test_filters.py @@ -3,8 +3,8 @@ import pytest from ddtrace._trace.filters import FilterRequestsOnUrl -from ddtrace._trace.span import Span from ddtrace.ext.http import URL +from ddtrace.trace import Span from ddtrace.trace import TraceFilter diff --git a/tests/tracer/test_gitmetadata.py b/tests/tracer/test_gitmetadata.py index 655398e8b0c..cb03d59f7e2 100644 --- a/tests/tracer/test_gitmetadata.py +++ b/tests/tracer/test_gitmetadata.py @@ -44,7 +44,7 @@ class GitMetadataTestCase(TracerTestCase): ) ) def test_gitmetadata_from_package(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -59,7 +59,7 @@ def test_gitmetadata_from_package(self): ) ) def test_gitmetadata_from_DD_TAGS(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -80,7 +80,7 @@ def test_gitmetadata_from_DD_TAGS(self): ) ) def test_gitmetadata_from_ENV(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -104,7 +104,7 @@ def test_gitmetadata_from_ENV(self): ) ) def test_gitmetadata_disabled(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -123,7 +123,7 @@ def test_gitmetadata_disabled(self): ) ) def test_gitmetadata_package_without_metadata(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -143,7 +143,7 @@ def test_gitmetadata_package_without_metadata(self): ) ) def test_gitmetadata_from_env_filtering_https(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -163,7 +163,7 @@ def test_gitmetadata_from_env_filtering_https(self): ) ) def test_gitmetadata_from_ddtags_filtering_https(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -184,7 +184,7 @@ def test_gitmetadata_from_ddtags_filtering_https(self): ) ) def test_gitmetadata_from_env_filtering_ssh(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass @@ -204,7 +204,7 @@ def test_gitmetadata_from_env_filtering_ssh(self): ) ) def test_gitmetadata_from_ddtags_filtering_ssh(self): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(writer=DummyWriter()) with tracer.trace("span") as s: pass diff --git a/tests/tracer/test_memory_leak.py b/tests/tracer/test_memory_leak.py index 47e82c71f7e..7fdcd7589f6 100644 --- a/tests/tracer/test_memory_leak.py +++ b/tests/tracer/test_memory_leak.py @@ -9,11 +9,11 @@ import pytest -from ddtrace import Tracer +from ddtrace.trace import Tracer if TYPE_CHECKING: # pragma: no cover - from ddtrace._trace.span import Span # noqa:F401 + from ddtrace.trace import Span # noqa:F401 @pytest.fixture @@ -117,7 +117,7 @@ def test_fork_open_span(): import os from weakref import WeakValueDictionary - from ddtrace import tracer + from ddtrace.trace import tracer from tests.tracer.test_memory_leak import trace wd = WeakValueDictionary() diff --git a/tests/tracer/test_processors.py b/tests/tracer/test_processors.py index ad9360deec2..ff19453555b 100644 --- a/tests/tracer/test_processors.py +++ b/tests/tracer/test_processors.py @@ -3,15 +3,12 @@ import mock import pytest -from ddtrace import Tracer -from ddtrace._trace.context import Context from ddtrace._trace.processor import SpanAggregator from ddtrace._trace.processor import SpanProcessor from ddtrace._trace.processor import TraceProcessor from ddtrace._trace.processor import TraceSamplingProcessor from ddtrace._trace.processor import TraceTagsProcessor from ddtrace._trace.sampler import DatadogSampler -from ddtrace._trace.span import Span from ddtrace.constants import _SAMPLING_PRIORITY_KEY from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MAX_PER_SEC from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MECHANISM @@ -27,6 +24,9 @@ from ddtrace.internal.sampling import SamplingMechanism from ddtrace.internal.sampling import SpanSamplingRule from ddtrace.internal.telemetry.constants import TELEMETRY_NAMESPACE +from ddtrace.trace import Context +from ddtrace.trace import Span +from ddtrace.trace import Tracer from tests.utils import DummyTracer from tests.utils import DummyWriter from tests.utils import override_global_config diff --git a/tests/tracer/test_propagation.py b/tests/tracer/test_propagation.py index 533e4974250..43052dced9f 100644 --- a/tests/tracer/test_propagation.py +++ b/tests/tracer/test_propagation.py @@ -8,9 +8,7 @@ import pytest import ddtrace -from ddtrace import tracer as ddtracer from ddtrace._trace._span_link import SpanLink -from ddtrace._trace.context import Context from ddtrace._trace.span import _get_64_lowest_order_bits_as_int from ddtrace.appsec._trace_utils import _asm_manual_keep from ddtrace.constants import AUTO_REJECT @@ -43,6 +41,8 @@ from ddtrace.propagation.http import HTTPPropagator from ddtrace.propagation.http import _BaggageHeader from ddtrace.propagation.http import _TraceContext +from ddtrace.trace import Context +from ddtrace.trace import tracer as ddtracer from tests.contrib.fastapi.conftest import client as fastapi_client # noqa:F401 from tests.contrib.fastapi.conftest import fastapi_application # noqa:F401 from tests.contrib.fastapi.conftest import test_spans as fastapi_test_spans # noqa:F401 @@ -87,10 +87,10 @@ def test_inject_with_baggage_http_propagation(tracer): # noqa: F811 env=dict(DD_TRACE_PROPAGATION_STYLE=PROPAGATION_STYLE_DATADOG), ) def test_inject_128bit_trace_id_datadog(): - from ddtrace._trace.context import Context from ddtrace.internal.constants import HIGHER_ORDER_TRACE_ID_BITS from ddtrace.internal.constants import SAMPLING_DECISION_TRACE_TAG_KEY from ddtrace.propagation.http import HTTPPropagator + from ddtrace.trace import Context from tests.utils import DummyTracer tracer = DummyTracer() # noqa: F811 @@ -117,8 +117,8 @@ def test_inject_128bit_trace_id_datadog(): env=dict(DD_TRACE_PROPAGATION_STYLE=PROPAGATION_STYLE_B3_MULTI), ) def test_inject_128bit_trace_id_b3multi(): - from ddtrace._trace.context import Context from ddtrace.propagation.http import HTTPPropagator + from ddtrace.trace import Context from tests.utils import DummyTracer tracer = DummyTracer() # noqa: F811 @@ -139,8 +139,8 @@ def test_inject_128bit_trace_id_b3multi(): env=dict(DD_TRACE_PROPAGATION_STYLE=PROPAGATION_STYLE_B3_SINGLE), ) def test_inject_128bit_trace_id_b3_single_header(): - from ddtrace._trace.context import Context from ddtrace.propagation.http import HTTPPropagator + from ddtrace.trace import Context from tests.utils import DummyTracer tracer = DummyTracer() # noqa: F811 @@ -161,8 +161,8 @@ def test_inject_128bit_trace_id_b3_single_header(): env=dict(DD_TRACE_PROPAGATION_STYLE=_PROPAGATION_STYLE_W3C_TRACECONTEXT), ) def test_inject_128bit_trace_id_tracecontext(): - from ddtrace._trace.context import Context from ddtrace.propagation.http import HTTPPropagator + from ddtrace.trace import Context from tests.utils import DummyTracer tracer = DummyTracer() # noqa: F811 @@ -2487,7 +2487,7 @@ def test_propagation_extract_env( code = """ import json import pickle -from ddtrace._trace.context import Context +from ddtrace.trace import Context from ddtrace.propagation.http import HTTPPropagator context = HTTPPropagator.extract({!r}) @@ -3295,7 +3295,7 @@ def test_propagation_inject(name, styles, context, expected_headers, run_python_ code = """ import json -from ddtrace._trace.context import Context +from ddtrace.trace import Context from ddtrace.propagation.http import HTTPPropagator context = Context(**{!r}) @@ -3362,7 +3362,7 @@ def test_DD_TRACE_PROPAGATION_STYLE_INJECT_overrides_DD_TRACE_PROPAGATION_STYLE( code = """ import json -from ddtrace._trace.context import Context +from ddtrace.trace import Context from ddtrace.propagation.http import HTTPPropagator context = Context(**{!r}) diff --git a/tests/tracer/test_rand.py b/tests/tracer/test_rand.py index 4d3a109c8ec..76a4bc1f33a 100644 --- a/tests/tracer/test_rand.py +++ b/tests/tracer/test_rand.py @@ -12,10 +12,10 @@ import threading import time -from ddtrace import tracer from ddtrace.internal import _rand from ddtrace.internal import forksafe from ddtrace.internal.compat import Queue +from ddtrace.trace import tracer def test_random(): @@ -285,7 +285,7 @@ def test_span_api_fork(): from itertools import chain import os - from ddtrace._trace.span import Span + from ddtrace.trace import Span from tests.tracer.test_rand import MPQueue q = MPQueue() diff --git a/tests/tracer/test_sampler.py b/tests/tracer/test_sampler.py index 4bf9de2019e..813dc1be439 100644 --- a/tests/tracer/test_sampler.py +++ b/tests/tracer/test_sampler.py @@ -6,12 +6,10 @@ import mock import pytest -from ddtrace._trace.context import Context from ddtrace._trace.sampler import DatadogSampler from ddtrace._trace.sampler import RateByServiceSampler from ddtrace._trace.sampler import RateSampler from ddtrace._trace.sampling_rule import SamplingRule -from ddtrace._trace.span import Span from ddtrace.constants import _SAMPLING_AGENT_DECISION from ddtrace.constants import _SAMPLING_LIMIT_DECISION from ddtrace.constants import _SAMPLING_PRIORITY_KEY @@ -24,6 +22,8 @@ from ddtrace.internal.sampling import SAMPLING_DECISION_TRACE_TAG_KEY from ddtrace.internal.sampling import SamplingMechanism from ddtrace.internal.sampling import set_sampling_decision_maker +from ddtrace.trace import Context +from ddtrace.trace import Span from ..subprocesstest import run_in_subprocess from ..utils import DummyTracer @@ -630,7 +630,7 @@ def pattern(prop): ) def test_sampling_rule_sample(): from ddtrace._trace.sampling_rule import SamplingRule - from ddtrace._trace.span import Span + from ddtrace.trace import Span for sample_rate in [0.01, 0.1, 0.15, 0.25, 0.5, 0.75, 0.85, 0.9, 0.95, 0.991]: rule = SamplingRule(sample_rate=sample_rate) diff --git a/tests/tracer/test_single_span_sampling_rules.py b/tests/tracer/test_single_span_sampling_rules.py index 24dfda91ad5..ef33ecfd619 100644 --- a/tests/tracer/test_single_span_sampling_rules.py +++ b/tests/tracer/test_single_span_sampling_rules.py @@ -2,7 +2,6 @@ import pytest -from ddtrace import Tracer from ddtrace.constants import _SAMPLING_PRIORITY_KEY from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MAX_PER_SEC from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MECHANISM @@ -11,6 +10,7 @@ from ddtrace.internal.sampling import SpanSamplingRule from ddtrace.internal.sampling import _get_file_json from ddtrace.internal.sampling import get_span_sampling_rules +from ddtrace.trace import Tracer from tests.utils import DummyTracer from tests.utils import DummyWriter diff --git a/tests/tracer/test_span.py b/tests/tracer/test_span.py index 1725f0d7675..1ea7bbb0003 100644 --- a/tests/tracer/test_span.py +++ b/tests/tracer/test_span.py @@ -10,7 +10,6 @@ from ddtrace._trace._span_link import SpanLink from ddtrace._trace._span_pointer import _SpanPointerDirection -from ddtrace._trace.span import Span from ddtrace.constants import _SPAN_MEASURED_KEY from ddtrace.constants import ENV_KEY from ddtrace.constants import ERROR_MSG @@ -20,6 +19,7 @@ from ddtrace.constants import VERSION_KEY from ddtrace.ext import SpanTypes from ddtrace.internal import core +from ddtrace.trace import Span from tests.subprocesstest import run_in_subprocess from tests.utils import TracerTestCase from tests.utils import assert_is_measured diff --git a/tests/tracer/test_trace_utils.py b/tests/tracer/test_trace_utils.py index 9e05cd9f40d..31099763d50 100644 --- a/tests/tracer/test_trace_utils.py +++ b/tests/tracer/test_trace_utils.py @@ -13,10 +13,7 @@ import mock import pytest -from ddtrace import Tracer from ddtrace import config -from ddtrace._trace.context import Context -from ddtrace._trace.span import Span from ddtrace.contrib.internal import trace_utils from ddtrace.contrib.internal.trace_utils import _get_request_header_client_ip from ddtrace.ext import SpanTypes @@ -28,7 +25,10 @@ from ddtrace.propagation.http import HTTP_HEADER_TRACE_ID from ddtrace.settings import Config from ddtrace.settings import IntegrationConfig +from ddtrace.trace import Context from ddtrace.trace import Pin +from ddtrace.trace import Span +from ddtrace.trace import Tracer from tests.appsec.utils import asm_context from tests.utils import override_global_config @@ -315,8 +315,8 @@ def test_ext_service(int_config, pin, config_val, default, expected): ) def test_set_http_meta_with_http_header_tags_config(): from ddtrace import config - from ddtrace._trace.span import Span from ddtrace.contrib.internal.trace_utils import set_http_meta + from ddtrace.trace import Span assert config._trace_http_header_tags == { "header1": "", @@ -511,8 +511,8 @@ def test_set_http_meta_custom_errors(mock_log, span, int_config, error_codes, st @pytest.mark.subprocess(env={"DD_TRACE_HTTP_SERVER_ERROR_STATUSES": "404-412"}) def test_set_http_meta_custom_errors_via_env(): from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.trace_utils import set_http_meta + from ddtrace.trace import tracer config._add("myint", dict()) with tracer.trace("error") as span1: @@ -1041,9 +1041,9 @@ def test_sanitized_url_in_http_meta(span, int_config): @pytest.mark.subprocess(env={"DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP": ""}) def test_url_in_http_with_empty_obfuscation_regex(): from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.trace_utils import set_http_meta from ddtrace.ext import http + from ddtrace.trace import tracer assert config._obfuscation_query_string_pattern.pattern == b"", config._obfuscation_query_string_pattern @@ -1066,9 +1066,9 @@ def test_url_in_http_with_obfuscation_enabled_and_empty_regex(): # Test that query strings are not added to urls when the obfuscation regex is an empty string # and obfuscation is enabled (not disabled xD) from ddtrace import config - from ddtrace import tracer from ddtrace.contrib.internal.trace_utils import set_http_meta from ddtrace.ext import http + from ddtrace.trace import tracer # assert obfuscation is disabled when the regex is an empty string assert config.global_query_string_obfuscation_disabled is True diff --git a/tests/tracer/test_tracer.py b/tests/tracer/test_tracer.py index 1c45f424679..0a75e5fc037 100644 --- a/tests/tracer/test_tracer.py +++ b/tests/tracer/test_tracer.py @@ -15,9 +15,7 @@ import pytest import ddtrace -from ddtrace._trace.context import Context from ddtrace._trace.span import _is_top_level -from ddtrace._trace.tracer import Tracer from ddtrace.constants import _HOSTNAME_KEY from ddtrace.constants import _ORIGIN_KEY from ddtrace.constants import _SAMPLING_PRIORITY_KEY @@ -41,6 +39,8 @@ from ddtrace.internal.writer import AgentWriter from ddtrace.internal.writer import LogWriter from ddtrace.settings import Config +from ddtrace.trace import Context +from ddtrace.trace import Tracer from tests.subprocesstest import run_in_subprocess from tests.utils import TracerTestCase from tests.utils import override_global_config @@ -641,30 +641,30 @@ def test_tracer_url(): import ddtrace - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() assert t._writer.agent_url == "http://localhost:8126" - t = ddtrace.Tracer(url="http://foobar:12") + t = ddtrace.trace.Tracer(url="http://foobar:12") assert t._writer.agent_url == "http://foobar:12" - t = ddtrace.Tracer(url="unix:///foobar") + t = ddtrace.trace.Tracer(url="unix:///foobar") assert t._writer.agent_url == "unix:///foobar" - t = ddtrace.Tracer(url="http://localhost") + t = ddtrace.trace.Tracer(url="http://localhost") assert t._writer.agent_url == "http://localhost" - t = ddtrace.Tracer(url="https://localhost") + t = ddtrace.trace.Tracer(url="https://localhost") assert t._writer.agent_url == "https://localhost" with pytest.raises(ValueError) as e: - ddtrace.Tracer(url="foo://foobar:12") + ddtrace.trace.Tracer(url="foo://foobar:12") assert ( str(e.value) == "Unsupported protocol 'foo' in intake URL 'foo://foobar:12'. Must be one of: http, https, unix" ) def test_tracer_shutdown_no_timeout(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() with mock.patch.object(AgentWriter, "stop") as mock_stop: with mock.patch.object(AgentWriter, "join") as mock_join: @@ -675,7 +675,7 @@ def test_tracer_shutdown_no_timeout(): def test_tracer_configure_writer_stop_unstarted(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() t._writer = mock.Mock(wraps=t._writer) orig_writer = t._writer @@ -685,7 +685,7 @@ def test_tracer_configure_writer_stop_unstarted(): def test_tracer_configure_writer_stop_started(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() t._writer = mock.Mock(wraps=t._writer) orig_writer = t._writer @@ -698,7 +698,7 @@ def test_tracer_configure_writer_stop_started(): def test_tracer_shutdown_timeout(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() with mock.patch.object(AgentWriter, "stop") as mock_stop: with t.trace("something"): @@ -709,7 +709,7 @@ def test_tracer_shutdown_timeout(): def test_tracer_shutdown(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() t.shutdown() with mock.patch.object(AgentWriter, "write") as mock_write: @@ -720,7 +720,7 @@ def test_tracer_shutdown(): def test_tracer_shutdown_warning(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() t.shutdown() with mock.patch.object(logging.Logger, "warning") as mock_logger: @@ -735,26 +735,26 @@ def test_tracer_shutdown_warning(): def test_tracer_dogstatsd_url(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() assert t._writer.dogstatsd.host == "localhost" assert t._writer.dogstatsd.port == 8125 - t = ddtrace.Tracer(dogstatsd_url="foobar:12") + t = ddtrace.trace.Tracer(dogstatsd_url="foobar:12") assert t._writer.dogstatsd.host == "foobar" assert t._writer.dogstatsd.port == 12 - t = ddtrace.Tracer(dogstatsd_url="udp://foobar:12") + t = ddtrace.trace.Tracer(dogstatsd_url="udp://foobar:12") assert t._writer.dogstatsd.host == "foobar" assert t._writer.dogstatsd.port == 12 - t = ddtrace.Tracer(dogstatsd_url="/var/run/statsd.sock") + t = ddtrace.trace.Tracer(dogstatsd_url="/var/run/statsd.sock") assert t._writer.dogstatsd.socket_path == "/var/run/statsd.sock" - t = ddtrace.Tracer(dogstatsd_url="unix:///var/run/statsd.sock") + t = ddtrace.trace.Tracer(dogstatsd_url="unix:///var/run/statsd.sock") assert t._writer.dogstatsd.socket_path == "/var/run/statsd.sock" with pytest.raises(ValueError) as e: - t = ddtrace.Tracer(dogstatsd_url="foo://foobar:12") + t = ddtrace.trace.Tracer(dogstatsd_url="foo://foobar:12") assert str(e) == "Unknown url format for `foo://foobar:12`" @@ -764,7 +764,7 @@ def test_tracer_fork(): import contextlib import multiprocessing - from ddtrace import tracer as t + from ddtrace.trace import tracer as t original_pid = t._pid original_writer = t._writer @@ -811,7 +811,7 @@ def task(t, errors): def test_tracer_with_version(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() # With global `config.version` defined with override_global_config(dict(version="1.2.3")): @@ -838,7 +838,7 @@ def test_tracer_with_version(): def test_tracer_with_env(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() # With global `config.env` defined with override_global_config(dict(env="prod")): @@ -1001,7 +1001,7 @@ def test_dd_tags_invalid(self): @run_in_subprocess(env_overrides=dict(DD_TAGS="service:mysvc,env:myenv,version:myvers")) def test_tags_from_DD_TAGS(self): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() with t.trace("test") as s: assert s.service == "mysvc" assert s.get_tag("env") == "myenv" @@ -1016,7 +1016,7 @@ def test_tags_from_DD_TAGS(self): ) ) def test_tags_from_DD_TAGS_precedence(self): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() with t.trace("test") as s: assert s.service == "svc" assert s.get_tag("env") == "env" @@ -1024,7 +1024,7 @@ def test_tags_from_DD_TAGS_precedence(self): @run_in_subprocess(env_overrides=dict(DD_TAGS="service:mysvc,env:myenv,version:myvers")) def test_tags_from_DD_TAGS_override(self): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() ddtrace.config.env = "env" ddtrace.config.service = "service" ddtrace.config.version = "0.123" @@ -1035,13 +1035,13 @@ def test_tags_from_DD_TAGS_override(self): def test_tracer_set_runtime_tags(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() with t.start_span("foobar") as span: pass assert len(span.get_tag("runtime-id")) - t2 = ddtrace.Tracer() + t2 = ddtrace.trace.Tracer() with t2.start_span("foobaz") as span2: pass @@ -1059,7 +1059,7 @@ def _test_tracer_runtime_tags_fork_task(tracer, q): def test_tracer_runtime_tags_fork(): import multiprocessing - from ddtrace import tracer + from ddtrace.trace import tracer from tests.tracer.test_tracer import _test_tracer_runtime_tags_fork_task span = tracer.start_span("foobar") @@ -1084,7 +1084,7 @@ def test_tracer_runtime_tags_cross_execution(tracer): def test_start_span_hooks(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() result = {} @@ -1099,7 +1099,7 @@ def store_span(span): def test_deregister_start_span_hooks(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() result = {} @@ -1121,7 +1121,7 @@ def test_enable(): import ddtrace - t2 = ddtrace.Tracer() + t2 = ddtrace.trace.Tracer() if os.environ["DD_TRACE_ENABLED"] == "true": assert t2.enabled else: @@ -1138,8 +1138,8 @@ def test_enable(): ) def test_unfinished_span_warning_log(): """Test that a warning log is emitted when the tracer is shut down with unfinished spans.""" - from ddtrace import tracer from ddtrace.constants import MANUAL_KEEP_KEY + from ddtrace.trace import tracer # Create two unfinished spans span1 = tracer.trace("unfinished_span1", service="my_service", resource="my_resource1") @@ -1170,7 +1170,7 @@ def thread_target(): def test_runtime_id_parent_only(): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() # Parent spans should have runtime-id with tracer.trace("test") as s: @@ -1196,7 +1196,7 @@ def test_runtime_id_parent_only(): def test_runtime_id_fork(): import os - from ddtrace import tracer + from ddtrace.trace import tracer s = tracer.trace("test") s.finish() @@ -1222,8 +1222,8 @@ def test_runtime_id_fork(): def test_multiple_tracer_ctx(): - t1 = ddtrace.Tracer() - t2 = ddtrace.Tracer() + t1 = ddtrace.trace.Tracer() + t2 = ddtrace.trace.Tracer() with t1.trace("") as s1: with t2.trace("") as s2: @@ -1413,7 +1413,7 @@ def _test_partial_flush(self): def test_unicode_config_vals(): - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() with override_global_config(dict(version="😇", env="😇")): with t.trace("1"): @@ -1664,22 +1664,24 @@ def override_service_mapping(service_mapping): ddtrace.config.service_mapping = {} # Test single mapping - with override_service_mapping("foo:bar"), ddtrace.Tracer().trace("renaming", service="foo") as span: + with override_service_mapping("foo:bar"), ddtrace.trace.Tracer().trace("renaming", service="foo") as span: assert span.service == "bar" # Test multiple mappings - with override_service_mapping("foo:bar,sna:fu"), ddtrace.Tracer().trace("renaming", service="sna") as span: + with override_service_mapping("foo:bar,sna:fu"), ddtrace.trace.Tracer().trace("renaming", service="sna") as span: assert span.service == "fu" # Test colliding mappings - with override_service_mapping("foo:bar,foo:foobar"), ddtrace.Tracer().trace("renaming", service="foo") as span: + with override_service_mapping("foo:bar,foo:foobar"), ddtrace.trace.Tracer().trace( + "renaming", service="foo" + ) as span: assert span.service == "foobar" # Test invalid service mapping with override_service_mapping("foo;bar,sna:fu"): - with ddtrace.Tracer().trace("passthru", service="foo") as _: + with ddtrace.trace.Tracer().trace("passthru", service="foo") as _: assert _.service == "foo" - with ddtrace.Tracer().trace("renaming", "sna") as _: + with ddtrace.trace.Tracer().trace("renaming", "sna") as _: assert _.service == "fu" @@ -1687,13 +1689,13 @@ def override_service_mapping(service_mapping): def test_configure_url_partial(): import ddtrace - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(hostname="abc") assert tracer._writer.agent_url == "http://abc:8126" tracer._configure(port=123) assert tracer._writer.agent_url == "http://abc:123" - tracer = ddtrace.Tracer(url="http://abc") + tracer = ddtrace.trace.Tracer(url="http://abc") assert tracer._writer.agent_url == "http://abc" tracer._configure(port=123) assert tracer._writer.agent_url == "http://abc:123" @@ -1706,7 +1708,7 @@ def test_bad_agent_url(): import pytest with pytest.raises(ValueError) as e: - from ddtrace import tracer # noqa: F401 + from ddtrace.trace import tracer # noqa: F401 assert ( str(e.value) @@ -1719,7 +1721,7 @@ def test_bad_agent_url_invalid_path(): import pytest with pytest.raises(ValueError) as e: - from ddtrace import tracer # noqa: F401 + from ddtrace.trace import tracer # noqa: F401 assert str(e.value) == "Invalid file path in intake URL 'unix://'" @@ -1728,7 +1730,7 @@ def test_bad_agent_url_invalid_hostname(): import pytest with pytest.raises(ValueError) as e: - from ddtrace import tracer # noqa: F401 + from ddtrace.trace import tracer # noqa: F401 assert str(e.value) == "Invalid hostname in intake URL 'http://'" @@ -1834,7 +1836,7 @@ def _target(span): def test_fork_manual_span_same_context(): import os - from ddtrace import tracer + from ddtrace.trace import tracer span = tracer.trace("test") pid = os.fork() @@ -1858,7 +1860,7 @@ def test_fork_manual_span_same_context(): def test_fork_manual_span_different_contexts(): import os - from ddtrace import tracer + from ddtrace.trace import tracer span = tracer.start_span("test") pid = os.fork() @@ -1881,8 +1883,8 @@ def test_fork_manual_span_different_contexts(): def test_fork_pid(): import os - from ddtrace import tracer from ddtrace.constants import PID + from ddtrace.trace import tracer root = tracer.trace("root_span") assert root.get_tag("runtime-id") is not None @@ -2017,8 +2019,8 @@ def test_import_ddtrace_tracer_not_module(): if import_ddtrace_tracer: import ddtrace.tracer # noqa: F401 - from ddtrace import Tracer - from ddtrace import tracer + from ddtrace.trace import Tracer + from ddtrace.trace import tracer assert isinstance(tracer, Tracer) @@ -2032,7 +2034,7 @@ def test_asm_standalone_configuration(sca_enabled, appsec_enabled, iast_enabled) with override_env({"DD_APPSEC_SCA_ENABLED": sca_enabled}): ddtrace.config._reset() - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() tracer._configure(appsec_enabled=appsec_enabled, iast_enabled=iast_enabled, appsec_standalone_enabled=True) if sca_enabled == "true": assert bool(ddtrace.config._sca_enabled) is True @@ -2051,7 +2053,7 @@ def test_asm_standalone_configuration(sca_enabled, appsec_enabled, iast_enabled) def test_gc_not_used_on_root_spans(): - tracer = ddtrace.Tracer() + tracer = ddtrace.trace.Tracer() gc.freeze() with tracer.trace("test-event"): @@ -2084,7 +2086,7 @@ def test_multiple_tracer_instances(): assert "Support for multiple Tracer instances is deprecated" not in str(w.message) warns.clear() - t = ddtrace.Tracer() + t = ddtrace.trace.Tracer() # TODO: Update this assertion when the deprecation is removed and the tracer becomes a singleton assert t is not ddtrace.tracer assert len(warns) == 1 diff --git a/tests/tracer/test_utils.py b/tests/tracer/test_utils.py index b24396fde7b..a83a329d716 100644 --- a/tests/tracer/test_utils.py +++ b/tests/tracer/test_utils.py @@ -7,7 +7,6 @@ import mock import pytest -from ddtrace._trace.context import Context from ddtrace.internal.utils import ArgumentError from ddtrace.internal.utils import get_argument_value from ddtrace.internal.utils import set_argument_value @@ -21,6 +20,7 @@ from ddtrace.internal.utils.formats import parse_tags_str from ddtrace.internal.utils.http import w3c_get_dd_list_member from ddtrace.internal.utils.importlib import func_name +from ddtrace.trace import Context class TestUtils(unittest.TestCase): diff --git a/tests/tracer/test_writer.py b/tests/tracer/test_writer.py index 6abb7681ab8..c0e375cca22 100644 --- a/tests/tracer/test_writer.py +++ b/tests/tracer/test_writer.py @@ -14,7 +14,6 @@ import ddtrace from ddtrace import config -from ddtrace._trace.span import Span from ddtrace.constants import _KEEP_SPANS_RATE_KEY from ddtrace.internal.ci_visibility.writer import CIVisibilityWriter from ddtrace.internal.compat import get_connection_response @@ -26,6 +25,7 @@ from ddtrace.internal.writer import LogWriter from ddtrace.internal.writer import Response from ddtrace.internal.writer import _human_size +from ddtrace.trace import Span from tests.utils import AnyInt from tests.utils import BaseTestCase from tests.utils import override_env diff --git a/tests/utils.py b/tests/utils.py index 5283e27e7cf..bc7acd68b84 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -17,9 +17,7 @@ import wrapt import ddtrace -from ddtrace import Tracer from ddtrace import config as dd_config -from ddtrace._trace.span import Span from ddtrace.constants import _SPAN_MEASURED_KEY from ddtrace.ext import http from ddtrace.internal import agent @@ -40,6 +38,8 @@ from ddtrace.propagation.http import _DatadogMultiHeader from ddtrace.settings._database_monitoring import dbm_config from ddtrace.settings.asm import config as asm_config +from ddtrace.trace import Span +from ddtrace.trace import Tracer from tests.subprocesstest import SubprocessTestCase @@ -373,7 +373,7 @@ def _ensure_test_spans(self, spans): """ internal helper to ensure the list of spans are all :class:`tests.utils.span.TestSpan` - :param spans: List of :class:`ddtrace._trace.span.Span` or :class:`tests.utils.span.TestSpan` + :param spans: List of :class:`ddtrace.trace.Span` or :class:`tests.utils.span.TestSpan` :type spans: list :returns: A list og :class:`tests.utils.span.TestSpan` :rtype: list @@ -664,7 +664,7 @@ def _configure(self, *args, **kwargs): class TestSpan(Span): """ - Test wrapper for a :class:`ddtrace._trace.span.Span` that provides additional functions and assertions + Test wrapper for a :class:`ddtrace.trace.Span` that provides additional functions and assertions Example:: @@ -682,8 +682,8 @@ def __init__(self, span): """ Constructor for TestSpan - :param span: The :class:`ddtrace._trace.span.Span` to wrap - :type span: :class:`ddtrace._trace.span.Span` + :param span: The :class:`ddtrace.trace.Span` to wrap + :type span: :class:`ddtrace.trace.Span` """ if isinstance(span, TestSpan): span = span._span @@ -693,7 +693,7 @@ def __init__(self, span): def __getattr__(self, key): """ - First look for property on the base :class:`ddtrace._trace.span.Span` otherwise return this object's attribute + First look for property on the base :class:`ddtrace.trace.Span` otherwise return this object's attribute """ if hasattr(self._span, key): return getattr(self._span, key) @@ -701,12 +701,12 @@ def __getattr__(self, key): return self.__getattribute__(key) def __setattr__(self, key, value): - """Pass through all assignment to the base :class:`ddtrace._trace.span.Span`""" + """Pass through all assignment to the base :class:`ddtrace.trace.Span`""" return setattr(self._span, key, value) def __eq__(self, other): """ - Custom equality code to ensure we are using the base :class:`ddtrace._trace.span.Span.__eq__` + Custom equality code to ensure we are using the base :class:`ddtrace.trace.Span.__eq__` :param other: The object to check equality with :type other: object @@ -882,7 +882,7 @@ class TestSpanNode(TestSpan, TestSpanContainer): """ A :class:`tests.utils.span.TestSpan` which is used as part of a span tree. - Each :class:`tests.utils.span.TestSpanNode` represents the current :class:`ddtrace._trace.span.Span` + Each :class:`tests.utils.span.TestSpanNode` represents the current :class:`ddtrace.trace.Span` along with any children who have that span as it's parent. This class can be used to assert on the parent/child relationships between spans. @@ -1002,7 +1002,7 @@ class SnapshotFailed(Exception): @dataclasses.dataclass class SnapshotTest: token: str - tracer: ddtrace.Tracer = ddtrace.tracer + tracer: ddtrace.trace.Tracer = ddtrace.tracer def clear(self): """Clear any traces sent that were sent for this snapshot.""" diff --git a/tests/webclient.py b/tests/webclient.py index 33e5751baf6..38904a9af95 100644 --- a/tests/webclient.py +++ b/tests/webclient.py @@ -2,9 +2,9 @@ import requests -from ddtrace._trace.context import Context from ddtrace.internal.utils.retry import retry from ddtrace.propagation.http import HTTPPropagator +from ddtrace.trace import Context from ddtrace.trace import TraceFilter From b61b2f15a721786a868adc8c171264b8141d62ee Mon Sep 17 00:00:00 2001 From: lievan <42917263+lievan@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:15:43 -0500 Subject: [PATCH 13/63] fix(llmobs): merge instead of overwrite dicts in annotate (#12142) Fix all annotations behavior of dictionary attributes to be merging, not over-write. This includes: - prompt - metadata - metrics Over-writing results in missing attributes when users want to annotate partial values of dictionaries ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) Co-authored-by: lievan --- ddtrace/llmobs/_llmobs.py | 72 +++++++------------ ...annotate-update-dict-6ef6028ecbf0845d.yaml | 5 ++ tests/llmobs/test_llmobs_service.py | 24 ++++++- 3 files changed, 51 insertions(+), 50 deletions(-) create mode 100644 releasenotes/notes/annotate-update-dict-6ef6028ecbf0845d.yaml diff --git a/ddtrace/llmobs/_llmobs.py b/ddtrace/llmobs/_llmobs.py index 79c1a494b04..5d88c9bf03b 100644 --- a/ddtrace/llmobs/_llmobs.py +++ b/ddtrace/llmobs/_llmobs.py @@ -759,16 +759,29 @@ def annotate( log.warning("Cannot annotate a finished span.") return if metadata is not None: - cls._tag_metadata(span, metadata) + if not isinstance(metadata, dict): + log.warning("metadata must be a dictionary") + else: + cls._set_dict_attribute(span, METADATA, metadata) if metrics is not None: - cls._tag_metrics(span, metrics) + if not isinstance(metrics, dict): + log.warning("metrics must be a dictionary of string key - numeric value pairs.") + else: + cls._set_dict_attribute(span, METRICS, metrics) if tags is not None: - cls._tag_span_tags(span, tags) + if not isinstance(tags, dict): + log.warning("span tags must be a dictionary of string key - primitive value pairs.") + else: + cls._set_dict_attribute(span, TAGS, tags) span_kind = span._get_ctx_item(SPAN_KIND) if _name is not None: span.name = _name if prompt is not None: - cls._tag_prompt(span, prompt) + try: + validated_prompt = validate_prompt(prompt) + cls._set_dict_attribute(span, INPUT_PROMPT, validated_prompt) + except TypeError: + log.warning("Failed to validate prompt with error: ", exc_info=True) if not span_kind: log.debug("Span kind not specified, skipping annotation for input/output data") return @@ -782,16 +795,6 @@ def annotate( else: cls._tag_text_io(span, input_value=input_data, output_value=output_data) - @staticmethod - def _tag_prompt(span, prompt: dict) -> None: - """Tags a given LLMObs span with a prompt""" - try: - validated_prompt = validate_prompt(prompt) - span._set_ctx_item(INPUT_PROMPT, validated_prompt) - except TypeError: - log.warning("Failed to validate prompt with error: ", exc_info=True) - return - @classmethod def _tag_llm_io(cls, span, input_messages=None, output_messages=None): """Tags input/output messages for LLM-kind spans. @@ -862,41 +865,14 @@ def _tag_text_io(cls, span, input_value=None, output_value=None): span._set_ctx_item(OUTPUT_VALUE, str(output_value)) @staticmethod - def _tag_span_tags(span: Span, span_tags: Dict[str, Any]) -> None: - """Tags a given LLMObs span with a dictionary of key-value tag pairs. - If tags are already set on the span, the new tags will be merged with the existing tags. + def _set_dict_attribute(span: Span, key, value: Dict[str, Any]) -> None: + """Sets a given LLM Obs span attribute with a dictionary key/values. + If the attribute is already set on the span, the new dict with be merged with the existing + dict. """ - if not span_tags: - return - if not isinstance(span_tags, dict): - log.warning("span_tags must be a dictionary of string key - primitive value pairs.") - return - try: - existing_tags = span._get_ctx_item(TAGS) or {} - existing_tags.update(span_tags) - span._set_ctx_item(TAGS, existing_tags) - except Exception: - log.warning("Failed to parse tags.", exc_info=True) - - @staticmethod - def _tag_metadata(span: Span, metadata: Dict[str, Any]) -> None: - """Tags a given LLMObs span with a dictionary of key-value metadata pairs.""" - if not metadata: - return - if not isinstance(metadata, dict): - log.warning("metadata must be a dictionary of string key-value pairs.") - return - span._set_ctx_item(METADATA, metadata) - - @staticmethod - def _tag_metrics(span: Span, metrics: Dict[str, Any]) -> None: - """Tags a given LLMObs span with a dictionary of key-value metric pairs.""" - if not metrics: - return - if not isinstance(metrics, dict): - log.warning("metrics must be a dictionary of string key - numeric value pairs.") - return - span._set_ctx_item(METRICS, metrics) + existing_value = span._get_ctx_item(key) or {} + existing_value.update(value) + span._set_ctx_item(key, existing_value) @classmethod def submit_evaluation_for( diff --git a/releasenotes/notes/annotate-update-dict-6ef6028ecbf0845d.yaml b/releasenotes/notes/annotate-update-dict-6ef6028ecbf0845d.yaml new file mode 100644 index 00000000000..8989ef48b4d --- /dev/null +++ b/releasenotes/notes/annotate-update-dict-6ef6028ecbf0845d.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + LLM Observability: This fix resolves an issue where successive calls to ``LLMObs.annotate()`` on the same span caused + overwriting of metrics, metadata, and prompt dictionaries. Now, calling ``LLMObs.annotate()`` will merge new metrics/metadata/prompt values with any existing ones. \ No newline at end of file diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py index 7c3c78a6085..fb5eb996bad 100644 --- a/tests/llmobs/test_llmobs_service.py +++ b/tests/llmobs/test_llmobs_service.py @@ -365,11 +365,24 @@ def test_annotate_metadata(llmobs): assert span._get_ctx_item(METADATA) == {"temperature": 0.5, "max_tokens": 20, "top_k": 10, "n": 3} +def test_annotate_metadata_updates(llmobs): + with llmobs.llm(model_name="test_model", name="test_llm_call", model_provider="test_provider") as span: + llmobs.annotate(span=span, metadata={"temperature": 0.5, "max_tokens": 20, "top_k": 10, "n": 3}) + llmobs.annotate(span=span, metadata={"temperature": 1, "logit_bias": [{"1": 2}]}) + assert span._get_ctx_item(METADATA) == { + "temperature": 1, + "max_tokens": 20, + "top_k": 10, + "n": 3, + "logit_bias": [{"1": 2}], + } + + def test_annotate_metadata_wrong_type_raises_warning(llmobs, mock_llmobs_logs): with llmobs.llm(model_name="test_model", name="test_llm_call", model_provider="test_provider") as span: llmobs.annotate(span=span, metadata="wrong_metadata") assert span._get_ctx_item(METADATA) is None - mock_llmobs_logs.warning.assert_called_once_with("metadata must be a dictionary of string key-value pairs.") + mock_llmobs_logs.warning.assert_called_once_with("metadata must be a dictionary") mock_llmobs_logs.reset_mock() @@ -384,7 +397,7 @@ def test_annotate_tag_wrong_type(llmobs, mock_llmobs_logs): llmobs.annotate(span=span, tags=12345) assert span._get_ctx_item(TAGS) is None mock_llmobs_logs.warning.assert_called_once_with( - "span_tags must be a dictionary of string key - primitive value pairs." + "span tags must be a dictionary of string key - primitive value pairs." ) @@ -631,6 +644,13 @@ def test_annotate_metrics(llmobs): assert span._get_ctx_item(METRICS) == {"input_tokens": 10, "output_tokens": 20, "total_tokens": 30} +def test_annotate_metrics_updates(llmobs): + with llmobs.llm(model_name="test_model") as span: + llmobs.annotate(span=span, metrics={"input_tokens": 10, "output_tokens": 20}) + llmobs.annotate(span=span, metrics={"input_tokens": 20, "total_tokens": 40}) + assert span._get_ctx_item(METRICS) == {"input_tokens": 20, "output_tokens": 20, "total_tokens": 40} + + def test_annotate_metrics_wrong_type(llmobs, mock_llmobs_logs): with llmobs.llm(model_name="test_model") as llm_span: llmobs.annotate(span=llm_span, metrics=12345) From 03e7cf80c75d6efb6444e096b180f9818c845cba Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Thu, 30 Jan 2025 10:29:43 +0100 Subject: [PATCH 14/63] chore(asm): clean libddwaf loading [forwardport 3.x] (#12145) Depending of the timing, libddwaf loading process could create triggers that would create loops in our instrumentation. From what I investigated: - if loaded too early, it could have bad interactions with gevent. - if loaded too late, it could be self instrumented by the tracer, creating a loop, as ctypes is using Popen and subprocess. while keeping the late loading introduced by 2 previous PRs - https://github.com/DataDog/dd-trace-py/pull/11987 - https://github.com/DataDog/dd-trace-py/pull/12013 this PR introduced a mechanism to bypass tracer instrumentation during ctypes loading, to avoid a possible loop that would prevent the WAF to be loaded. (cherry picked from commit 4f0bcb5a59378fb6015230f9f9ad04199fc380b5) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) Co-authored-by: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> --- ddtrace/appsec/_ddwaf/ddwaf_types.py | 3 +++ ddtrace/appsec/_processor.py | 26 +++++++++++--------- ddtrace/contrib/internal/subprocess/patch.py | 6 +++++ ddtrace/settings/asm.py | 1 + 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/ddtrace/appsec/_ddwaf/ddwaf_types.py b/ddtrace/appsec/_ddwaf/ddwaf_types.py index e998b6048f6..5942a2fa184 100644 --- a/ddtrace/appsec/_ddwaf/ddwaf_types.py +++ b/ddtrace/appsec/_ddwaf/ddwaf_types.py @@ -22,9 +22,12 @@ if system() == "Linux": try: + asm_config._bypass_instrumentation_for_waf = True ctypes.CDLL(ctypes.util.find_library("rt"), mode=ctypes.RTLD_GLOBAL) except Exception: # nosec pass + finally: + asm_config._bypass_instrumentation_for_waf = False ARCHI = machine().lower() diff --git a/ddtrace/appsec/_processor.py b/ddtrace/appsec/_processor.py index f144eba6458..a49af4e10a1 100644 --- a/ddtrace/appsec/_processor.py +++ b/ddtrace/appsec/_processor.py @@ -4,6 +4,7 @@ from json.decoder import JSONDecodeError import os import os.path +from typing import TYPE_CHECKING from typing import Any from typing import Dict from typing import List @@ -11,6 +12,11 @@ from typing import Set from typing import Tuple from typing import Union + + +if TYPE_CHECKING: + import ddtrace.appsec._ddwaf as ddwaf + import weakref from ddtrace._trace.processor import SpanProcessor @@ -167,14 +173,17 @@ def __post_init__(self) -> None: def delayed_init(self) -> None: try: if self._rules is not None and not hasattr(self, "_ddwaf"): - self._ddwaf = ddwaf.DDWaf( + from ddtrace.appsec._ddwaf import DDWaf # noqa: E402 + import ddtrace.appsec._metrics as metrics # noqa: E402 + + self.metrics = metrics + self._ddwaf = DDWaf( self._rules, self.obfuscation_parameter_key_regexp, self.obfuscation_parameter_value_regexp ) - _set_waf_init_metric(self._ddwaf.info) + self.metrics._set_waf_init_metric(self._ddwaf.info) except Exception: # Partial of DDAS-0005-00 log.warning("[DDAS-0005-00] WAF initialization failed") - raise self._update_required() def _update_required(self): @@ -193,7 +202,7 @@ def _update_rules(self, new_rules: Dict[str, Any]) -> bool: if asm_config._asm_static_rule_file is not None: return result result = self._ddwaf.update_rules(new_rules) - _set_waf_updates_metric(self._ddwaf.info) + self.metrics._set_waf_updates_metric(self._ddwaf.info) self._update_required() return result @@ -241,7 +250,7 @@ def waf_callable(custom_data=None, **kwargs): return self._waf_action(span._local_root or span, ctx, custom_data, **kwargs) _asm_request_context.set_waf_callback(waf_callable) - _asm_request_context.add_context_callback(_set_waf_request_metrics) + _asm_request_context.add_context_callback(self.metrics._set_waf_request_metrics) if headers is not None: _asm_request_context.set_waf_address(SPAN_DATA_NAMES.REQUEST_HEADERS_NO_COOKIES, headers) _asm_request_context.set_waf_address( @@ -436,10 +445,3 @@ def on_span_finish(self, span: Span) -> None: del self._span_to_waf_ctx[s] except Exception: # nosec B110 pass - - -# load waf at the end only to avoid possible circular imports with gevent -import ddtrace.appsec._ddwaf as ddwaf # noqa: E402 -from ddtrace.appsec._metrics import _set_waf_init_metric # noqa: E402 -from ddtrace.appsec._metrics import _set_waf_request_metrics # noqa: E402 -from ddtrace.appsec._metrics import _set_waf_updates_metric # noqa: E402 diff --git a/ddtrace/contrib/internal/subprocess/patch.py b/ddtrace/contrib/internal/subprocess/patch.py index 80d05b107bb..2d66edd4737 100644 --- a/ddtrace/contrib/internal/subprocess/patch.py +++ b/ddtrace/contrib/internal/subprocess/patch.py @@ -327,6 +327,8 @@ def unpatch() -> None: @trace_utils.with_traced_module def _traced_ossystem(module, pin, wrapped, instance, args, kwargs): try: + if asm_config._bypass_instrumentation_for_waf: + return wrapped(*args, **kwargs) if isinstance(args[0], str): for callback in _STR_CALLBACKS.values(): callback(args[0]) @@ -393,6 +395,8 @@ def _traced_osspawn(module, pin, wrapped, instance, args, kwargs): @trace_utils.with_traced_module def _traced_subprocess_init(module, pin, wrapped, instance, args, kwargs): try: + if asm_config._bypass_instrumentation_for_waf: + return wrapped(*args, **kwargs) cmd_args = args[0] if len(args) else kwargs["args"] if isinstance(cmd_args, (list, tuple, str)): if kwargs.get("shell", False): @@ -425,6 +429,8 @@ def _traced_subprocess_init(module, pin, wrapped, instance, args, kwargs): @trace_utils.with_traced_module def _traced_subprocess_wait(module, pin, wrapped, instance, args, kwargs): try: + if asm_config._bypass_instrumentation_for_waf: + return wrapped(*args, **kwargs) binary = core.get_item("subprocess_popen_binary") with pin.tracer.trace(COMMANDS.SPAN_NAME, resource=binary, span_type=SpanTypes.SYSTEM) as span: diff --git a/ddtrace/settings/asm.py b/ddtrace/settings/asm.py index 0dac1ba5981..49fc5e6f6c2 100644 --- a/ddtrace/settings/asm.py +++ b/ddtrace/settings/asm.py @@ -214,6 +214,7 @@ class ASMConfig(Env): default=r"^[+-]?((0b[01]+)|(0x[0-9A-Fa-f]+)|(\d+\.?\d*(?:[Ee][+-]?\d+)?|\.\d+(?:[Ee][+-]" + r"?\d+)?)|(X\'[0-9A-Fa-f]+\')|(B\'[01]+\'))$", ) + _bypass_instrumentation_for_waf = False def __init__(self): super().__init__() From 26a275b4ee7c359397f633e4344ef010da605393 Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:42:36 +0100 Subject: [PATCH 15/63] fix(profiling): fix SystemError when collecting memory profiler events [forwardport 3.x] (#12140) Forwardporting https://github.com/DataDog/dd-trace-py/pull/12075 We added locking to the memory profiler to address crashes. These locks are mostly "try" locks, meaning we bail out if we can't acquire them right away. This was done defensively to mitigate the possibility of deadlock until we fully understood why the locks are needed and could guarantee their correctness. But as a result of using try locks, the iter_events function in particular can fail if the memory profiler lock is contended when it tries to collect profiling events. The function then returns NULL, leading to SystemError exceptions because we don't set an error. Even if we set an error, returning NULL isn't the right thing to do. It'll basically mean we wait until the next profile iteration, still accumulating events in the same buffer, and try again to upload the events. So we're going to get multiple iteration's worth of events. The right thing to do is take the lock unconditionally in iter_events. We can allocate the new tracker outside the memory allocation profiler lock so that we don't need to worry about reentrancy/deadlock issues if we start profiling that allocation. Then, the only thing we do under the lock is swap out the global tracker, so it's safe to take the lock unconditionally. Fixes https://github.com/DataDog/dd-trace-py/issues/11831 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) Co-authored-by: Nick Ripley --- ddtrace/profiling/collector/_memalloc.c | 22 +++++++++++++------ ...loc-iter-events-null-780fd50bbebbf616.yaml | 4 ++++ 2 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 releasenotes/notes/profiling-memalloc-iter-events-null-780fd50bbebbf616.yaml diff --git a/ddtrace/profiling/collector/_memalloc.c b/ddtrace/profiling/collector/_memalloc.c index 1f2b87e0433..1e1b9dbf52e 100644 --- a/ddtrace/profiling/collector/_memalloc.c +++ b/ddtrace/profiling/collector/_memalloc.c @@ -394,20 +394,28 @@ iterevents_new(PyTypeObject* type, PyObject* Py_UNUSED(args), PyObject* Py_UNUSE } IterEventsState* iestate = (IterEventsState*)type->tp_alloc(type, 0); - if (!iestate) + if (!iestate) { + PyErr_SetString(PyExc_RuntimeError, "failed to allocate IterEventsState"); return NULL; + } memalloc_assert_gil(); - /* reset the current traceback list */ - if (memlock_trylock(&g_memalloc_lock)) { - iestate->alloc_tracker = global_alloc_tracker; - global_alloc_tracker = alloc_tracker_new(); - memlock_unlock(&g_memalloc_lock); - } else { + /* Reset the current traceback list. Do this outside lock so we can track it, + * and avoid reentrancy/deadlock problems, if we start tracking the raw + * allocator domain */ + alloc_tracker_t* tracker = alloc_tracker_new(); + if (!tracker) { + PyErr_SetString(PyExc_RuntimeError, "failed to allocate new allocation tracker"); Py_TYPE(iestate)->tp_free(iestate); return NULL; } + + memlock_lock(&g_memalloc_lock); + iestate->alloc_tracker = global_alloc_tracker; + global_alloc_tracker = tracker; + memlock_unlock(&g_memalloc_lock); + iestate->seq_index = 0; PyObject* iter_and_count = PyTuple_New(3); diff --git a/releasenotes/notes/profiling-memalloc-iter-events-null-780fd50bbebbf616.yaml b/releasenotes/notes/profiling-memalloc-iter-events-null-780fd50bbebbf616.yaml new file mode 100644 index 00000000000..52a43cbd2a1 --- /dev/null +++ b/releasenotes/notes/profiling-memalloc-iter-events-null-780fd50bbebbf616.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + profiling: fix SystemError from the memory profiler returning NULL when collecting events From 09517b8881dcafc8211bd7513628c588f4a5bfb2 Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:45:50 +0100 Subject: [PATCH 16/63] chore: update changelog for version 2.19.2 [forwardport 3.x] (#12139) Forwardporting https://github.com/DataDog/dd-trace-py/pull/12088 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) Co-authored-by: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a29299f8987..6c72665472f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ Changelogs for versions not listed here can be found at https://github.com/DataD --- +## 2.19.2 +### Bug Fixes + +- Tracing + - celery: Fixes an issue where `celery.apply` spans from Celery prerun got closed too soon leading to span tags being missing. + - openai: Fixes a patching issue where asynchronous moderation endpoint calls resulted in coroutine scheduling errors. + - openai: Ensures the OpenAI integration is compatible with Python versions 3.12 and 3.13. + - vertexai: Resolves an issue with `chat.send_message()` where the content keyword argument was not parsed correctly. +- LLM Observability + - This fix resolves an issue where annotating a span with non latin-1 (but valid utf-8) input/output values resulted in encoding errors. +- Lib-Injection + - Fixes incorrect telemetry data payload format. + +--- + ## 2.19.1 ### Bug Fixes From 40cafd9ed3b58709c8cd573a8cf0287ac0113136 Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Thu, 30 Jan 2025 13:01:17 +0100 Subject: [PATCH 17/63] fix(llmobs): propagate distributed headers via signal dispatching, not config [forwardport 3.x] (#12154) Forwardporting https://github.com/DataDog/dd-trace-py/pull/12089 This PR makes a change to our shared distributed tracing header injection method to dispatch signals/events instead of relying on the global config settings, which is only modifiable via env vars. This fixes distributed tracing for users that might rely solely on the LLMObs.enable() setup config. Programmatic LLMObs.enable()/disable() calls do not set the global config._llmobs_enabled boolean setting, which is only controlled by the DD_LLMOBS_ENABLED env var. This was problematic for users that relied on manual LLMObs.enable() setup (i.e. no env vars) because our distributed tracing injection code only checks the global config to inject llmobs parent IDs into request headers. If users manually enabled LLMObs without any env vars, then this would not be reflected in the global config value and thus LLMObs parent IDs would never be injected into the request headers. We can't check directly if LLMObs is enabled in the http injection module because: This would require us to import significant product-specific LLMObs-code into the shared http injector helper module which would impact non-LLMObs users' app performance Circular imports in LLMObs which imports http injector logic to use in its own helpers Instead of doing our check based on the global config._llmobs_enabled setting, we now send a tracing event to our shared product listeners, and register a corresponding LLMObs._inject_llmobs_context() hook to be called for all inject() calls if LLMObs is enabled (we check the LLMObs instance, not the global config setting value). One risk and why I don't like changing global config settings is because this then implies that it is no longer global or tied to an env var (I want to push for env var configuration where possible over manual overriding/enabling). If a global enabled config can be toggled indiscriminately then this could open a can of worms for enabling/disabling logic in our LLMObs service, which isn't really designed to be toggled on/off multiple times in the app's lifespan. However if some users cannot rely on env vars, then I don't see any other solution that does not couple tracer internal code with LLMObs code which is a no-option. (UPDATE: we avoided this issue by using signal dispatching) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) Co-authored-by: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> --- ddtrace/llmobs/_llmobs.py | 8 ++- ddtrace/propagation/http.py | 7 +-- ...nable-updates-config-45379a7a30e2e0e3.yaml | 5 ++ tests/llmobs/test_llmobs_service.py | 1 - tests/llmobs/test_propagation.py | 54 ++++++++++++------- tests/tracer/test_propagation.py | 24 --------- 6 files changed, 49 insertions(+), 50 deletions(-) create mode 100644 releasenotes/notes/fix-llmobs-enable-updates-config-45379a7a30e2e0e3.yaml diff --git a/ddtrace/llmobs/_llmobs.py b/ddtrace/llmobs/_llmobs.py index 5d88c9bf03b..14e12d3151e 100644 --- a/ddtrace/llmobs/_llmobs.py +++ b/ddtrace/llmobs/_llmobs.py @@ -282,6 +282,7 @@ def _stop_service(self) -> None: # Remove listener hooks for span events core.reset_listeners("trace.span_start", self._on_span_start) core.reset_listeners("trace.span_finish", self._on_span_finish) + core.reset_listeners("http.span_inject", self._inject_llmobs_context) forksafe.unregister(self._child_after_fork) @@ -363,6 +364,7 @@ def enable( # Register hooks for span events core.on("trace.span_start", cls._instance._on_span_start) core.on("trace.span_finish", cls._instance._on_span_finish) + core.on("http.span_inject", cls._instance._inject_llmobs_context) atexit.register(cls.disable) telemetry_writer.product_activated(TELEMETRY_APM_PRODUCT.LLMOBS, True) @@ -1117,6 +1119,11 @@ def submit_evaluation( cls._instance._llmobs_eval_metric_writer.enqueue(evaluation_metric) + def _inject_llmobs_context(self, span_context: Context, request_headers: Dict[str, str]) -> None: + if self.enabled is False: + return + _inject_llmobs_parent_id(span_context) + @classmethod def inject_distributed_headers(cls, request_headers: Dict[str, str], span: Optional[Span] = None) -> Dict[str, str]: """Injects the span's distributed context into the given request headers.""" @@ -1134,7 +1141,6 @@ def inject_distributed_headers(cls, request_headers: Dict[str, str], span: Optio if span is None: log.warning("No span provided and no currently active span found.") return request_headers - _inject_llmobs_parent_id(span.context) HTTPPropagator.inject(span.context, request_headers) return request_headers diff --git a/ddtrace/propagation/http.py b/ddtrace/propagation/http.py index 3179e1980bb..e80b7e97d36 100644 --- a/ddtrace/propagation/http.py +++ b/ddtrace/propagation/http.py @@ -27,6 +27,7 @@ from ddtrace._trace.span import _get_64_lowest_order_bits_as_int from ddtrace._trace.span import _MetaDictType from ddtrace.appsec._constants import APPSEC +from ddtrace.internal.core import dispatch from ddtrace.settings.asm import config as asm_config from ddtrace.trace import Context @@ -1052,6 +1053,7 @@ def parent_call(): :param dict headers: HTTP headers to extend with tracing attributes. :param Span non_active_span: Only to be used if injecting a non-active span. """ + dispatch("http.span_inject", (span_context, headers)) if not config._propagation_style_inject: return if non_active_span is not None and non_active_span.context is not span_context: @@ -1089,11 +1091,6 @@ def parent_call(): for key in span_context._baggage: headers[_HTTP_BAGGAGE_PREFIX + key] = span_context._baggage[key] - if config._llmobs_enabled: - from ddtrace.llmobs._utils import _inject_llmobs_parent_id - - _inject_llmobs_parent_id(span_context) - if PROPAGATION_STYLE_DATADOG in config._propagation_style_inject: _DatadogMultiHeader._inject(span_context, headers) if PROPAGATION_STYLE_B3_MULTI in config._propagation_style_inject: diff --git a/releasenotes/notes/fix-llmobs-enable-updates-config-45379a7a30e2e0e3.yaml b/releasenotes/notes/fix-llmobs-enable-updates-config-45379a7a30e2e0e3.yaml new file mode 100644 index 00000000000..4bf312f4680 --- /dev/null +++ b/releasenotes/notes/fix-llmobs-enable-updates-config-45379a7a30e2e0e3.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + LLM Observability: Resolves an issue where explicitly only using ``LLMObs.enable()`` to configure LLM Observability + without environment variables would not automatically propagate distributed tracing headers. diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py index fb5eb996bad..db3957d018e 100644 --- a/tests/llmobs/test_llmobs_service.py +++ b/tests/llmobs/test_llmobs_service.py @@ -59,7 +59,6 @@ def test_service_enable_proxy_default(): assert llmobs_instance.tracer == dummy_tracer assert isinstance(llmobs_instance._llmobs_span_writer._clients[0], LLMObsProxiedEventClient) assert run_llmobs_trace_filter(dummy_tracer) is not None - llmobs_service.disable() diff --git a/tests/llmobs/test_propagation.py b/tests/llmobs/test_propagation.py index 7d7c6a59bbb..2a2d8a92695 100644 --- a/tests/llmobs/test_propagation.py +++ b/tests/llmobs/test_propagation.py @@ -57,20 +57,24 @@ def test_propagate_correct_llmobs_parent_id_simple(run_python_code_in_subprocess """ code = """ import json +import mock -from ddtrace.trace import tracer -from ddtrace.ext import SpanTypes +from ddtrace.internal.utils.http import Response +from ddtrace.llmobs import LLMObs from ddtrace.propagation.http import HTTPPropagator -with tracer.trace("LLMObs span", span_type=SpanTypes.LLM) as root_span: - with tracer.trace("Non-LLMObs span") as child_span: - headers = {"_DD_LLMOBS_SPAN_ID": str(root_span.span_id)} - HTTPPropagator.inject(child_span.context, headers) +with mock.patch( + "ddtrace.internal.writer.HTTPWriter._send_payload", return_value=Response(status=200, body="{}"), +): + LLMObs.enable(ml_app="test-app", api_key="", agentless_enabled=True) + with LLMObs.workflow("LLMObs span") as root_span: + with LLMObs._instance.tracer.trace("Non-LLMObs span") as child_span: + headers = {"_DD_LLMOBS_SPAN_ID": str(root_span.span_id)} + HTTPPropagator.inject(child_span.context, headers) print(json.dumps(headers)) """ env = os.environ.copy() - env["DD_LLMOBS_ENABLED"] = "1" env["DD_TRACE_ENABLED"] = "0" stdout, stderr, status, _ = run_python_code_in_subprocess(code=code, env=env) assert status == 0, (stdout, stderr) @@ -93,21 +97,33 @@ def test_propagate_llmobs_parent_id_complex(run_python_code_in_subprocess): """ code = """ import json +import mock -from ddtrace.trace import tracer -from ddtrace.ext import SpanTypes +from ddtrace.internal.utils.http import Response +from ddtrace.llmobs import LLMObs from ddtrace.propagation.http import HTTPPropagator -with tracer.trace("LLMObs span", span_type=SpanTypes.LLM) as root_span: - with tracer.trace("Non-LLMObs span") as child_span: - headers = {"_DD_LLMOBS_SPAN_ID": str(root_span.span_id)} - HTTPPropagator.inject(child_span.context, headers) +with mock.patch( + "ddtrace.internal.writer.HTTPWriter._send_payload", return_value=Response(status=200, body="{}"), +): + from ddtrace import auto # simulate ddtrace-run startup to ensure env var configs also propagate + with LLMObs.workflow("LLMObs span") as root_span: + with LLMObs._instance.tracer.trace("Non-LLMObs span") as child_span: + headers = {"_DD_LLMOBS_SPAN_ID": str(root_span.span_id)} + HTTPPropagator.inject(child_span.context, headers) print(json.dumps(headers)) """ env = os.environ.copy() - env["DD_LLMOBS_ENABLED"] = "1" - env["DD_TRACE_ENABLED"] = "0" + env.update( + { + "DD_LLMOBS_ENABLED": "1", + "DD_TRACE_ENABLED": "0", + "DD_AGENTLESS_ENABLED": "1", + "DD_API_KEY": "", + "DD_LLMOBS_ML_APP": "test-app", + } + ) stdout, stderr, status, _ = run_python_code_in_subprocess(code=code, env=env) assert status == 0, (stdout, stderr) assert stderr == b"", (stdout, stderr) @@ -124,7 +140,7 @@ def test_propagate_llmobs_parent_id_complex(run_python_code_in_subprocess): def test_no_llmobs_parent_id_propagated_if_no_llmobs_spans(run_python_code_in_subprocess): - """Test that the correct LLMObs parent ID (None) is extracted from the headers in a simple distributed scenario. + """Test that the correct LLMObs parent ID ('undefined') is extracted from headers in a simple distributed scenario. Service A (subprocess) has spans, but none are LLMObs spans. Service B (outside subprocess) has a LLMObs span. Service B's span should have no LLMObs parent ID as there are no LLMObs spans from service A. @@ -132,17 +148,17 @@ def test_no_llmobs_parent_id_propagated_if_no_llmobs_spans(run_python_code_in_su code = """ import json -from ddtrace.trace import tracer +from ddtrace.llmobs import LLMObs from ddtrace.propagation.http import HTTPPropagator -with tracer.trace("Non-LLMObs span") as root_span: +LLMObs.enable(ml_app="ml-app", agentless_enabled=True, api_key="") +with LLMObs._instance.tracer.trace("Non-LLMObs span") as root_span: headers = {} HTTPPropagator.inject(root_span.context, headers) print(json.dumps(headers)) """ env = os.environ.copy() - env["DD_LLMOBS_ENABLED"] = "1" env["DD_TRACE_ENABLED"] = "0" stdout, stderr, status, _ = run_python_code_in_subprocess(code=code, env=env) assert status == 0, (stdout, stderr) diff --git a/tests/tracer/test_propagation.py b/tests/tracer/test_propagation.py index 43052dced9f..c4074c16840 100644 --- a/tests/tracer/test_propagation.py +++ b/tests/tracer/test_propagation.py @@ -4,7 +4,6 @@ import os import pickle -import mock import pytest import ddtrace @@ -3387,29 +3386,6 @@ def test_DD_TRACE_PROPAGATION_STYLE_INJECT_overrides_DD_TRACE_PROPAGATION_STYLE( assert result == expected_headers -def test_llmobs_enabled_injects_llmobs_parent_id(): - with override_global_config(dict(_llmobs_enabled=True)): - with mock.patch("ddtrace.llmobs._utils._inject_llmobs_parent_id") as mock_llmobs_inject: - context = Context(trace_id=1, span_id=2) - HTTPPropagator.inject(context, {}) - mock_llmobs_inject.assert_called_once_with(context) - - -def test_llmobs_disabled_does_not_inject_parent_id(): - with override_global_config(dict(_llmobs_enabled=False)): - with mock.patch("ddtrace.llmobs._utils._inject_llmobs_parent_id") as mock_llmobs_inject: - context = Context(trace_id=1, span_id=2) - HTTPPropagator.inject(context, {}) - mock_llmobs_inject.assert_not_called() - - -def test_llmobs_parent_id_not_injected_by_default(): - with mock.patch("ddtrace.llmobs._utils._inject_llmobs_parent_id") as mock_llmobs_inject: - context = Context(trace_id=1, span_id=2) - HTTPPropagator.inject(context, {}) - mock_llmobs_inject.assert_not_called() - - @pytest.mark.parametrize( "span_context,expected_headers", [ From f73a3fe79d94e471bd227c8e323b5596ec95f766 Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Thu, 30 Jan 2025 13:01:51 +0100 Subject: [PATCH 18/63] feat(provider): expose context provider in ddtrace.trace [forwardport 3.x] (#12155) Forwardporting https://github.com/DataDog/dd-trace-py/pull/12135 ddtrace v3.0 is set to remove `ddtrace.providers` module from the public API. However we should still allow users to use their own ContextProviders. This PR ensures the BaseContextProvider remains in the public API and can be used in `tracer.configure(...)`. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) (cherry picked from commit cb41f8e77aa71bfffbb63f7ee1a9808e659189d2) Co-authored-by: Munir Abdinur --- .github/CODEOWNERS | 2 ++ ddtrace/provider.py | 5 +++-- ddtrace/trace/__init__.py | 1 + .../feat-expose-base-context-provider-530ebec2225f6c8d.yaml | 5 +++++ 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/feat-expose-base-context-provider-530ebec2225f6c8d.yaml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 84e6c873642..b1162da2348 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -166,12 +166,14 @@ ddtrace/internal/remoteconfig @DataDog/remote-config @DataDog/apm-core-pyt tests/internal/remoteconfig @DataDog/remote-config @DataDog/apm-core-python # API SDK +ddtrace/trace/ @DataDog/apm-sdk-api-python ddtrace/_trace/ @DataDog/apm-sdk-api-python ddtrace/opentelemetry/ @DataDog/apm-sdk-api-python ddtrace/internal/opentelemetry @DataDog/apm-sdk-api-python ddtrace/opentracer/ @DataDog/apm-sdk-api-python ddtrace/propagation/ @DataDog/apm-sdk-api-python ddtrace/filters.py @DataDog/apm-sdk-api-python +ddtrace/provider.py @DataDog/apm-sdk-api-python ddtrace/pin.py @DataDog/apm-sdk-api-python ddtrace/sampler.py @DataDog/apm-sdk-api-python ddtrace/sampling_rule.py @DataDog/apm-sdk-api-python diff --git a/ddtrace/provider.py b/ddtrace/provider.py index 4a275ece8c8..7b9867de01a 100644 --- a/ddtrace/provider.py +++ b/ddtrace/provider.py @@ -7,7 +7,8 @@ deprecate( - "The context provider interface is deprecated.", - message="The trace context is an internal interface and will no longer be supported.", + "The context provider interface is deprecated", + message="Import BaseContextProvider from `ddtrace.trace` instead.", category=DDTraceDeprecationWarning, + removal_version="3.0.0", ) diff --git a/ddtrace/trace/__init__.py b/ddtrace/trace/__init__.py index 3d50f66ec5a..6491fc6d01b 100644 --- a/ddtrace/trace/__init__.py +++ b/ddtrace/trace/__init__.py @@ -17,4 +17,5 @@ "Tracer", "Span", "tracer", + "BaseContextProvider", ] diff --git a/releasenotes/notes/feat-expose-base-context-provider-530ebec2225f6c8d.yaml b/releasenotes/notes/feat-expose-base-context-provider-530ebec2225f6c8d.yaml new file mode 100644 index 00000000000..010d2bf52bd --- /dev/null +++ b/releasenotes/notes/feat-expose-base-context-provider-530ebec2225f6c8d.yaml @@ -0,0 +1,5 @@ +--- +deprecations: + - | + tracing: Moves ``ddtrace.provider.BaseContextProvider`` to ``ddtrace.trace.BaseContextProvider``. + The ``ddtrace.provider`` module is deprecated and will be removed in v3.0.0. From 0ed084a18a046f28bc066dbd8ad61eefa3683553 Mon Sep 17 00:00:00 2001 From: Taegyun Kim Date: Thu, 30 Jan 2025 11:05:00 -0500 Subject: [PATCH 19/63] ci(profiling): run smoke test with built wheels (#12128) --- .github/workflows/build_python_3.yml | 1 + tests/smoke_test.py | 40 +++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_python_3.yml b/.github/workflows/build_python_3.yml index a20779fbe81..f03c3c1bdcd 100644 --- a/.github/workflows/build_python_3.yml +++ b/.github/workflows/build_python_3.yml @@ -47,6 +47,7 @@ jobs: runs-on: ${{ matrix.os }} name: Build ${{ matrix.only }} strategy: + fail-fast: false matrix: include: ${{ fromJson(needs.build-wheels-matrix.outputs.include) }} diff --git a/tests/smoke_test.py b/tests/smoke_test.py index 24017c0df81..56a2ab3a9c0 100644 --- a/tests/smoke_test.py +++ b/tests/smoke_test.py @@ -1,13 +1,13 @@ import copy import os -from platform import system +import platform import subprocess import sys import textwrap def mac_supported_iast_version(): - if system() == "Darwin": + if platform.system() == "Darwin": # TODO: MacOS 10.9 or lower has a old GCC version but cibuildwheel has a GCC old version in newest mac versions # mac_version = [int(i) for i in mac_ver()[0].split(".")] # mac_version > [10, 9] @@ -45,7 +45,7 @@ def emit(self, record): if __name__ == "__main__": # ASM IAST smoke test - if sys.version_info >= (3, 6, 0) and system() != "Windows" and mac_supported_iast_version(): + if sys.version_info >= (3, 6, 0) and platform.system() != "Windows" and mac_supported_iast_version(): print("Running native IAST module load test...") test_code = textwrap.dedent(test_native_load_code) cmd = [sys.executable, "-c", test_code] @@ -67,7 +67,7 @@ def emit(self, record): os.environ = orig_env # ASM WAF smoke test - if system() != "Linux" or sys.maxsize > 2**32: + if platform.system() != "Linux" or sys.maxsize > 2**32: import ddtrace.appsec._ddwaf import ddtrace.bootstrap.sitecustomize as module @@ -80,3 +80,35 @@ def emit(self, record): else: # Skip the test for 32-bit Linux systems print("Skipping test, 32-bit DDWAF not ready yet") + + # Profiling smoke test + print("Running profiling smoke test...") + profiling_cmd = [sys.executable, "-c", "import ddtrace.profiling.auto"] + if sys.version_info >= (3, 13, 0): + print("Skipping profiling smoke test for Python 3.13+ as it's not supported yet") + elif ( + # echion doesn't work on Windows + platform.system() == "Windows" + # libdatadog x86_64-apple-darwin has not yet been integrated to dd-trace-py + or (platform.system() == "Darwin" and platform.machine() == "x86_64") + # echion only works with 3.8+ + or sys.version_info < (3, 8, 0) + # echion crashes on musl linux with Python 3.12 for both x86_64 and + # aarch64 + or (platform.system() == "Linux" and sys.version_info[:2] == (3, 12) and platform.libc_ver()[0] != "glibc") + ): + orig_env = os.environ.copy() + copied_env = copy.deepcopy(orig_env) + copied_env["DD_PROFILING_STACK_V2_ENABLED"] = "False" + if platform.system() == "Windows": + # Memory profiler crashes on Windows + copied_env["DD_PROFILING_MEMORY_ENABLED"] = "False" + result = subprocess.run(profiling_cmd, env=copied_env, capture_output=True, text=True) + assert result.returncode == 0, "Failed with DD_PROFILING_STACK_V2_ENABLED=0: %s, %s" % ( + result.stdout, + result.stderr, + ) + else: + result = subprocess.run(profiling_cmd, capture_output=True, text=True) + assert result.returncode == 0, "Failed: %s, %s" % (result.stdout, result.stderr) + print("Profiling smoke test completed successfully") From 380f3e28a8be143799ec43c47717641e2bbae32c Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:38:39 +0100 Subject: [PATCH 20/63] chore: remove `check_safe_main_merge` workflow (#12171) Since we decided to lock main, we don't need this check anymore. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [ ] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .github/workflows/check_safe_main_merge.yml | 27 --------------------- 1 file changed, 27 deletions(-) delete mode 100644 .github/workflows/check_safe_main_merge.yml diff --git a/.github/workflows/check_safe_main_merge.yml b/.github/workflows/check_safe_main_merge.yml deleted file mode 100644 index 50a516ee4ac..00000000000 --- a/.github/workflows/check_safe_main_merge.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Check for Safe main Merge - -on: - pull_request: - branches: - - '3.x-staging' - -jobs: - check-merge: - runs-on: ubuntu-latest - steps: - # Step 1: Checkout the repository - - name: Checkout repository - uses: actions/checkout@v4 - - # Step 2: Fetch the main branch - - name: Fetch main branch - run: git fetch origin main - - # Step 3: Attempt to merge - - name: Check merge conflicts - run: | - git merge --no-commit --no-ff origin/main || exit 1 - # Step 4: Clean up the merge (optional) - - name: Abort merge - if: failure() - run: git merge --abort From 3e9891593e79c095692eb732a611c443710bd8e1 Mon Sep 17 00:00:00 2001 From: lievan <42917263+lievan@users.noreply.github.com> Date: Thu, 30 Jan 2025 13:37:22 -0500 Subject: [PATCH 21/63] fix(llmobs): don't enqueue spans to an inactive evaluator runner (#12150) This fix resolves an issue where spans were being enqueued to the buffer of a **inactive** evaluator runner, which caused noisy warning logs related to the evaluator runner's buffer being full ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: lievan --- ddtrace/llmobs/_evaluators/runner.py | 3 ++ ...evaluator-runner-log-fcd0aa18602d4252.yaml | 5 +++ tests/llmobs/test_llmobs_evaluator_runner.py | 37 +++++++++++-------- tests/llmobs/test_llmobs_service.py | 3 ++ 4 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 releasenotes/notes/fix-evaluator-runner-log-fcd0aa18602d4252.yaml diff --git a/ddtrace/llmobs/_evaluators/runner.py b/ddtrace/llmobs/_evaluators/runner.py index 3d800fe67a6..5e0ab2737f4 100644 --- a/ddtrace/llmobs/_evaluators/runner.py +++ b/ddtrace/llmobs/_evaluators/runner.py @@ -5,6 +5,7 @@ from ddtrace.internal import forksafe from ddtrace.internal.logger import get_logger from ddtrace.internal.periodic import PeriodicService +from ddtrace.internal.service import ServiceStatus from ddtrace.internal.telemetry import telemetry_writer from ddtrace.internal.telemetry.constants import TELEMETRY_NAMESPACE from ddtrace.llmobs._evaluators.ragas.answer_relevancy import RagasAnswerRelevancyEvaluator @@ -94,6 +95,8 @@ def recreate(self) -> "EvaluatorRunner": ) def enqueue(self, span_event: Dict, span: Span) -> None: + if self.status == ServiceStatus.STOPPED: + return with self._lock: if len(self._buffer) >= self._buffer_limit: logger.warning( diff --git a/releasenotes/notes/fix-evaluator-runner-log-fcd0aa18602d4252.yaml b/releasenotes/notes/fix-evaluator-runner-log-fcd0aa18602d4252.yaml new file mode 100644 index 00000000000..7149c48c4f1 --- /dev/null +++ b/releasenotes/notes/fix-evaluator-runner-log-fcd0aa18602d4252.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + LLM Observability: This fix resolves an issue where spans were being enqueued to an inactive evaluator runner which caused noisy logs + related to the evaluator runner buffer being full. diff --git a/tests/llmobs/test_llmobs_evaluator_runner.py b/tests/llmobs/test_llmobs_evaluator_runner.py index 6b13ce38718..a2c4278297c 100644 --- a/tests/llmobs/test_llmobs_evaluator_runner.py +++ b/tests/llmobs/test_llmobs_evaluator_runner.py @@ -18,39 +18,44 @@ DUMMY_SPAN = Span("dummy_span") -def test_evaluator_runner_start(mock_evaluator_logs): - evaluator_runner = EvaluatorRunner(interval=0.01, llmobs_service=mock.MagicMock()) - evaluator_runner.evaluators.append(DummyEvaluator(llmobs_service=mock.MagicMock())) +@pytest.fixture +def active_evaluator_runner(llmobs): + evaluator_runner = EvaluatorRunner(interval=0.01, llmobs_service=llmobs) + evaluator_runner.evaluators.append(DummyEvaluator(llmobs_service=llmobs)) evaluator_runner.start() + yield evaluator_runner + + +def test_evaluator_runner_start(mock_evaluator_logs, active_evaluator_runner): mock_evaluator_logs.debug.assert_has_calls([mock.call("started %r", "EvaluatorRunner")]) -def test_evaluator_runner_buffer_limit(mock_evaluator_logs): - evaluator_runner = EvaluatorRunner(interval=0.01, llmobs_service=mock.MagicMock()) +def test_evaluator_runner_buffer_limit(mock_evaluator_logs, active_evaluator_runner): for _ in range(1001): - evaluator_runner.enqueue({}, DUMMY_SPAN) + active_evaluator_runner.enqueue({}, DUMMY_SPAN) mock_evaluator_logs.warning.assert_called_with( "%r event buffer full (limit is %d), dropping event", "EvaluatorRunner", 1000 ) -def test_evaluator_runner_periodic_enqueues_eval_metric(llmobs, mock_llmobs_eval_metric_writer): - evaluator_runner = EvaluatorRunner(interval=0.01, llmobs_service=llmobs) - evaluator_runner.evaluators.append(DummyEvaluator(llmobs_service=llmobs)) - evaluator_runner.enqueue({"span_id": "123", "trace_id": "1234"}, DUMMY_SPAN) - evaluator_runner.periodic() +def test_evaluator_runner_periodic_enqueues_eval_metric(mock_llmobs_eval_metric_writer, active_evaluator_runner): + active_evaluator_runner.enqueue({"span_id": "123", "trace_id": "1234"}, DUMMY_SPAN) + active_evaluator_runner.periodic() mock_llmobs_eval_metric_writer.enqueue.assert_called_once_with( _dummy_evaluator_eval_metric_event(span_id="123", trace_id="1234") ) -@pytest.mark.vcr_logs -def test_evaluator_runner_timed_enqueues_eval_metric(llmobs, mock_llmobs_eval_metric_writer): - evaluator_runner = EvaluatorRunner(interval=0.01, llmobs_service=llmobs) - evaluator_runner.evaluators.append(DummyEvaluator(llmobs_service=llmobs)) +def test_evaluator_runner_stopped_does_not_enqueue_metric(llmobs, mock_llmobs_eval_metric_writer): + evaluator_runner = EvaluatorRunner(interval=0.1, llmobs_service=llmobs) evaluator_runner.start() - evaluator_runner.enqueue({"span_id": "123", "trace_id": "1234"}, DUMMY_SPAN) + assert not evaluator_runner._buffer + assert mock_llmobs_eval_metric_writer.enqueue.call_count == 0 + + +def test_evaluator_runner_timed_enqueues_eval_metric(llmobs, mock_llmobs_eval_metric_writer, active_evaluator_runner): + active_evaluator_runner.enqueue({"span_id": "123", "trace_id": "1234"}, DUMMY_SPAN) time.sleep(0.1) diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py index db3957d018e..ff099ae3f71 100644 --- a/tests/llmobs/test_llmobs_service.py +++ b/tests/llmobs/test_llmobs_service.py @@ -1383,6 +1383,7 @@ def test_llmobs_fork_recreates_and_restarts_eval_metric_writer(): def test_llmobs_fork_recreates_and_restarts_evaluator_runner(mock_ragas_evaluator): """Test that forking a process correctly recreates and restarts the EvaluatorRunner.""" + pytest.importorskip("ragas") with override_env(dict(_DD_LLMOBS_EVALUATORS="ragas_faithfulness")): with mock.patch("ddtrace.llmobs._evaluators.runner.EvaluatorRunner.periodic"): llmobs_service.enable(_tracer=DummyTracer(), ml_app="test_app") @@ -1464,6 +1465,8 @@ def test_llmobs_fork_submit_evaluation(monkeypatch): def test_llmobs_fork_evaluator_runner_run(monkeypatch): """Test that forking a process correctly encodes new spans created in each process.""" monkeypatch.setenv("_DD_LLMOBS_EVALUATOR_INTERVAL", 5.0) + pytest.importorskip("ragas") + monkeypatch.setenv("_DD_LLMOBS_EVALUATORS", "ragas_faithfulness") with mock.patch("ddtrace.llmobs._evaluators.runner.EvaluatorRunner.periodic"): llmobs_service.enable(_tracer=DummyTracer(), ml_app="test_app", api_key="test_api_key") pid = os.fork() From 5b4ffa6dbce7cd0ea78cfda71352375810a587e8 Mon Sep 17 00:00:00 2001 From: ncybul <124532568+ncybul@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:34:24 -0500 Subject: [PATCH 22/63] chore(llmobs): [MLOB-2089] remove python 3.7 tests from test suite (#12132) Removes LLMObs and related integration tests run with Python version 3.7. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .riot/requirements/16562eb.txt | 32 --------------------- .riot/requirements/df60af6.txt | 52 ---------------------------------- riotfile.py | 19 +++++-------- 3 files changed, 7 insertions(+), 96 deletions(-) delete mode 100644 .riot/requirements/16562eb.txt delete mode 100644 .riot/requirements/df60af6.txt diff --git a/.riot/requirements/16562eb.txt b/.riot/requirements/16562eb.txt deleted file mode 100644 index e2aac88c146..00000000000 --- a/.riot/requirements/16562eb.txt +++ /dev/null @@ -1,32 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/16562eb.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pyyaml==6.0.1 -six==1.17.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.20 -vcrpy==4.4.0 -wrapt==1.16.0 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/df60af6.txt b/.riot/requirements/df60af6.txt deleted file mode 100644 index 5143f0e0a74..00000000000 --- a/.riot/requirements/df60af6.txt +++ /dev/null @@ -1,52 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/df60af6.in -# -annotated-types==0.5.0 -anyio==3.7.1 -attrs==24.2.0 -cached-property==1.5.2 -certifi==2024.12.14 -coverage[toml]==7.2.7 -distro==1.9.0 -exceptiongroup==1.2.2 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.5 -numpy==1.21.6 -openai[datalib]==1.30.1 -opentracing==2.4.0 -packaging==24.0 -pandas==1.3.5 -pandas-stubs==1.2.0.62 -pillow==9.5.0 -pluggy==1.2.0 -pydantic==2.5.3 -pydantic-core==2.14.6 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -pytz==2024.2 -pyyaml==6.0.1 -six==1.17.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -tqdm==4.67.1 -typing-extensions==4.7.1 -urllib3==1.26.20 -vcrpy==4.2.1 -wrapt==1.16.0 -yarl==1.9.4 -zipp==3.15.0 diff --git a/riotfile.py b/riotfile.py index 90452bca332..d6fd8a1e89b 100644 --- a/riotfile.py +++ b/riotfile.py @@ -2492,13 +2492,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "pytest-randomly": latest, }, venvs=[ - Venv( - pys="3.7", - pkgs={ - "openai[datalib]": "==1.30.1", - "pillow": "==9.5.0", - }, - ), Venv( pys=select_pys(min_version="3.8", max_version="3.11"), pkgs={ @@ -2927,11 +2920,13 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( name="llmobs", command="pytest {cmdargs} tests/llmobs", - pkgs={"vcrpy": latest, "pytest-asyncio": "==0.21.1"}, - venvs=[ - Venv(pys="3.7"), - Venv(pys=select_pys(min_version="3.8"), pkgs={"ragas": "==0.1.21", "langchain": latest}), - ], + pkgs={ + "vcrpy": latest, + "pytest-asyncio": "==0.21.1", + "ragas": "==0.1.21", + "langchain": latest, + }, + pys=select_pys(min_version="3.8"), ), Venv( name="profile", From 92d8c5f7c6d9c84208fc1323364380f5b600fa30 Mon Sep 17 00:00:00 2001 From: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:18:28 +0100 Subject: [PATCH 23/63] chore(asm): improve user blocking for django (auth middleware) (#12069) This PR improve user blocking on Django by adding the possibility to block a previously authentified user. - Wrap AuthenticationMiddleware.process_request to check at the start of a new request, if an authentified user was already found and run the WAF on it. Ensure this patch is compatible with APM patches of middleware - Ensure the new way of blocking requests does not interfere with the old way on set_user, by allowing set_user blocking to be bypassed. We want to be sure we call the WAF exactly once. - Add support for "_dd.appsec.user.collection_mode" tag - Those changes will be tested and tracked by several system tests: - `tests/appsec/test_automated_user_and_session_tracking.py::Test_Automated_User_Tracking` - `tests/appsec/test_automated_user_and_session_tracking.py::Test_Automated_User_Blocking::test_user_blocking_auto` https://github.com/DataDog/system-tests/pull/3935 APPSEC-56505 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Co-authored-by: Nicole Cybul Co-authored-by: Nick Ripley Co-authored-by: William Conti <58711692+wconti27@users.noreply.github.com> --- ddtrace/appsec/_constants.py | 1 + ddtrace/appsec/_trace_utils.py | 57 +++++++++++++++++++++++- ddtrace/appsec/trace_utils/__init__.py | 2 + ddtrace/contrib/internal/django/patch.py | 51 +++++++++++++++++++++ ddtrace/contrib/internal/trace_utils.py | 3 +- 5 files changed, 111 insertions(+), 3 deletions(-) diff --git a/ddtrace/appsec/_constants.py b/ddtrace/appsec/_constants.py index 8fd812a888b..2172548205b 100644 --- a/ddtrace/appsec/_constants.py +++ b/ddtrace/appsec/_constants.py @@ -90,6 +90,7 @@ class APPSEC(metaclass=Constant_Class): AUTO_LOGIN_EVENTS_FAILURE_MODE: Literal[ "_dd.appsec.events.users.login.failure.auto.mode" ] = "_dd.appsec.events.users.login.failure.auto.mode" + AUTO_LOGIN_EVENTS_COLLECTION_MODE: Literal["_dd.appsec.user.collection_mode"] = "_dd.appsec.user.collection_mode" BLOCKED: Literal["appsec.blocked"] = "appsec.blocked" EVENT: Literal["appsec.event"] = "appsec.event" AUTO_USER_INSTRUMENTATION_MODE: Literal[ diff --git a/ddtrace/appsec/_trace_utils.py b/ddtrace/appsec/_trace_utils.py index 87400183607..53cc8d9b9b2 100644 --- a/ddtrace/appsec/_trace_utils.py +++ b/ddtrace/appsec/_trace_utils.py @@ -133,10 +133,10 @@ def track_user_login_success_event( return if real_mode == LOGIN_EVENTS_MODE.ANON and isinstance(user_id, str): user_id = _hash_user_id(user_id) - + span.set_tag_str(APPSEC.AUTO_LOGIN_EVENTS_COLLECTION_MODE, real_mode) if login_events_mode != LOGIN_EVENTS_MODE.SDK: span.set_tag_str(APPSEC.USER_LOGIN_USERID, str(user_id)) - set_user(tracer, user_id, name, email, scope, role, session_id, propagate, span) + set_user(tracer, user_id, name, email, scope, role, session_id, propagate, span, may_block=False) if in_asm_context(): res = call_waf_callback( custom_data={ @@ -185,6 +185,7 @@ def track_user_login_failure_event( if login_events_mode != LOGIN_EVENTS_MODE.SDK: span.set_tag_str(APPSEC.USER_LOGIN_USERID, str(user_id)) span.set_tag_str("%s.failure.%s" % (APPSEC.USER_LOGIN_EVENT_PREFIX_PUBLIC, user.ID), str(user_id)) + span.set_tag_str(APPSEC.AUTO_LOGIN_EVENTS_COLLECTION_MODE, real_mode) # if called from the SDK, set the login, email and name if login_events_mode in (LOGIN_EVENTS_MODE.SDK, LOGIN_EVENTS_MODE.AUTO): if login: @@ -376,5 +377,57 @@ def _on_django_auth(result_user, mode, kwargs, pin, info_retriever, django_confi return False, None +def _on_django_process(result_user, mode, kwargs, pin, info_retriever, django_config): + if (not asm_config._asm_enabled) or mode == LOGIN_EVENTS_MODE.DISABLED: + return + userid_list = info_retriever.possible_user_id_fields + info_retriever.possible_login_fields + + for possible_key in userid_list: + if possible_key in kwargs: + user_id = kwargs[possible_key] + break + else: + user_id = None + + user_id_found, user_extra = info_retriever.get_user_info( + login=django_config.include_user_login, + email=django_config.include_user_email, + name=django_config.include_user_realname, + ) + if user_extra.get("login") is None: + user_extra["login"] = user_id + user_id = user_id_found or user_id + if result_user and result_user.is_authenticated: + span = pin.tracer.current_root_span() + if mode == LOGIN_EVENTS_MODE.ANON and isinstance(user_id, str): + hash_id = _hash_user_id(user_id) + span.set_tag_str(APPSEC.USER_LOGIN_USERID, hash_id) + span.set_tag_str(APPSEC.AUTO_LOGIN_EVENTS_COLLECTION_MODE, mode) + set_user(pin.tracer, hash_id, propagate=True, may_block=False, span=span) + elif mode == LOGIN_EVENTS_MODE.IDENT: + span.set_tag_str(APPSEC.USER_LOGIN_USERID, str(user_id)) + span.set_tag_str(APPSEC.AUTO_LOGIN_EVENTS_COLLECTION_MODE, mode) + set_user( + pin.tracer, + str(user_id), + propagate=True, + email=user_extra.get("email"), + name=user_extra.get("name"), + may_block=False, + span=span, + ) + if in_asm_context(): + real_mode = mode if mode != LOGIN_EVENTS_MODE.AUTO else asm_config._user_event_mode + custom_data = { + "REQUEST_USER_ID": str(user_id) if user_id else None, + "REQUEST_USERNAME": user_extra.get("login"), + "LOGIN_SUCCESS": real_mode, + } + res = call_waf_callback(custom_data=custom_data, force_sent=True) + if res and any(action in [WAF_ACTIONS.BLOCK_ACTION, WAF_ACTIONS.REDIRECT_ACTION] for action in res.actions): + raise BlockingException(get_blocked()) + + core.on("django.login", _on_django_login) core.on("django.auth", _on_django_auth, "user") +core.on("django.process_request", _on_django_process) diff --git a/ddtrace/appsec/trace_utils/__init__.py b/ddtrace/appsec/trace_utils/__init__.py index 25559d7f0e9..749480429c1 100644 --- a/ddtrace/appsec/trace_utils/__init__.py +++ b/ddtrace/appsec/trace_utils/__init__.py @@ -1,3 +1,5 @@ +"""Public API for User events""" + from ddtrace.appsec._trace_utils import block_request # noqa: F401 from ddtrace.appsec._trace_utils import block_request_if_user_blocked # noqa: F401 from ddtrace.appsec._trace_utils import should_block_user # noqa: F401 diff --git a/ddtrace/contrib/internal/django/patch.py b/ddtrace/contrib/internal/django/patch.py index c51c789aab7..ba96675fef3 100644 --- a/ddtrace/contrib/internal/django/patch.py +++ b/ddtrace/contrib/internal/django/patch.py @@ -832,6 +832,53 @@ def traced_authenticate(django, pin, func, instance, args, kwargs): return result_user +@trace_utils.with_traced_module +def traced_process_request(django, pin, func, instance, args, kwargs): + tags = {COMPONENT: config.django.integration_name} + with core.context_with_data( + "django.func.wrapped", + span_name="django.middleware", + resource="django.contrib.auth.middleware.AuthenticationMiddleware.process_request", + tags=tags, + pin=pin, + ) as ctx, ctx.span: + core.dispatch( + "django.func.wrapped", + ( + args, + kwargs, + django.core.handlers.wsgi.WSGIRequest if hasattr(django.core.handlers, "wsgi") else object, + ctx, + None, + ), + ) + func(*args, **kwargs) + mode = asm_config._user_event_mode + if mode == "disabled": + return + try: + request = get_argument_value(args, kwargs, 0, "request") + if request: + if hasattr(request, "user") and hasattr(request.user, "_setup"): + request.user._setup() + request_user = request.user._wrapped + else: + request_user = request.user + core.dispatch( + "django.process_request", + ( + request_user, + mode, + kwargs, + pin, + _DjangoUserInfoRetriever(request_user, credentials=kwargs), + config.django, + ), + ) + except Exception: + log.debug("Error while trying to trace Django AuthenticationMiddleware process_request", exc_info=True) + + def unwrap_views(func, instance, args, kwargs): """ Django channels uses path() and re_path() to route asgi applications. This broke our initial @@ -884,6 +931,10 @@ def _(m): trace_utils.wrap(m, "login", traced_login(django)) trace_utils.wrap(m, "authenticate", traced_authenticate(django)) + @when_imported("django.contrib.auth.middleware") + def _(m): + trace_utils.wrap(m, "AuthenticationMiddleware.process_request", traced_process_request(django)) + # Only wrap get_asgi_application if get_response_async exists. Otherwise we will effectively double-patch # because get_response and get_asgi_application will be used. We must rely on the version instead of coalescing # with the previous patching hook because of circular imports within `django.core.asgi`. diff --git a/ddtrace/contrib/internal/trace_utils.py b/ddtrace/contrib/internal/trace_utils.py index e89dc39f1d7..90cf4e44ae0 100644 --- a/ddtrace/contrib/internal/trace_utils.py +++ b/ddtrace/contrib/internal/trace_utils.py @@ -639,6 +639,7 @@ def set_user( session_id=None, # type: Optional[str] propagate=False, # type bool span=None, # type: Optional[Span] + may_block=True, # type: bool ): # type: (...) -> None """Set user tags. @@ -666,7 +667,7 @@ def set_user( if session_id: span.set_tag_str(user.SESSION_ID, session_id) - if asm_config._asm_enabled: + if may_block and asm_config._asm_enabled: exc = core.dispatch_with_results("set_user_for_asm", [tracer, user_id]).block_user.exception if exc: raise exc From 9eeae42c6f57732a9c3af74156e63a088034e054 Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Fri, 31 Jan 2025 14:53:14 +0100 Subject: [PATCH 24/63] chore(tracing): refactor web server integrations to use the core module [forwardport 3.x] (#12164) Forwardporting https://github.com/DataDog/dd-trace-py/pull/12035 ## Motivation Refactors all web server integrations still using `tracer.trace` to instead use `core.context_with_data`. This is in preparation for supporting AWS API Gateway to ensure all web servers share the same code path. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) (cherry picked from commit 55767a78063ed17de0e954a6db4b9ff64b762f1d) Co-authored-by: William Conti <58711692+wconti27@users.noreply.github.com> --- ddtrace/_trace/trace_handlers.py | 56 +++++++++- .../contrib/internal/aiohttp/middlewares.py | 105 ++++++++---------- ddtrace/contrib/internal/bottle/trace.py | 61 +++++----- ddtrace/contrib/internal/cherrypy/patch.py | 53 +++++---- ddtrace/contrib/internal/falcon/middleware.py | 61 ++++------ ddtrace/contrib/internal/molten/patch.py | 52 ++++----- ddtrace/contrib/internal/pyramid/trace.py | 72 ++++++------ ddtrace/contrib/internal/sanic/patch.py | 61 +++++----- ...b.cherrypy.test_middleware.test_child.json | 1 + ...b.cherrypy.test_middleware.test_error.json | 1 + ...b.cherrypy.test_middleware.test_fatal.json | 1 + ...cherrypy.test_middleware.test_success.json | 1 + ...ver.test_multiple_requests_sanic_http.json | 2 + ...multiple_requests_sanic_http_pre_21.9.json | 2 + ...c.test_sanic_server.test_sanic_errors.json | 2 + ...nic_server.test_sanic_errors_pre_21.9.json | 2 + 16 files changed, 290 insertions(+), 243 deletions(-) diff --git a/ddtrace/_trace/trace_handlers.py b/ddtrace/_trace/trace_handlers.py index 89e31fa4e97..e0d99c0d020 100644 --- a/ddtrace/_trace/trace_handlers.py +++ b/ddtrace/_trace/trace_handlers.py @@ -109,11 +109,14 @@ def _get_parameters_for_new_span_directly_from_context(ctx: core.ExecutionContex def _start_span(ctx: core.ExecutionContext, call_trace: bool = True, **kwargs) -> "Span": span_kwargs = _get_parameters_for_new_span_directly_from_context(ctx) call_trace = ctx.get_item("call_trace", call_trace) - tracer = (ctx.get_item("middleware") or ctx["pin"]).tracer + tracer = ctx.get_item("tracer") or (ctx.get_item("middleware") or ctx["pin"]).tracer distributed_headers_config = ctx.get_item("distributed_headers_config") if distributed_headers_config: trace_utils.activate_distributed_headers( - tracer, int_config=distributed_headers_config, request_headers=ctx["distributed_headers"] + tracer, + int_config=distributed_headers_config, + request_headers=ctx["distributed_headers"], + override=ctx.get_item("distributed_headers_config_override"), ) distributed_context = ctx.get_item("distributed_context") if distributed_context and not call_trace: @@ -126,6 +129,42 @@ def _start_span(ctx: core.ExecutionContext, call_trace: bool = True, **kwargs) - return span +def _set_web_frameworks_tags(ctx, span, int_config): + span.set_tag_str(COMPONENT, int_config.integration_name) + span.set_tag_str(SPAN_KIND, SpanKind.SERVER) + span.set_tag(_SPAN_MEASURED_KEY) + + analytics_enabled = ctx.get_item("analytics_enabled") + analytics_sample_rate = ctx.get_item("analytics_sample_rate", True) + + # Configure trace search sample rate + if (config._analytics_enabled and analytics_enabled is not False) or analytics_enabled is True: + span.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, analytics_sample_rate) + + +def _on_web_framework_start_request(ctx, int_config): + request_span = ctx.get_item("req_span") + _set_web_frameworks_tags(ctx, request_span, int_config) + + +def _on_web_framework_finish_request( + span, int_config, method, url, status_code, query, req_headers, res_headers, route, finish +): + trace_utils.set_http_meta( + span=span, + integration_config=int_config, + method=method, + url=url, + status_code=status_code, + query=query, + request_headers=req_headers, + response_headers=res_headers, + route=route, + ) + if finish: + span.finish() + + def _on_traced_request_context_started_flask(ctx): current_span = ctx["pin"].tracer.current_span() if not ctx["pin"].enabled or not current_span: @@ -761,6 +800,10 @@ def listen(): core.on("azure.functions.request_call_modifier", _on_azure_functions_request_span_modifier) core.on("azure.functions.start_response", _on_azure_functions_start_response) + # web frameworks general handlers + core.on("web.request.start", _on_web_framework_start_request) + core.on("web.request.finish", _on_web_framework_finish_request) + core.on("test_visibility.enable", _on_test_visibility_enable) core.on("test_visibility.disable", _on_test_visibility_disable) core.on("test_visibility.is_enabled", _on_test_visibility_is_enabled, "is_enabled") @@ -769,6 +812,14 @@ def listen(): core.on("rq.queue.enqueue_job", _propagate_context) for context_name in ( + # web frameworks + "aiohttp.request", + "bottle.request", + "cherrypy.request", + "falcon.request", + "molten.request", + "pyramid.request", + "sanic.request", "flask.call", "flask.jsonify", "flask.render_template", @@ -779,6 +830,7 @@ def listen(): "django.template.render", "django.process_exception", "django.func.wrapped", + # non web frameworks "botocore.instrumented_api_call", "botocore.instrumented_lib_function", "botocore.patched_kinesis_api_call", diff --git a/ddtrace/contrib/internal/aiohttp/middlewares.py b/ddtrace/contrib/internal/aiohttp/middlewares.py index ddb2d35fbc6..63a60734d3b 100644 --- a/ddtrace/contrib/internal/aiohttp/middlewares.py +++ b/ddtrace/contrib/internal/aiohttp/middlewares.py @@ -2,15 +2,10 @@ from aiohttp.web_urldispatcher import SystemRoute from ddtrace import config -from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY -from ddtrace.constants import _SPAN_MEASURED_KEY -from ddtrace.constants import SPAN_KIND -from ddtrace.contrib import trace_utils from ddtrace.contrib.asyncio import context_provider -from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes from ddtrace.ext import http -from ddtrace.internal.constants import COMPONENT +from ddtrace.internal import core from ddtrace.internal.schema import schematize_url_operation from ddtrace.internal.schema.span_attribute_schema import SpanDirection @@ -35,47 +30,42 @@ async def attach_context(request): # application configs tracer = app[CONFIG_KEY]["tracer"] service = app[CONFIG_KEY]["service"] - distributed_tracing = app[CONFIG_KEY]["distributed_tracing_enabled"] - # Create a new context based on the propagated information. - trace_utils.activate_distributed_headers( - tracer, - int_config=config.aiohttp, - request_headers=request.headers, - override=distributed_tracing, - ) - - # trace the handler - request_span = tracer.trace( - schematize_url_operation("aiohttp.request", protocol="http", direction=SpanDirection.INBOUND), - service=service, - span_type=SpanTypes.WEB, - ) - request_span.set_tag(_SPAN_MEASURED_KEY) - - request_span.set_tag_str(COMPONENT, config.aiohttp.integration_name) - - # set span.kind tag equal to type of request - request_span.set_tag_str(SPAN_KIND, SpanKind.SERVER) - - # Configure trace search sample rate # DEV: aiohttp is special case maintains separate configuration from config api analytics_enabled = app[CONFIG_KEY]["analytics_enabled"] - if (config._analytics_enabled and analytics_enabled is not False) or analytics_enabled is True: - request_span.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, app[CONFIG_KEY].get("analytics_sample_rate", True)) - - # attach the context and the root span to the request; the Context - # may be freely used by the application code - request[REQUEST_CONTEXT_KEY] = request_span.context - request[REQUEST_SPAN_KEY] = request_span - request[REQUEST_CONFIG_KEY] = app[CONFIG_KEY] - try: - response = await handler(request) - if isinstance(response, web.StreamResponse): - request.task.add_done_callback(lambda _: finish_request_span(request, response)) - return response - except Exception: - request_span.set_traceback() - raise + # Create a new context based on the propagated information. + + with core.context_with_data( + "aiohttp.request", + span_name=schematize_url_operation("aiohttp.request", protocol="http", direction=SpanDirection.INBOUND), + span_type=SpanTypes.WEB, + service=service, + tags={}, + tracer=tracer, + distributed_headers=request.headers, + distributed_headers_config=config.aiohttp, + distributed_headers_config_override=app[CONFIG_KEY]["distributed_tracing_enabled"], + headers_case_sensitive=True, + analytics_enabled=analytics_enabled, + analytics_sample_rate=app[CONFIG_KEY].get("analytics_sample_rate", True), + ) as ctx: + req_span = ctx.span + + ctx.set_item("req_span", req_span) + core.dispatch("web.request.start", (ctx, config.aiohttp)) + + # attach the context and the root span to the request; the Context + # may be freely used by the application code + request[REQUEST_CONTEXT_KEY] = req_span.context + request[REQUEST_SPAN_KEY] = req_span + request[REQUEST_CONFIG_KEY] = app[CONFIG_KEY] + try: + response = await handler(request) + if isinstance(response, web.StreamResponse): + request.task.add_done_callback(lambda _: finish_request_span(request, response)) + return response + except Exception: + req_span.set_traceback() + raise return attach_context @@ -122,19 +112,22 @@ def finish_request_span(request, response): # SystemRoute objects exist to throw HTTP errors and have no path route = aiohttp_route.resource.canonical - trace_utils.set_http_meta( - request_span, - config.aiohttp, - method=request.method, - url=str(request.url), # DEV: request.url is a yarl's URL object - status_code=response.status, - request_headers=request.headers, - response_headers=response.headers, - route=route, + core.dispatch( + "web.request.finish", + ( + request_span, + config.aiohttp, + request.method, + str(request.url), # DEV: request.url is a yarl's URL object + response.status, + None, # query arg = None + request.headers, + response.headers, + route, + True, + ), ) - request_span.finish() - async def on_prepare(request, response): """ diff --git a/ddtrace/contrib/internal/bottle/trace.py b/ddtrace/contrib/internal/bottle/trace.py index 3aabb4ccc81..58778a36ee1 100644 --- a/ddtrace/contrib/internal/bottle/trace.py +++ b/ddtrace/contrib/internal/bottle/trace.py @@ -5,13 +5,8 @@ import ddtrace from ddtrace import config -from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY -from ddtrace.constants import _SPAN_MEASURED_KEY -from ddtrace.constants import SPAN_KIND -from ddtrace.contrib import trace_utils -from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes -from ddtrace.internal.constants import COMPONENT +from ddtrace.internal import core from ddtrace.internal.schema import schematize_url_operation from ddtrace.internal.schema.span_attribute_schema import SpanDirection from ddtrace.internal.utils.formats import asbool @@ -42,24 +37,21 @@ def wrapped(*args, **kwargs): resource = "{} {}".format(request.method, route.rule) - trace_utils.activate_distributed_headers( - self.tracer, int_config=config.bottle, request_headers=request.headers - ) - - with self.tracer.trace( - schematize_url_operation("bottle.request", protocol="http", direction=SpanDirection.INBOUND), + with core.context_with_data( + "bottle.request", + span_name=schematize_url_operation("bottle.request", protocol="http", direction=SpanDirection.INBOUND), + span_type=SpanTypes.WEB, service=self.service, resource=resource, - span_type=SpanTypes.WEB, - ) as s: - s.set_tag_str(COMPONENT, config.bottle.integration_name) - - # set span.kind to the type of request being performed - s.set_tag_str(SPAN_KIND, SpanKind.SERVER) - - s.set_tag(_SPAN_MEASURED_KEY) - # set analytics sample rate with global config enabled - s.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, config.bottle.get_analytics_sample_rate(use_global_config=True)) + tags={}, + tracer=self.tracer, + distributed_headers=request.headers, + distributed_headers_config=config.bottle, + headers_case_sensitive=True, + analytics_sample_rate=config.bottle.get_analytics_sample_rate(use_global_config=True), + ) as ctx, ctx.span as req_span: + ctx.set_item("req_span", req_span) + core.dispatch("web.request.start", (ctx, config.bottle)) code = None result = None @@ -91,16 +83,21 @@ def wrapped(*args, **kwargs): method = request.method url = request.urlparts._replace(query="").geturl() full_route = "/".join([request.script_name.rstrip("/"), route.rule.lstrip("/")]) - trace_utils.set_http_meta( - s, - config.bottle, - method=method, - url=url, - status_code=response_code, - query=request.query_string, - request_headers=request.headers, - response_headers=response.headers, - route=full_route, + + core.dispatch( + "web.request.finish", + ( + req_span, + config.bottle, + method, + url, + response_code, + request.query_string, + request.headers, + response.headers, + full_route, + False, + ), ) return wrapped diff --git a/ddtrace/contrib/internal/cherrypy/patch.py b/ddtrace/contrib/internal/cherrypy/patch.py index 909a043175f..70f43059905 100644 --- a/ddtrace/contrib/internal/cherrypy/patch.py +++ b/ddtrace/contrib/internal/cherrypy/patch.py @@ -11,12 +11,10 @@ from ddtrace.constants import ERROR_MSG from ddtrace.constants import ERROR_STACK from ddtrace.constants import ERROR_TYPE -from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils -from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes from ddtrace.internal import compat -from ddtrace.internal.constants import COMPONENT +from ddtrace.internal import core from ddtrace.internal.schema import SpanDirection from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.schema import schematize_url_operation @@ -77,20 +75,23 @@ def _setup(self): cherrypy.request.hooks.attach("after_error_response", self._after_error_response, priority=5) def _on_start_resource(self): - trace_utils.activate_distributed_headers( - self._tracer, int_config=config.cherrypy, request_headers=cherrypy.request.headers - ) - - cherrypy.request._datadog_span = self._tracer.trace( - SPAN_NAME, - service=trace_utils.int_service(None, config.cherrypy, default="cherrypy"), + with core.context_with_data( + "cherrypy.request", + span_name=SPAN_NAME, span_type=SpanTypes.WEB, - ) + service=trace_utils.int_service(None, config.cherrypy, default="cherrypy"), + tags={}, + tracer=self._tracer, + distributed_headers=cherrypy.request.headers, + distributed_headers_config=config.cherrypy, + headers_case_sensitive=True, + ) as ctx: + req_span = ctx.span - cherrypy.request._datadog_span.set_tag_str(COMPONENT, config.cherrypy.integration_name) + ctx.set_item("req_span", req_span) + core.dispatch("web.request.start", (ctx, config.cherrypy)) - # set span.kind to the type of request being performed - cherrypy.request._datadog_span.set_tag_str(SPAN_KIND, SpanKind.SERVER) + cherrypy.request._datadog_span = req_span def _after_error_response(self): span = getattr(cherrypy.request, "_datadog_span", None) @@ -135,18 +136,22 @@ def _close_span(self, span): url = compat.to_unicode(cherrypy.request.base + cherrypy.request.path_info) status_code, _, _ = valid_status(cherrypy.response.status) - trace_utils.set_http_meta( - span, - config.cherrypy, - method=cherrypy.request.method, - url=url, - status_code=status_code, - request_headers=cherrypy.request.headers, - response_headers=cherrypy.response.headers, + core.dispatch( + "web.request.finish", + ( + span, + config.cherrypy, + cherrypy.request.method, + url, + status_code, + None, + cherrypy.request.headers, + cherrypy.response.headers, + None, + True, + ), ) - span.finish() - # Clear our span just in case. cherrypy.request._datadog_span = None diff --git a/ddtrace/contrib/internal/falcon/middleware.py b/ddtrace/contrib/internal/falcon/middleware.py index b4ec5434777..513ce6cce39 100644 --- a/ddtrace/contrib/internal/falcon/middleware.py +++ b/ddtrace/contrib/internal/falcon/middleware.py @@ -1,14 +1,8 @@ import sys from ddtrace import config -from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY -from ddtrace.constants import _SPAN_MEASURED_KEY -from ddtrace.constants import SPAN_KIND -from ddtrace.contrib import trace_utils -from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes -from ddtrace.ext import http as httpx -from ddtrace.internal.constants import COMPONENT +from ddtrace.internal import core from ddtrace.internal.schema import SpanDirection from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.schema import schematize_url_operation @@ -27,26 +21,27 @@ def __init__(self, tracer, service=None, distributed_tracing=None): def process_request(self, req, resp): # Falcon uppercases all header names. headers = dict((k.lower(), v) for k, v in req.headers.items()) - trace_utils.activate_distributed_headers(self.tracer, int_config=config.falcon, request_headers=headers) - span = self.tracer.trace( - schematize_url_operation("falcon.request", protocol="http", direction=SpanDirection.INBOUND), - service=self.service, + with core.context_with_data( + "falcon.request", + span_name=schematize_url_operation("falcon.request", protocol="http", direction=SpanDirection.INBOUND), span_type=SpanTypes.WEB, - ) - span.set_tag_str(COMPONENT, config.falcon.integration_name) - - # set span.kind to the type of operation being performed - span.set_tag_str(SPAN_KIND, SpanKind.SERVER) - - span.set_tag(_SPAN_MEASURED_KEY) - - # set analytics sample rate with global config enabled - span.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, config.falcon.get_analytics_sample_rate(use_global_config=True)) - - trace_utils.set_http_meta( - span, config.falcon, method=req.method, url=req.url, query=req.query_string, request_headers=req.headers - ) + service=self.service, + tags={}, + tracer=self.tracer, + distributed_headers=headers, + distributed_headers_config=config.falcon, + headers_case_sensitive=True, + analytics_sample_rate=config.falcon.get_analytics_sample_rate(use_global_config=True), + ) as ctx: + req_span = ctx.span + ctx.set_item("req_span", req_span) + core.dispatch("web.request.start", (ctx, config.falcon)) + + core.dispatch( + "web.request.finish", + (req_span, config.falcon, req.method, req.url, None, req.query_string, req.headers, None, None, False), + ) def process_resource(self, req, resp, resource, params): span = self.tracer.current_span() @@ -69,8 +64,7 @@ def process_response(self, req, resp, resource, req_succeeded=None): if resource is None: status = "404" span.resource = "%s 404" % req.method - span.set_tag(httpx.STATUS_CODE, status) - span.finish() + core.dispatch("web.request.finish", (span, config.falcon, None, None, status, None, None, None, None, True)) return err_type = sys.exc_info()[0] @@ -87,20 +81,13 @@ def process_response(self, req, resp, resource, req_succeeded=None): route = req.root_path or "" + req.uri_template - trace_utils.set_http_meta( - span, - config.falcon, - status_code=status, - response_headers=resp._headers, - route=route, - ) - # Emit span hook for this response # DEV: Emit before closing so they can overwrite `span.resource` if they want config.falcon.hooks.emit("request", span, req, resp) - # Close the span - span.finish() + core.dispatch( + "web.request.finish", (span, config.falcon, None, None, status, None, None, resp._headers, route, True) + ) def _is_404(err_type): diff --git a/ddtrace/contrib/internal/molten/patch.py b/ddtrace/contrib/internal/molten/patch.py index 38fa949243c..dfec47eb17d 100644 --- a/ddtrace/contrib/internal/molten/patch.py +++ b/ddtrace/contrib/internal/molten/patch.py @@ -5,15 +5,11 @@ from wrapt import wrap_function_wrapper as _w from ddtrace import config -from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY -from ddtrace.constants import _SPAN_MEASURED_KEY -from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils from ddtrace.contrib.internal.trace_utils import unwrap as _u -from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes +from ddtrace.internal import core from ddtrace.internal.compat import urlencode -from ddtrace.internal.constants import COMPONENT from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.schema import schematize_url_operation from ddtrace.internal.schema.span_attribute_schema import SpanDirection @@ -89,25 +85,21 @@ def patch_app_call(wrapped, instance, args, kwargs): request = molten.http.Request.from_environ(environ) resource = func_name(wrapped) - # request.headers is type Iterable[Tuple[str, str]] - trace_utils.activate_distributed_headers( - pin.tracer, int_config=config.molten, request_headers=dict(request.headers) - ) - - with pin.tracer.trace( - schematize_url_operation("molten.request", protocol="http", direction=SpanDirection.INBOUND), + with core.context_with_data( + "molten.request", + span_name=schematize_url_operation("molten.request", protocol="http", direction=SpanDirection.INBOUND), + span_type=SpanTypes.WEB, service=trace_utils.int_service(pin, config.molten), resource=resource, - span_type=SpanTypes.WEB, - ) as span: - span.set_tag_str(COMPONENT, config.molten.integration_name) - - # set span.kind tag equal to type of operation being performed - span.set_tag_str(SPAN_KIND, SpanKind.SERVER) - - span.set_tag(_SPAN_MEASURED_KEY) - # set analytics sample rate with global config enabled - span.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, config.molten.get_analytics_sample_rate(use_global_config=True)) + tags={}, + tracer=pin.tracer, + distributed_headers=dict(request.headers), # request.headers is type Iterable[Tuple[str, str]] + distributed_headers_config=config.molten, + headers_case_sensitive=True, + analytics_sample_rate=config.molten.get_analytics_sample_rate(use_global_config=True), + ) as ctx, ctx.span as req_span: + ctx.set_item("req_span", req_span) + core.dispatch("web.request.start", (ctx, config.molten)) @wrapt.function_wrapper def _w_start_response(wrapped, instance, args, kwargs): @@ -125,11 +117,13 @@ def _w_start_response(wrapped, instance, args, kwargs): except ValueError: pass - if not span.get_tag(MOLTEN_ROUTE): + if not req_span.get_tag(MOLTEN_ROUTE): # if route never resolve, update root resource - span.resource = "{} {}".format(request.method, code) + req_span.resource = "{} {}".format(request.method, code) - trace_utils.set_http_meta(span, config.molten, status_code=code) + core.dispatch( + "web.request.finish", (req_span, config.molten, None, None, code, None, None, None, None, False) + ) return wrapped(*args, **kwargs) @@ -143,11 +137,13 @@ def _w_start_response(wrapped, instance, args, kwargs): request.path, ) query = urlencode(dict(request.params)) - trace_utils.set_http_meta( - span, config.molten, method=request.method, url=url, query=query, request_headers=request.headers + + core.dispatch( + "web.request.finish", + (req_span, config.molten, request.method, url, None, query, request.headers, None, None, False), ) - span.set_tag_str("molten.version", molten.__version__) + req_span.set_tag_str("molten.version", molten.__version__) return wrapped(environ, start_response, **kwargs) diff --git a/ddtrace/contrib/internal/pyramid/trace.py b/ddtrace/contrib/internal/pyramid/trace.py index 9942c673d4e..9b221bd3f09 100644 --- a/ddtrace/contrib/internal/pyramid/trace.py +++ b/ddtrace/contrib/internal/pyramid/trace.py @@ -6,12 +6,8 @@ # project import ddtrace from ddtrace import config -from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY -from ddtrace.constants import _SPAN_MEASURED_KEY -from ddtrace.constants import SPAN_KIND -from ddtrace.contrib import trace_utils -from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes +from ddtrace.internal import core from ddtrace.internal.constants import COMPONENT from ddtrace.internal.logger import get_logger from ddtrace.internal.schema import schematize_service_name @@ -67,29 +63,30 @@ def trace_tween_factory(handler, registry): service = settings.get(SETTINGS_SERVICE) or schematize_service_name("pyramid") tracer = settings.get(SETTINGS_TRACER) or ddtrace.tracer enabled = asbool(settings.get(SETTINGS_TRACE_ENABLED, tracer.enabled)) - distributed_tracing = asbool(settings.get(SETTINGS_DISTRIBUTED_TRACING, True)) + + # ensure distributed tracing within pyramid settings matches config + config.pyramid.distributed_tracing_enabled = asbool(settings.get(SETTINGS_DISTRIBUTED_TRACING, True)) if enabled: # make a request tracing function def trace_tween(request): - trace_utils.activate_distributed_headers( - tracer, int_config=config.pyramid, request_headers=request.headers, override=distributed_tracing - ) - - span_name = schematize_url_operation("pyramid.request", protocol="http", direction=SpanDirection.INBOUND) - with tracer.trace(span_name, service=service, resource="404", span_type=SpanTypes.WEB) as span: - span.set_tag_str(COMPONENT, config.pyramid.integration_name) - - # set span.kind to the type of operation being performed - span.set_tag_str(SPAN_KIND, SpanKind.SERVER) - - span.set_tag(_SPAN_MEASURED_KEY) - # Configure trace search sample rate + with core.context_with_data( + "pyramid.request", + span_name=schematize_url_operation("pyramid.request", protocol="http", direction=SpanDirection.INBOUND), + span_type=SpanTypes.WEB, + service=service, + resource="404", + tags={}, + tracer=tracer, + distributed_headers=request.headers, + distributed_headers_config=config.pyramid, + headers_case_sensitive=True, # DEV: pyramid is special case maintains separate configuration from config api - analytics_enabled = settings.get(SETTINGS_ANALYTICS_ENABLED) - - if (config._analytics_enabled and analytics_enabled is not False) or analytics_enabled is True: - span.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, settings.get(SETTINGS_ANALYTICS_SAMPLE_RATE, True)) + analytics_enabled=settings.get(SETTINGS_ANALYTICS_ENABLED), + analytics_sample_rate=settings.get(SETTINGS_ANALYTICS_SAMPLE_RATE, True), + ) as ctx, ctx.span as req_span: + ctx.set_item("req_span", req_span) + core.dispatch("web.request.start", (ctx, config.pyramid)) setattr(request, DD_TRACER, tracer) # used to find the tracer in templates response = None @@ -110,8 +107,8 @@ def trace_tween(request): finally: # set request tags if request.matched_route: - span.resource = "{} {}".format(request.method, request.matched_route.name) - span.set_tag_str("pyramid.route.name", request.matched_route.name) + req_span.resource = "{} {}".format(request.method, request.matched_route.name) + req_span.set_tag_str("pyramid.route.name", request.matched_route.name) # set response tags if response: status = response.status_code @@ -119,17 +116,22 @@ def trace_tween(request): else: response_headers = None - trace_utils.set_http_meta( - span, - config.pyramid, - method=request.method, - url=request.path_url, - status_code=status, - query=request.query_string, - request_headers=request.headers, - response_headers=response_headers, - route=request.matched_route.pattern if request.matched_route else None, + core.dispatch( + "web.request.finish", + ( + req_span, + config.pyramid, + request.method, + request.path_url, + status, + request.query_string, + request.headers, + response_headers, + request.matched_route.pattern if request.matched_route else None, + False, + ), ) + return response return trace_tween diff --git a/ddtrace/contrib/internal/sanic/patch.py b/ddtrace/contrib/internal/sanic/patch.py index 8e53ed41dc8..1babf7d44a0 100644 --- a/ddtrace/contrib/internal/sanic/patch.py +++ b/ddtrace/contrib/internal/sanic/patch.py @@ -4,14 +4,10 @@ import wrapt from wrapt import wrap_function_wrapper as _w -import ddtrace from ddtrace import config -from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY -from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils -from ddtrace.ext import SpanKind from ddtrace.ext import SpanTypes -from ddtrace.internal.constants import COMPONENT +from ddtrace.internal import core from ddtrace.internal.logger import get_logger from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.schema import schematize_url_operation @@ -47,7 +43,10 @@ def update_span(span, response): # and so use 500 status_code = getattr(response, "status", 500) response_headers = getattr(response, "headers", None) - trace_utils.set_http_meta(span, config.sanic, status_code=status_code, response_headers=response_headers) + + core.dispatch( + "web.request.finish", (span, config.sanic, None, None, status_code, None, None, response_headers, None, False) + ) def _wrap_response_callback(span, callback): @@ -200,31 +199,35 @@ def _create_sanic_request_span(request): headers = request.headers.copy() - trace_utils.activate_distributed_headers(ddtrace.tracer, int_config=config.sanic, request_headers=headers) - - span = pin.tracer.trace( - schematize_url_operation("sanic.request", protocol="http", direction=SpanDirection.INBOUND), + with core.context_with_data( + "sanic.request", + span_name=schematize_url_operation("sanic.request", protocol="http", direction=SpanDirection.INBOUND), + span_type=SpanTypes.WEB, service=trace_utils.int_service(None, config.sanic), resource=resource, - span_type=SpanTypes.WEB, - ) - span.set_tag_str(COMPONENT, config.sanic.integration_name) - - # set span.kind to the type of operation being performed - span.set_tag_str(SPAN_KIND, SpanKind.SERVER) - - sample_rate = config.sanic.get_analytics_sample_rate(use_global_config=True) - if sample_rate is not None: - span.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, sample_rate) - - method = request.method - url = "{scheme}://{host}{path}".format(scheme=request.scheme, host=request.host, path=request.path) - query_string = request.query_string - if isinstance(query_string, bytes): - query_string = query_string.decode() - trace_utils.set_http_meta(span, config.sanic, method=method, url=url, query=query_string, request_headers=headers) - - return span + tags={}, + pin=pin, + distributed_headers=headers, + distributed_headers_config=config.sanic, + headers_case_sensitive=True, + analytics_sample_rate=config.sanic.get_analytics_sample_rate(use_global_config=True), + ) as ctx: + req_span = ctx.span + + ctx.set_item("req_span", req_span) + core.dispatch("web.request.start", (ctx, config.sanic)) + + method = request.method + url = "{scheme}://{host}{path}".format(scheme=request.scheme, host=request.host, path=request.path) + query_string = request.query_string + if isinstance(query_string, bytes): + query_string = query_string.decode() + + core.dispatch( + "web.request.finish", (req_span, config.sanic, method, url, None, query_string, headers, None, None, False) + ) + + return req_span async def sanic_http_lifecycle_handle(request): diff --git a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_child.json b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_child.json index 1887282b06f..933eda3e420 100644 --- a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_child.json +++ b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_child.json @@ -22,6 +22,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, diff --git a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_error.json b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_error.json index 49759fee3d3..58fde524828 100644 --- a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_error.json +++ b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_error.json @@ -25,6 +25,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, diff --git a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_fatal.json b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_fatal.json index 4153c8c2b18..a5a7c1ed14f 100644 --- a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_fatal.json +++ b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_fatal.json @@ -25,6 +25,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, diff --git a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_success.json b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_success.json index d1eb9fc5bee..ce13988add0 100644 --- a/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_success.json +++ b/tests/snapshots/tests.contrib.cherrypy.test_middleware.test_success.json @@ -22,6 +22,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, diff --git a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http.json b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http.json index 3803d07f360..66ca28d9606 100644 --- a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http.json +++ b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http.json @@ -23,6 +23,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, @@ -72,6 +73,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, diff --git a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http_pre_21.9.json b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http_pre_21.9.json index 4aac2721c02..aca376a974a 100644 --- a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http_pre_21.9.json +++ b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_multiple_requests_sanic_http_pre_21.9.json @@ -22,6 +22,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, @@ -70,6 +71,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, diff --git a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors.json b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors.json index 435bbbc7b23..ab2aeaec920 100644 --- a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors.json +++ b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors.json @@ -22,6 +22,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, @@ -58,6 +59,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, diff --git a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors_pre_21.9.json b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors_pre_21.9.json index c03813a43d6..ceabecd1ae7 100644 --- a/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors_pre_21.9.json +++ b/tests/snapshots/tests.contrib.sanic.test_sanic_server.test_sanic_errors_pre_21.9.json @@ -22,6 +22,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, @@ -54,6 +55,7 @@ "span.kind": "server" }, "metrics": { + "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, From 7fbf54a777243ae55d98ebf2d8f68a3044d7ac6b Mon Sep 17 00:00:00 2001 From: Sam Brenner <106700075+sabrenner@users.noreply.github.com> Date: Fri, 31 Jan 2025 09:54:22 -0500 Subject: [PATCH 25/63] chore(langchain): drop support for tracing `langchain.chains` (#12172) This PR drops support for tracing `langchain.chains` in favor of only tracing `RunnableSequence` (LangChain Expression Language - LCEL) chains. High LOC - this PR also re-introduces APM tracing tests for langchain, but removes all cassettes and snapshots related to previous `langchain` patching. We still need to refactor `conftest` a bit to be more modern, and re-introduce LLMObs tests. I'm fairly certain those ones are flaky, while the normal APM tests _should_ be OK. **Known issue**: This PR effectively removes all patching on the `langchain` package, and only patches `langchain_core` and community and partner libraries. However, to trigger patching, you must still: ```python import langchain ``` in order to trigger patching for LangChain. This will be fixed in a patch in `ddtrace` 3.x. MLOB-2140 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/contrib/internal/langchain/patch.py | 112 -- ...-base-chains-support-48d8290af6eb86e3.yaml | 4 + .../ai21_completion_sync.yaml | 0 .../anthropic_chat_completion_sync.yaml | 0 .../bedrock_amazon_chat_invoke.yaml | 0 .../bedrock_amazon_invoke.yaml | 0 .../cohere_completion_sync.yaml | 0 .../langchain/ai21_completion_sync.yaml | 71 -- .../langchain/ai21_completion_sync_39.yaml | 151 --- .../langchain/cohere_completion_sync.yaml | 61 -- .../langchain/cohere_math_chain_sync.yaml | 73 -- .../huggingfacehub_completion_sync.yaml | 62 -- .../langchain/openai_chain_schema_io.yaml | 88 -- .../openai_chat_completion_async_call.yaml | 81 -- ...openai_chat_completion_async_generate.yaml | 161 --- .../openai_chat_completion_sync_call.yaml | 88 -- .../openai_chat_completion_sync_call_39.yaml | 89 -- .../openai_chat_completion_sync_generate.yaml | 175 ---- ...enai_chat_completion_sync_generate_39.yaml | 175 ---- .../langchain/openai_completion_async.yaml | 77 -- .../langchain/openai_completion_async_39.yaml | 77 -- .../langchain/openai_completion_error.yaml | 77 -- .../langchain/openai_completion_sync.yaml | 108 -- .../langchain/openai_completion_sync_39.yaml | 89 -- .../openai_completion_sync_multi_prompt.yaml | 94 -- ...penai_completion_sync_multi_prompt_39.yaml | 90 -- .../langchain/openai_embedding_document.yaml | 78 -- .../openai_embedding_document_39.yaml | 287 ------ .../langchain/openai_embedding_query.yaml | 70 -- .../langchain/openai_embedding_query_39.yaml | 182 ---- .../langchain/openai_math_chain_async.yaml | 85 -- .../langchain/openai_math_chain_sync.yaml | 92 -- .../langchain/openai_math_chain_sync_39.yaml | 93 -- .../langchain/openai_paraphrase.yaml | 92 -- .../openai_pinecone_similarity_search.yaml | 176 ---- .../openai_pinecone_similarity_search_39.yaml | 650 ------------ ..._pinecone_vectorstore_retrieval_chain.yaml | 861 ---------------- ...necone_vectorstore_retrieval_chain_39.yaml | 964 ------------------ ...sequential_paraphrase_and_rhyme_async.yaml | 178 ---- ..._sequential_paraphrase_and_rhyme_sync.yaml | 195 ---- ..._completion_image_input_sync_generate.yaml | 103 -- .../openai_embedding_query_integration.yaml | 89 -- .../openai_math_chain.yaml | 109 -- ...sequential_paraphrase_and_rhyme_async.yaml | 231 ----- ..._sequential_paraphrase_and_rhyme_sync.yaml | 230 ----- .../lcel_openai_chain_acall.yaml | 0 .../lcel_openai_chain_batch.yaml | 0 .../lcel_openai_chain_batch_311.yaml | 0 .../lcel_openai_chain_batch_async.yaml | 0 .../lcel_openai_chain_call.yaml | 0 .../lcel_openai_chain_call_complicated.yaml | 0 .../lcel_openai_chain_nested.yaml | 0 .../lcel_openai_chain_schema_io.yaml | 0 .../lcel_openai_chat_streamed_response.txt | 0 ...t_streamed_response_json_output_parser.txt | 0 .../lcel_openai_llm_streamed_response.txt | 0 .../lcel_with_tools_anthropic.yaml | 0 .../lcel_with_tools_openai.yaml | 0 .../openai_chat_completion_async_call.yaml | 0 ...openai_chat_completion_async_generate.yaml | 0 ..._completion_image_input_sync_generate.yaml | 112 ++ .../openai_chat_completion_sync_call.yaml | 0 .../openai_chat_completion_sync_generate.yaml | 0 .../openai_completion_async.yaml | 0 .../openai_completion_error.yaml | 0 .../openai_completion_non_ascii.yaml | 0 .../openai_completion_sync.yaml | 0 .../openai_completion_sync_multi_prompt.yaml | 0 .../openai_embedding_query.yaml | 0 .../openai_paraphrase.yaml | 0 .../openai_pinecone_similarity_search.yaml | 0 ..._pinecone_similarity_search_community.yaml | 0 ..._pinecone_vectorstore_retrieval_chain.yaml | 0 .../openai_retrieval_embedding.yaml | 0 tests/contrib/langchain/conftest.py | 54 +- tests/contrib/langchain/test_langchain.py | 681 +++++++++++++ .../contrib/langchain/test_langchain_patch.py | 11 - tests/contrib/langchain/utils.py | 2 +- ...ain.test_langchain.test_ai21_llm_sync.json | 14 +- ...test_langchain.test_base_tool_invoke.json} | 10 +- ..._invoke_non_json_serializable_config.json} | 12 +- ...n.test_langchain.test_cohere_llm_sync.json | 22 +- ...test_langchain.test_cohere_math_chain.json | 85 -- ...ain.test_faiss_vectorstore_retrieval.json} | 24 +- ...angchain.test_fake_embedding_document.json | 12 +- ...t_langchain.test_fake_embedding_query.json | 12 +- ...angchain.test_huggingfacehub_llm_sync.json | 36 - ...test_langchain.test_lcel_chain_batch.json} | 26 +- ...angchain.test_lcel_chain_complicated.json} | 18 +- ...est_langchain.test_lcel_chain_nested.json} | 24 +- ...chain.test_lcel_chain_non_dict_input.json} | 10 +- ...est_langchain.test_lcel_chain_simple.json} | 14 +- ...ngchain.test_lcel_chain_simple_async.json} | 16 +- ...chain.test_lcel_with_tools_anthropic.json} | 10 +- ...angchain.test_lcel_with_tools_openai.json} | 10 +- ...est_openai_chat_model_async_generate.json} | 11 +- ...langchain.test_openai_chat_model_call.json | 45 - ...chain.test_openai_chat_model_generate.json | 53 - ...n.test_openai_chat_model_sync_call_39.json | 45 - ...chat_model_sync_call_langchain_openai.json | 22 +- ...test_openai_chat_model_sync_generate.json} | 10 +- ...st_openai_chat_model_sync_generate_39.json | 53 - ...st_openai_chat_model_vision_generate.json} | 28 +- ...gchain.test_openai_embedding_document.json | 34 - ...langchain.test_openai_embedding_query.json | 12 +- ...est_langchain.test_openai_integration.json | 114 --- ....test_langchain.test_openai_llm_async.json | 25 +- ....test_langchain.test_openai_llm_error.json | 23 +- ...n.test_langchain.test_openai_llm_sync.json | 27 +- ...est_langchain.test_openai_llm_sync_39.json | 46 - ...test_openai_llm_sync_multiple_prompts.json | 31 +- ...t_openai_llm_sync_multiple_prompts_39.json | 50 - ...test_langchain.test_openai_math_chain.json | 100 -- ...angchain.test_openai_sequential_chain.json | 121 --- ...uential_chain_with_multiple_llm_async.json | 159 --- ...quential_chain_with_multiple_llm_sync.json | 159 --- ...n.test_openai_service_name[None-None].json | 114 --- ...ain.test_openai_service_name[None-v0].json | 114 --- ...ain.test_openai_service_name[None-v1].json | 114 --- ....test_openai_service_name[mysvc-None].json | 114 --- ...in.test_openai_service_name[mysvc-v0].json | 114 --- ...in.test_openai_service_name[mysvc-v1].json | 114 --- ..._pinecone_vectorstore_retrieval_chain.json | 196 ---- ...necone_vectorstore_retrieval_chain_39.json | 201 ---- ...inecone_vectorstore_similarity_search.json | 26 +- ...n.test_langchain.test_streamed_chain.json} | 14 +- ...in.test_langchain.test_streamed_chat.json} | 10 +- ...ain.test_streamed_json_output_parser.json} | 14 +- ...ain.test_langchain.test_streamed_llm.json} | 10 +- ...angchain_community.test_ai21_llm_sync.json | 57 -- ...langchain_community.test_chain_invoke.json | 73 -- ...gchain_community.test_cohere_llm_sync.json | 31 - ...ommunity.test_fake_embedding_document.json | 34 - ...n_community.test_fake_embedding_query.json | 32 - ...ommunity.test_huggingfacehub_llm_sync.json | 36 - ...unity.test_lcecl_chain_non_dict_input.json | 29 - ...n_community.test_lcel_chain_batch_311.json | 103 -- ...community.test_lcel_chain_batch_async.json | 103 -- ...ity.test_openai_chat_model_async_call.json | 44 - ...chat_model_sync_call_langchain_openai.json | 44 - ...community.test_openai_embedding_query.json | 33 - ...ain_community.test_openai_integration.json | 86 -- ...chain_community.test_openai_llm_async.json | 45 - ...chain_community.test_openai_llm_error.json | 42 - ...gchain_community.test_openai_llm_sync.json | 45 - ...test_openai_llm_sync_multiple_prompts.json | 51 - ...hain_community.test_openai_math_chain.json | 99 -- ...ommunity.test_openai_math_chain_async.json | 99 -- ...ommunity.test_openai_sequential_chain.json | 122 --- ...uential_chain_with_multiple_llm_async.json | 157 --- ...quential_chain_with_multiple_llm_sync.json | 161 --- ...y.test_openai_service_name[None-None].json | 86 -- ...ity.test_openai_service_name[None-v0].json | 86 -- ...ity.test_openai_service_name[None-v1].json | 86 -- ....test_openai_service_name[mysvc-None].json | 86 -- ...ty.test_openai_service_name[mysvc-v0].json | 86 -- ...ty.test_openai_service_name[mysvc-v1].json | 86 -- ..._pinecone_vectorstore_retrieval_chain.json | 176 ---- ...inecone_vectorstore_similarity_search.json | 61 -- 159 files changed, 1047 insertions(+), 11538 deletions(-) create mode 100644 releasenotes/notes/langchain-drop-langchain-base-chains-support-48d8290af6eb86e3.yaml rename tests/contrib/langchain/cassettes/{langchain_community => }/ai21_completion_sync.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/anthropic_chat_completion_sync.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/bedrock_amazon_chat_invoke.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/bedrock_amazon_invoke.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/cohere_completion_sync.yaml (100%) delete mode 100644 tests/contrib/langchain/cassettes/langchain/ai21_completion_sync.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/ai21_completion_sync_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/cohere_completion_sync.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/cohere_math_chain_sync.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/huggingfacehub_completion_sync.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_chain_schema_io.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_call.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_generate.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_completion_async.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_completion_async_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_completion_error.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_completion_sync.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_completion_sync_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_embedding_document.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_embedding_document_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_embedding_query.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_embedding_query_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_math_chain_async.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_paraphrase.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain_39.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_async.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_sync.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_image_input_sync_generate.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain_community/openai_embedding_query_integration.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain_community/openai_math_chain.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_async.yaml delete mode 100644 tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_sync.yaml rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_acall.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_batch.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_batch_311.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_batch_async.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_call.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_call_complicated.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_nested.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chain_schema_io.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chat_streamed_response.txt (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_chat_streamed_response_json_output_parser.txt (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_openai_llm_streamed_response.txt (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_with_tools_anthropic.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/lcel_with_tools_openai.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_chat_completion_async_call.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_chat_completion_async_generate.yaml (100%) create mode 100644 tests/contrib/langchain/cassettes/openai_chat_completion_image_input_sync_generate.yaml rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_chat_completion_sync_call.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_chat_completion_sync_generate.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_completion_async.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_completion_error.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_completion_non_ascii.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_completion_sync.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_completion_sync_multi_prompt.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_embedding_query.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_paraphrase.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_pinecone_similarity_search.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_pinecone_similarity_search_community.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_pinecone_vectorstore_retrieval_chain.yaml (100%) rename tests/contrib/langchain/cassettes/{langchain_community => }/openai_retrieval_embedding.yaml (100%) create mode 100644 tests/contrib/langchain/test_langchain.py rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_base_tool_invoke.json => tests.contrib.langchain.test_langchain.test_base_tool_invoke.json} (82%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_base_tool_invoke_non_json_serializable_config.json => tests.contrib.langchain.test_langchain.test_base_tool_invoke_non_json_serializable_config.json} (79%) delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_math_chain.json rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_faiss_vectorstore_retrieval.json => tests.contrib.langchain.test_langchain.test_faiss_vectorstore_retrieval.json} (84%) delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_huggingfacehub_llm_sync.json rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch.json => tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json} (87%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_chain_complicated.json => tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json} (87%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_chain_nested.json => tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json} (90%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_chain_non_dict_input.json => tests.contrib.langchain.test_langchain.test_lcel_chain_non_dict_input.json} (76%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple.json => tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json} (91%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple_async.json => tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json} (87%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_anthropic.json => tests.contrib.langchain.test_langchain.test_lcel_with_tools_anthropic.json} (91%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_openai.json => tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json} (90%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_generate.json => tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json} (90%) delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_call.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_generate.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_39.json rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_generate.json => tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json} (92%) delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate_39.json rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_openai_chat_model_vision_generate.json => tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json} (60%) delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_document.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_integration.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_39.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts_39.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_math_chain.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_async.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_sync.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-None].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v0].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v1].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-None].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v0].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v1].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain_39.json rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_streamed_chain.json => tests.contrib.langchain.test_langchain.test_streamed_chain.json} (89%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_streamed_chat.json => tests.contrib.langchain.test_langchain.test_streamed_chat.json} (87%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_streamed_json_output_parser.json => tests.contrib.langchain.test_langchain.test_streamed_json_output_parser.json} (91%) rename tests/snapshots/{tests.contrib.langchain.test_langchain_community.test_streamed_llm.json => tests.contrib.langchain.test_langchain.test_streamed_llm.json} (87%) delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_ai21_llm_sync.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_chain_invoke.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_cohere_llm_sync.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_document.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_query.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_huggingfacehub_llm_sync.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcecl_chain_non_dict_input.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_311.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_async.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_call.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_call_langchain_openai.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_embedding_query.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_integration.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_async.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_error.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync_multiple_prompts.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain_async.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_async.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_sync.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-None].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v0].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v1].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-None].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v0].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v1].json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_retrieval_chain.json delete mode 100644 tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_similarity_search.json diff --git a/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py index 75b88c3fbab..6c7cd2f41e0 100644 --- a/ddtrace/contrib/internal/langchain/patch.py +++ b/ddtrace/contrib/internal/langchain/patch.py @@ -643,114 +643,6 @@ def traced_embedding(langchain, pin, func, instance, args, kwargs): return embeddings -@with_traced_module -def traced_chain_call(langchain, pin, func, instance, args, kwargs): - integration = langchain._datadog_integration - span = integration.trace( - pin, - "{}.{}".format(instance.__module__, instance.__class__.__name__), - submit_to_llmobs=True, - interface_type="chain", - ) - inputs = None - final_outputs = {} - try: - inputs = get_argument_value(args, kwargs, 0, "input") - if not isinstance(inputs, dict): - inputs = {instance.input_keys[0]: inputs} - if integration.is_pc_sampled_span(span): - for k, v in inputs.items(): - span.set_tag_str("langchain.request.inputs.%s" % k, integration.trunc(str(v))) - template = deep_getattr(instance, "prompt.template", default="") - if template: - span.set_tag_str("langchain.request.prompt", integration.trunc(str(template))) - final_outputs = func(*args, **kwargs) - if integration.is_pc_sampled_span(span): - for k, v in final_outputs.items(): - span.set_tag_str("langchain.response.outputs.%s" % k, integration.trunc(str(v))) - if _is_iast_enabled(): - taint_outputs(instance, inputs, final_outputs) - except Exception: - span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) - raise - finally: - integration.llmobs_set_tags(span, args=[], kwargs=inputs, response=final_outputs, operation="chain") - span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - log_inputs = {} - log_outputs = {} - for k, v in inputs.items(): - log_inputs[k] = str(v) - for k, v in final_outputs.items(): - log_outputs[k] = str(v) - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={ - "inputs": log_inputs, - "prompt": str(deep_getattr(instance, "prompt.template", default="")), - "outputs": log_outputs, - }, - ) - return final_outputs - - -@with_traced_module -async def traced_chain_acall(langchain, pin, func, instance, args, kwargs): - integration = langchain._datadog_integration - span = integration.trace( - pin, - "{}.{}".format(instance.__module__, instance.__class__.__name__), - submit_to_llmobs=True, - interface_type="chain", - ) - inputs = None - final_outputs = {} - try: - inputs = get_argument_value(args, kwargs, 0, "input") - if not isinstance(inputs, dict): - inputs = {instance.input_keys[0]: inputs} - if integration.is_pc_sampled_span(span): - for k, v in inputs.items(): - span.set_tag_str("langchain.request.inputs.%s" % k, integration.trunc(str(v))) - template = deep_getattr(instance, "prompt.template", default="") - if template: - span.set_tag_str("langchain.request.prompt", integration.trunc(str(template))) - final_outputs = await func(*args, **kwargs) - if integration.is_pc_sampled_span(span): - for k, v in final_outputs.items(): - span.set_tag_str("langchain.response.outputs.%s" % k, integration.trunc(str(v))) - except Exception: - span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) - raise - finally: - integration.llmobs_set_tags(span, args=[], kwargs=inputs, response=final_outputs, operation="chain") - span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - log_inputs = {} - log_outputs = {} - for k, v in inputs.items(): - log_inputs[k] = str(v) - for k, v in final_outputs.items(): - log_outputs[k] = str(v) - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={ - "inputs": log_inputs, - "prompt": str(deep_getattr(instance, "prompt.template", default="")), - "outputs": log_outputs, - }, - ) - return final_outputs - - @with_traced_module def traced_lcel_runnable_sequence(langchain, pin, func, instance, args, kwargs): """ @@ -1287,8 +1179,6 @@ def patch(): "language_models.chat_models.BaseChatModel.agenerate", traced_chat_model_agenerate(langchain), ) - wrap("langchain", "chains.base.Chain.invoke", traced_chain_call(langchain)) - wrap("langchain", "chains.base.Chain.ainvoke", traced_chain_acall(langchain)) wrap("langchain_core", "runnables.base.RunnableSequence.invoke", traced_lcel_runnable_sequence(langchain)) wrap("langchain_core", "runnables.base.RunnableSequence.ainvoke", traced_lcel_runnable_sequence_async(langchain)) wrap("langchain_core", "runnables.base.RunnableSequence.batch", traced_lcel_runnable_sequence(langchain)) @@ -1342,8 +1232,6 @@ def unpatch(): unwrap(langchain_core.language_models.llms.BaseLLM, "agenerate") unwrap(langchain_core.language_models.chat_models.BaseChatModel, "generate") unwrap(langchain_core.language_models.chat_models.BaseChatModel, "agenerate") - unwrap(langchain.chains.base.Chain, "invoke") - unwrap(langchain.chains.base.Chain, "ainvoke") unwrap(langchain_core.runnables.base.RunnableSequence, "invoke") unwrap(langchain_core.runnables.base.RunnableSequence, "ainvoke") unwrap(langchain_core.runnables.base.RunnableSequence, "batch") diff --git a/releasenotes/notes/langchain-drop-langchain-base-chains-support-48d8290af6eb86e3.yaml b/releasenotes/notes/langchain-drop-langchain-base-chains-support-48d8290af6eb86e3.yaml new file mode 100644 index 00000000000..66badf53ad4 --- /dev/null +++ b/releasenotes/notes/langchain-drop-langchain-base-chains-support-48d8290af6eb86e3.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + langchain: removed tracing support for ``langchain.chains.base.Chains``. To maintain support, migrate to using Langchain's LCEL instead. diff --git a/tests/contrib/langchain/cassettes/langchain_community/ai21_completion_sync.yaml b/tests/contrib/langchain/cassettes/ai21_completion_sync.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/ai21_completion_sync.yaml rename to tests/contrib/langchain/cassettes/ai21_completion_sync.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/anthropic_chat_completion_sync.yaml b/tests/contrib/langchain/cassettes/anthropic_chat_completion_sync.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/anthropic_chat_completion_sync.yaml rename to tests/contrib/langchain/cassettes/anthropic_chat_completion_sync.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/bedrock_amazon_chat_invoke.yaml b/tests/contrib/langchain/cassettes/bedrock_amazon_chat_invoke.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/bedrock_amazon_chat_invoke.yaml rename to tests/contrib/langchain/cassettes/bedrock_amazon_chat_invoke.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/bedrock_amazon_invoke.yaml b/tests/contrib/langchain/cassettes/bedrock_amazon_invoke.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/bedrock_amazon_invoke.yaml rename to tests/contrib/langchain/cassettes/bedrock_amazon_invoke.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/cohere_completion_sync.yaml b/tests/contrib/langchain/cassettes/cohere_completion_sync.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/cohere_completion_sync.yaml rename to tests/contrib/langchain/cassettes/cohere_completion_sync.yaml diff --git a/tests/contrib/langchain/cassettes/langchain/ai21_completion_sync.yaml b/tests/contrib/langchain/cassettes/langchain/ai21_completion_sync.yaml deleted file mode 100644 index e586fb71b38..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/ai21_completion_sync.yaml +++ /dev/null @@ -1,71 +0,0 @@ -interactions: -- request: - body: '{"prompt": "Why does everyone in Bikini Bottom hate Plankton?", "stopSequences": - [], "temperature": 0.7, "maxTokens": 256, "minTokens": 0, "topP": 1.0, "presencePenalty": - {"scale": 0, "applyToWhitespaces": true, "applyToPunctuations": true, "applyToNumbers": - true, "applyToStopwords": true, "applyToEmojis": true}, "countPenalty": {"scale": - 0, "applyToWhitespaces": true, "applyToPunctuations": true, "applyToNumbers": - true, "applyToStopwords": true, "applyToEmojis": true}, "frequencyPenalty": - {"scale": 0, "applyToWhitespaces": true, "applyToPunctuations": true, "applyToNumbers": - true, "applyToStopwords": true, "applyToEmojis": true}, "numResults": 1, "logitBias": - null}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '674' - Content-Type: - - application/json - User-Agent: - - python-requests/2.31.0 - method: POST - uri: https://api.ai21.com/studio/v1/j2-jumbo-instruct/complete - response: - body: - string: "{\"id\":\"c3e5117c-8d76-5f9e-79cd-91051f840d8a\",\"prompt\":{\"text\":\"Why - does everyone in Bikini Bottom hate Plankton?\",\"tokens\":[{\"generatedToken\":{\"token\":\"\u2581Why\u2581does\",\"logprob\":-10.208540916442871,\"raw_logprob\":-10.208540916442871},\"topTokens\":null,\"textRange\":{\"start\":0,\"end\":8}},{\"generatedToken\":{\"token\":\"\u2581everyone\",\"logprob\":-5.55824089050293,\"raw_logprob\":-5.55824089050293},\"topTokens\":null,\"textRange\":{\"start\":8,\"end\":17}},{\"generatedToken\":{\"token\":\"\u2581in\",\"logprob\":-5.1295318603515625,\"raw_logprob\":-5.1295318603515625},\"topTokens\":null,\"textRange\":{\"start\":17,\"end\":20}},{\"generatedToken\":{\"token\":\"\u2581Bikini\",\"logprob\":-7.318790435791016,\"raw_logprob\":-7.318790435791016},\"topTokens\":null,\"textRange\":{\"start\":20,\"end\":27}},{\"generatedToken\":{\"token\":\"\u2581Bottom\",\"logprob\":-0.01663598231971264,\"raw_logprob\":-0.01663598231971264},\"topTokens\":null,\"textRange\":{\"start\":27,\"end\":34}},{\"generatedToken\":{\"token\":\"\u2581hate\",\"logprob\":-1.3611352443695068,\"raw_logprob\":-1.3611352443695068},\"topTokens\":null,\"textRange\":{\"start\":34,\"end\":39}},{\"generatedToken\":{\"token\":\"\u2581Plank\",\"logprob\":-0.3689423203468323,\"raw_logprob\":-0.3689423203468323},\"topTokens\":null,\"textRange\":{\"start\":39,\"end\":45}},{\"generatedToken\":{\"token\":\"ton\",\"logprob\":-0.0021787970326840878,\"raw_logprob\":-0.0021787970326840878},\"topTokens\":null,\"textRange\":{\"start\":45,\"end\":48}},{\"generatedToken\":{\"token\":\"?\",\"logprob\":-5.5226898193359375,\"raw_logprob\":-5.5226898193359375},\"topTokens\":null,\"textRange\":{\"start\":48,\"end\":49}}]},\"completions\":[{\"data\":{\"text\":\"\\nPlankton - is a character in the animated television show SpongeBob SquarePants. He is - the owner of The Chum Bucket, a fast food restaurant located across the street - from the successful Krusty Krab. Plankton is known for his small size and - his evil plots to steal the secret formula for the Krabby Patty from Mr. Krabs, - the owner of the Krusty Krab. While Plankton is not inherently evil in the - show, his actions are often motivated by his desire for power and success, - which often puts him in conflict with other characters in the show. It is - possible that the people of Bikini Bottom, where the show is set, may have - a negative perception of Plankton due to his attempts to steal from Mr. Krabs - and cause harm to the other characters.\",\"tokens\":[{\"generatedToken\":{\"token\":\"<|newline|>\",\"logprob\":-1.1920928244535389e-07,\"raw_logprob\":-1.7046782886609435e-05},\"topTokens\":null,\"textRange\":{\"start\":0,\"end\":1}},{\"generatedToken\":{\"token\":\"\u2581Plank\",\"logprob\":-0.07572638988494873,\"raw_logprob\":-0.31565842032432556},\"topTokens\":null,\"textRange\":{\"start\":1,\"end\":6}},{\"generatedToken\":{\"token\":\"ton\",\"logprob\":0.0,\"raw_logprob\":-1.6689286894688848e-06},\"topTokens\":null,\"textRange\":{\"start\":6,\"end\":9}},{\"generatedToken\":{\"token\":\"\u2581is\u2581a\",\"logprob\":-1.751707673072815,\"raw_logprob\":-1.6270575523376465},\"topTokens\":null,\"textRange\":{\"start\":9,\"end\":14}},{\"generatedToken\":{\"token\":\"\u2581character\",\"logprob\":-0.004562088754028082,\"raw_logprob\":-0.04288514330983162},\"topTokens\":null,\"textRange\":{\"start\":14,\"end\":24}},{\"generatedToken\":{\"token\":\"\u2581in\u2581the\",\"logprob\":-0.04007918760180473,\"raw_logprob\":-0.12501344084739685},\"topTokens\":null,\"textRange\":{\"start\":24,\"end\":31}},{\"generatedToken\":{\"token\":\"\u2581animated\",\"logprob\":-1.9412957429885864,\"raw_logprob\":-1.6550559997558594},\"topTokens\":null,\"textRange\":{\"start\":31,\"end\":40}},{\"generatedToken\":{\"token\":\"\u2581television\u2581show\",\"logprob\":-0.9479485154151917,\"raw_logprob\":-0.9432346224784851},\"topTokens\":null,\"textRange\":{\"start\":40,\"end\":56}},{\"generatedToken\":{\"token\":\"\u2581Sponge\",\"logprob\":-0.025703437626361847,\"raw_logprob\":-0.07821916043758392},\"topTokens\":null,\"textRange\":{\"start\":56,\"end\":63}},{\"generatedToken\":{\"token\":\"Bob\",\"logprob\":-0.0007227431051433086,\"raw_logprob\":-0.006310062948614359},\"topTokens\":null,\"textRange\":{\"start\":63,\"end\":66}},{\"generatedToken\":{\"token\":\"\u2581Square\",\"logprob\":0.0,\"raw_logprob\":-4.6491513785440475e-06},\"topTokens\":null,\"textRange\":{\"start\":66,\"end\":73}},{\"generatedToken\":{\"token\":\"P\",\"logprob\":-6.782778655178845e-05,\"raw_logprob\":-0.0012157914461567998},\"topTokens\":null,\"textRange\":{\"start\":73,\"end\":74}},{\"generatedToken\":{\"token\":\"ants\",\"logprob\":0.0,\"raw_logprob\":-1.1920922133867862e-06},\"topTokens\":null,\"textRange\":{\"start\":74,\"end\":78}},{\"generatedToken\":{\"token\":\".\",\"logprob\":-2.544250726699829,\"raw_logprob\":-1.9201889038085938},\"topTokens\":null,\"textRange\":{\"start\":78,\"end\":79}},{\"generatedToken\":{\"token\":\"\u2581He\",\"logprob\":-1.1932941675186157,\"raw_logprob\":-1.346736192703247},\"topTokens\":null,\"textRange\":{\"start\":79,\"end\":82}},{\"generatedToken\":{\"token\":\"\u2581is\u2581the\u2581owner\u2581of\",\"logprob\":-0.10346007347106934,\"raw_logprob\":-0.24757422506809235},\"topTokens\":null,\"textRange\":{\"start\":82,\"end\":98}},{\"generatedToken\":{\"token\":\"\u2581The\",\"logprob\":-2.030987501144409,\"raw_logprob\":-1.7930617332458496},\"topTokens\":null,\"textRange\":{\"start\":98,\"end\":102}},{\"generatedToken\":{\"token\":\"\u2581Chum\",\"logprob\":-0.009587788954377174,\"raw_logprob\":-0.038218703120946884},\"topTokens\":null,\"textRange\":{\"start\":102,\"end\":107}},{\"generatedToken\":{\"token\":\"\u2581Bucket\",\"logprob\":-2.264974000354414e-06,\"raw_logprob\":-0.00021252757869660854},\"topTokens\":null,\"textRange\":{\"start\":107,\"end\":114}},{\"generatedToken\":{\"token\":\",\",\"logprob\":-0.0015753014013171196,\"raw_logprob\":-0.01220508199185133},\"topTokens\":null,\"textRange\":{\"start\":114,\"end\":115}},{\"generatedToken\":{\"token\":\"\u2581a\",\"logprob\":-0.7763500809669495,\"raw_logprob\":-0.8355852961540222},\"topTokens\":null,\"textRange\":{\"start\":115,\"end\":117}},{\"generatedToken\":{\"token\":\"\u2581fast\u2581food\u2581restaurant\",\"logprob\":-0.1277875155210495,\"raw_logprob\":-0.297400563955307},\"topTokens\":null,\"textRange\":{\"start\":117,\"end\":138}},{\"generatedToken\":{\"token\":\"\u2581located\",\"logprob\":-0.38827550411224365,\"raw_logprob\":-0.6371002793312073},\"topTokens\":null,\"textRange\":{\"start\":138,\"end\":146}},{\"generatedToken\":{\"token\":\"\u2581across\u2581the\u2581street\u2581from\u2581the\",\"logprob\":-0.25029826164245605,\"raw_logprob\":-0.4857385754585266},\"topTokens\":null,\"textRange\":{\"start\":146,\"end\":173}},{\"generatedToken\":{\"token\":\"\u2581successful\",\"logprob\":-2.4747061729431152,\"raw_logprob\":-2.1822023391723633},\"topTokens\":null,\"textRange\":{\"start\":173,\"end\":184}},{\"generatedToken\":{\"token\":\"\u2581Krus\",\"logprob\":-0.01569877564907074,\"raw_logprob\":-0.06510558724403381},\"topTokens\":null,\"textRange\":{\"start\":184,\"end\":189}},{\"generatedToken\":{\"token\":\"ty\",\"logprob\":0.0,\"raw_logprob\":-2.861018856492592e-06},\"topTokens\":null,\"textRange\":{\"start\":189,\"end\":191}},{\"generatedToken\":{\"token\":\"\u2581Kra\",\"logprob\":-1.6689286894688848e-06,\"raw_logprob\":-0.00010835537250386551},\"topTokens\":null,\"textRange\":{\"start\":191,\"end\":195}},{\"generatedToken\":{\"token\":\"b.\",\"logprob\":-2.174257516860962,\"raw_logprob\":-1.6506117582321167},\"topTokens\":null,\"textRange\":{\"start\":195,\"end\":197}},{\"generatedToken\":{\"token\":\"\u2581Plank\",\"logprob\":-0.0010253892978653312,\"raw_logprob\":-0.01375611498951912},\"topTokens\":null,\"textRange\":{\"start\":197,\"end\":203}},{\"generatedToken\":{\"token\":\"ton\",\"logprob\":0.0,\"raw_logprob\":-1.5497195136049413e-06},\"topTokens\":null,\"textRange\":{\"start\":203,\"end\":206}},{\"generatedToken\":{\"token\":\"\u2581is\u2581known\u2581for\u2581his\",\"logprob\":-5.00175666809082,\"raw_logprob\":-4.033731937408447},\"topTokens\":null,\"textRange\":{\"start\":206,\"end\":223}},{\"generatedToken\":{\"token\":\"\u2581small\u2581size\",\"logprob\":-0.05760713666677475,\"raw_logprob\":-0.2230779379606247},\"topTokens\":null,\"textRange\":{\"start\":223,\"end\":234}},{\"generatedToken\":{\"token\":\"\u2581and\u2581his\",\"logprob\":-1.4826339483261108,\"raw_logprob\":-1.3588287830352783},\"topTokens\":null,\"textRange\":{\"start\":234,\"end\":242}},{\"generatedToken\":{\"token\":\"\u2581evil\",\"logprob\":-1.3681774139404297,\"raw_logprob\":-1.5272061824798584},\"topTokens\":null,\"textRange\":{\"start\":242,\"end\":247}},{\"generatedToken\":{\"token\":\"\u2581plots\",\"logprob\":-0.5305055379867554,\"raw_logprob\":-0.678555428981781},\"topTokens\":null,\"textRange\":{\"start\":247,\"end\":253}},{\"generatedToken\":{\"token\":\"\u2581to\u2581steal\",\"logprob\":-0.0005501187406480312,\"raw_logprob\":-0.007605643477290869},\"topTokens\":null,\"textRange\":{\"start\":253,\"end\":262}},{\"generatedToken\":{\"token\":\"\u2581the\u2581secret\",\"logprob\":-1.0447473526000977,\"raw_logprob\":-1.0853514671325684},\"topTokens\":null,\"textRange\":{\"start\":262,\"end\":273}},{\"generatedToken\":{\"token\":\"\u2581formula\",\"logprob\":-0.06510435789823532,\"raw_logprob\":-0.19504840672016144},\"topTokens\":null,\"textRange\":{\"start\":273,\"end\":281}},{\"generatedToken\":{\"token\":\"\u2581for\u2581the\",\"logprob\":-0.005869296845048666,\"raw_logprob\":-0.03637520968914032},\"topTokens\":null,\"textRange\":{\"start\":281,\"end\":289}},{\"generatedToken\":{\"token\":\"\u2581Kr\",\"logprob\":-0.031645651906728745,\"raw_logprob\":-0.0866592600941658},\"topTokens\":null,\"textRange\":{\"start\":289,\"end\":292}},{\"generatedToken\":{\"token\":\"abby\",\"logprob\":-9.775113539944869e-06,\"raw_logprob\":-0.0004119024670217186},\"topTokens\":null,\"textRange\":{\"start\":292,\"end\":296}},{\"generatedToken\":{\"token\":\"\u2581Patty\",\"logprob\":-0.001291037304326892,\"raw_logprob\":-0.009473016485571861},\"topTokens\":null,\"textRange\":{\"start\":296,\"end\":302}},{\"generatedToken\":{\"token\":\"\u2581from\",\"logprob\":-0.9215817451477051,\"raw_logprob\":-0.925796627998352},\"topTokens\":null,\"textRange\":{\"start\":302,\"end\":307}},{\"generatedToken\":{\"token\":\"\u2581Mr.\",\"logprob\":-0.029057390987873077,\"raw_logprob\":-0.14585760235786438},\"topTokens\":null,\"textRange\":{\"start\":307,\"end\":311}},{\"generatedToken\":{\"token\":\"\u2581Kra\",\"logprob\":-1.1920922133867862e-06,\"raw_logprob\":-0.00011932138295378536},\"topTokens\":null,\"textRange\":{\"start\":311,\"end\":315}},{\"generatedToken\":{\"token\":\"bs\",\"logprob\":-0.232733815908432,\"raw_logprob\":-0.3307577967643738},\"topTokens\":null,\"textRange\":{\"start\":315,\"end\":317}},{\"generatedToken\":{\"token\":\",\",\"logprob\":-0.004706020932644606,\"raw_logprob\":-0.03333796560764313},\"topTokens\":null,\"textRange\":{\"start\":317,\"end\":318}},{\"generatedToken\":{\"token\":\"\u2581the\u2581owner\u2581of\u2581the\",\"logprob\":-0.004386090207844973,\"raw_logprob\":-0.036760106682777405},\"topTokens\":null,\"textRange\":{\"start\":318,\"end\":335}},{\"generatedToken\":{\"token\":\"\u2581Krus\",\"logprob\":-1.4305104514278355e-06,\"raw_logprob\":-8.916457591112703e-05},\"topTokens\":null,\"textRange\":{\"start\":335,\"end\":340}},{\"generatedToken\":{\"token\":\"ty\",\"logprob\":0.0,\"raw_logprob\":-1.1920928244535389e-07},\"topTokens\":null,\"textRange\":{\"start\":340,\"end\":342}},{\"generatedToken\":{\"token\":\"\u2581Kra\",\"logprob\":0.0,\"raw_logprob\":-6.9141146923357155e-06},\"topTokens\":null,\"textRange\":{\"start\":342,\"end\":346}},{\"generatedToken\":{\"token\":\"b.\",\"logprob\":-0.0007557396893389523,\"raw_logprob\":-0.006509528495371342},\"topTokens\":null,\"textRange\":{\"start\":346,\"end\":348}},{\"generatedToken\":{\"token\":\"\u2581While\",\"logprob\":-1.383504867553711,\"raw_logprob\":-1.4828848838806152},\"topTokens\":null,\"textRange\":{\"start\":348,\"end\":354}},{\"generatedToken\":{\"token\":\"\u2581Plank\",\"logprob\":-0.0033521433360874653,\"raw_logprob\":-0.022998731583356857},\"topTokens\":null,\"textRange\":{\"start\":354,\"end\":360}},{\"generatedToken\":{\"token\":\"ton\",\"logprob\":0.0,\"raw_logprob\":-3.2186455882765586e-06},\"topTokens\":null,\"textRange\":{\"start\":360,\"end\":363}},{\"generatedToken\":{\"token\":\"\u2581is\u2581not\",\"logprob\":-1.534242033958435,\"raw_logprob\":-1.603725790977478},\"topTokens\":null,\"textRange\":{\"start\":363,\"end\":370}},{\"generatedToken\":{\"token\":\"\u2581inherently\",\"logprob\":-3.1567306518554688,\"raw_logprob\":-2.7135300636291504},\"topTokens\":null,\"textRange\":{\"start\":370,\"end\":381}},{\"generatedToken\":{\"token\":\"\u2581evil\",\"logprob\":-0.20878708362579346,\"raw_logprob\":-0.415998637676239},\"topTokens\":null,\"textRange\":{\"start\":381,\"end\":386}},{\"generatedToken\":{\"token\":\"\u2581in\u2581the\u2581show\",\"logprob\":-5.616759777069092,\"raw_logprob\":-3.9874682426452637},\"topTokens\":null,\"textRange\":{\"start\":386,\"end\":398}},{\"generatedToken\":{\"token\":\",\",\"logprob\":-0.001795467222109437,\"raw_logprob\":-0.013217685744166374},\"topTokens\":null,\"textRange\":{\"start\":398,\"end\":399}},{\"generatedToken\":{\"token\":\"\u2581his\u2581actions\",\"logprob\":-0.07070847600698471,\"raw_logprob\":-0.21277494728565216},\"topTokens\":null,\"textRange\":{\"start\":399,\"end\":411}},{\"generatedToken\":{\"token\":\"\u2581are\u2581often\",\"logprob\":-1.348650336265564,\"raw_logprob\":-1.3712364435195923},\"topTokens\":null,\"textRange\":{\"start\":411,\"end\":421}},{\"generatedToken\":{\"token\":\"\u2581motivated\u2581by\",\"logprob\":-0.8720835447311401,\"raw_logprob\":-1.1438623666763306},\"topTokens\":null,\"textRange\":{\"start\":421,\"end\":434}},{\"generatedToken\":{\"token\":\"\u2581his\u2581desire\",\"logprob\":-0.17174404859542847,\"raw_logprob\":-0.3934558928012848},\"topTokens\":null,\"textRange\":{\"start\":434,\"end\":445}},{\"generatedToken\":{\"token\":\"\u2581for\",\"logprob\":-1.393027424812317,\"raw_logprob\":-1.642277479171753},\"topTokens\":null,\"textRange\":{\"start\":445,\"end\":449}},{\"generatedToken\":{\"token\":\"\u2581power\u2581and\",\"logprob\":-0.14334328472614288,\"raw_logprob\":-0.37921762466430664},\"topTokens\":null,\"textRange\":{\"start\":449,\"end\":459}},{\"generatedToken\":{\"token\":\"\u2581success\",\"logprob\":-0.4306185841560364,\"raw_logprob\":-0.6001667380332947},\"topTokens\":null,\"textRange\":{\"start\":459,\"end\":467}},{\"generatedToken\":{\"token\":\",\",\"logprob\":-0.007419057190418243,\"raw_logprob\":-0.034646231681108475},\"topTokens\":null,\"textRange\":{\"start\":467,\"end\":468}},{\"generatedToken\":{\"token\":\"\u2581which\u2581often\",\"logprob\":-2.644437789916992,\"raw_logprob\":-2.444056510925293},\"topTokens\":null,\"textRange\":{\"start\":468,\"end\":480}},{\"generatedToken\":{\"token\":\"\u2581puts\u2581him\",\"logprob\":-0.35182347893714905,\"raw_logprob\":-0.7153971195220947},\"topTokens\":null,\"textRange\":{\"start\":480,\"end\":489}},{\"generatedToken\":{\"token\":\"\u2581in\u2581conflict\u2581with\",\"logprob\":-2.5856313705444336,\"raw_logprob\":-2.061291217803955},\"topTokens\":null,\"textRange\":{\"start\":489,\"end\":506}},{\"generatedToken\":{\"token\":\"\u2581other\u2581characters\",\"logprob\":-0.24702562391757965,\"raw_logprob\":-0.4690077304840088},\"topTokens\":null,\"textRange\":{\"start\":506,\"end\":523}},{\"generatedToken\":{\"token\":\"\u2581in\u2581the\u2581show\",\"logprob\":-1.1890774965286255,\"raw_logprob\":-1.1896255016326904},\"topTokens\":null,\"textRange\":{\"start\":523,\"end\":535}},{\"generatedToken\":{\"token\":\".\",\"logprob\":-0.06939230114221573,\"raw_logprob\":-0.14831382036209106},\"topTokens\":null,\"textRange\":{\"start\":535,\"end\":536}},{\"generatedToken\":{\"token\":\"\u2581It\u2581is\u2581possible\u2581that\",\"logprob\":-0.3098878264427185,\"raw_logprob\":-0.7920936942100525},\"topTokens\":null,\"textRange\":{\"start\":536,\"end\":556}},{\"generatedToken\":{\"token\":\"\u2581the\u2581people\u2581of\",\"logprob\":-4.5077643394470215,\"raw_logprob\":-3.6872503757476807},\"topTokens\":null,\"textRange\":{\"start\":556,\"end\":570}},{\"generatedToken\":{\"token\":\"\u2581Bikini\",\"logprob\":0.0,\"raw_logprob\":-4.172316494077677e-06},\"topTokens\":null,\"textRange\":{\"start\":570,\"end\":577}},{\"generatedToken\":{\"token\":\"\u2581Bottom\",\"logprob\":-2.3841855067985307e-07,\"raw_logprob\":-3.182837463100441e-05},\"topTokens\":null,\"textRange\":{\"start\":577,\"end\":584}},{\"generatedToken\":{\"token\":\",\",\"logprob\":-0.48780083656311035,\"raw_logprob\":-0.8429109454154968},\"topTokens\":null,\"textRange\":{\"start\":584,\"end\":585}},{\"generatedToken\":{\"token\":\"\u2581where\u2581the\",\"logprob\":-1.133927822113037,\"raw_logprob\":-1.238049030303955},\"topTokens\":null,\"textRange\":{\"start\":585,\"end\":595}},{\"generatedToken\":{\"token\":\"\u2581show\",\"logprob\":-0.001280560391023755,\"raw_logprob\":-0.011843129992485046},\"topTokens\":null,\"textRange\":{\"start\":595,\"end\":600}},{\"generatedToken\":{\"token\":\"\u2581is\u2581set\",\"logprob\":-0.7623605132102966,\"raw_logprob\":-0.7415213584899902},\"topTokens\":null,\"textRange\":{\"start\":600,\"end\":607}},{\"generatedToken\":{\"token\":\",\",\"logprob\":-1.1920928244535389e-07,\"raw_logprob\":-2.109982233378105e-05},\"topTokens\":null,\"textRange\":{\"start\":607,\"end\":608}},{\"generatedToken\":{\"token\":\"\u2581may\u2581have\",\"logprob\":-1.0092089176177979,\"raw_logprob\":-1.2629231214523315},\"topTokens\":null,\"textRange\":{\"start\":608,\"end\":617}},{\"generatedToken\":{\"token\":\"\u2581a\u2581negative\",\"logprob\":-0.030881239101290703,\"raw_logprob\":-0.1463761180639267},\"topTokens\":null,\"textRange\":{\"start\":617,\"end\":628}},{\"generatedToken\":{\"token\":\"\u2581perception\u2581of\",\"logprob\":-0.16625826060771942,\"raw_logprob\":-0.3311261534690857},\"topTokens\":null,\"textRange\":{\"start\":628,\"end\":642}},{\"generatedToken\":{\"token\":\"\u2581Plank\",\"logprob\":-2.9682672902708873e-05,\"raw_logprob\":-0.0007254829397425056},\"topTokens\":null,\"textRange\":{\"start\":642,\"end\":648}},{\"generatedToken\":{\"token\":\"ton\",\"logprob\":0.0,\"raw_logprob\":0.0},\"topTokens\":null,\"textRange\":{\"start\":648,\"end\":651}},{\"generatedToken\":{\"token\":\"\u2581due\u2581to\u2581his\",\"logprob\":-1.0963561534881592,\"raw_logprob\":-1.2465860843658447},\"topTokens\":null,\"textRange\":{\"start\":651,\"end\":662}},{\"generatedToken\":{\"token\":\"\u2581attempts\u2581to\",\"logprob\":-1.6155610084533691,\"raw_logprob\":-1.8263475894927979},\"topTokens\":null,\"textRange\":{\"start\":662,\"end\":674}},{\"generatedToken\":{\"token\":\"\u2581steal\",\"logprob\":-0.34135136008262634,\"raw_logprob\":-0.592598557472229},\"topTokens\":null,\"textRange\":{\"start\":674,\"end\":680}},{\"generatedToken\":{\"token\":\"\u2581from\",\"logprob\":-1.0074231624603271,\"raw_logprob\":-1.1367250680923462},\"topTokens\":null,\"textRange\":{\"start\":680,\"end\":685}},{\"generatedToken\":{\"token\":\"\u2581Mr.\",\"logprob\":-0.062399908900260925,\"raw_logprob\":-0.15431667864322662},\"topTokens\":null,\"textRange\":{\"start\":685,\"end\":689}},{\"generatedToken\":{\"token\":\"\u2581Kra\",\"logprob\":-1.0728830375228426e-06,\"raw_logprob\":-9.30981186684221e-05},\"topTokens\":null,\"textRange\":{\"start\":689,\"end\":693}},{\"generatedToken\":{\"token\":\"bs\",\"logprob\":-0.00562027283012867,\"raw_logprob\":-0.026302652433514595},\"topTokens\":null,\"textRange\":{\"start\":693,\"end\":695}},{\"generatedToken\":{\"token\":\"\u2581and\",\"logprob\":-0.17783275246620178,\"raw_logprob\":-0.3877376914024353},\"topTokens\":null,\"textRange\":{\"start\":695,\"end\":699}},{\"generatedToken\":{\"token\":\"\u2581cause\u2581harm\",\"logprob\":-0.261639803647995,\"raw_logprob\":-0.612569272518158},\"topTokens\":null,\"textRange\":{\"start\":699,\"end\":710}},{\"generatedToken\":{\"token\":\"\u2581to\u2581the\",\"logprob\":-1.111329436302185,\"raw_logprob\":-1.2211508750915527},\"topTokens\":null,\"textRange\":{\"start\":710,\"end\":717}},{\"generatedToken\":{\"token\":\"\u2581other\u2581characters\",\"logprob\":-1.075192928314209,\"raw_logprob\":-0.9965963959693909},\"topTokens\":null,\"textRange\":{\"start\":717,\"end\":734}},{\"generatedToken\":{\"token\":\".\",\"logprob\":-0.8371210694313049,\"raw_logprob\":-0.803280234336853},\"topTokens\":null,\"textRange\":{\"start\":734,\"end\":735}},{\"generatedToken\":{\"token\":\"<|endoftext|>\",\"logprob\":-0.16828671097755432,\"raw_logprob\":-0.34051239490509033},\"topTokens\":null,\"textRange\":{\"start\":735,\"end\":735}}]},\"finishReason\":{\"reason\":\"endoftext\"}}]}" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7df0919d3c144289-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 29 Jun 2023 19:27:49 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=8o25EV7IlZ%2BYHQvB89qKHaZQ0qHPveJLPNpUlLt1iXZjeVvSoiwr1SL2Q5dorpnpuDs%2B5zikfpW68pkSBF3lC5DQowHYtVOguUtd6htM4EEY3%2FBf4l6Y5SSMFq15Kw%3D%3D"}],"group":"cf-nel","max_age":604800}' - Server: - - cloudflare - Strict-Transport-Security: - - max-age=0; includeSubDomains - Transfer-Encoding: - - chunked - request-id: - - c3e5117c-8d76-5f9e-79cd-91051f840d8a - via: - - 1.1 google - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/ai21_completion_sync_39.yaml b/tests/contrib/langchain/cassettes/langchain/ai21_completion_sync_39.yaml deleted file mode 100644 index 1826181c345..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/ai21_completion_sync_39.yaml +++ /dev/null @@ -1,151 +0,0 @@ -interactions: -- request: - body: '{"prompt": "Why does everyone in Bikini Bottom hate Plankton?", "stopSequences": - [], "temperature": 0.7, "maxTokens": 256, "minTokens": 0, "topP": 1.0, "presencePenalty": - {"scale": 0, "applyToWhitespaces": true, "applyToPunctuations": true, "applyToNumbers": - true, "applyToStopwords": true, "applyToEmojis": true}, "countPenalty": {"scale": - 0, "applyToWhitespaces": true, "applyToPunctuations": true, "applyToNumbers": - true, "applyToStopwords": true, "applyToEmojis": true}, "frequencyPenalty": - {"scale": 0, "applyToWhitespaces": true, "applyToPunctuations": true, "applyToNumbers": - true, "applyToStopwords": true, "applyToEmojis": true}, "numResults": 1, "logitBias": - null}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '674' - Content-Type: - - application/json - User-Agent: - - python-requests/2.31.0 - method: POST - uri: https://api.ai21.com/studio/v1/j2-jumbo-instruct/complete - response: - body: - string: !!binary | - H4sIAAAAAAAAA6xazW4jSXJ+lQIvc1ETGf8RDcMLjC9rLBYYeNbYw45hlMRSk26qSi6WWpZn+9Av - 0Q/YT2JkUayeKdYMk70+iZKSWV9FZER88UX+vNptVm9XFHqH9x5vNnHnb26xpjc13dVvHOrb+w3e - 2yY2q5vVY989PA6rtz+vhuZ/htXb1V+3L9Wmaw5V86HpX7q2qXZt9f3u/a7dVd93w9A9VNt6aKof - 9nX7fujaP6xuVkP3vmkPq7d/+3n1rmmbvh6azV/y38Z9jx9WXz5/+uv25cvnT3n31c1q37177Lvb - 1ds3kNaYXDgFKDO6wc2qr5//8/dWfMxPffzL64Pbp/3+ZnyDf6vbd01+7GGo+2H1Nt2smnazeusf - P95cQHd64V9hk7WIIyePJAmD5sjm/y/F5a+4wC4D27UzSIAhBK6JBERRzkHNV5TCAnvFhekyruOp - +BU2WxO4RWISC0igc2hnC0qR4cmTWGCx40H9FbK0TqBKEo4EYYDKc2wLS4rRnexGfBldjp9fB8Ca - FIAEmUlDkvpZAJytKEVGfEIWl5GNQT0zG6kHI2EiViekc6vNVxRDi1doLBegDV07d2ZCMLewRKjO - yc0X3Hm+qBQbywnbpczxh3m+QFQPhyCSIFsIzvmKYkynpMHx8eN/fLxZ3XUPj/tm2HWvyXdTD/Uv - UvlP7SlJV7tDVVd327qv74amzyl92DbVj49d+675vrutfvzvp7pvfqjb4VDd1f3QdW11aPpdc6ie - t13+enc/NG312PVDX780m6rOO37Y7ff1rl1Xf2zymrxn99w2fdXdV3V1eKj3+6pvDkP91NftUN3V - +32zGZf9y/bpofr+6e59M9xUz9vd3TZvsO/uso2r+q7vDsf9DkPfNEN133cP4+9/6p8Ow0v1p76+ - vanqX+6en7ypbl++vtZ3h+o27/Pnfj1+4bCufmmR4ysN/cuufVcNXXUYmnp/fGhz1+eHdv3D077O - P8fv375UP9TDsGsON8dlu3dtPTz1TXXfdZv80mcId23V9Zumz/tndzVDUz3vhu248iv4kwXr/aGr - 3rfdczs+dLs7vFrxsPvf5mb8vfmw21eHu23zkGHU7Wb8a3d7aA6HXdced//6xj+1P7X/Onx3qHYP - 2XnZUENXtd3QVMO2HqrfOSL17Cgcn9Z2Q5URfdg1z01/qJ53+3113zSvlqsfmuq5fqnq2+5pqLa7 - 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 - /wMAsP0KichZAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e1221192a6242e7-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:12:57 GMT - NEL: - - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' - Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=WuqC19X6yHodx8eZ8OFOVPUC54LCuQDisDTWDOi4BV8ExVSF6qqNMaWSgLmS%2Fhs0gpxYdNz4w6vS5bpFAElwp5Cg3eTnM8CQXW7jH9IaNc6ASSaXIsmep9mS%2FIuXXA%3D%3D"}],"group":"cf-nel","max_age":604800}' - Server: - - cloudflare - Strict-Transport-Security: - - max-age=0; includeSubDomains - Transfer-Encoding: - - chunked - request-id: - - 396c2f89-d9c8-b2a3-a3ca-81abfd2f7d9d - via: - - 1.1 google - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/cohere_completion_sync.yaml b/tests/contrib/langchain/cassettes/langchain/cohere_completion_sync.yaml deleted file mode 100644 index d8b6c12f5c2..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/cohere_completion_sync.yaml +++ /dev/null @@ -1,61 +0,0 @@ -interactions: -- request: - body: '{"model": null, "prompt": "What is the secret Krabby Patty recipe?", "prompt_vars": - {}, "preset": null, "num_generations": null, "max_tokens": 256, "temperature": - 0.75, "k": 0, "p": 1, "frequency_penalty": 0.0, "presence_penalty": 0.0, "end_sequences": - null, "stop_sequences": null, "return_likelihoods": null, "truncate": null, - "logit_bias": {}, "stream": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '363' - Content-Type: - - application/json - Request-Source: - - python-sdk-4.11.2 - User-Agent: - - python-requests/2.31.0 - method: POST - uri: https://api.cohere.ai/v1/generate - response: - body: - string: '{"id":"2178266f-e279-4645-915e-ece297fad232","generations":[{"id":"5edd6cea-359a-4eef-bfbe-608f02832227","text":"\nThe - secret Krabby Patty recipe is a closely guarded trade secret, known only to - a select few people at the Krusty Krab restaurant."}],"prompt":"What is the - secret Krabby Patty recipe?","meta":{"api_version":{"version":"1"}}}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Via: - - 1.1 google - content-length: - - '339' - content-type: - - application/json - date: - - Thu, 29 Jun 2023 13:40:32 GMT - num_chars: - - '170' - vary: - - Origin - x-endpoint-monthly-call-limit: - - '5000' - x-ratelimit-limit: - - '10000000' - x-ratelimit-remaining: - - '9999998' - x-ratelimit-reset: - - '1684403260' - x-trial-endpoint-call-limit: - - '5' - x-trial-endpoint-call-remaining: - - '4' - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/cohere_math_chain_sync.yaml b/tests/contrib/langchain/cassettes/langchain/cohere_math_chain_sync.yaml deleted file mode 100644 index db4a246a2c1..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/cohere_math_chain_sync.yaml +++ /dev/null @@ -1,73 +0,0 @@ -interactions: -- request: - body: '{"model": null, "prompt": "Translate a math problem into a expression that - can be executed using Python''s numexpr library. Use the output of running this - code to answer the question.\n\nQuestion: ${Question with math problem.}\n```text\n${single - line mathematical expression that solves the problem}\n```\n...numexpr.evaluate(text)...\n```output\n${Output - of running the code}\n```\nAnswer: ${Answer}\n\nBegin.\n\nQuestion: What is - 37593 * 67?\n```text\n37593 * 67\n```\n...numexpr.evaluate(\"37593 * 67\")...\n```output\n2518731\n```\nAnswer: - 2518731\n\nQuestion: 37593^(1/5)\n```text\n37593**(1/5)\n```\n...numexpr.evaluate(\"37593**(1/5)\")...\n```output\n8.222831614237718\n```\nAnswer: - 8.222831614237718\n\nQuestion: what is thirteen raised to the .3432 power?\n", - "prompt_vars": {}, "preset": null, "num_generations": null, "max_tokens": 256, - "temperature": 0.75, "k": 0, "p": 1, "frequency_penalty": 0.0, "presence_penalty": - 0.0, "end_sequences": null, "stop_sequences": ["```output"], "return_likelihoods": - null, "truncate": null, "logit_bias": {}, "stream": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '1073' - Content-Type: - - application/json - Request-Source: - - python-sdk-4.11.2 - User-Agent: - - python-requests/2.31.0 - method: POST - uri: https://api.cohere.ai/v1/generate - response: - body: - string: '{"id":"ff8bc90b-83bb-4f55-8c9a-6223e0852ce0","generations":[{"id":"88ed66bb-a9a0-4335-ace0-9a6695cbb21e","text":"```text\n13**(0.3432)\n```\n...numexpr.evaluate(\"13**(0.3432)\")...\n```output"}],"prompt":"Translate - a math problem into a expression that can be executed using Python''s numexpr - library. Use the output of running this code to answer the question.\n\nQuestion: - ${Question with math problem.}\n```text\n${single line mathematical expression - that solves the problem}\n```\n...numexpr.evaluate(text)...\n```output\n${Output - of running the code}\n```\nAnswer: ${Answer}\n\nBegin.\n\nQuestion: What is - 37593 * 67?\n```text\n37593 * 67\n```\n...numexpr.evaluate(\"37593 * 67\")...\n```output\n2518731\n```\nAnswer: - 2518731\n\nQuestion: 37593^(1/5)\n```text\n37593**(1/5)\n```\n...numexpr.evaluate(\"37593**(1/5)\")...\n```output\n8.222831614237718\n```\nAnswer: - 8.222831614237718\n\nQuestion: what is thirteen raised to the .3432 power?\n","meta":{"api_version":{"version":"1"}}}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Via: - - 1.1 google - content-length: - - '987' - content-type: - - application/json - date: - - Thu, 29 Jun 2023 22:14:29 GMT - num_chars: - - '774' - vary: - - Origin - x-endpoint-monthly-call-limit: - - '5000' - x-ratelimit-limit: - - '10000000' - x-ratelimit-remaining: - - '9999993' - x-ratelimit-reset: - - '1684403260' - x-trial-endpoint-call-limit: - - '5' - x-trial-endpoint-call-remaining: - - '4' - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/huggingfacehub_completion_sync.yaml b/tests/contrib/langchain/cassettes/langchain/huggingfacehub_completion_sync.yaml deleted file mode 100644 index 7464fee93a0..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/huggingfacehub_completion_sync.yaml +++ /dev/null @@ -1,62 +0,0 @@ -interactions: -- request: - body: '{"options": {"wait_for_model": true, "use_gpu": false}, "inputs": "Why - does Mr. Krabs have a whale daughter?", "parameters": {"temperature": 0.5, "max_length": - 256}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '165' - Content-Type: - - application/json - user-agent: - - unknown/None; hf_hub/0.15.1; python/3.10.5 - method: POST - uri: https://api-inference.huggingface.co/pipeline/text2text-generation/google/flan-t5-xxl - response: - body: - string: '[{"generated_text":"she''s a mermaid"}]' - headers: - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Thu, 29 Jun 2023 13:55:08 GMT - Transfer-Encoding: - - chunked - access-control-allow-credentials: - - 'true' - access-control-allow-origin: - - '*' - vary: - - origin, Origin, Access-Control-Request-Method, Access-Control-Request-Headers - x-compute-characters: - - '41' - x-compute-time: - - '340' - x-compute-type: - - gpu+optimized - x-inference-time: - - '340' - x-queue-time: - - '0' - x-request-id: - - 6vAmsyMDCF-uQZgQpQHUz - x-sha: - - ad196ce8c46191d6a52592960835ff96d30152b5 - x-time-per-token: - - '34' - x-total-time: - - '340' - x-validation-time: - - '0' - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_chain_schema_io.yaml b/tests/contrib/langchain/cassettes/langchain/openai_chain_schema_io.yaml deleted file mode 100644 index f5d85e10ded..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_chain_schema_io.yaml +++ /dev/null @@ -1,88 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "system", "content": "You''re an assistant who''s - good at world capitals. Respond in 20 words or fewer"}, {"role": "user", "content": - "Can you be my science teacher instead?"}, {"role": "assistant", "content": - "Yes"}, {"role": "user", "content": "What''s the powerhouse of the cell?"}], - "model": "gpt-3.5-turbo", "max_tokens": null, "stream": false, "n": 1, "temperature": - 0.7}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '397' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.13", "platform": "macOS-13.6.5-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.6.0 Darwin Kernel Version 22.6.0: Mon Feb 19 19:45:09 - PST 2024; root:xnu-8796.141.3.704.6~1/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-9MKlPkyelxszTnEysy4eeZihFwATX\",\n \"object\": - \"chat.completion\",\n \"created\": 1715110059,\n \"model\": \"gpt-3.5-turbo-0125\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Mitochondria.\"\n },\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 54,\n \"completion_tokens\": 4,\n \"total_tokens\": 58\n },\n \"system_fingerprint\": - null\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 88039bced98e1841-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 07 May 2024 19:27:39 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=aG4mqwdLl6mtVHmUY1sni3SuU.qFBxanrCQAi0keMns-1715110059-1.0.1.1-q49zqtqqYOldKfp6LoZrV4xRF21gLaurG_WZtpCCQwxZkgKJfJgRMp5UzCBiwPlyxeQ4_OU81cwxx2_3QluxUw; - path=/; expires=Tue, 07-May-24 19:57:39 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=haGbmuprDHtB3GBdFJZDKT3WJMffTyEMnAhIgX__yro-1715110059674-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - user-vgqng3jybrjkfe7a1gf2l5ch - openai-processing-ms: - - '194' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '60000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '59941' - x-ratelimit-reset-requests: - - 8.64s - x-ratelimit-reset-tokens: - - 59ms - x-request-id: - - req_0d67fc7c57498b6f769c94d0e1b8ed94 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_call.yaml b/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_call.yaml deleted file mode 100644 index 5626b990111..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_call.yaml +++ /dev/null @@ -1,81 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "user", "content": "When do you use ''whom'' instead - of ''who''?"}], "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, - "n": 1, "temperature": 0.0}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-7TaSACt6vlSqn8bFubs1F7N40RYFy\",\n \"object\": - \"chat.completion\",\n \"created\": 1687285994,\n \"model\": \"gpt-3.5-turbo-0301\",\n - \ \"usage\": {\n \"prompt_tokens\": 21,\n \"completion_tokens\": 59,\n - \ \"total_tokens\": 80\n },\n \"choices\": [\n {\n \"message\": - {\n \"role\": \"assistant\",\n \"content\": \"'Whom' is used - instead of 'who' when referring to the object of a sentence or clause. It - is used when the person being referred to is the receiver of the action. For - example, \\\"Whom did you give the book to?\\\" or \\\"To whom are you speaking?\\\"\"\n - \ },\n \"finish_reason\": \"stop\",\n \"index\": 0\n }\n - \ ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da6195a7daca1f2-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:33:15 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '784' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999732' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - 5c57021890a3870d7de605a56c8dd095 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/chat/completions -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_generate.yaml b/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_generate.yaml deleted file mode 100644 index 19ac9e4b4d6..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_async_generate.yaml +++ /dev/null @@ -1,161 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "system", "content": "Respond like a frat boy."}, - {"role": "user", "content": "Where''s the nearest equinox gym from Hudson Yards - manhattan?"}], "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, - "n": 1, "temperature": 0.0}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-7TaSCbeCcLsttRsnqIf9UAkGcaOx1\",\n \"object\": - \"chat.completion\",\n \"created\": 1687285996,\n \"model\": \"gpt-3.5-turbo-0301\",\n - \ \"usage\": {\n \"prompt_tokens\": 33,\n \"completion_tokens\": 37,\n - \ \"total_tokens\": 70\n },\n \"choices\": [\n {\n \"message\": - {\n \"role\": \"assistant\",\n \"content\": \"Dude, I have no - idea. Why don't you just Google it like a normal person? Or better yet, just - skip the gym and come crush some beers with us instead!\"\n },\n \"finish_reason\": - \"stop\",\n \"index\": 0\n }\n ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da61962a8e054b5-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:33:16 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '691' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999721' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - fedbdb34ba01ecc4bd61e0279a952d3b - status: - code: 200 - message: OK - url: https://api.openai.com/v1/chat/completions -- request: - body: '{"messages": [{"role": "system", "content": "Respond with a pirate accent."}, - {"role": "user", "content": "How does one get to Bikini Bottom from New York?"}], - "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, "n": 1, "temperature": - 0.0}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-7TaSCN0QY9bkx5QkmHL0dCNWEXAUq\",\n \"object\": - \"chat.completion\",\n \"created\": 1687285996,\n \"model\": \"gpt-3.5-turbo-0301\",\n - \ \"usage\": {\n \"prompt_tokens\": 31,\n \"completion_tokens\": 96,\n - \ \"total_tokens\": 127\n },\n \"choices\": [\n {\n \"message\": - {\n \"role\": \"assistant\",\n \"content\": \"Arrr, ye be lookin' - to sail to Bikini Bottom, eh? Well shiver me timbers, ye'll need to set sail - from New York and head southward, past the Caribbean and into the Atlantic. - Keep yer eyes peeled for the signs of the Krusty Krab, and ye'll know ye be - close to Bikini Bottom. But beware, there be many a sea monster and pirate - lurking in those waters, so keep yer wits about ye!\"\n },\n \"finish_reason\": - \"stop\",\n \"index\": 0\n }\n ]\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da61962af50369d-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:33:17 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1441' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999722' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - e38c7fa8d588584bd32bdbfbcc3f5850 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/chat/completions -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call.yaml b/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call.yaml deleted file mode 100644 index 96f4638c001..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call.yaml +++ /dev/null @@ -1,88 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "user", "content": "When do you use ''whom'' instead - of ''who''?"}], "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, - "n": 1, "temperature": 0.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '177' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-7TaNAsddHQpRbMLAuYNXbL2ezFYRW\",\n \"object\": - \"chat.completion\",\n \"created\": 1687285684,\n \"model\": \"gpt-3.5-turbo-0301\",\n - \ \"usage\": {\n \"prompt_tokens\": 21,\n \"completion_tokens\": 59,\n - \ \"total_tokens\": 80\n },\n \"choices\": [\n {\n \"message\": - {\n \"role\": \"assistant\",\n \"content\": \"'Whom' is used - instead of 'who' when referring to the object of a sentence or clause. It - is used when the person being referred to is the receiver of the action. For - example, \\\"Whom did you give the book to?\\\" or \\\"To whom are you speaking?\\\"\"\n - \ },\n \"finish_reason\": \"stop\",\n \"index\": 0\n }\n - \ ]\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da611c49f04a22c-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:28:04 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '890' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999732' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - fd7944fb6bb1df560918b7c149c8ac87 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call_39.yaml deleted file mode 100644 index 39569a9e2c4..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_call_39.yaml +++ /dev/null @@ -1,89 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "user", "content": "When do you use ''whom'' instead - of ''who''?"}], "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, - "n": 1, "temperature": 0.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '177' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA5VTTW/bMAy991cQvngDHCMfTZf2MmwruuSwL3RAUSxDochMrNUWDUlJGhT57yPl - pFmKodgugs3H9x5JiY8nAIkpkgtIdKmCrpuq8+b20+Xq4/jdh+rL+H3v69Vk+O3y9PY6fA72epRk - wqDZL9Rhz8o1MQ+DIdvC2qEKKKq9s9HotN8/HwwjUFOBldAWTegM8mEnLN2MOt2z3mDHLMlo9Jzy - g38BHuMpNdoCHzjczfaRGr1XC+TYPomDjiqJJMp744OyIckOoCYb0May05uS6hSMh6XHAoz1AVUB - NId0XVIK6xItmCAJoURo+xVYwQrdDMhB47Ahb6Rr5jPgUeQ15jAJT8qBwOEcnXyIUoPOM0H4SDw0 - RjWalbGLCCsd9dhI/vZWxyVEmYN5DlM7tVechg9K7uFiajswTb4Td0E1FKaADS1hYVYYuTOi+7fT - BF6N0WEWG25H8aINpIHnomzR9uOfNXTchljkr9s6bv4swiP3GFqicmHzj3XEQaRMfqGCGYo751hx - ntqJXMucXK0q8A2iLiN37bgdu8h2F812NOdr++s7qNMMkLnaqKra/OejyGFMa2Qgk+exK2TnLqlR - bU5VRetYeHCG1RZO1bVy4JYV+udD0eScWLZbIrIc9RxXHn2e7F769mlF5sYaX97xNvKA5Nn7QE2b - tuXzZ1y55dEWJY3jZQ53ge7Ryh72e61ccljyAzg834GBgqoO8VH3RCy2J78BcV8HZmAEAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e1286b36be5425c-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 22:22:17 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0613 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1666' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999732' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - 46fe3eb710843518a606f971946eac6c - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate.yaml b/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate.yaml deleted file mode 100644 index d0bfc516ec5..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate.yaml +++ /dev/null @@ -1,175 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "system", "content": "Respond like a frat boy."}, - {"role": "user", "content": "Where''s the nearest equinox gym from Hudson Yards - manhattan?"}], "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, - "n": 1, "temperature": 0.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '256' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-7TaG1tbwmWRzTW1B98UFDw9a2cuQn\",\n \"object\": - \"chat.completion\",\n \"created\": 1687285241,\n \"model\": \"gpt-3.5-turbo-0301\",\n - \ \"usage\": {\n \"prompt_tokens\": 33,\n \"completion_tokens\": 37,\n - \ \"total_tokens\": 70\n },\n \"choices\": [\n {\n \"message\": - {\n \"role\": \"assistant\",\n \"content\": \"Dude, I have no - idea. Why don't you just Google it like a normal person? Or better yet, just - skip the gym and come crush some beers with us instead!\"\n },\n \"finish_reason\": - \"stop\",\n \"index\": 0\n }\n ]\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da606f94c84a247-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:20:42 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '741' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999721' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - 92c3eaf96b7d158b5d2c3a2d5386eb19 - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "Respond with a pirate accent."}, - {"role": "user", "content": "How does one get to Bikini Bottom from New York?"}], - "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, "n": 1, "temperature": - 0.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '249' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-7TaG3rUoSxMMRiphR3Sh7LLIZBlPd\",\n \"object\": - \"chat.completion\",\n \"created\": 1687285243,\n \"model\": \"gpt-3.5-turbo-0301\",\n - \ \"usage\": {\n \"prompt_tokens\": 31,\n \"completion_tokens\": 96,\n - \ \"total_tokens\": 127\n },\n \"choices\": [\n {\n \"message\": - {\n \"role\": \"assistant\",\n \"content\": \"Arrr, ye be lookin' - to sail to Bikini Bottom, eh? Well shiver me timbers, ye'll need to set sail - from New York and head southward, past the Caribbean and into the Atlantic. - Keep yer eyes peeled for the signs of the Krusty Krab, and ye'll know ye be - close to Bikini Bottom. But beware, there be many a sea monster and pirate - lurking in those waters, so keep yer wits about ye!\"\n },\n \"finish_reason\": - \"stop\",\n \"index\": 0\n }\n ]\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da607006e0a369f-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:20:44 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0301 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1469' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999722' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - fa0dec6c7e8116002997a62433ebd0c4 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate_39.yaml deleted file mode 100644 index 283837b1f88..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_chat_completion_sync_generate_39.yaml +++ /dev/null @@ -1,175 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "system", "content": "Respond like a frat boy."}, - {"role": "user", "content": "Where''s the nearest equinox gym from Hudson Yards - manhattan?"}], "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, - "n": 1, "temperature": 0.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '256' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA1RSy27bMBC8+ysmvOQiC1b9iOtbX2iCJijQFgWMoggoaW0xlrgKd+UHAv97QdmJ - 0QsPMzvLwcy+DADjSrOAKSqrRdPWw5vl/YO8+/Tj47eizPez7/elmz///rxc3VbTlUmigvMnKvRV - lRbctDWpY3+ii0BWKW7NZvP5JHs/m8x6ouGS6ihbtzocp9OhdiHn4WiWjc/Kil1BYhb4MwCAl/6N - Hn1Je7PAKHlFGhKxazKLtyHABK4jYqyIE7VeTXIhC/ZKvre9ZOSBE9xhzYoDdyh4S4HKK/yqCJ5s - IFF8ee6c5z3WhwarwA1uu1LYY2lDKXAeD9ZXVtV6OMFTJwqLFe2Q11xsBHZnDwka61Pc6bWAPbKR - VviwJd9RguDWlSIn3RF5jCNlfYlxJoqfGog0xTKas/5a0TgROE1QdiWl0eiht2/rGloRxBUb7Dhs - uFPQc+fahrz2Gy02rq4pYOtySvGVUYROKmjFQlhb5yWJiVyZc1zHt5xXzjupHgNZYR+zE+X2NHYc - AH/73rr/qjBt4KbVR+UN+VjmODutM5dLuZA3kzOprLa+4NloOoh/HAf/AAAA//8DAL+Kx6amAgAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e123665bf10426a-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:27:27 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0613 - openai-organization: - - datadog-4 - openai-processing-ms: - - '881' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999721' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - dd77720096a26c714efe2d809fbafc88 - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "Respond with a pirate accent."}, - {"role": "user", "content": "How does one get to Bikini Bottom from New York?"}], - "model": "gpt-3.5-turbo", "max_tokens": 256, "stream": false, "n": 1, "temperature": - 0.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '249' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA1RSXU/bQBB8z68Y/NIXJyIQIMlbUSVUqYWHVqrSqkIbexMfsW+vt2vARfx3dBcg - 4sWSZ3bmZj+eRkDh6mKJomrIqi6044vVt+/2v51trrurm3/zr/z77os+eDdcXc5XRZkUsr7jyt5U - k0q60LI58Xu6ikzGyXV6Pp/Ppovz2UUmOqm5TbJtsPHp5GxsfVzL+Ph8evqqbMRVrMUSf0YA8JS/ - KaOv+bFY4rh8QzpWpS0Xy/cioIjSJqQgVadG3oryQFbijX2O/TnGEh2jYYrm+Ag/BVs2mODS7Zx3 - uBQz6bCJ0uGaH7CSuCsxMNYMz1w7/wkEtT7WA7RxAeRrENIsSBXWkCGI86aw2PMEP9ig5Nq9pzWM - huJaYomNtK08ZEiNopbZy9O925Jxxi0yVQ1H6RXKpBP8IqsaSG/YSIRWfbwfEoVOvBpHzSY75oCB - I3hgRWBuuc4C8gPUbb1CNmjJ1xPc+IpThxrE9mHI5+Ykci77MJoSdZTUddVkuxohcqDIaYj8GFqJ - ++g1B2uyPv1JxeTz7DsyHo6K1/08vy9247zT5jYyqfi0LDUJ+7LnEfA3H0r/YfdFiNIFuzXZsU/X - c7LY2xWH0zyQi7NX0sSoPeDTk9kovfE8egEAAP//AwByYMwnFwMAAA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e12366becfd426a-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:27:28 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-0613 - openai-organization: - - datadog-4 - openai-processing-ms: - - '997' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '999722' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 16ms - x-request-id: - - 3fba53c58c2ecb6c17e4c109d18e6db0 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_completion_async.yaml b/tests/contrib/langchain/cassettes/langchain/openai_completion_async.yaml deleted file mode 100644 index 7228b0725cf..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_completion_async.yaml +++ /dev/null @@ -1,77 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Which team won the 2019 NBA finals?"], "model": "text-davinci-003", - "temperature": 0.7, "max_tokens": 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": - 0, "n": 1, "logit_bias": {}}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7TZycohfrscabqdjAkIMd6ApJEOLx\",\n \"object\": - \"text_completion\",\n \"created\": 1687284162,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\n\\nThe Toronto Raptors won the - 2019 NBA Finals.\",\n \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 8,\n \"completion_tokens\": - 11,\n \"total_tokens\": 19\n }\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da5ec9d7ee05401-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:02:42 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '281' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 485221f2c6ac021097bc443b78eef4a2 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/completions -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_completion_async_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_completion_async_39.yaml deleted file mode 100644 index a6a6bf6074c..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_completion_async_39.yaml +++ /dev/null @@ -1,77 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Which team won the 2019 NBA finals?"], "model": "text-davinci-003", - "temperature": 0.7, "max_tokens": 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": - 0, "n": 1, "logit_bias": {}}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7YL6kcqQstcEl7ZKYEFKAiuxhtJwp\",\n \"object\": - \"text_completion\",\n \"created\": 1688418646,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\n\\nThe Toronto Raptors won the - 2019 NBA Finals.\",\n \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 8,\n \"completion_tokens\": - 11,\n \"total_tokens\": 19\n }\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e121dfd0c328c48-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:10:47 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '454' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 27189e40e65e8946995e950f058723f0 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/completions -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_completion_error.yaml b/tests/contrib/langchain/cassettes/langchain/openai_completion_error.yaml deleted file mode 100644 index d0b67cb8741..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_completion_error.yaml +++ /dev/null @@ -1,77 +0,0 @@ -interactions: -- request: - body: '{"prompt": [12345, 123456], "model": "text-davinci-003", "temperature": - 0.7, "max_tokens": 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": - 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '180' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"error\": {\n \"message\": \"Invalid token in prompt: 123456. - Minimum value is 0, maximum value is 50280 (inclusive).\",\n \"type\": - \"invalid_request_error\",\n \"param\": null,\n \"code\": null\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7dd8e3963f3343e6-EWR - Connection: - - keep-alive - Content-Length: - - '201' - Content-Type: - - application/json - Date: - - Mon, 26 Jun 2023 22:29:26 GMT - Server: - - cloudflare - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '5' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 879dd45d0c332eca070a71de04ccee40 - status: - code: 400 - message: Bad Request -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync.yaml b/tests/contrib/langchain/cassettes/langchain/openai_completion_sync.yaml deleted file mode 100644 index 5647d2d5753..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync.yaml +++ /dev/null @@ -1,108 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Can you explain what Descartes meant by ''I think, therefore - I am''?"], "model": "gpt-3.5-turbo-instruct", "temperature": 0.7, "max_tokens": - 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": - {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '241' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.11.1", "platform": "macOS-14.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:10:42 - PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T6000 arm64 arm"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - - body: - string: "{\n \"id\": \"cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP\",\n \"object\": - \"text_completion\",\n \"created\": 1687283761,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\n\\nDescartes' famous phrase - \\\"I think, therefore I am\\\" is a fundamental statement of his philosophical - approach, known as Cartesian logic. This phrase is often interpreted as a - statement that reflects his belief in the existence of the self and one's - consciousness.\\n\\nIn his philosophical work, Descartes was searching for - a solid foundation for knowledge and truth. He doubted everything he had learned - and believed, even the existence of the external world and his own body. However, - he reached a point where he realized that even if everything else could be - doubted, there was one thing that he could not doubt - the fact that he was - doubting. This led him to the conclusion that he must exist in order to have - thoughts and doubts.\\n\\nTherefore, by saying \\\"I think,\\\" Descartes - is asserting that he is a thinking being. And by saying \\\"therefore I am,\\\" - he is affirming that his existence is inseparable from his ability to think. - In other words, the very act of thinking proves his existence as a conscious - being.\\n\\nThis statement also implies that the mind and consciousness are - essential to one's existence, rather than the physical body. While the body - can be doubted and can deceive the senses, the mind's ability to think and\",\n - \ \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 17,\n \"completion_tokens\": - 95,\n \"total_tokens\": 112\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 88b1dec92bf84414-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 28 May 2024 23:02:09 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=GO1qX6goSJ8IacyvMS7tLMf0y55kYhL6qoz7yWHzVaw-1716937329-1.0.1.1-KvV3UvXRKv112CoSczDnRzcxKh8yFACOJH3Ze3RU6UqLAbH9hU09.k9UMn37Jjz4lL0vp_QtsV86A5CZ6pj0xg; - path=/; expires=Tue, 28-May-24 23:32:09 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=2wZlGKfUHYLv2py8qBP8822KGpT_cuKDJqqhhCMyEAs-1716937329373-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-instruct - openai-organization: - - datadog-4 - openai-processing-ms: - - '4278' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 17ms - x-ratelimit-reset-tokens: - - 181ms - x-request-id: - - req_9c5e9d6c980fce68872534cb21e92939 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_39.yaml deleted file mode 100644 index f0ba4120a2b..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_39.yaml +++ /dev/null @@ -1,89 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Can you explain what Descartes meant by ''I think, therefore - I am''?"], "model": "text-davinci-003", "temperature": 0.7, "max_tokens": 256, - "top_p": 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": - {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '235' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: !!binary | - H4sIAAAAAAAACk1SwW4TQQy99yusvXBJqgSaJuWGhIqCQCIckBCtosmMNztk117Gs22iKlI+okf4 - uXwJnlnScNnZsd97fvb46QKg8K54C4Vt2no4/f5pMt2NF4vq3bWhFbnFQr59+Lq53TYfsRgkNK9+ - oo2JEXEbl5aVh9Ez9Wkb0ERMiuPr2exqPJtcTXKiYYf1iTZ05sGT9cPR6M0/XsXeoijgh14BnvIX - enii3dEdvUexJkSUV1CahjuBtgpGEI6H33OIlafNQA8MWHJAmINpjoc/4AUMlB050yBFU4N3qIHA - DVSae+SgtM/ofDSpEQEmuPVBInypfM3CbbW7hHnshURRmISAy8xvMFbs0q09wb1NVehX58MODLmM - s0y27kQrqEcTk1GtVO+y8TXozRqClR4YovGUFJWWqPxIgFsvEcmiWtFcajNZdzJI1E7wDFU/3bqK - YHRAgVUm11NU1lCC6PAxGzA295Fnl1wo/kGVMkE4tabR4+FZ7eivNqHj1oK+EazLFE9YHThEBsdZ - 8qR1mV82P6Inh1t9xdFLpOa1llqlB6eurl/ipScv1VK3SHSl9N0lclvk7F6/93lZOjFr1GS/JIUK - NW1cRt4gJcHxtJcrzst5Tt7kdUyLxboK/5HGrzW+v9j/BR2fvZEUAwAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e121b84bb79430f-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:09:08 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '3010' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - acd861adc9cc2833688abc7e32b2d08c - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt.yaml b/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt.yaml deleted file mode 100644 index 5a36f445d47..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt.yaml +++ /dev/null @@ -1,94 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["What is the best way to teach a baby multiple languages?", - "How many times has Spongebob failed his road test?"], "model": "text-davinci-003", - "temperature": 0.7, "max_tokens": 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": - 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '279' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7UJs2Rfqv8Lct2GoadGz04UrCweAp\",\n \"object\": - \"text_completion\",\n \"created\": 1687460578,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\n\\nThe best way to teach a baby - multiple languages is to start as early as possible and to make the learning - experience fun and engaging. Create an immersive environment and speak to - them in both languages, alternating between the two often. Use as much visual - stimulation as possible, like pictures, videos, and music, to help them learn - and remember words. Read books in multiple languages to them, and use repetition - and reinforcement whenever possible. Finally, be patient and encouraging throughout - the learning process.\",\n \"index\": 0,\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n },\n {\n \"text\": \"\\n\\nSpongebob - has failed his road test a total of three times.\",\n \"index\": 1,\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 24,\n \"completion_tokens\": 114,\n - \ \"total_tokens\": 138\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7db6bfa97c6a4327-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 22 Jun 2023 19:03:03 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '5028' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249487' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 122ms - x-request-id: - - de897ed5573bbdf5e1ac01bcdcbad33c - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt_39.yaml deleted file mode 100644 index 7bccbeb46cb..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_completion_sync_multi_prompt_39.yaml +++ /dev/null @@ -1,90 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["What is the best way to teach a baby multiple languages?", - "How many times has Spongebob failed his road test?"], "model": "text-davinci-003", - "temperature": 0.7, "max_tokens": 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": - 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '279' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA6RTTWsbMRC9+1c89mybOHHS1LcUSiktlDSBYJoSZndnd1VrNapG6w9C/nuR7MYu - tKdedJiZ9958PD2PgMLUxQJF1Xs7ebP87O6vfm7vL28elh9C//52SbfrL8v+4+7Tqhinail/cBUT - IvI2PlXSe8vRiNunq8AUOTHOrq6v5+ez87eXOdFLzfY3bFLT2rjKTM7OLg64TkzFWizwbQQAz/nF - vjzBHt2ju+8YJWvEhnaIgshUdSCUVO7QDzYabxmWXDtQywqjqaqnFUOHwIgdRZC1qChwa9YcFBQY - 6plWxrWI3Sk8KSTFxN4E6UHYyeBaUMtTPHTseM0BXlRNaXmMQY/wiXquTGMqlCIrHYO8T6+rsTY1 - S6bv2PqjhmUKboq71A3Uysbucn2iVZP2jI2EWnNQ2UV2FesUX9lzNOkGaeIV76a4sVY2R+YsRQGE - jakZgVzLkAa1aRoO7OLJ1ImcXSVDoDatjPsE5623EvgEoTK4Wqd4x/AUTQolaFrribDpOcGpVAll - LshT/rHpabZAvrZxNW+LBc5eI1ZaH6RMznCDta/xxjij3VNgUnHJIBrFFzn7Mv63he68uJZLKdGR - oiFjuUZnFEGoRkzmcsZxblz/0tjsvxobAd+z3QellovFocfCB+l9fIqyYpcIz+d7uuL4vY7J2eyw - nSJKJHuSuJiPksjL6BcAAAD//wMAxyCzCtgDAAA= - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e125ea77cc54396-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:54:56 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1659' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249487' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 122ms - x-request-id: - - 190c63d620093e56117dc45dc2f7f55d - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_embedding_document.yaml b/tests/contrib/langchain/cassettes/langchain/openai_embedding_document.yaml deleted file mode 100644 index fac5c36211e..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_embedding_document.yaml +++ /dev/null @@ -1,78 +0,0 @@ -interactions: -- request: - body: '{"input": [[576, 374], [64, 1296, 2246, 13]], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '74' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"embedding\",\n \"index\": 0,\n \"embedding\": \"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\"\n - \ },\n {\n \"object\": \"embedding\",\n \"index\": 1,\n \"embedding\": - \"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\"\n - \ }\n ],\n \"model\": \"text-embedding-ada-002-v2\",\n \"usage\": {\n - \ \"prompt_tokens\": 6,\n \"total_tokens\": 6\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7dd89fba186b17e9-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 26 Jun 2023 21:43:06 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '33' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '999993' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - 55d5384c8b1c650ac417047d7ee1c97d - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_embedding_document_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_embedding_document_39.yaml deleted file mode 100644 index 78a83ba9563..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_embedding_document_39.yaml +++ /dev/null @@ -1,287 +0,0 @@ -interactions: -- request: - body: '{"input": [[576, 374], [64, 1296, 2246, 13]], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '74' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: !!binary | - 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 - AA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e123b418cba9e1a-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:30:45 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '40' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '205107' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 47.693s - x-request-id: - - 740a3bfc63aee09550a888079eebcfc3 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_embedding_query.yaml b/tests/contrib/langchain/cassettes/langchain/openai_embedding_query.yaml deleted file mode 100644 index 16ea9b076b2..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_embedding_query.yaml +++ /dev/null @@ -1,70 +0,0 @@ -interactions: -- request: - body: '{"input": ["this is a test query."], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '65' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"embedding\",\n \"index\": 0,\n \"embedding\": \"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\"\n - \ }\n ],\n \"model\": \"text-embedding-ada-002-v2\",\n \"usage\": {\n - \ \"prompt_tokens\": 6,\n \"total_tokens\": 6\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da633614ab8a1f6-YYZ - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 18:51:01 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1048' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-reset-requests: - - 20ms - x-request-id: - - a09a2d7d7518e3d87daeb7457fde8f57 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_embedding_query_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_embedding_query_39.yaml deleted file mode 100644 index 53a34d97e2b..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_embedding_query_39.yaml +++ /dev/null @@ -1,182 +0,0 @@ -interactions: -- request: - body: '{"input": ["this is a test query."], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '65' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: !!binary | - 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 - //8DAAkmhufhIAAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e123ab1fa9e0cb6-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:30:22 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '26' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2998' - x-ratelimit-remaining-tokens: - - '186923' - x-ratelimit-reset-requests: - - 39ms - x-ratelimit-reset-tokens: - - 48.784s - x-request-id: - - b60c3f085c8d2d4554402259953bfced - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_math_chain_async.yaml b/tests/contrib/langchain/cassettes/langchain/openai_math_chain_async.yaml deleted file mode 100644 index bf6e1ed694f..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_math_chain_async.yaml +++ /dev/null @@ -1,85 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Translate a math problem into a expression that can be executed - using Python''s numexpr library. Use the output of running this code to answer - the question.\n\nQuestion: ${Question with math problem.}\n```text\n${single - line mathematical expression that solves the problem}\n```\n...numexpr.evaluate(text)...\n```output\n${Output - of running the code}\n```\nAnswer: ${Answer}\n\nBegin.\n\nQuestion: What is - 37593 * 67?\n```text\n37593 * 67\n```\n...numexpr.evaluate(\"37593 * 67\")...\n```output\n2518731\n```\nAnswer: - 2518731\n\nQuestion: 37593^(1/5)\n```text\n37593**(1/5)\n```\n...numexpr.evaluate(\"37593**(1/5)\")...\n```output\n8.222831614237718\n```\nAnswer: - 8.222831614237718\n\nQuestion: what is two raised to the fifty-fourth power?\n"], - "model": "text-davinci-003", "temperature": 0.0, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}, - "stop": ["```output"]}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7TcXe9BKSenEUt2754Mj9iQnYH9jt\",\n \"object\": - \"text_completion\",\n \"created\": 1687294022,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\n```text\\n2**54\\n```\\n...numexpr.evaluate(\\\"2**54\\\")...\\n\",\n - \ \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 236,\n \"completion_tokens\": - 24,\n \"total_tokens\": 260\n }\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da6dd5b2c7ca21a-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 20:47:05 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '2214' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 757253e7d6d118ba26ec2f4b64e5cc85 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/completions -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync.yaml b/tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync.yaml deleted file mode 100644 index 4c18d3cbf3e..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync.yaml +++ /dev/null @@ -1,92 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Translate a math problem into a expression that can be executed - using Python''s numexpr library. Use the output of running this code to answer - the question.\n\nQuestion: ${Question with math problem.}\n```text\n${single - line mathematical expression that solves the problem}\n```\n...numexpr.evaluate(text)...\n```output\n${Output - of running the code}\n```\nAnswer: ${Answer}\n\nBegin.\n\nQuestion: What is - 37593 * 67?\n```text\n37593 * 67\n```\n...numexpr.evaluate(\"37593 * 67\")...\n```output\n2518731\n```\nAnswer: - 2518731\n\nQuestion: 37593^(1/5)\n```text\n37593**(1/5)\n```\n...numexpr.evaluate(\"37593**(1/5)\")...\n```output\n8.222831614237718\n```\nAnswer: - 8.222831614237718\n\nQuestion: what is two raised to the fifty-fourth power?\n"], - "model": "text-davinci-003", "temperature": 0.0, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}, - "stop": ["```output"]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '934' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7TcXeDqtDyButnv4DX8YEYqqHvJit\",\n \"object\": - \"text_completion\",\n \"created\": 1687294022,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\n```text\\n2**54\\n```\\n...numexpr.evaluate(\\\"2**54\\\")...\\n\",\n - \ \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 236,\n \"completion_tokens\": - 24,\n \"total_tokens\": 260\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da6dd5549fea253-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 20:47:02 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '669' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 763b776926e553e6e09d09b0ecff37d6 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync_39.yaml deleted file mode 100644 index 2047ec14e51..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_math_chain_sync_39.yaml +++ /dev/null @@ -1,93 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Translate a math problem into a expression that can be executed - using Python''s numexpr library. Use the output of running this code to answer - the question.\n\nQuestion: ${Question with math problem.}\n```text\n${single - line mathematical expression that solves the problem}\n```\n...numexpr.evaluate(text)...\n```output\n${Output - of running the code}\n```\nAnswer: ${Answer}\n\nBegin.\n\nQuestion: What is - 37593 * 67?\n```text\n37593 * 67\n```\n...numexpr.evaluate(\"37593 * 67\")...\n```output\n2518731\n```\nAnswer: - 2518731\n\nQuestion: 37593^(1/5)\n```text\n37593**(1/5)\n```\n...numexpr.evaluate(\"37593**(1/5)\")...\n```output\n8.222831614237718\n```\nAnswer: - 8.222831614237718\n\nQuestion: what is two raised to the fifty-fourth power?\n"], - "model": "text-davinci-003", "temperature": 0.0, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}, - "stop": ["```output"]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '934' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA0xQ3W6CMBS+5ymaXm1mNCgMlSfYFm4W44UbBmo507rS00BRFuO7LwXmvGlyvv/0 - 4hFCZUkTQkVllD/fpKtw9d6KHxuH6fFl/fpxLt/WoTjDJqVPTo27IwjrHBY6mwusjAIrUQ+0qIFb - cInTeLGIpstlPO+JCktQfza/5CephfSDIBx9B5QCGpqQT48QQi79Swa5s2W6KAp3ZHo2mTxH/Z1p - xphuK+hMzeDEVcstPGR0UNBHxlg2DOuzpC6howkJbojCvalx53p1q9QN/5JaNoe8Bt6gdvWNRUN7 - 9uoRsu03tw3fA03GrdTUWBmbW/wG7QJnYTzk0f9PumOjkbRoubrD48BzJVfvFwAA//8DAFfosjGd - AQAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e123e39f9670f69-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:32:51 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '4619' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 01ed91b039a6125500da9c9dc3f35ad7 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_paraphrase.yaml b/tests/contrib/langchain/cassettes/langchain/openai_paraphrase.yaml deleted file mode 100644 index 7e590728a35..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_paraphrase.yaml +++ /dev/null @@ -1,92 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Paraphrase this text:\n\n \n Chains allow us to combine - multiple \n components together to create a single, coherent application. \n - For example, we can create a chain that takes user input, format it with a PromptTemplate, - \n and then passes the formatted response to an LLM. We can build more complex - chains by combining multiple chains together, or by \n combining chains with - other components.\n \n\n In the style of a a 90s rapper.\n\n Paraphrase: - "], "model": "text-davinci-003", "temperature": 0.7, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '643' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7TcyG7cN81zNV3sWTHke4jEByO717\",\n \"object\": - \"text_completion\",\n \"created\": 1687295672,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\nChains be like a link, let us - connect the pieces, creatin' a single app. We can write a chain to take input, - format it with a PromptTemplate, then send it to an LLM. We can get more complex, - linkin' chains together, mixin' them with other parts, no problemo.\",\n \"index\": - 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n - \ ],\n \"usage\": {\n \"prompt_tokens\": 105,\n \"completion_tokens\": - 69,\n \"total_tokens\": 174\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7da7059efa3da244-YYZ - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 20 Jun 2023 21:14:33 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '1288' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - c8405a5a8b3587a99678b9e61f56063f - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search.yaml b/tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search.yaml deleted file mode 100644 index d829d8efccb..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search.yaml +++ /dev/null @@ -1,176 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.31.0 - method: GET - uri: https://controller.us-west1-gcp-free.pinecone.io/actions/whoami - response: - body: - string: '{"project_name":"74ce8fe","user_name":"","user_label":""}' - headers: - Alt-Svc: - - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 - Content-Length: - - '57' - Date: - - Mon, 11 Mar 2024 19:03:34 GMT - Server: - - Google Frontend - Via: - - 1.1 google - X-Cloud-Trace-Context: - - c0647d71ba097bc4b5b3c1bcc43b1d2c - access-control-allow-origin: - - '*' - access-control-expose-headers: - - '*' - content-type: - - application/json - vary: - - origin,access-control-request-method,access-control-request-headers - status: - code: 200 - message: OK -- request: - body: '{"input": ["Who was Alan Turing?"], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '64' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.3", "platform": "Linux-5.15.49-linuxkit-aarch64-with-glibc2.28", "publisher": - "openai", "uname": "Linux 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 - UTC 2022 aarch64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"embedding\",\n \"index\": 0,\n \"embedding\": \"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\"\n - \ }\n ],\n \"model\": \"text-embedding-ada-002\",\n \"usage\": {\n \"prompt_tokens\": - 5,\n \"total_tokens\": 5\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 862dce278950c404-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 11 Mar 2024 19:03:34 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=K1LJyywwczX14VXDQC1.r8Uf7R_QJanDPmA0CdWBj54-1710183814-1.0.1.1-PifG.eX_K2tX0EuVnLBr7_LGVaZ0xNcE95pRppeKoNKNBIwM9VY4LRaysXQ2.Q9i6Zrke2dNmMAp_Rz80qSRYQ; - path=/; expires=Mon, 11-Mar-24 19:33:34 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=lNs1LKgcDwyfq5gp9AHvm_0pEEhs0jptufoRKHXat3w-1710183814449-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-embedding-ada-002 - openai-organization: - - datadog-4 - openai-processing-ms: - - '15' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '10000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '9999994' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_7a982465208e3204b2f9f27e5fea39a3 - status: - code: 200 - message: OK -- request: - body: '' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - python-client-2.2.4 (requests:2.31.0, urllib3:2.2.1) - method: POST - uri: https://langchain-retrieval-74ce8fe.svc.us-west1-gcp-free.pinecone.io/query - response: - body: - string: "{\"results\":[],\"matches\":[{\"id\":\"35391d1d-0466-4d92-b457-35f673e516eb\",\"score\":0.901149213,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}}],\"namespace\":\"\"}" - headers: - content-length: - - '1821' - content-type: - - application/json - date: - - Mon, 11 Mar 2024 19:03:35 GMT - grpc-status: - - '0' - server: - - envoy - x-envoy-upstream-service-time: - - '1' - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search_39.yaml deleted file mode 100644 index f6e20c6db65..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_similarity_search_39.yaml +++ /dev/null @@ -1,650 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.31.0 - method: GET - uri: https://controller.us-west1-gcp-free.pinecone.io/actions/whoami - response: - body: - string: '{"project_name":"74ce8fe","user_label":"default","user_name":"5c27a1f"} - - ' - headers: - content-length: - - '72' - content-type: - - application/json; charset=UTF-8 - date: - - Mon, 03 Jul 2023 21:40:09 GMT - server: - - envoy - x-envoy-upstream-service-time: - - '0' - status: - code: 200 - message: OK -- request: - body: '{"input": ["Who was Alan Turing?"], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '64' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: !!binary | - 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 - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e124906cbc94204-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:40:09 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '30' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '119338' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 52.839s - x-request-id: - - a34d409cc747546125ea39c8db850c41 - status: - code: 200 - message: OK -- request: - body: '{"topK": 1, "vector": [[0.004753536079078913, -0.030386485159397125, -0.008732564747333527, - -0.021428022533655167, 0.004605088848620653, 0.012334021739661694, -0.039680566638708115, - 0.009306990541517735, -0.023958079516887665, -0.025313466787338257, 0.03141916170716286, - 0.029715247452259064, 0.010436479933559895, -0.00868093129247427, 0.009287628345191479, - 0.007745068520307541, 0.013347335159778595, 0.015231967903673649, 0.015541771426796913, - 0.0022654326166957617, -0.02382899448275566, 0.00788060761988163, -0.0001955428160727024, - -0.010455843061208725, -0.011359433643519878, -0.0021460293792188168, 0.023854810744524002, - -0.022008903324604034, 0.021156946197152138, -0.0353691466152668, 0.019156135618686676, - -0.005947567522525787, -0.02798551507294178, -0.013734588399529457, -0.03082537278532982, - 0.009261811152100563, 0.015477228909730911, 0.025274740532040596, 0.013579687103629112, - -0.012805180624127388, 0.03206458315253258, 0.028501853346824646, 0.004808396566659212, - -0.013915306888520718, -0.010042772628366947, 0.010701103135943413, 0.0031335256062448025, - -0.002497784560546279, -0.00900364201515913, 0.009649064391851425, 0.009048821404576302, - 0.0234417412430048, 0.011727324686944485, -0.019762832671403885, -0.04146193340420723, - -0.010862458497285843, -0.016522813588380814, 0.0117208706215024, 0.00013664802827406675, - 0.02381608635187149, -0.0020943956915289164, -0.006421952974051237, -0.0030576884746551514, - 0.005395730957388878, 0.01301171537488699, -0.010288032703101635, -0.014586545526981354, - 0.019375579431653023, -0.00627673277631402, 0.006399362813681364, 0.013037532567977905, - 0.010223490186035633, -0.004769671242684126, -0.009210177697241306, 0.028476035222411156, - -0.0027027062606066465, -0.021273121237754822, -0.005211785901337862, -0.022021811455488205, - 0.001791047165170312, 0.017813658341765404, -0.008293678052723408, 0.005437683779746294, - -0.014676905237138271, -0.0020588974002748728, 0.002368700224906206, -0.017891108989715576, - 0.011475609615445137, -0.02318357303738594, 0.0045179566368460655, -0.00817104708403349, - 0.010856004431843758, 0.019504664465785027, 0.024229155853390694, -0.009578067809343338, - 0.012585736811161041, -0.00507301976904273, 0.02153129130601883, -0.02444859966635704, - -0.05571286007761955, 0.013244067318737507, -0.010055680759251118, -0.01043002586811781, - -0.017800750210881233, 0.0005921750562265515, -0.009132727049291134, 0.012237208895385265, - -0.004317875951528549, 0.028424402698874474, -0.0067253015004098415, 0.015503046102821827, - 0.02319648116827011, 0.007048012688755989, -0.037460315972566605, -0.000527229392901063, - -0.018471987918019295, 0.03534333035349846, -0.03575640171766281, 0.013734588399529457, - -0.020640607923269272, 0.027804795652627945, 0.005366687197238207, 0.0019491756102070212, - -0.01636791229248047, 0.011133535765111446, 0.02544254995882511, -0.004243652336299419, - -0.007828973233699799, 0.01015249453485012, -0.00934571586549282, 0.004143611527979374, - -0.010565564036369324, 0.027262641116976738, 0.005095609929412603, -0.002623642096295953, - 0.023273931816220284, -0.0247713103890419, -0.0004796295252162963, -0.008726110681891441, - -0.02731427550315857, 0.01026867050677538, 0.021131128072738647, -0.0017732980195432901, - -0.0068156602792441845, 0.0011415908811613917, 0.04461159557104111, -0.0012722888495773077, - -0.00017012930766213685, -0.004314648453146219, 0.020150087773799896, 0.01111417356878519, - 0.012308204546570778, 0.02159583382308483, 0.00822268147021532, 0.027159374207258224, - 0.0013094006571918726, -0.010668831877410412, 0.0020459890365600586, -0.022925402969121933, - -0.015567587688565254, -0.0077515230514109135, -0.006463905330747366, 0.0196466576308012, - -0.018084734678268433, 0.0305930208414793, 0.03573058173060417, 0.023996803909540176, - 0.026772120967507362, 0.0031335256062448025, -0.0195821151137352, -0.009390896186232567, - 0.01142397616058588, -0.039680566638708115, 0.0263203252106905, 0.01160469464957714, - -0.00513110775500536, 0.00045421600225381553, -0.0029528073500841856, -0.015838665887713432, - 0.013398968614637852, -0.02088586799800396, 0.004676084965467453, 0.01902705244719982, - 0.03180641680955887, -0.022447790950536728, 0.011759595945477486, -0.005502225831151009, - 0.00010972180461976677, 0.011172261089086533, -0.014689813368022442, 0.0038757615257054567, - 0.015231967903673649, 0.0029398989863693714, -0.013127891346812248, -0.6497596502304077, - -0.04202990606427193, -0.02342883311212063, -0.0025784624740481377, 0.010507476516067982, - 0.013799130916595459, 0.0072351847775280476, -0.006505857687443495, -0.004824532195925713, - 0.0002545384631957859, 0.011333617381751537, 0.0235062837600708, 0.006060515996068716, - -0.008377582766115665, -0.01794274151325226, -0.01923358626663685, -0.002480035414919257, - 0.011036722920835018, 0.01529651042073965, 0.01897541806101799, -0.020666424185037613, - 0.03596293553709984, -0.021699100732803345, -0.030309034511446953, 0.026191240176558495, - 0.004908437374979258, 0.013018169440329075, -0.011888680048286915, -0.008526029996573925, - -0.006370319053530693, -0.01925940439105034, 0.027391726151108742, 0.013540961779654026, - -0.01400566566735506, 0.032296936959028244, -0.008209772408008575, -0.019194861873984337, - 0.023958079516887665, -0.0029673294629901648, 0.023867720738053322, -0.015193242579698563, - -0.024267882108688354, 0.03851880878210068, 0.014276742935180664, 0.011817683465778828, - 0.01461236272007227, 0.003995164763182402, -0.0012464720057323575, -0.0037595853209495544, - -0.00045219904859550297, -0.001227916101925075, 0.00571198808029294, -0.0001236387324752286, - 0.00313029857352376, -0.012869722209870815, -0.0023477240465581417, 0.0002809604338835925, - -0.03273582458496094, 0.0017958878306671977, 0.0047438545152544975, 0.0010496181203052402, - 0.03172896429896355, -0.02762407809495926, -0.009216631762683392, -0.002060510916635394, - 0.010901183821260929, -0.011817683465778828, 0.017826566472649574, -0.0029786243103444576, - -0.01737477071583271, 0.024926211684942245, 0.007048012688755989, -0.008267860859632492, - -0.001691006706096232, -0.01605810970067978, 0.01240501832216978, 0.02606215514242649, - -0.028192050755023956, 0.033561963587999344, -0.01573539711534977, 0.005273100920021534, - -0.004947162698954344, -0.009119817987084389, -0.006005655508488417, 0.04626387730240822, - -0.0016926202224567533, -0.013108528219163418, -0.006018563639372587, -0.006873748265206814, - 0.011933860369026661, 0.019517572596669197, 0.02539091743528843, -0.0068672941997647285, - -0.03216785192489624, -0.007377177942544222, 0.009113363921642303, -0.009197268635034561, - -0.02375154383480549, -0.003307789796963334, -0.010223490186035633, 0.007196459453552961, - -0.026823753491044044, 0.033536147326231, 0.010023409500718117, 0.0007361848838627338, - -0.016897158697247505, -0.009326353669166565, 0.014405827969312668, 0.03252928704023361, - -0.024616409093141556, 0.0031674103811383247, -0.0077515230514109135, -0.004566363524645567, - 0.0006809206097386777, -0.010817279107868671, -0.023351382464170456, 0.005324734840542078, - 0.022318705916404724, -0.0015377188101410866, -0.029379626736044884, 0.03051557019352913, - -0.0054215481504797935, 0.027391726151108742, -0.006583308335393667, 0.0027156146243214607, - 0.03188386559486389, 0.0022638191003352404, -0.017478037625551224, -0.02058897353708744, - 0.021428022533655167, -0.013618412427604198, -0.025623269379138947, 0.010055680759251118, - -0.024332424625754356, 0.02187981829047203, -0.01462527085095644, -0.002116985386237502, - -0.00023799949849490076, -0.028450218960642815, 0.00724163930863142, -0.03952566534280777, - -0.009881416335701942, -0.013902397826313972, 0.022938311100006104, -0.025791078805923462, - -0.02191854454576969, 0.0031093223951756954, 0.014586545526981354, 0.0005320700583979487, - 0.009087547659873962, 0.004140384495258331, -0.003614365356042981, -0.0075256251730024815, - 0.01570958085358143, 0.004153293091803789, -0.010714011266827583, 0.0036659990437328815, - -0.025171473622322083, -0.0008769676787778735, -0.005918523296713829, 0.0006224291864782572, - 0.022434882819652557, 0.002454218687489629, 0.001158533152192831, 0.005863662343472242, - 0.004676084965467453, 0.007899969816207886, 0.026217056438326836, -0.019491756334900856, - -0.01834290474653244, 0.027443360537290573, 0.0016095220344141126, -0.003933849278837442, - 0.009365078993141651, -0.01570958085358143, 0.026539769023656845, 0.0127341840416193, - -0.002221866510808468, 0.011359433643519878, 0.004950389731675386, -0.009565159678459167, - 0.0024913304951041937, -0.004605088848620653, -0.011772504076361656, 0.022409064695239067, - 0.008158138953149319, 0.006192827597260475, 0.011682145297527313, 0.020046819001436234, - 0.0007345713675022125, 0.006977016106247902, 0.013244067318737507, 0.01667771488428116, - 0.0010463910875841975, 0.005014931783080101, 0.01430256012827158, 0.0225252415984869, - -0.014057300053536892, 0.024267882108688354, 0.041332848370075226, 0.003394921775907278, - 0.01124971266835928, 0.021608741953969002, 0.02119567058980465, -0.0005986292380839586, - -0.026436500251293182, 0.001230336376465857, -0.005247284192591906, 0.02829531766474247, - -0.0028898788150399923, 0.004011299926787615, -0.020446980372071266, -0.02184109389781952, - -0.014663996174931526, -0.0014336444437503815, 0.031160993501544, -0.008629296906292439, - 0.021440932527184486, -0.01123034954071045, -0.015864482149481773, -0.004046798218041658, - -0.0026881841477006674, -0.004637359641492367, 0.0023202935699373484, -0.0012069398071616888, - 0.03696979582309723, -0.014638179913163185, 0.011036722920835018, 0.010520384646952152, - -0.041358668357133865, -0.008732564747333527, -0.008242043666541576, 0.0037369956262409687, - 0.015825757756829262, -0.0013061735080555081, 0.026152515783905983, 0.014818898402154446, - -0.010868912562727928, 0.04009363800287247, -0.009862054139375687, -0.019556298851966858, - -0.001853975816629827, 0.010520384646952152, -0.003920941147953272, 0.00998468417674303, - 0.018549438565969467, 0.05176287516951561, 0.029715247452259064, -0.02481003664433956, - 0.02315775491297245, -0.006615579593926668, 0.01351514458656311, -0.017194053158164024, - -0.026126697659492493, -0.005321507807821035, -0.007131917402148247, 0.017878200858831406, - -0.007867698557674885, -0.004534092266112566, 0.012811634689569473, 0.02610088139772415, - 0.016496995463967323, 0.009371533058583736, 0.007699889130890369, -0.003769266651943326, - -0.011172261089086533, 0.010068588890135288, 0.0008487304439768195, 0.004872939083725214, - 0.012185574509203434, 0.0027979060541838408, -0.008726110681891441, 0.013837856240570545, - -0.007848336361348629, 0.022602692246437073, 0.009371533058583736, -0.0004396940057631582, - 0.005198877304792404, 0.009920141659677029, -0.005137562286108732, -0.02987014874815941, - -0.03931913152337074, 0.02182818576693535, 0.03931913152337074, 0.006247688550502062, - -0.02697865664958954, 0.006944744847714901, 0.016948791220784187, -0.009584522806107998, - -0.02604924701154232, 0.006886656861752272, -0.005866889376193285, -0.005844299681484699, - 0.007951604202389717, -0.019504664465785027, -0.03190968185663223, 0.039112597703933716, - -0.022331614047288895, 8.461083780275658e-05, -0.018575256690382957, -0.005599039141088724, - 0.019246496260166168, 0.0036498636472970247, -0.015812847763299942, 0.029999231919646263, - -0.005540951155126095, -0.011417522095143795, -0.01796855963766575, 0.014818898402154446, - -0.026281598955392838, -0.00946189183741808, -0.015941932797431946, -0.0032222713343799114, - -0.013063348829746246, 0.005253738258033991, 0.028166232630610466, 0.010565564036369324, - -0.012818088755011559, 0.027494993060827255, -0.005663581658154726, -0.014676905237138271, - -0.012340475805103779, -0.007919332943856716, 0.0016571219312027097, 0.08049707859754562, - 0.015528862364590168, -0.014844714663922787, -0.0007809610688127577, -0.00017144031880889088, - 0.0019152909517288208, -0.03562731668353081, -0.010004047304391861, 0.04443087801337242, - -0.01511579193174839, -0.0007507069385610521, 0.021079495549201965, 0.01123034954071045, - -0.003840263234451413, 0.005392503924667835, 0.00931344460695982, 0.0011601467849686742, - -0.008493758738040924, 0.0004965718253515661, -0.03023158386349678, -0.010410662740468979, - 0.011327163316309452, 0.006828568875789642, 0.00609601428732276, -0.020446980372071266, - -0.0314449779689312, 0.012650278396904469, 0.005560313817113638, 0.0069124735891819, - -0.02088586799800396, 0.003194840857759118, 0.006218644790351391, -0.008119413629174232, - 0.0024477643892169, 0.003846717532724142, 0.03864789381623268, -0.025313466787338257, - 0.03245183825492859, -0.01381203904747963, -0.0276498943567276, 0.013786221854388714, - -0.0023896764032542706, 0.016522813588380814, -0.02987014874815941, 0.023687001317739487, - -0.015154517255723476, -0.001239210949279368, 0.036866527050733566, -0.010255761444568634, - -0.015257785096764565, 0.002878583734855056, 0.012082306668162346, -0.028476035222411156, - -0.014960890635848045, -0.021376390010118484, 0.034543007612228394, 0.0030786648858338594, - -0.016161376610398293, -0.0196466576308012, 0.004156520124524832, -0.01190158911049366, - -0.015554679557681084, -0.016187192872166634, -0.011985493823885918, 0.01643245480954647, - -0.005185968708246946, -0.0032238848507404327, -0.01576121523976326, -0.013670045882463455, - 0.004563136491924524, 0.02150547318160534, -0.01043002586811781, -0.045127931982278824, - 0.0004372736730147153, -0.0027962925378233194, 0.004075842443853617, 0.010765645653009415, - -0.015231967903673649, -0.011946768499910831, 0.021066587418317795, 0.005286009516566992, - -0.03474954143166542, -0.010158948600292206, -0.01029448676854372, 0.004417916294187307, - -0.006744664162397385, -0.006344501860439777, -0.002054056851193309, -0.002168619306758046, - 0.014560729265213013, 0.004611542914062738, 0.015180334448814392, -0.005156924948096275, - -0.017813658341765404, -0.006031472235918045, 0.016845524311065674, -0.005037521943449974, - 0.039422400295734406, -0.004062933847308159, -0.015128700993955135, -0.0006559105240739882, - -0.032968174666166306, 0.004950389731675386, -0.008913283236324787, -0.02253814972937107, - 0.009603885002434254, 0.014767264015972614, 0.019504664465785027, 0.005453818943351507, - -0.02573944441974163, 0.0010125063126906753, -0.014405827969312668, 0.019866101443767548, - -0.003180318744853139, 0.01709078438580036, 0.016935883089900017, 0.015825757756829262, - -0.0017200506990775466, -0.020072637125849724, -0.011920951306819916, 0.004050025250762701, - -0.028450218960642815, 0.017878200858831406, 0.013747496530413628, -0.013670045882463455, - 0.02415170520544052, 0.004766444209963083, -0.007202913984656334, -0.0029737837612628937, - -0.0019136774353682995, -0.0157224889844656, 0.011701507493853569, -0.020679334178566933, - -0.021105311810970306, -0.024693859741091728, -0.016858432441949844, -0.010139585472643375, - 0.012456651777029037, -0.00882937852293253, -0.01062365248799324, -0.024538958445191383, - -0.009287628345191479, -0.015580496750772, -0.00740299466997385, -0.021776551380753517, - -0.028553485870361328, -0.011540152132511139, -0.007596621289849281, -0.00773216038942337, - 0.01576121523976326, -0.02438405714929104, 0.013211796060204506, -0.01869143173098564, - -0.015541771426796913, -0.007557895965874195, -0.03570476546883583, -0.022718867287039757, - 0.0005187582573853433, 0.03206458315253258, 0.01999518647789955, 0.043088398873806, - -0.005715215113013983, 0.011469155550003052, 0.03885442763566971, 0.007486899849027395, - -0.0009269879083149135, 0.009616793133318424, 0.014831806533038616, -0.023415924981236458, - 0.005231148563325405, 0.028527669608592987, 0.02857930399477482, 0.006977016106247902, - 0.012630916200578213, 0.0018927011406049132, 0.010165402665734291, 0.005931431893259287, - 0.00649617612361908, -0.0051117450930178165, -0.03627273812890053, -0.02311903052031994, - -0.011056085117161274, -0.010197673924267292, -0.01093345507979393, 0.0066413963213562965, - 0.0019201316172257066, 0.030670471489429474, 0.023325564339756966, 0.007261001970618963, - 0.009158543311059475, 0.024822944775223732, -0.007899969816207886, 0.008622842840850353, - 0.004082296509295702, 0.00995241291821003, -0.007119008805602789, -0.014999615959823132, - -0.0014578477712348104, 0.010823733173310757, 0.015515954233705997, 0.007254547439515591, - 0.002862448338419199, 0.01674225740134716, -0.004327557049691677, -0.007790248375386, - 0.010668831877410412, -0.03384594991803169, 0.011778958141803741, 0.011333617381751537, - -0.011862863786518574, -0.015851574018597603, -0.016509905457496643, -0.0012739024823531508, - -0.0024897167459130287, -0.001184350112453103, -0.005463500507175922, 0.016251735389232635, - 0.013437693938612938, -0.013231159187853336, -0.025300556793808937, -0.011482064612209797, - -0.008274314925074577, 0.022279981523752213, -0.0004961684462614357, 0.03580803424119949, - 0.0195821151137352, -0.0008398558711633086, -0.0074417199939489365, 0.009261811152100563, - -0.0034271928016096354, 0.00342073873616755, 0.024319514632225037, 0.004214608110487461, - 0.00981042068451643, -0.013147254474461079, -0.00031181969097815454, -0.006860840134322643, - -0.034207385033369064, -0.01400566566735506, -0.012895539402961731, 0.006744664162397385, - 0.00039612798718735576, -0.0035465960390865803, -0.032942358404397964, -0.012869722209870815, - 0.024242063984274864, -0.025158565491437912, -0.008784199133515358, -0.03415575250983238, - -0.03141916170716286, 0.014392918907105923, -0.002097622724249959, -0.000839049112983048, - 0.003014122601598501, -0.01479308120906353, 0.0020266263745725155, 0.0022202529944479465, - -0.033975034952163696, 0.01805891841650009, 0.006622033659368753, -0.001002018223516643, - 0.009797511622309685, -0.012140395119786263, -0.017219869419932365, -0.00237354077398777, - 0.005576449446380138, -0.019491756334900856, 0.0051149725914001465, -0.005611947737634182, - 0.029198909178376198, -0.01511579193174839, -0.010655923746526241, 0.006776934955269098, - 0.002171846339479089, 0.01703915186226368, 0.017232777550816536, 0.001343285315670073, - -0.004950389731675386, -0.011346525512635708, 0.017620030790567398, 0.020782601088285446, - 0.003982256166636944, 0.01191449724137783, -0.005027840379625559, -0.006463905330747366, - -0.0314449779689312, -0.006305776536464691, -0.000754337408579886, 0.004314648453146219, - -0.029327992349863052, -0.031031908467411995, -0.021673284471035004, 0.017219869419932365, - 0.011333617381751537, 0.01044293399900198, -0.0018039555288851261, -0.025197289884090424, - 0.0283469520509243, -0.021621650084853172, 0.005582903511822224, -0.0006430020439438522, - 0.0037434499245136976, -0.012676095589995384, 0.002636550460010767, 0.008151684887707233, - -0.028811655938625336, 0.028398584574460983, -0.021298939362168312, -0.013850764371454716, - -0.017581306397914886, -0.0055441781878471375, -0.011985493823885918, -0.004221062641590834, - -0.02513274736702442, -0.02052443102002144, 0.009474800899624825, 0.0026542996056377888, - -0.018575256690382957, -0.008822924457490444, 0.013386060483753681, 0.012017765082418919, - 0.007196459453552961, 0.0005288429674692452, -0.020072637125849724, -0.029353810474276543, - 0.013244067318737507, -0.012456651777029037, -0.015193242579698563, -0.026255782693624496, - -0.016509905457496643, -0.004446960054337978, 0.005118199624121189, 0.02095041051506996, - 0.012488923035562038, -0.01931103691458702, 0.023299748077988625, -0.006218644790351391, - -0.009752332232892513, 0.0035433690063655376, -0.0077192517928779125, -0.013360243290662766, - 0.019039960578083992, 0.008300132118165493, 0.003927395213395357, 0.007654709741473198, - -0.014831806533038616, -0.006486495025455952, -0.0009189201518893242, -0.02641068398952484, - -0.024629319086670876, -0.022292889654636383, 0.031651515513658524, -0.00046631766599603, - -0.0021831411868333817, -0.012940718792378902, 0.020472798496484756, -0.031935498118400574, - -0.02639777585864067, -0.003507870715111494, 0.02346755750477314, 0.027185190469026566, - 0.013747496530413628, 0.00900364201515913, 0.02380317822098732, -0.008074234239757061, - 0.0023832221049815416, -0.0022121851798146963, -0.0015312646282836795, 0.027778979390859604, - -0.006238007452338934, -1.4912786355125718e-05, -0.005766849033534527, -0.019039960578083992, - 0.007119008805602789, 0.015051250346004963, -0.0059669301845133305, -0.029069824144244194, - -0.010959272272884846, -0.01302462350577116, 0.004521183669567108, -0.02504238858819008, - 0.009016551077365875, -0.005586130544543266, -0.0009035913390107453, 0.014457461424171925, - -0.010288032703101635, 0.011288437992334366, -0.025920163840055466, -0.013876581564545631, - -0.012417926453053951, -0.0012964921770617366, 0.011494972743093967, -0.002906014211475849, - 0.011010905727744102, -0.0009181133355014026, 0.01075273659080267, 0.01736186258494854, - -0.030980274081230164, 0.015657946467399597, 0.015877390280365944, 0.008235589601099491, - 0.007757977116852999, -0.0011859636288136244, 0.013592595234513283, 0.003601456992328167, - -0.013398968614637852, -0.029198909178376198, -0.008267860859632492, 0.013644229620695114, - -0.019194861873984337, 0.03888024389743805, -0.01064301561564207, 0.012669641524553299, - -0.024293698370456696, -0.021415114402770996, -0.00869383942335844, 0.019879009574651718, - -0.017103692516684532, 0.020434072241187096, -0.00017426404519937932, 0.0034723724238574505, - 0.004221062641590834, -0.005666808690875769, 0.002405812032520771, 0.003073824103921652, - -0.014883439987897873, 0.015193242579698563, 0.00998468417674303, -0.014896349050104618, - 0.02798551507294178, -0.023222297430038452, -0.021428022533655167, 0.0036240466870367527, - 0.012837450951337814, 0.004476004280149937, -0.005924977362155914, 0.2447441667318344, - -0.01763293892145157, 0.020072637125849724, -0.0018394538201391697, -0.027494993060827255, - 0.010468751192092896, 0.010255761444568634, -0.017749115824699402, -0.0016587355639785528, - 0.015696672722697258, -0.00962970219552517, 0.030309034511446953, -0.0195821151137352, - 0.010417117737233639, -0.003595002694055438, -0.004214608110487461, -0.024358240887522697, - -0.03224530071020126, -0.012527648359537125, -0.027856430038809776, 0.006170237902551889, - 0.001671643927693367, -0.008358219638466835, -0.03090282343327999, 0.03707306087017059, - 0.013373151421546936, -0.023377198725938797, -0.014418736100196838, 0.005747486371546984, - -0.011991947889328003, -0.014070208184421062, 0.001099638408049941, -0.0013360243756324053, - 0.016910066828131676, 0.01707787625491619, -0.00313029857352376, -0.0020492160692811012, - 0.0007386052166111767, 0.013553869910538197, -0.00044695500400848687, 0.0018717249622568488, - -0.016832616180181503, -0.01173377875238657, -0.028501853346824646, -0.01271482091397047, - 0.024242063984274864, -0.005808801390230656, -0.03531751409173012, -0.03252928704023361, - 0.013734588399529457, -0.0195821151137352, -0.009997593238949776, 0.027520811185240746, - 0.036143653094768524, 0.003267450723797083, 0.006518766283988953, -0.0072997272945940495, - -0.006789843551814556, 0.021144038066267967, 0.02116985432803631, -0.007325544022023678, - 0.009377987124025822, -0.017258593812584877, 0.003991937264800072, -0.0005449785385280848, - 0.04344983398914337, -0.05134980380535126, 0.02317066304385662, 0.02025335468351841, - -0.020408255979418755, 0.0026155742816627026, 0.0022121851798146963, -0.027520811185240746, - 0.025339283049106598, -0.038802795112133026, -0.0064768134616315365, 0.051607973873615265, - 0.024926211684942245, -0.00045098888222128153, 0.02089877612888813, 0.003788629313930869, - -0.014457461424171925, 0.02218962088227272, 0.0014731766423210502, -0.018394537270069122, - -0.014870531857013702, 0.007054466754198074, -0.02989596500992775, 0.02030498906970024, - 0.006873748265206814, -0.0015982271870598197, -0.03503352776169777, -0.0025478049647063017, - 0.0063025495037436485, 0.01412184163928032, 0.006712392903864384, 0.0070931920781731606, - 0.007919332943856716, 0.013902397826313972, -0.007906423881649971, -0.042546242475509644, - -0.0010165402200073004, 0.023338474333286285, 0.018562348559498787, -0.003417511470615864, - 0.0301799513399601, -0.000394514441723004, -0.001199678867124021, 0.003707951633259654, - -0.04270114377140999, -0.02899237349629402, -0.0009205336682498455, 0.025971796363592148, - 0.004337238613516092, -0.0028592210728675127, 0.023390106856822968, -0.008622842840850353, - -0.010526838712394238, 0.019788650795817375, -0.00715128006413579, 0.0074417199939489365, - -0.0314449779689312, -0.016561537981033325, 0.013347335159778595, -0.0205631572753191, - -0.031031908467411995, -0.04208153858780861, -0.012508286163210869, -0.03668580949306488, - -0.022292889654636383, 0.026152515783905983, -0.011933860369026661, -0.01028157863765955, - 0.00835176557302475, -0.012914901599287987, -0.024319514632225037, 0.01794274151325226, - -0.0013941123615950346, -0.00522146699950099, -0.006505857687443495, -0.009713606908917427, - -0.011398158967494965, -0.02439696714282036, 0.00038483311072923243, -0.010765645653009415, - -0.019749924540519714, 0.02181527577340603, 0.0009253743337467313, 0.010959272272884846, - -0.03056720457971096, 0.0006821308052167296, -0.007686980534344912, -0.001215007621794939, - 0.00531182624399662, 0.012605099007487297, -0.007570804562419653, -0.029715247452259064, - -0.01560631301254034, -0.020085545256733894, 0.010985089465975761, -0.03900932893157005, - 0.007370723877102137, 0.03949984908103943, -0.02126021310687065, -0.004869712051004171, - 0.005357005633413792, -0.16347257792949677, -0.0013287633191794157, 0.012630916200578213, - -0.019401397556066513, 0.021789459511637688, 0.004505048040300608, 0.008564755320549011, - -0.004566363524645567, 0.0018636571476235986, 0.01836872100830078, 0.013140799477696419, - 0.00724163930863142, -0.027107739821076393, -0.023854810744524002, 0.001528037479147315, - 0.003107708878815174, 0.010836642235517502, -0.00046268716687336564, 0.027572443708777428, - 0.007648255210369825, 0.02598470449447632, -0.01207585260272026, 0.007396540604531765, - 0.001297299051657319, 0.015825757756829262, -0.005305372178554535, -0.002112144837155938, - 0.008164593018591404, 0.016509905457496643, -0.013928215019404888, -0.006796297617256641, - -0.03278745710849762, 0.026462318375706673, -0.015541771426796913, 0.03085119090974331, - -0.004943935666233301, 0.005905614700168371, -0.030412303283810616, -0.008977825753390789, - 0.0019636976066976786, 0.013282792642712593, 0.05359587445855141, 0.011778958141803741, - -0.00019776145927608013, -0.014470369555056095, 0.00946189183741808, 0.013218250125646591, - -0.017581306397914886, 0.0020266263745725155, 0.0022186394780874252, 0.0328390896320343, - -0.038079921156167984, 0.014431644231081009, 0.001349739613942802, 0.03640182316303253, - 0.002317066304385662, -0.006686575710773468, 0.010404208675026894, 0.0036272737197577953, - -0.009203723631799221, -0.023648276925086975, -0.005589358042925596, 0.02899237349629402, - -0.0015231968136504292, 0.007480445317924023, 0.0013473192229866982, -0.030644655227661133, - -0.014831806533038616, -0.03503352776169777, -0.002605892950668931, 0.000569585245102644, - -0.010636560618877411, 0.02734009176492691, -0.014263834804296494, -0.007286818698048592, - 0.00949416309595108, -0.03689234331250191, 0.00571198808029294, 0.0045502278953790665, - 0.025997614488005638, -0.011030268855392933, 0.026565585285425186, -0.0040887510403990746, - -0.003862852929159999, 0.004866485018283129, -0.022718867287039757, 0.001741026877425611, - 0.016600264236330986, -0.013902397826313972, -0.02570072002708912, 0.01400566566735506, - -0.029198909178376198, -0.028166232630610466, -0.0003967330849263817, 0.008810015395283699, - -0.0039306222461164, 0.005750713404268026, 0.01546432077884674, -0.0005114972591400146, - -0.040377624332904816, -0.0010601063258945942, 0.002492944011464715, -0.00755144190043211, - 0.010062134824693203, 0.03557568043470383, 0.026242874562740326, -0.017620030790567398, - -0.0014981867279857397, 0.019504664465785027, 0.014031482860445976, -0.03642763942480087, - 0.01123034954071045, 0.015180334448814392, 0.02481003664433956, -0.01612265035510063, - 0.025636177510023117, 0.007344906684011221, -0.034284837543964386, 0.0032981084659695625, - -0.014689813368022442, 0.06758863478899002, 0.007603075820952654, 0.002328361151739955, - 0.015812847763299942, -0.01612265035510063, -0.0006869714707136154, -0.08767417818307877, - -0.023235205560922623, 0.006931836251169443, 0.01799437589943409, 0.0069899242371320724, - 0.033019810914993286, 0.00047761257155798376, 0.0013642616104334593, -0.031160993501544, - 0.03221948444843292, -0.016019383445382118, -0.04499885067343712, -0.025313466787338257, - -0.019788650795817375, -0.010836642235517502, -0.016329186037182808, -0.00853248406201601, - -0.02151838317513466, -0.03980965167284012, 0.03671162575483322, -0.009997593238949776, - -0.006789843551814556, 0.018213819712400436, -0.012095215730369091, -0.014405827969312668, - -0.006286413874477148, -0.03123844414949417, 0.009429621510207653, 0.017503855749964714, - 0.012108123861253262, -4.356601129984483e-05, -0.0348011739552021, -0.002810814417898655, - -0.03082537278532982, 0.018239635974168777, 0.0008640591986477375, -0.01827836222946644, - -0.003183546010404825, 0.010630106553435326, 0.013450603000819683, -0.004279150627553463, - -0.009797511622309685, 0.026927022263407707, -0.004175882786512375, -0.003307789796963334, - -0.004472777247428894, -0.01796855963766575, 0.023712817579507828, 0.01350223645567894, - -0.016148468479514122, -0.01737477071583271, -0.0007398154120892286, -0.0228737685829401, - 0.007306181360036135, 0.010836642235517502, -0.015167426317930222, 0.023996803909540176, - 0.028140416368842125, 0.0038047649431973696, -0.0025219880044460297, 0.018717249855399132, - 0.008797107264399529, -0.030773740261793137, 0.01399275753647089, 0.011824138462543488, - 0.0018394538201391697, -0.007854790426790714, -0.01559340488165617, 0.018910875543951988, - -0.02610088139772415, 0.012321113608777523, 0.01734895445406437, -0.014947982504963875, - 0.008455033414065838, 0.0015207765391096473, 0.0010835027787834406, -0.00788060761988163, - 0.020730966702103615, 0.01933685503900051, -0.011966130696237087, 0.0008495372021570802, - -0.0061896005645394325, -0.002718841889873147, -0.008584117516875267, 0.023983895778656006, - 0.0015828984323889017, -0.024345332756638527, -0.00538604985922575, 0.007286818698048592, - -0.004459868650883436, 0.008274314925074577, 0.02669467031955719, 0.019052868708968163, - -0.02505529671907425, -0.023687001317739487, 0.010739828459918499, -0.0048051695339381695, - 0.003814446274191141, 0.011269074864685535, 0.02124730497598648, -0.0008007271680980921, - 0.003969347570091486, -0.06825987249612808, 0.0301799513399601, 0.005937885958701372, - -0.01993064396083355, 0.024306606501340866, -0.007448174525052309, 0.006547810044139624, - -0.010288032703101635, -0.003866080194711685, 0.02793388068675995, -0.02927635982632637, - -0.004146839026361704, -0.009526434354484081, -0.008668022230267525, -0.013670045882463455, - -0.004711583256721497, 0.026255782693624496, 0.0005409446312114596, 0.005831391084939241, - 0.004127476364374161, 0.019775742664933205, -0.0039467578753829, 0.007202913984656334, - 0.02279631793498993, 0.016600264236330986, -0.015670856460928917, -0.010307395830750465, - 0.006121831480413675, -0.04267532750964165, 0.0009592590504325926, -0.007990329526364803, - -0.012676095589995384, -0.015645038336515427, 0.01092054694890976, -0.0012835838133469224, - 0.008609934709966183, 0.017852382734417915, -0.006463905330747366, 0.003343287855386734, - 0.05364750698208809, -0.009384441189467907, -0.029405444860458374, 0.0296119786798954, - -0.0005933851934969425, -0.022292889654636383, -0.0025590998120605946, 0.0012037127744406462, - 0.0017474810592830181, 0.011056085117161274, 0.013095620088279247, -0.003869307227432728, - 0.02896655723452568, -0.018239635974168777, -0.0061605568043887615, -0.006505857687443495, - -0.005495771765708923, 0.0036595449782907963, 0.004082296509295702, 0.019220678135752678, - -0.008151684887707233, 0.02155710756778717, 0.01827836222946644, -0.015993567183613777, - 0.005098836962133646, 0.018252545967698097, 0.014767264015972614, -0.014444553293287754, - 0.012760000303387642, 0.0266688521951437, -0.027727345004677773, 0.0003465111367404461, - -0.020989136770367622, 0.010223490186035633, 0.016935883089900017, -0.00011103282304247841, - 0.01400566566735506, 0.00866156816482544, 0.002312225755304098, -0.03250347077846527, - 0.015515954233705997, 0.02088586799800396, -0.010339667089283466, -0.004688993562012911, - -0.00245583220385015, 0.036763258278369904, -0.0008769676787778735, 0.027469176799058914, - 0.007338452618569136, 0.023970987647771835, 0.016161376610398293, 0.019465940073132515, - 0.009281174279749393, 0.005153697915375233, -0.012985898181796074, 0.0037628125865012407, - 0.0042113810777664185, 0.0026897978968918324, 0.0009891098598018289, 0.02446150779724121, - 0.020330805331468582, 0.029044007882475853, -0.010868912562727928, 0.02703028917312622, - -0.030489753931760788, -0.02767571248114109, 0.031703148037195206, -0.023906445130705833, - -0.04159101843833923, 0.0054215481504797935, 0.020666424185037613, 0.0283469520509243, - 0.02315775491297245, -0.011991947889328003, 0.017878200858831406, -0.042623694986104965, - 0.021724916994571686, 0.013837856240570545, -0.018097642809152603, -0.02572653628885746, - 0.03312307596206665, -0.006338047794997692, 0.0002837841457221657, 0.00021258600463625044, - -0.011843500658869743, 0.014250926673412323, 0.011365888640284538, 0.026927022263407707, - -0.03513679653406143, -0.013211796060204506, -0.017142418771982193, -0.016006475314497948, - -0.013850764371454716, -0.008003237657248974, -0.012101669795811176, 0.0012488922802731395, - -0.016858432441949844, -0.01993064396083355, 0.009991138242185116, -0.018162185326218605, - 0.056435734033584595, 0.008810015395283699, -0.017465129494667053, 0.0047438545152544975, - -0.0036789076402783394, -0.0016829388914629817, 0.024848761036992073, 0.008926191367208958, - -0.020162995904684067, -0.020188812166452408, 0.02215089648962021, -0.0025332828518003225, - -0.00715128006413579, -0.029766879975795746, 0.0017394133610650897, 0.009842691011726856, - 0.005924977362155914, 0.006228325888514519, -0.021298939362168312, -0.010823733173310757, - 0.020679334178566933, 0.0006950392271392047, -0.003107708878815174, -0.002906014211475849, - 0.0032787458039820194, -0.0032497018110007048, 0.023364290595054626, -0.0027285232208669186, - -0.004514729604125023, -0.039422400295734406, -0.0017297320300713181, 0.0022460699547082186, - -0.024706769734621048, -0.016213010996580124, 0.008758381940424442, -0.03495607525110245, - -0.002391289919614792, -0.00020562754070851952, 0.031031908467411995, 0.0002809604338835925, - -0.004995569121092558, 0.022938311100006104, -0.006738209631294012, -0.014263834804296494, - 0.011553061194717884, 0.0016296915709972382, -0.014083116315305233, -0.004869712051004171, - -0.016355004161596298]], "includeMetadata": true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - python-client-2.2.2 (requests:2.31.0, urllib3:1.26.16) - method: POST - uri: https://langchain-retrieval-74ce8fe.svc.us-west1-gcp-free.pinecone.io/query - response: - body: - string: "{\"results\":[],\"matches\":[{\"id\":\"35391d1d-0466-4d92-b457-35f673e516eb\",\"score\":0.901216626,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}}],\"namespace\":\"\"}" - headers: - content-length: - - '1821' - content-type: - - application/json - date: - - Mon, 03 Jul 2023 21:40:09 GMT - grpc-status: - - '0' - server: - - envoy - x-envoy-upstream-service-time: - - '2' - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain.yaml b/tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain.yaml deleted file mode 100644 index b361242f1fe..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain.yaml +++ /dev/null @@ -1,861 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.31.0 - method: GET - uri: https://controller.us-west1-gcp-free.pinecone.io/actions/whoami - response: - body: - string: '{"project_name":"74ce8fe","user_label":"default","user_name":"5c27a1f"} - - ' - headers: - content-length: - - '72' - content-type: - - application/json; charset=UTF-8 - date: - - Mon, 26 Jun 2023 17:39:56 GMT - server: - - envoy - x-envoy-upstream-service-time: - - '0' - status: - code: 200 - message: OK -- request: - body: '{"input": ["Who was Alan Turing?"], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '64' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"embedding\",\n \"index\": 0,\n \"embedding\": \"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\"\n - \ }\n ],\n \"model\": \"text-embedding-ada-002-v2\",\n \"usage\": {\n - \ \"prompt_tokens\": 5,\n \"total_tokens\": 5\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7dd73b87ef9d17d9-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 26 Jun 2023 17:39:56 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '18' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '12500' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '12495' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 24ms - x-request-id: - - 5840e9cab42d0d2b9022025abe80b691 - status: - code: 200 - message: OK -- request: - body: '{"topK": 4, "vector": [[0.004753536079078913, -0.030386485159397125, -0.008732564747333527, - -0.021428022533655167, 0.004605088848620653, 0.012334021739661694, -0.039680566638708115, - 0.009306990541517735, -0.023958079516887665, -0.025313466787338257, 0.03141916170716286, - 0.029715247452259064, 0.010436479933559895, -0.00868093129247427, 0.009287628345191479, - 0.007745068520307541, 0.013347335159778595, 0.015231967903673649, 0.015541771426796913, - 0.0022654326166957617, -0.02382899448275566, 0.00788060761988163, -0.0001955428160727024, - -0.010455843061208725, -0.011359433643519878, -0.0021460293792188168, 0.023854810744524002, - -0.022008903324604034, 0.021156946197152138, -0.0353691466152668, 0.019156135618686676, - -0.005947567522525787, -0.02798551507294178, -0.013734588399529457, -0.03082537278532982, - 0.009261811152100563, 0.015477228909730911, 0.025274740532040596, 0.013579687103629112, - -0.012805180624127388, 0.03206458315253258, 0.028501853346824646, 0.004808396566659212, - -0.013915306888520718, -0.010042772628366947, 0.010701103135943413, 0.0031335256062448025, - -0.002497784560546279, -0.00900364201515913, 0.009649064391851425, 0.009048821404576302, - 0.0234417412430048, 0.011727324686944485, -0.019762832671403885, -0.04146193340420723, - -0.010862458497285843, -0.016522813588380814, 0.0117208706215024, 0.00013664802827406675, - 0.02381608635187149, -0.0020943956915289164, -0.006421952974051237, -0.0030576884746551514, - 0.005395730957388878, 0.01301171537488699, -0.010288032703101635, -0.014586545526981354, - 0.019375579431653023, -0.00627673277631402, 0.006399362813681364, 0.013037532567977905, - 0.010223490186035633, -0.004769671242684126, -0.009210177697241306, 0.028476035222411156, - -0.0027027062606066465, -0.021273121237754822, -0.005211785901337862, -0.022021811455488205, - 0.001791047165170312, 0.017813658341765404, -0.008293678052723408, 0.005437683779746294, - -0.014676905237138271, -0.0020588974002748728, 0.002368700224906206, -0.017891108989715576, - 0.011475609615445137, -0.02318357303738594, 0.0045179566368460655, -0.00817104708403349, - 0.010856004431843758, 0.019504664465785027, 0.024229155853390694, -0.009578067809343338, - 0.012585736811161041, -0.00507301976904273, 0.02153129130601883, -0.02444859966635704, - -0.05571286007761955, 0.013244067318737507, -0.010055680759251118, -0.01043002586811781, - -0.017800750210881233, 0.0005921750562265515, -0.009132727049291134, 0.012237208895385265, - -0.004317875951528549, 0.028424402698874474, -0.0067253015004098415, 0.015503046102821827, - 0.02319648116827011, 0.007048012688755989, -0.037460315972566605, -0.000527229392901063, - -0.018471987918019295, 0.03534333035349846, -0.03575640171766281, 0.013734588399529457, - -0.020640607923269272, 0.027804795652627945, 0.005366687197238207, 0.0019491756102070212, - -0.01636791229248047, 0.011133535765111446, 0.02544254995882511, -0.004243652336299419, - -0.007828973233699799, 0.01015249453485012, -0.00934571586549282, 0.004143611527979374, - -0.010565564036369324, 0.027262641116976738, 0.005095609929412603, -0.002623642096295953, - 0.023273931816220284, -0.0247713103890419, -0.0004796295252162963, -0.008726110681891441, - -0.02731427550315857, 0.01026867050677538, 0.021131128072738647, -0.0017732980195432901, - -0.0068156602792441845, 0.0011415908811613917, 0.04461159557104111, -0.0012722888495773077, - -0.00017012930766213685, -0.004314648453146219, 0.020150087773799896, 0.01111417356878519, - 0.012308204546570778, 0.02159583382308483, 0.00822268147021532, 0.027159374207258224, - 0.0013094006571918726, -0.010668831877410412, 0.0020459890365600586, -0.022925402969121933, - -0.015567587688565254, -0.0077515230514109135, -0.006463905330747366, 0.0196466576308012, - -0.018084734678268433, 0.0305930208414793, 0.03573058173060417, 0.023996803909540176, - 0.026772120967507362, 0.0031335256062448025, -0.0195821151137352, -0.009390896186232567, - 0.01142397616058588, -0.039680566638708115, 0.0263203252106905, 0.01160469464957714, - -0.00513110775500536, 0.00045421600225381553, -0.0029528073500841856, -0.015838665887713432, - 0.013398968614637852, -0.02088586799800396, 0.004676084965467453, 0.01902705244719982, - 0.03180641680955887, -0.022447790950536728, 0.011759595945477486, -0.005502225831151009, - 0.00010972180461976677, 0.011172261089086533, -0.014689813368022442, 0.0038757615257054567, - 0.015231967903673649, 0.0029398989863693714, -0.013127891346812248, -0.6497596502304077, - -0.04202990606427193, -0.02342883311212063, -0.0025784624740481377, 0.010507476516067982, - 0.013799130916595459, 0.0072351847775280476, -0.006505857687443495, -0.004824532195925713, - 0.0002545384631957859, 0.011333617381751537, 0.0235062837600708, 0.006060515996068716, - -0.008377582766115665, -0.01794274151325226, -0.01923358626663685, -0.002480035414919257, - 0.011036722920835018, 0.01529651042073965, 0.01897541806101799, -0.020666424185037613, - 0.03596293553709984, -0.021699100732803345, -0.030309034511446953, 0.026191240176558495, - 0.004908437374979258, 0.013018169440329075, -0.011888680048286915, -0.008526029996573925, - -0.006370319053530693, -0.01925940439105034, 0.027391726151108742, 0.013540961779654026, - -0.01400566566735506, 0.032296936959028244, -0.008209772408008575, -0.019194861873984337, - 0.023958079516887665, -0.0029673294629901648, 0.023867720738053322, -0.015193242579698563, - -0.024267882108688354, 0.03851880878210068, 0.014276742935180664, 0.011817683465778828, - 0.01461236272007227, 0.003995164763182402, -0.0012464720057323575, -0.0037595853209495544, - -0.00045219904859550297, -0.001227916101925075, 0.00571198808029294, -0.0001236387324752286, - 0.00313029857352376, -0.012869722209870815, -0.0023477240465581417, 0.0002809604338835925, - -0.03273582458496094, 0.0017958878306671977, 0.0047438545152544975, 0.0010496181203052402, - 0.03172896429896355, -0.02762407809495926, -0.009216631762683392, -0.002060510916635394, - 0.010901183821260929, -0.011817683465778828, 0.017826566472649574, -0.0029786243103444576, - -0.01737477071583271, 0.024926211684942245, 0.007048012688755989, -0.008267860859632492, - -0.001691006706096232, -0.01605810970067978, 0.01240501832216978, 0.02606215514242649, - -0.028192050755023956, 0.033561963587999344, -0.01573539711534977, 0.005273100920021534, - -0.004947162698954344, -0.009119817987084389, -0.006005655508488417, 0.04626387730240822, - -0.0016926202224567533, -0.013108528219163418, -0.006018563639372587, -0.006873748265206814, - 0.011933860369026661, 0.019517572596669197, 0.02539091743528843, -0.0068672941997647285, - -0.03216785192489624, -0.007377177942544222, 0.009113363921642303, -0.009197268635034561, - -0.02375154383480549, -0.003307789796963334, -0.010223490186035633, 0.007196459453552961, - -0.026823753491044044, 0.033536147326231, 0.010023409500718117, 0.0007361848838627338, - -0.016897158697247505, -0.009326353669166565, 0.014405827969312668, 0.03252928704023361, - -0.024616409093141556, 0.0031674103811383247, -0.0077515230514109135, -0.004566363524645567, - 0.0006809206097386777, -0.010817279107868671, -0.023351382464170456, 0.005324734840542078, - 0.022318705916404724, -0.0015377188101410866, -0.029379626736044884, 0.03051557019352913, - -0.0054215481504797935, 0.027391726151108742, -0.006583308335393667, 0.0027156146243214607, - 0.03188386559486389, 0.0022638191003352404, -0.017478037625551224, -0.02058897353708744, - 0.021428022533655167, -0.013618412427604198, -0.025623269379138947, 0.010055680759251118, - -0.024332424625754356, 0.02187981829047203, -0.01462527085095644, -0.002116985386237502, - -0.00023799949849490076, -0.028450218960642815, 0.00724163930863142, -0.03952566534280777, - -0.009881416335701942, -0.013902397826313972, 0.022938311100006104, -0.025791078805923462, - -0.02191854454576969, 0.0031093223951756954, 0.014586545526981354, 0.0005320700583979487, - 0.009087547659873962, 0.004140384495258331, -0.003614365356042981, -0.0075256251730024815, - 0.01570958085358143, 0.004153293091803789, -0.010714011266827583, 0.0036659990437328815, - -0.025171473622322083, -0.0008769676787778735, -0.005918523296713829, 0.0006224291864782572, - 0.022434882819652557, 0.002454218687489629, 0.001158533152192831, 0.005863662343472242, - 0.004676084965467453, 0.007899969816207886, 0.026217056438326836, -0.019491756334900856, - -0.01834290474653244, 0.027443360537290573, 0.0016095220344141126, -0.003933849278837442, - 0.009365078993141651, -0.01570958085358143, 0.026539769023656845, 0.0127341840416193, - -0.002221866510808468, 0.011359433643519878, 0.004950389731675386, -0.009565159678459167, - 0.0024913304951041937, -0.004605088848620653, -0.011772504076361656, 0.022409064695239067, - 0.008158138953149319, 0.006192827597260475, 0.011682145297527313, 0.020046819001436234, - 0.0007345713675022125, 0.006977016106247902, 0.013244067318737507, 0.01667771488428116, - 0.0010463910875841975, 0.005014931783080101, 0.01430256012827158, 0.0225252415984869, - -0.014057300053536892, 0.024267882108688354, 0.041332848370075226, 0.003394921775907278, - 0.01124971266835928, 0.021608741953969002, 0.02119567058980465, -0.0005986292380839586, - -0.026436500251293182, 0.001230336376465857, -0.005247284192591906, 0.02829531766474247, - -0.0028898788150399923, 0.004011299926787615, -0.020446980372071266, -0.02184109389781952, - -0.014663996174931526, -0.0014336444437503815, 0.031160993501544, -0.008629296906292439, - 0.021440932527184486, -0.01123034954071045, -0.015864482149481773, -0.004046798218041658, - -0.0026881841477006674, -0.004637359641492367, 0.0023202935699373484, -0.0012069398071616888, - 0.03696979582309723, -0.014638179913163185, 0.011036722920835018, 0.010520384646952152, - -0.041358668357133865, -0.008732564747333527, -0.008242043666541576, 0.0037369956262409687, - 0.015825757756829262, -0.0013061735080555081, 0.026152515783905983, 0.014818898402154446, - -0.010868912562727928, 0.04009363800287247, -0.009862054139375687, -0.019556298851966858, - -0.001853975816629827, 0.010520384646952152, -0.003920941147953272, 0.00998468417674303, - 0.018549438565969467, 0.05176287516951561, 0.029715247452259064, -0.02481003664433956, - 0.02315775491297245, -0.006615579593926668, 0.01351514458656311, -0.017194053158164024, - -0.026126697659492493, -0.005321507807821035, -0.007131917402148247, 0.017878200858831406, - -0.007867698557674885, -0.004534092266112566, 0.012811634689569473, 0.02610088139772415, - 0.016496995463967323, 0.009371533058583736, 0.007699889130890369, -0.003769266651943326, - -0.011172261089086533, 0.010068588890135288, 0.0008487304439768195, 0.004872939083725214, - 0.012185574509203434, 0.0027979060541838408, -0.008726110681891441, 0.013837856240570545, - -0.007848336361348629, 0.022602692246437073, 0.009371533058583736, -0.0004396940057631582, - 0.005198877304792404, 0.009920141659677029, -0.005137562286108732, -0.02987014874815941, - -0.03931913152337074, 0.02182818576693535, 0.03931913152337074, 0.006247688550502062, - -0.02697865664958954, 0.006944744847714901, 0.016948791220784187, -0.009584522806107998, - -0.02604924701154232, 0.006886656861752272, -0.005866889376193285, -0.005844299681484699, - 0.007951604202389717, -0.019504664465785027, -0.03190968185663223, 0.039112597703933716, - -0.022331614047288895, 8.461083780275658e-05, -0.018575256690382957, -0.005599039141088724, - 0.019246496260166168, 0.0036498636472970247, -0.015812847763299942, 0.029999231919646263, - -0.005540951155126095, -0.011417522095143795, -0.01796855963766575, 0.014818898402154446, - -0.026281598955392838, -0.00946189183741808, -0.015941932797431946, -0.0032222713343799114, - -0.013063348829746246, 0.005253738258033991, 0.028166232630610466, 0.010565564036369324, - -0.012818088755011559, 0.027494993060827255, -0.005663581658154726, -0.014676905237138271, - -0.012340475805103779, -0.007919332943856716, 0.0016571219312027097, 0.08049707859754562, - 0.015528862364590168, -0.014844714663922787, -0.0007809610688127577, -0.00017144031880889088, - 0.0019152909517288208, -0.03562731668353081, -0.010004047304391861, 0.04443087801337242, - -0.01511579193174839, -0.0007507069385610521, 0.021079495549201965, 0.01123034954071045, - -0.003840263234451413, 0.005392503924667835, 0.00931344460695982, 0.0011601467849686742, - -0.008493758738040924, 0.0004965718253515661, -0.03023158386349678, -0.010410662740468979, - 0.011327163316309452, 0.006828568875789642, 0.00609601428732276, -0.020446980372071266, - -0.0314449779689312, 0.012650278396904469, 0.005560313817113638, 0.0069124735891819, - -0.02088586799800396, 0.003194840857759118, 0.006218644790351391, -0.008119413629174232, - 0.0024477643892169, 0.003846717532724142, 0.03864789381623268, -0.025313466787338257, - 0.03245183825492859, -0.01381203904747963, -0.0276498943567276, 0.013786221854388714, - -0.0023896764032542706, 0.016522813588380814, -0.02987014874815941, 0.023687001317739487, - -0.015154517255723476, -0.001239210949279368, 0.036866527050733566, -0.010255761444568634, - -0.015257785096764565, 0.002878583734855056, 0.012082306668162346, -0.028476035222411156, - -0.014960890635848045, -0.021376390010118484, 0.034543007612228394, 0.0030786648858338594, - -0.016161376610398293, -0.0196466576308012, 0.004156520124524832, -0.01190158911049366, - -0.015554679557681084, -0.016187192872166634, -0.011985493823885918, 0.01643245480954647, - -0.005185968708246946, -0.0032238848507404327, -0.01576121523976326, -0.013670045882463455, - 0.004563136491924524, 0.02150547318160534, -0.01043002586811781, -0.045127931982278824, - 0.0004372736730147153, -0.0027962925378233194, 0.004075842443853617, 0.010765645653009415, - -0.015231967903673649, -0.011946768499910831, 0.021066587418317795, 0.005286009516566992, - -0.03474954143166542, -0.010158948600292206, -0.01029448676854372, 0.004417916294187307, - -0.006744664162397385, -0.006344501860439777, -0.002054056851193309, -0.002168619306758046, - 0.014560729265213013, 0.004611542914062738, 0.015180334448814392, -0.005156924948096275, - -0.017813658341765404, -0.006031472235918045, 0.016845524311065674, -0.005037521943449974, - 0.039422400295734406, -0.004062933847308159, -0.015128700993955135, -0.0006559105240739882, - -0.032968174666166306, 0.004950389731675386, -0.008913283236324787, -0.02253814972937107, - 0.009603885002434254, 0.014767264015972614, 0.019504664465785027, 0.005453818943351507, - -0.02573944441974163, 0.0010125063126906753, -0.014405827969312668, 0.019866101443767548, - -0.003180318744853139, 0.01709078438580036, 0.016935883089900017, 0.015825757756829262, - -0.0017200506990775466, -0.020072637125849724, -0.011920951306819916, 0.004050025250762701, - -0.028450218960642815, 0.017878200858831406, 0.013747496530413628, -0.013670045882463455, - 0.02415170520544052, 0.004766444209963083, -0.007202913984656334, -0.0029737837612628937, - -0.0019136774353682995, -0.0157224889844656, 0.011701507493853569, -0.020679334178566933, - -0.021105311810970306, -0.024693859741091728, -0.016858432441949844, -0.010139585472643375, - 0.012456651777029037, -0.00882937852293253, -0.01062365248799324, -0.024538958445191383, - -0.009287628345191479, -0.015580496750772, -0.00740299466997385, -0.021776551380753517, - -0.028553485870361328, -0.011540152132511139, -0.007596621289849281, -0.00773216038942337, - 0.01576121523976326, -0.02438405714929104, 0.013211796060204506, -0.01869143173098564, - -0.015541771426796913, -0.007557895965874195, -0.03570476546883583, -0.022718867287039757, - 0.0005187582573853433, 0.03206458315253258, 0.01999518647789955, 0.043088398873806, - -0.005715215113013983, 0.011469155550003052, 0.03885442763566971, 0.007486899849027395, - -0.0009269879083149135, 0.009616793133318424, 0.014831806533038616, -0.023415924981236458, - 0.005231148563325405, 0.028527669608592987, 0.02857930399477482, 0.006977016106247902, - 0.012630916200578213, 0.0018927011406049132, 0.010165402665734291, 0.005931431893259287, - 0.00649617612361908, -0.0051117450930178165, -0.03627273812890053, -0.02311903052031994, - -0.011056085117161274, -0.010197673924267292, -0.01093345507979393, 0.0066413963213562965, - 0.0019201316172257066, 0.030670471489429474, 0.023325564339756966, 0.007261001970618963, - 0.009158543311059475, 0.024822944775223732, -0.007899969816207886, 0.008622842840850353, - 0.004082296509295702, 0.00995241291821003, -0.007119008805602789, -0.014999615959823132, - -0.0014578477712348104, 0.010823733173310757, 0.015515954233705997, 0.007254547439515591, - 0.002862448338419199, 0.01674225740134716, -0.004327557049691677, -0.007790248375386, - 0.010668831877410412, -0.03384594991803169, 0.011778958141803741, 0.011333617381751537, - -0.011862863786518574, -0.015851574018597603, -0.016509905457496643, -0.0012739024823531508, - -0.0024897167459130287, -0.001184350112453103, -0.005463500507175922, 0.016251735389232635, - 0.013437693938612938, -0.013231159187853336, -0.025300556793808937, -0.011482064612209797, - -0.008274314925074577, 0.022279981523752213, -0.0004961684462614357, 0.03580803424119949, - 0.0195821151137352, -0.0008398558711633086, -0.0074417199939489365, 0.009261811152100563, - -0.0034271928016096354, 0.00342073873616755, 0.024319514632225037, 0.004214608110487461, - 0.00981042068451643, -0.013147254474461079, -0.00031181969097815454, -0.006860840134322643, - -0.034207385033369064, -0.01400566566735506, -0.012895539402961731, 0.006744664162397385, - 0.00039612798718735576, -0.0035465960390865803, -0.032942358404397964, -0.012869722209870815, - 0.024242063984274864, -0.025158565491437912, -0.008784199133515358, -0.03415575250983238, - -0.03141916170716286, 0.014392918907105923, -0.002097622724249959, -0.000839049112983048, - 0.003014122601598501, -0.01479308120906353, 0.0020266263745725155, 0.0022202529944479465, - -0.033975034952163696, 0.01805891841650009, 0.006622033659368753, -0.001002018223516643, - 0.009797511622309685, -0.012140395119786263, -0.017219869419932365, -0.00237354077398777, - 0.005576449446380138, -0.019491756334900856, 0.0051149725914001465, -0.005611947737634182, - 0.029198909178376198, -0.01511579193174839, -0.010655923746526241, 0.006776934955269098, - 0.002171846339479089, 0.01703915186226368, 0.017232777550816536, 0.001343285315670073, - -0.004950389731675386, -0.011346525512635708, 0.017620030790567398, 0.020782601088285446, - 0.003982256166636944, 0.01191449724137783, -0.005027840379625559, -0.006463905330747366, - -0.0314449779689312, -0.006305776536464691, -0.000754337408579886, 0.004314648453146219, - -0.029327992349863052, -0.031031908467411995, -0.021673284471035004, 0.017219869419932365, - 0.011333617381751537, 0.01044293399900198, -0.0018039555288851261, -0.025197289884090424, - 0.0283469520509243, -0.021621650084853172, 0.005582903511822224, -0.0006430020439438522, - 0.0037434499245136976, -0.012676095589995384, 0.002636550460010767, 0.008151684887707233, - -0.028811655938625336, 0.028398584574460983, -0.021298939362168312, -0.013850764371454716, - -0.017581306397914886, -0.0055441781878471375, -0.011985493823885918, -0.004221062641590834, - -0.02513274736702442, -0.02052443102002144, 0.009474800899624825, 0.0026542996056377888, - -0.018575256690382957, -0.008822924457490444, 0.013386060483753681, 0.012017765082418919, - 0.007196459453552961, 0.0005288429674692452, -0.020072637125849724, -0.029353810474276543, - 0.013244067318737507, -0.012456651777029037, -0.015193242579698563, -0.026255782693624496, - -0.016509905457496643, -0.004446960054337978, 0.005118199624121189, 0.02095041051506996, - 0.012488923035562038, -0.01931103691458702, 0.023299748077988625, -0.006218644790351391, - -0.009752332232892513, 0.0035433690063655376, -0.0077192517928779125, -0.013360243290662766, - 0.019039960578083992, 0.008300132118165493, 0.003927395213395357, 0.007654709741473198, - -0.014831806533038616, -0.006486495025455952, -0.0009189201518893242, -0.02641068398952484, - -0.024629319086670876, -0.022292889654636383, 0.031651515513658524, -0.00046631766599603, - -0.0021831411868333817, -0.012940718792378902, 0.020472798496484756, -0.031935498118400574, - -0.02639777585864067, -0.003507870715111494, 0.02346755750477314, 0.027185190469026566, - 0.013747496530413628, 0.00900364201515913, 0.02380317822098732, -0.008074234239757061, - 0.0023832221049815416, -0.0022121851798146963, -0.0015312646282836795, 0.027778979390859604, - -0.006238007452338934, -1.4912786355125718e-05, -0.005766849033534527, -0.019039960578083992, - 0.007119008805602789, 0.015051250346004963, -0.0059669301845133305, -0.029069824144244194, - -0.010959272272884846, -0.01302462350577116, 0.004521183669567108, -0.02504238858819008, - 0.009016551077365875, -0.005586130544543266, -0.0009035913390107453, 0.014457461424171925, - -0.010288032703101635, 0.011288437992334366, -0.025920163840055466, -0.013876581564545631, - -0.012417926453053951, -0.0012964921770617366, 0.011494972743093967, -0.002906014211475849, - 0.011010905727744102, -0.0009181133355014026, 0.01075273659080267, 0.01736186258494854, - -0.030980274081230164, 0.015657946467399597, 0.015877390280365944, 0.008235589601099491, - 0.007757977116852999, -0.0011859636288136244, 0.013592595234513283, 0.003601456992328167, - -0.013398968614637852, -0.029198909178376198, -0.008267860859632492, 0.013644229620695114, - -0.019194861873984337, 0.03888024389743805, -0.01064301561564207, 0.012669641524553299, - -0.024293698370456696, -0.021415114402770996, -0.00869383942335844, 0.019879009574651718, - -0.017103692516684532, 0.020434072241187096, -0.00017426404519937932, 0.0034723724238574505, - 0.004221062641590834, -0.005666808690875769, 0.002405812032520771, 0.003073824103921652, - -0.014883439987897873, 0.015193242579698563, 0.00998468417674303, -0.014896349050104618, - 0.02798551507294178, -0.023222297430038452, -0.021428022533655167, 0.0036240466870367527, - 0.012837450951337814, 0.004476004280149937, -0.005924977362155914, 0.2447441667318344, - -0.01763293892145157, 0.020072637125849724, -0.0018394538201391697, -0.027494993060827255, - 0.010468751192092896, 0.010255761444568634, -0.017749115824699402, -0.0016587355639785528, - 0.015696672722697258, -0.00962970219552517, 0.030309034511446953, -0.0195821151137352, - 0.010417117737233639, -0.003595002694055438, -0.004214608110487461, -0.024358240887522697, - -0.03224530071020126, -0.012527648359537125, -0.027856430038809776, 0.006170237902551889, - 0.001671643927693367, -0.008358219638466835, -0.03090282343327999, 0.03707306087017059, - 0.013373151421546936, -0.023377198725938797, -0.014418736100196838, 0.005747486371546984, - -0.011991947889328003, -0.014070208184421062, 0.001099638408049941, -0.0013360243756324053, - 0.016910066828131676, 0.01707787625491619, -0.00313029857352376, -0.0020492160692811012, - 0.0007386052166111767, 0.013553869910538197, -0.00044695500400848687, 0.0018717249622568488, - -0.016832616180181503, -0.01173377875238657, -0.028501853346824646, -0.01271482091397047, - 0.024242063984274864, -0.005808801390230656, -0.03531751409173012, -0.03252928704023361, - 0.013734588399529457, -0.0195821151137352, -0.009997593238949776, 0.027520811185240746, - 0.036143653094768524, 0.003267450723797083, 0.006518766283988953, -0.0072997272945940495, - -0.006789843551814556, 0.021144038066267967, 0.02116985432803631, -0.007325544022023678, - 0.009377987124025822, -0.017258593812584877, 0.003991937264800072, -0.0005449785385280848, - 0.04344983398914337, -0.05134980380535126, 0.02317066304385662, 0.02025335468351841, - -0.020408255979418755, 0.0026155742816627026, 0.0022121851798146963, -0.027520811185240746, - 0.025339283049106598, -0.038802795112133026, -0.0064768134616315365, 0.051607973873615265, - 0.024926211684942245, -0.00045098888222128153, 0.02089877612888813, 0.003788629313930869, - -0.014457461424171925, 0.02218962088227272, 0.0014731766423210502, -0.018394537270069122, - -0.014870531857013702, 0.007054466754198074, -0.02989596500992775, 0.02030498906970024, - 0.006873748265206814, -0.0015982271870598197, -0.03503352776169777, -0.0025478049647063017, - 0.0063025495037436485, 0.01412184163928032, 0.006712392903864384, 0.0070931920781731606, - 0.007919332943856716, 0.013902397826313972, -0.007906423881649971, -0.042546242475509644, - -0.0010165402200073004, 0.023338474333286285, 0.018562348559498787, -0.003417511470615864, - 0.0301799513399601, -0.000394514441723004, -0.001199678867124021, 0.003707951633259654, - -0.04270114377140999, -0.02899237349629402, -0.0009205336682498455, 0.025971796363592148, - 0.004337238613516092, -0.0028592210728675127, 0.023390106856822968, -0.008622842840850353, - -0.010526838712394238, 0.019788650795817375, -0.00715128006413579, 0.0074417199939489365, - -0.0314449779689312, -0.016561537981033325, 0.013347335159778595, -0.0205631572753191, - -0.031031908467411995, -0.04208153858780861, -0.012508286163210869, -0.03668580949306488, - -0.022292889654636383, 0.026152515783905983, -0.011933860369026661, -0.01028157863765955, - 0.00835176557302475, -0.012914901599287987, -0.024319514632225037, 0.01794274151325226, - -0.0013941123615950346, -0.00522146699950099, -0.006505857687443495, -0.009713606908917427, - -0.011398158967494965, -0.02439696714282036, 0.00038483311072923243, -0.010765645653009415, - -0.019749924540519714, 0.02181527577340603, 0.0009253743337467313, 0.010959272272884846, - -0.03056720457971096, 0.0006821308052167296, -0.007686980534344912, -0.001215007621794939, - 0.00531182624399662, 0.012605099007487297, -0.007570804562419653, -0.029715247452259064, - -0.01560631301254034, -0.020085545256733894, 0.010985089465975761, -0.03900932893157005, - 0.007370723877102137, 0.03949984908103943, -0.02126021310687065, -0.004869712051004171, - 0.005357005633413792, -0.16347257792949677, -0.0013287633191794157, 0.012630916200578213, - -0.019401397556066513, 0.021789459511637688, 0.004505048040300608, 0.008564755320549011, - -0.004566363524645567, 0.0018636571476235986, 0.01836872100830078, 0.013140799477696419, - 0.00724163930863142, -0.027107739821076393, -0.023854810744524002, 0.001528037479147315, - 0.003107708878815174, 0.010836642235517502, -0.00046268716687336564, 0.027572443708777428, - 0.007648255210369825, 0.02598470449447632, -0.01207585260272026, 0.007396540604531765, - 0.001297299051657319, 0.015825757756829262, -0.005305372178554535, -0.002112144837155938, - 0.008164593018591404, 0.016509905457496643, -0.013928215019404888, -0.006796297617256641, - -0.03278745710849762, 0.026462318375706673, -0.015541771426796913, 0.03085119090974331, - -0.004943935666233301, 0.005905614700168371, -0.030412303283810616, -0.008977825753390789, - 0.0019636976066976786, 0.013282792642712593, 0.05359587445855141, 0.011778958141803741, - -0.00019776145927608013, -0.014470369555056095, 0.00946189183741808, 0.013218250125646591, - -0.017581306397914886, 0.0020266263745725155, 0.0022186394780874252, 0.0328390896320343, - -0.038079921156167984, 0.014431644231081009, 0.001349739613942802, 0.03640182316303253, - 0.002317066304385662, -0.006686575710773468, 0.010404208675026894, 0.0036272737197577953, - -0.009203723631799221, -0.023648276925086975, -0.005589358042925596, 0.02899237349629402, - -0.0015231968136504292, 0.007480445317924023, 0.0013473192229866982, -0.030644655227661133, - -0.014831806533038616, -0.03503352776169777, -0.002605892950668931, 0.000569585245102644, - -0.010636560618877411, 0.02734009176492691, -0.014263834804296494, -0.007286818698048592, - 0.00949416309595108, -0.03689234331250191, 0.00571198808029294, 0.0045502278953790665, - 0.025997614488005638, -0.011030268855392933, 0.026565585285425186, -0.0040887510403990746, - -0.003862852929159999, 0.004866485018283129, -0.022718867287039757, 0.001741026877425611, - 0.016600264236330986, -0.013902397826313972, -0.02570072002708912, 0.01400566566735506, - -0.029198909178376198, -0.028166232630610466, -0.0003967330849263817, 0.008810015395283699, - -0.0039306222461164, 0.005750713404268026, 0.01546432077884674, -0.0005114972591400146, - -0.040377624332904816, -0.0010601063258945942, 0.002492944011464715, -0.00755144190043211, - 0.010062134824693203, 0.03557568043470383, 0.026242874562740326, -0.017620030790567398, - -0.0014981867279857397, 0.019504664465785027, 0.014031482860445976, -0.03642763942480087, - 0.01123034954071045, 0.015180334448814392, 0.02481003664433956, -0.01612265035510063, - 0.025636177510023117, 0.007344906684011221, -0.034284837543964386, 0.0032981084659695625, - -0.014689813368022442, 0.06758863478899002, 0.007603075820952654, 0.002328361151739955, - 0.015812847763299942, -0.01612265035510063, -0.0006869714707136154, -0.08767417818307877, - -0.023235205560922623, 0.006931836251169443, 0.01799437589943409, 0.0069899242371320724, - 0.033019810914993286, 0.00047761257155798376, 0.0013642616104334593, -0.031160993501544, - 0.03221948444843292, -0.016019383445382118, -0.04499885067343712, -0.025313466787338257, - -0.019788650795817375, -0.010836642235517502, -0.016329186037182808, -0.00853248406201601, - -0.02151838317513466, -0.03980965167284012, 0.03671162575483322, -0.009997593238949776, - -0.006789843551814556, 0.018213819712400436, -0.012095215730369091, -0.014405827969312668, - -0.006286413874477148, -0.03123844414949417, 0.009429621510207653, 0.017503855749964714, - 0.012108123861253262, -4.356601129984483e-05, -0.0348011739552021, -0.002810814417898655, - -0.03082537278532982, 0.018239635974168777, 0.0008640591986477375, -0.01827836222946644, - -0.003183546010404825, 0.010630106553435326, 0.013450603000819683, -0.004279150627553463, - -0.009797511622309685, 0.026927022263407707, -0.004175882786512375, -0.003307789796963334, - -0.004472777247428894, -0.01796855963766575, 0.023712817579507828, 0.01350223645567894, - -0.016148468479514122, -0.01737477071583271, -0.0007398154120892286, -0.0228737685829401, - 0.007306181360036135, 0.010836642235517502, -0.015167426317930222, 0.023996803909540176, - 0.028140416368842125, 0.0038047649431973696, -0.0025219880044460297, 0.018717249855399132, - 0.008797107264399529, -0.030773740261793137, 0.01399275753647089, 0.011824138462543488, - 0.0018394538201391697, -0.007854790426790714, -0.01559340488165617, 0.018910875543951988, - -0.02610088139772415, 0.012321113608777523, 0.01734895445406437, -0.014947982504963875, - 0.008455033414065838, 0.0015207765391096473, 0.0010835027787834406, -0.00788060761988163, - 0.020730966702103615, 0.01933685503900051, -0.011966130696237087, 0.0008495372021570802, - -0.0061896005645394325, -0.002718841889873147, -0.008584117516875267, 0.023983895778656006, - 0.0015828984323889017, -0.024345332756638527, -0.00538604985922575, 0.007286818698048592, - -0.004459868650883436, 0.008274314925074577, 0.02669467031955719, 0.019052868708968163, - -0.02505529671907425, -0.023687001317739487, 0.010739828459918499, -0.0048051695339381695, - 0.003814446274191141, 0.011269074864685535, 0.02124730497598648, -0.0008007271680980921, - 0.003969347570091486, -0.06825987249612808, 0.0301799513399601, 0.005937885958701372, - -0.01993064396083355, 0.024306606501340866, -0.007448174525052309, 0.006547810044139624, - -0.010288032703101635, -0.003866080194711685, 0.02793388068675995, -0.02927635982632637, - -0.004146839026361704, -0.009526434354484081, -0.008668022230267525, -0.013670045882463455, - -0.004711583256721497, 0.026255782693624496, 0.0005409446312114596, 0.005831391084939241, - 0.004127476364374161, 0.019775742664933205, -0.0039467578753829, 0.007202913984656334, - 0.02279631793498993, 0.016600264236330986, -0.015670856460928917, -0.010307395830750465, - 0.006121831480413675, -0.04267532750964165, 0.0009592590504325926, -0.007990329526364803, - -0.012676095589995384, -0.015645038336515427, 0.01092054694890976, -0.0012835838133469224, - 0.008609934709966183, 0.017852382734417915, -0.006463905330747366, 0.003343287855386734, - 0.05364750698208809, -0.009384441189467907, -0.029405444860458374, 0.0296119786798954, - -0.0005933851934969425, -0.022292889654636383, -0.0025590998120605946, 0.0012037127744406462, - 0.0017474810592830181, 0.011056085117161274, 0.013095620088279247, -0.003869307227432728, - 0.02896655723452568, -0.018239635974168777, -0.0061605568043887615, -0.006505857687443495, - -0.005495771765708923, 0.0036595449782907963, 0.004082296509295702, 0.019220678135752678, - -0.008151684887707233, 0.02155710756778717, 0.01827836222946644, -0.015993567183613777, - 0.005098836962133646, 0.018252545967698097, 0.014767264015972614, -0.014444553293287754, - 0.012760000303387642, 0.0266688521951437, -0.027727345004677773, 0.0003465111367404461, - -0.020989136770367622, 0.010223490186035633, 0.016935883089900017, -0.00011103282304247841, - 0.01400566566735506, 0.00866156816482544, 0.002312225755304098, -0.03250347077846527, - 0.015515954233705997, 0.02088586799800396, -0.010339667089283466, -0.004688993562012911, - -0.00245583220385015, 0.036763258278369904, -0.0008769676787778735, 0.027469176799058914, - 0.007338452618569136, 0.023970987647771835, 0.016161376610398293, 0.019465940073132515, - 0.009281174279749393, 0.005153697915375233, -0.012985898181796074, 0.0037628125865012407, - 0.0042113810777664185, 0.0026897978968918324, 0.0009891098598018289, 0.02446150779724121, - 0.020330805331468582, 0.029044007882475853, -0.010868912562727928, 0.02703028917312622, - -0.030489753931760788, -0.02767571248114109, 0.031703148037195206, -0.023906445130705833, - -0.04159101843833923, 0.0054215481504797935, 0.020666424185037613, 0.0283469520509243, - 0.02315775491297245, -0.011991947889328003, 0.017878200858831406, -0.042623694986104965, - 0.021724916994571686, 0.013837856240570545, -0.018097642809152603, -0.02572653628885746, - 0.03312307596206665, -0.006338047794997692, 0.0002837841457221657, 0.00021258600463625044, - -0.011843500658869743, 0.014250926673412323, 0.011365888640284538, 0.026927022263407707, - -0.03513679653406143, -0.013211796060204506, -0.017142418771982193, -0.016006475314497948, - -0.013850764371454716, -0.008003237657248974, -0.012101669795811176, 0.0012488922802731395, - -0.016858432441949844, -0.01993064396083355, 0.009991138242185116, -0.018162185326218605, - 0.056435734033584595, 0.008810015395283699, -0.017465129494667053, 0.0047438545152544975, - -0.0036789076402783394, -0.0016829388914629817, 0.024848761036992073, 0.008926191367208958, - -0.020162995904684067, -0.020188812166452408, 0.02215089648962021, -0.0025332828518003225, - -0.00715128006413579, -0.029766879975795746, 0.0017394133610650897, 0.009842691011726856, - 0.005924977362155914, 0.006228325888514519, -0.021298939362168312, -0.010823733173310757, - 0.020679334178566933, 0.0006950392271392047, -0.003107708878815174, -0.002906014211475849, - 0.0032787458039820194, -0.0032497018110007048, 0.023364290595054626, -0.0027285232208669186, - -0.004514729604125023, -0.039422400295734406, -0.0017297320300713181, 0.0022460699547082186, - -0.024706769734621048, -0.016213010996580124, 0.008758381940424442, -0.03495607525110245, - -0.002391289919614792, -0.00020562754070851952, 0.031031908467411995, 0.0002809604338835925, - -0.004995569121092558, 0.022938311100006104, -0.006738209631294012, -0.014263834804296494, - 0.011553061194717884, 0.0016296915709972382, -0.014083116315305233, -0.004869712051004171, - -0.016355004161596298]], "includeMetadata": true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - python-client-2.2.2 (requests:2.31.0, urllib3:2.0.3) - method: POST - uri: https://langchain-retrieval-74ce8fe.svc.us-west1-gcp-free.pinecone.io/query - response: - body: - string: "{\"results\":[],\"matches\":[{\"id\":\"35391d1d-0466-4d92-b457-35f673e516eb\",\"score\":0.901216626,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}},{\"id\":\"ff70f7d5-d84b-42c7-a7b9-8ba673903322\",\"score\":0.901193,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}},{\"id\":\"0b2c67b8-1381-4140-bc35-574c9bd9c8e6\",\"score\":0.901193,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}},{\"id\":\"484eb188-fe55-456f-9aa5-2ca84a301ac3\",\"score\":0.901193,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}}],\"namespace\":\"\"}" - headers: - content-length: - - '7152' - content-type: - - application/json - date: - - Mon, 26 Jun 2023 17:39:57 GMT - grpc-status: - - '0' - server: - - envoy - x-envoy-upstream-service-time: - - '2' - status: - code: 200 - message: OK -- request: - body: '{"prompt": ["Given the following extracted parts of a long document and - a question, create a final answer with references (\"SOURCES\"). \nIf you don''t - know the answer, just say that you don''t know. Don''t try to make up an answer.\nALWAYS - return a \"SOURCES\" part in your answer.\n\nQUESTION: Which state/country''s - law governs the interpretation of the contract?\n=========\nContent: This Agreement - is governed by English law and the parties submit to the exclusive jurisdiction - of the English courts in relation to any dispute (contractual or non-contractual) - concerning this Agreement save that either party may apply to any court for - an injunction or other relief to protect its Intellectual Property Rights.\nSource: - 28-pl\nContent: No Waiver. Failure or delay in exercising any right or remedy - under this Agreement shall not constitute a waiver of such (or any other) right - or remedy.\n\n11.7 Severability. The invalidity, illegality or unenforceability - of any term (or part of a term) of this Agreement shall not affect the continuation in - force of the remainder of the term (if any) and this Agreement.\n\n11.8 No Agency. - Except as expressly stated otherwise, nothing in this Agreement shall create - an agency, partnership or joint venture of any kind between the parties.\n\n11.9 - No Third-Party Beneficiaries.\nSource: 30-pl\nContent: (b) if Google believes, - in good faith, that the Distributor has violated or caused Google to violate - any Anti-Bribery Laws (as defined in Clause 8.5) or that such a violation is - reasonably likely to occur,\nSource: 4-pl\n=========\nFINAL ANSWER: This Agreement - is governed by English law.\nSOURCES: 28-pl\n\nQUESTION: What did the president - say about Michael Jackson?\n=========\nContent: Madam Speaker, Madam Vice President, - our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices - of the Supreme Court. My fellow Americans. \n\nLast year COVID-19 kept us apart. - This year we are finally together again. \n\nTonight, we meet as Democrats Republicans - and Independents. But most importantly as Americans. \n\nWith a duty to one - another to the American people to the Constitution. \n\nAnd with an unwavering - resolve that freedom will always triumph over tyranny. \n\nSix days ago, Russia\u2019s - Vladimir Putin sought to shake the foundations of the free world thinking he - could make it bend to his menacing ways. But he badly miscalculated. \n\nHe - thought he could roll into Ukraine and the world would roll over. Instead he - met a wall of strength he never imagined. \n\nHe met the Ukrainian people. \n\nFrom - President Zelenskyy to every Ukrainian, their fearlessness, their courage, their - determination, inspires the world. \n\nGroups of citizens blocking tanks with - their bodies. Everyone from students to retirees teachers turned soldiers defending - their homeland.\nSource: 0-pl\nContent: And we won\u2019t stop. \n\nWe have - lost so much to COVID-19. Time with one another. And worst of all, so much loss - of life. \n\nLet\u2019s use this moment to reset. Let\u2019s stop looking at - COVID-19 as a partisan dividing line and see it for what it is: A God-awful - disease. \n\nLet\u2019s stop seeing each other as enemies, and start seeing - each other for who we really are: Fellow Americans. \n\nWe can\u2019t change - how divided we\u2019ve been. But we can change how we move forward\u2014on COVID-19 - and other issues we must face together. \n\nI recently visited the New York - City Police Department days after the funerals of Officer Wilbert Mora and his - partner, Officer Jason Rivera. \n\nThey were responding to a 9-1-1 call when - a man shot and killed them with a stolen gun. \n\nOfficer Mora was 27 years - old. \n\nOfficer Rivera was 22. \n\nBoth Dominican Americans who\u2019d grown - up on the same streets they later chose to patrol as police officers. \n\nI - spoke with their families and told them that we are forever in debt for their - sacrifice, and we will carry on their mission to restore the trust and safety - every community deserves.\nSource: 24-pl\nContent: And a proud Ukrainian people, - who have known 30 years of independence, have repeatedly shown that they will - not tolerate anyone who tries to take their country backwards. \n\nTo all Americans, - I will be honest with you, as I\u2019ve always promised. A Russian dictator, - invading a foreign country, has costs around the world. \n\nAnd I\u2019m taking - robust action to make sure the pain of our sanctions is targeted at Russia\u2019s - economy. And I will use every tool at our disposal to protect American businesses - and consumers. \n\nTonight, I can announce that the United States has worked - with 30 other countries to release 60 Million barrels of oil from reserves around - the world. \n\nAmerica will lead that effort, releasing 30 Million barrels - from our own Strategic Petroleum Reserve. And we stand ready to do more if necessary, - unified with our allies. \n\nThese steps will help blunt gas prices here at - home. And I know the news about what\u2019s happening can seem alarming. \n\nBut - I want you to know that we are going to be okay.\nSource: 5-pl\nContent: More - support for patients and families. \n\nTo get there, I call on Congress to fund - ARPA-H, the Advanced Research Projects Agency for Health. \n\nIt\u2019s based - on DARPA\u2014the Defense Department project that led to the Internet, GPS, - and so much more. \n\nARPA-H will have a singular purpose\u2014to drive breakthroughs - in cancer, Alzheimer\u2019s, diabetes, and more. \n\nA unity agenda for the - nation. \n\nWe can do this. \n\nMy fellow Americans\u2014tonight , we have gathered - in a sacred space\u2014the citadel of our democracy. \n\nIn this Capitol, generation - after generation, Americans have debated great questions amid great strife, - and have done great things. \n\nWe have fought for freedom, expanded liberty, - defeated totalitarianism and terror. \n\nAnd built the strongest, freest, and - most prosperous nation the world has ever known. \n\nNow is the hour. \n\nOur - moment of responsibility. \n\nOur test of resolve and conscience, of history - itself. \n\nIt is in this moment that our character is formed. Our purpose is - found. Our future is forged. \n\nWell I know this nation.\nSource: 34-pl\n=========\nFINAL - ANSWER: The president did not mention Michael Jackson.\nSOURCES:\n\nQUESTION: - Who was Alan Turing?\n=========\nContent: A brilliant mathematician and cryptographer - Alan was to become the founder of modern-day computer science and artificial - intelligence; designing a machine at Bletchley Park to break secret Enigma encrypted - messages used by the Nazi German war machine to protect sensitive commercial, - diplomatic and military communications during World War 2. Thus, Turing made - the single biggest contribution to the Allied victory in the war against Nazi - Germany, possibly saving the lives of an estimated 2 million people, through - his effort in shortening World War II.\n\nIn 2013, almost 60 years later, Turing - received a posthumous Royal Pardon from Queen Elizabeth II. Today, the \u201cTuring - law\u201d grants an automatic pardon to men who died before the law came into - force, making it possible for living convicted gay men to seek pardons for offences - now no longer on the statute book.\n\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended his - life at the age of 41 years, by eating an apple laced with cyanide.\n\nCareer - \nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it included - the idea of a computer program.\n\nTuring was interested in artificial intelligence. - He proposed the Turing test, to say when a machine could be called \"intelligent\". - A computer could be said to \"think\" if a human talking with it could not tell - it was a machine.\nSource: https://simple.wikipedia.org/wiki/Alan%20Turing\n\nContent: - A brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the lives - of an estimated 2 million people, through his effort in shortening World War - II.\n\nIn 2013, almost 60 years later, Turing received a posthumous Royal Pardon - from Queen Elizabeth II. Today, the \u201cTuring law\u201d grants an automatic - pardon to men who died before the law came into force, making it possible for - living convicted gay men to seek pardons for offences now no longer on the statute - book.\n\nAlas, Turing accidentally or otherwise lost his life in 1954, having - been subjected by a British court to chemical castration, thus avoiding a custodial - sentence. He is known to have ended his life at the age of 41 years, by eating - an apple laced with cyanide.\n\nCareer \nTuring was one of the people who worked - on the first computers. He created the theoretical Turing machine in 1936. - The machine was imaginary, but it included the idea of a computer program.\n\nTuring - was interested in artificial intelligence. He proposed the Turing test, to say - when a machine could be called \"intelligent\". A computer could be said to - \"think\" if a human talking with it could not tell it was a machine.\nSource: - https://simple.wikipedia.org/wiki/Alan%20Turing\n\nContent: A brilliant mathematician - and cryptographer Alan was to become the founder of modern-day computer science - and artificial intelligence; designing a machine at Bletchley Park to break - secret Enigma encrypted messages used by the Nazi German war machine to protect - sensitive commercial, diplomatic and military communications during World War - 2. Thus, Turing made the single biggest contribution to the Allied victory in - the war against Nazi Germany, possibly saving the lives of an estimated 2 million - people, through his effort in shortening World War II.\n\nIn 2013, almost 60 - years later, Turing received a posthumous Royal Pardon from Queen Elizabeth - II. Today, the \u201cTuring law\u201d grants an automatic pardon to men who - died before the law came into force, making it possible for living convicted - gay men to seek pardons for offences now no longer on the statute book.\n\nAlas, - Turing accidentally or otherwise lost his life in 1954, having been subjected - by a British court to chemical castration, thus avoiding a custodial sentence. - He is known to have ended his life at the age of 41 years, by eating an apple - laced with cyanide.\n\nCareer \nTuring was one of the people who worked on the - first computers. He created the theoretical Turing machine in 1936. The machine - was imaginary, but it included the idea of a computer program.\n\nTuring was - interested in artificial intelligence. He proposed the Turing test, to say when - a machine could be called \"intelligent\". A computer could be said to \"think\" - if a human talking with it could not tell it was a machine.\nSource: https://simple.wikipedia.org/wiki/Alan%20Turing\n\nContent: - A brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the lives - of an estimated 2 million people, through his effort in shortening World War - II.\n\nIn 2013, almost 60 years later, Turing received a posthumous Royal Pardon - from Queen Elizabeth II. Today, the \u201cTuring law\u201d grants an automatic - pardon to men who died before the law came into force, making it possible for - living convicted gay men to seek pardons for offences now no longer on the statute - book.\n\nAlas, Turing accidentally or otherwise lost his life in 1954, having - been subjected by a British court to chemical castration, thus avoiding a custodial - sentence. He is known to have ended his life at the age of 41 years, by eating - an apple laced with cyanide.\n\nCareer \nTuring was one of the people who worked - on the first computers. He created the theoretical Turing machine in 1936. - The machine was imaginary, but it included the idea of a computer program.\n\nTuring - was interested in artificial intelligence. He proposed the Turing test, to say - when a machine could be called \"intelligent\". A computer could be said to - \"think\" if a human talking with it could not tell it was a machine.\nSource: - https://simple.wikipedia.org/wiki/Alan%20Turing\n=========\nFINAL ANSWER:"], - "model": "text-davinci-003", "temperature": 0.7, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '13124' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7VkTtVCPUFv8RiuL3JU16twR7qkio\",\n \"object\": - \"text_completion\",\n \"created\": 1687801197,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \" Alan Turing was a brilliant mathematician - and cryptographer who was the founder of modern-day computer science and artificial - intelligence. He created the theoretical Turing machine in 1936 and proposed - the Turing test to measure machine intelligence. During World War II, he made - the single biggest contribution to the Allied victory by breaking secret Enigma - encrypted messages used by the Nazi German war machine. He was posthumously - pardoned by Queen Elizabeth II and had his name given to the \\\"Turing law\\\" - which grants an automatic pardon to men who died before the law came into - force.\\n\\nSOURCES: https://simple.wikipedia.org/wiki/Alan%20Turing\",\n - \ \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 2889,\n \"completion_tokens\": - 132,\n \"total_tokens\": 3021\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7dd73b8bce27159b-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 26 Jun 2023 17:40:01 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '4124' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 708a9668e7816be6996b646b5fc9db72 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain_39.yaml b/tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain_39.yaml deleted file mode 100644 index d8e9d79da85..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_pinecone_vectorstore_retrieval_chain_39.yaml +++ /dev/null @@ -1,964 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - python-requests/2.31.0 - method: GET - uri: https://controller.us-west1-gcp-free.pinecone.io/actions/whoami - response: - body: - string: '{"project_name":"74ce8fe","user_label":"default","user_name":"5c27a1f"} - - ' - headers: - content-length: - - '72' - content-type: - - application/json; charset=UTF-8 - date: - - Mon, 03 Jul 2023 21:40:10 GMT - server: - - envoy - x-envoy-upstream-service-time: - - '0' - status: - code: 200 - message: OK -- request: - body: '{"input": ["Who was Alan Turing?"], "encoding_format": "base64"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '64' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings - response: - body: - string: !!binary | - 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 - v/+fy/+Yn/Xf//g/AAAA//8DAMJ5rOfhIAAA - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e12490ccd8842d3-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:40:10 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '60' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '1000000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '123908' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 52.565s - x-request-id: - - bca40ae325365449d0cb022f21f6098d - status: - code: 200 - message: OK -- request: - body: '{"topK": 4, "vector": [[0.004753536079078913, -0.030386485159397125, -0.008732564747333527, - -0.021428022533655167, 0.004605088848620653, 0.012334021739661694, -0.039680566638708115, - 0.009306990541517735, -0.023958079516887665, -0.025313466787338257, 0.03141916170716286, - 0.029715247452259064, 0.010436479933559895, -0.00868093129247427, 0.009287628345191479, - 0.007745068520307541, 0.013347335159778595, 0.015231967903673649, 0.015541771426796913, - 0.0022654326166957617, -0.02382899448275566, 0.00788060761988163, -0.0001955428160727024, - -0.010455843061208725, -0.011359433643519878, -0.0021460293792188168, 0.023854810744524002, - -0.022008903324604034, 0.021156946197152138, -0.0353691466152668, 0.019156135618686676, - -0.005947567522525787, -0.02798551507294178, -0.013734588399529457, -0.03082537278532982, - 0.009261811152100563, 0.015477228909730911, 0.025274740532040596, 0.013579687103629112, - -0.012805180624127388, 0.03206458315253258, 0.028501853346824646, 0.004808396566659212, - -0.013915306888520718, -0.010042772628366947, 0.010701103135943413, 0.0031335256062448025, - -0.002497784560546279, -0.00900364201515913, 0.009649064391851425, 0.009048821404576302, - 0.0234417412430048, 0.011727324686944485, -0.019762832671403885, -0.04146193340420723, - -0.010862458497285843, -0.016522813588380814, 0.0117208706215024, 0.00013664802827406675, - 0.02381608635187149, -0.0020943956915289164, -0.006421952974051237, -0.0030576884746551514, - 0.005395730957388878, 0.01301171537488699, -0.010288032703101635, -0.014586545526981354, - 0.019375579431653023, -0.00627673277631402, 0.006399362813681364, 0.013037532567977905, - 0.010223490186035633, -0.004769671242684126, -0.009210177697241306, 0.028476035222411156, - -0.0027027062606066465, -0.021273121237754822, -0.005211785901337862, -0.022021811455488205, - 0.001791047165170312, 0.017813658341765404, -0.008293678052723408, 0.005437683779746294, - -0.014676905237138271, -0.0020588974002748728, 0.002368700224906206, -0.017891108989715576, - 0.011475609615445137, -0.02318357303738594, 0.0045179566368460655, -0.00817104708403349, - 0.010856004431843758, 0.019504664465785027, 0.024229155853390694, -0.009578067809343338, - 0.012585736811161041, -0.00507301976904273, 0.02153129130601883, -0.02444859966635704, - -0.05571286007761955, 0.013244067318737507, -0.010055680759251118, -0.01043002586811781, - -0.017800750210881233, 0.0005921750562265515, -0.009132727049291134, 0.012237208895385265, - -0.004317875951528549, 0.028424402698874474, -0.0067253015004098415, 0.015503046102821827, - 0.02319648116827011, 0.007048012688755989, -0.037460315972566605, -0.000527229392901063, - -0.018471987918019295, 0.03534333035349846, -0.03575640171766281, 0.013734588399529457, - -0.020640607923269272, 0.027804795652627945, 0.005366687197238207, 0.0019491756102070212, - -0.01636791229248047, 0.011133535765111446, 0.02544254995882511, -0.004243652336299419, - -0.007828973233699799, 0.01015249453485012, -0.00934571586549282, 0.004143611527979374, - -0.010565564036369324, 0.027262641116976738, 0.005095609929412603, -0.002623642096295953, - 0.023273931816220284, -0.0247713103890419, -0.0004796295252162963, -0.008726110681891441, - -0.02731427550315857, 0.01026867050677538, 0.021131128072738647, -0.0017732980195432901, - -0.0068156602792441845, 0.0011415908811613917, 0.04461159557104111, -0.0012722888495773077, - -0.00017012930766213685, -0.004314648453146219, 0.020150087773799896, 0.01111417356878519, - 0.012308204546570778, 0.02159583382308483, 0.00822268147021532, 0.027159374207258224, - 0.0013094006571918726, -0.010668831877410412, 0.0020459890365600586, -0.022925402969121933, - -0.015567587688565254, -0.0077515230514109135, -0.006463905330747366, 0.0196466576308012, - -0.018084734678268433, 0.0305930208414793, 0.03573058173060417, 0.023996803909540176, - 0.026772120967507362, 0.0031335256062448025, -0.0195821151137352, -0.009390896186232567, - 0.01142397616058588, -0.039680566638708115, 0.0263203252106905, 0.01160469464957714, - -0.00513110775500536, 0.00045421600225381553, -0.0029528073500841856, -0.015838665887713432, - 0.013398968614637852, -0.02088586799800396, 0.004676084965467453, 0.01902705244719982, - 0.03180641680955887, -0.022447790950536728, 0.011759595945477486, -0.005502225831151009, - 0.00010972180461976677, 0.011172261089086533, -0.014689813368022442, 0.0038757615257054567, - 0.015231967903673649, 0.0029398989863693714, -0.013127891346812248, -0.6497596502304077, - -0.04202990606427193, -0.02342883311212063, -0.0025784624740481377, 0.010507476516067982, - 0.013799130916595459, 0.0072351847775280476, -0.006505857687443495, -0.004824532195925713, - 0.0002545384631957859, 0.011333617381751537, 0.0235062837600708, 0.006060515996068716, - -0.008377582766115665, -0.01794274151325226, -0.01923358626663685, -0.002480035414919257, - 0.011036722920835018, 0.01529651042073965, 0.01897541806101799, -0.020666424185037613, - 0.03596293553709984, -0.021699100732803345, -0.030309034511446953, 0.026191240176558495, - 0.004908437374979258, 0.013018169440329075, -0.011888680048286915, -0.008526029996573925, - -0.006370319053530693, -0.01925940439105034, 0.027391726151108742, 0.013540961779654026, - -0.01400566566735506, 0.032296936959028244, -0.008209772408008575, -0.019194861873984337, - 0.023958079516887665, -0.0029673294629901648, 0.023867720738053322, -0.015193242579698563, - -0.024267882108688354, 0.03851880878210068, 0.014276742935180664, 0.011817683465778828, - 0.01461236272007227, 0.003995164763182402, -0.0012464720057323575, -0.0037595853209495544, - -0.00045219904859550297, -0.001227916101925075, 0.00571198808029294, -0.0001236387324752286, - 0.00313029857352376, -0.012869722209870815, -0.0023477240465581417, 0.0002809604338835925, - -0.03273582458496094, 0.0017958878306671977, 0.0047438545152544975, 0.0010496181203052402, - 0.03172896429896355, -0.02762407809495926, -0.009216631762683392, -0.002060510916635394, - 0.010901183821260929, -0.011817683465778828, 0.017826566472649574, -0.0029786243103444576, - -0.01737477071583271, 0.024926211684942245, 0.007048012688755989, -0.008267860859632492, - -0.001691006706096232, -0.01605810970067978, 0.01240501832216978, 0.02606215514242649, - -0.028192050755023956, 0.033561963587999344, -0.01573539711534977, 0.005273100920021534, - -0.004947162698954344, -0.009119817987084389, -0.006005655508488417, 0.04626387730240822, - -0.0016926202224567533, -0.013108528219163418, -0.006018563639372587, -0.006873748265206814, - 0.011933860369026661, 0.019517572596669197, 0.02539091743528843, -0.0068672941997647285, - -0.03216785192489624, -0.007377177942544222, 0.009113363921642303, -0.009197268635034561, - -0.02375154383480549, -0.003307789796963334, -0.010223490186035633, 0.007196459453552961, - -0.026823753491044044, 0.033536147326231, 0.010023409500718117, 0.0007361848838627338, - -0.016897158697247505, -0.009326353669166565, 0.014405827969312668, 0.03252928704023361, - -0.024616409093141556, 0.0031674103811383247, -0.0077515230514109135, -0.004566363524645567, - 0.0006809206097386777, -0.010817279107868671, -0.023351382464170456, 0.005324734840542078, - 0.022318705916404724, -0.0015377188101410866, -0.029379626736044884, 0.03051557019352913, - -0.0054215481504797935, 0.027391726151108742, -0.006583308335393667, 0.0027156146243214607, - 0.03188386559486389, 0.0022638191003352404, -0.017478037625551224, -0.02058897353708744, - 0.021428022533655167, -0.013618412427604198, -0.025623269379138947, 0.010055680759251118, - -0.024332424625754356, 0.02187981829047203, -0.01462527085095644, -0.002116985386237502, - -0.00023799949849490076, -0.028450218960642815, 0.00724163930863142, -0.03952566534280777, - -0.009881416335701942, -0.013902397826313972, 0.022938311100006104, -0.025791078805923462, - -0.02191854454576969, 0.0031093223951756954, 0.014586545526981354, 0.0005320700583979487, - 0.009087547659873962, 0.004140384495258331, -0.003614365356042981, -0.0075256251730024815, - 0.01570958085358143, 0.004153293091803789, -0.010714011266827583, 0.0036659990437328815, - -0.025171473622322083, -0.0008769676787778735, -0.005918523296713829, 0.0006224291864782572, - 0.022434882819652557, 0.002454218687489629, 0.001158533152192831, 0.005863662343472242, - 0.004676084965467453, 0.007899969816207886, 0.026217056438326836, -0.019491756334900856, - -0.01834290474653244, 0.027443360537290573, 0.0016095220344141126, -0.003933849278837442, - 0.009365078993141651, -0.01570958085358143, 0.026539769023656845, 0.0127341840416193, - -0.002221866510808468, 0.011359433643519878, 0.004950389731675386, -0.009565159678459167, - 0.0024913304951041937, -0.004605088848620653, -0.011772504076361656, 0.022409064695239067, - 0.008158138953149319, 0.006192827597260475, 0.011682145297527313, 0.020046819001436234, - 0.0007345713675022125, 0.006977016106247902, 0.013244067318737507, 0.01667771488428116, - 0.0010463910875841975, 0.005014931783080101, 0.01430256012827158, 0.0225252415984869, - -0.014057300053536892, 0.024267882108688354, 0.041332848370075226, 0.003394921775907278, - 0.01124971266835928, 0.021608741953969002, 0.02119567058980465, -0.0005986292380839586, - -0.026436500251293182, 0.001230336376465857, -0.005247284192591906, 0.02829531766474247, - -0.0028898788150399923, 0.004011299926787615, -0.020446980372071266, -0.02184109389781952, - -0.014663996174931526, -0.0014336444437503815, 0.031160993501544, -0.008629296906292439, - 0.021440932527184486, -0.01123034954071045, -0.015864482149481773, -0.004046798218041658, - -0.0026881841477006674, -0.004637359641492367, 0.0023202935699373484, -0.0012069398071616888, - 0.03696979582309723, -0.014638179913163185, 0.011036722920835018, 0.010520384646952152, - -0.041358668357133865, -0.008732564747333527, -0.008242043666541576, 0.0037369956262409687, - 0.015825757756829262, -0.0013061735080555081, 0.026152515783905983, 0.014818898402154446, - -0.010868912562727928, 0.04009363800287247, -0.009862054139375687, -0.019556298851966858, - -0.001853975816629827, 0.010520384646952152, -0.003920941147953272, 0.00998468417674303, - 0.018549438565969467, 0.05176287516951561, 0.029715247452259064, -0.02481003664433956, - 0.02315775491297245, -0.006615579593926668, 0.01351514458656311, -0.017194053158164024, - -0.026126697659492493, -0.005321507807821035, -0.007131917402148247, 0.017878200858831406, - -0.007867698557674885, -0.004534092266112566, 0.012811634689569473, 0.02610088139772415, - 0.016496995463967323, 0.009371533058583736, 0.007699889130890369, -0.003769266651943326, - -0.011172261089086533, 0.010068588890135288, 0.0008487304439768195, 0.004872939083725214, - 0.012185574509203434, 0.0027979060541838408, -0.008726110681891441, 0.013837856240570545, - -0.007848336361348629, 0.022602692246437073, 0.009371533058583736, -0.0004396940057631582, - 0.005198877304792404, 0.009920141659677029, -0.005137562286108732, -0.02987014874815941, - -0.03931913152337074, 0.02182818576693535, 0.03931913152337074, 0.006247688550502062, - -0.02697865664958954, 0.006944744847714901, 0.016948791220784187, -0.009584522806107998, - -0.02604924701154232, 0.006886656861752272, -0.005866889376193285, -0.005844299681484699, - 0.007951604202389717, -0.019504664465785027, -0.03190968185663223, 0.039112597703933716, - -0.022331614047288895, 8.461083780275658e-05, -0.018575256690382957, -0.005599039141088724, - 0.019246496260166168, 0.0036498636472970247, -0.015812847763299942, 0.029999231919646263, - -0.005540951155126095, -0.011417522095143795, -0.01796855963766575, 0.014818898402154446, - -0.026281598955392838, -0.00946189183741808, -0.015941932797431946, -0.0032222713343799114, - -0.013063348829746246, 0.005253738258033991, 0.028166232630610466, 0.010565564036369324, - -0.012818088755011559, 0.027494993060827255, -0.005663581658154726, -0.014676905237138271, - -0.012340475805103779, -0.007919332943856716, 0.0016571219312027097, 0.08049707859754562, - 0.015528862364590168, -0.014844714663922787, -0.0007809610688127577, -0.00017144031880889088, - 0.0019152909517288208, -0.03562731668353081, -0.010004047304391861, 0.04443087801337242, - -0.01511579193174839, -0.0007507069385610521, 0.021079495549201965, 0.01123034954071045, - -0.003840263234451413, 0.005392503924667835, 0.00931344460695982, 0.0011601467849686742, - -0.008493758738040924, 0.0004965718253515661, -0.03023158386349678, -0.010410662740468979, - 0.011327163316309452, 0.006828568875789642, 0.00609601428732276, -0.020446980372071266, - -0.0314449779689312, 0.012650278396904469, 0.005560313817113638, 0.0069124735891819, - -0.02088586799800396, 0.003194840857759118, 0.006218644790351391, -0.008119413629174232, - 0.0024477643892169, 0.003846717532724142, 0.03864789381623268, -0.025313466787338257, - 0.03245183825492859, -0.01381203904747963, -0.0276498943567276, 0.013786221854388714, - -0.0023896764032542706, 0.016522813588380814, -0.02987014874815941, 0.023687001317739487, - -0.015154517255723476, -0.001239210949279368, 0.036866527050733566, -0.010255761444568634, - -0.015257785096764565, 0.002878583734855056, 0.012082306668162346, -0.028476035222411156, - -0.014960890635848045, -0.021376390010118484, 0.034543007612228394, 0.0030786648858338594, - -0.016161376610398293, -0.0196466576308012, 0.004156520124524832, -0.01190158911049366, - -0.015554679557681084, -0.016187192872166634, -0.011985493823885918, 0.01643245480954647, - -0.005185968708246946, -0.0032238848507404327, -0.01576121523976326, -0.013670045882463455, - 0.004563136491924524, 0.02150547318160534, -0.01043002586811781, -0.045127931982278824, - 0.0004372736730147153, -0.0027962925378233194, 0.004075842443853617, 0.010765645653009415, - -0.015231967903673649, -0.011946768499910831, 0.021066587418317795, 0.005286009516566992, - -0.03474954143166542, -0.010158948600292206, -0.01029448676854372, 0.004417916294187307, - -0.006744664162397385, -0.006344501860439777, -0.002054056851193309, -0.002168619306758046, - 0.014560729265213013, 0.004611542914062738, 0.015180334448814392, -0.005156924948096275, - -0.017813658341765404, -0.006031472235918045, 0.016845524311065674, -0.005037521943449974, - 0.039422400295734406, -0.004062933847308159, -0.015128700993955135, -0.0006559105240739882, - -0.032968174666166306, 0.004950389731675386, -0.008913283236324787, -0.02253814972937107, - 0.009603885002434254, 0.014767264015972614, 0.019504664465785027, 0.005453818943351507, - -0.02573944441974163, 0.0010125063126906753, -0.014405827969312668, 0.019866101443767548, - -0.003180318744853139, 0.01709078438580036, 0.016935883089900017, 0.015825757756829262, - -0.0017200506990775466, -0.020072637125849724, -0.011920951306819916, 0.004050025250762701, - -0.028450218960642815, 0.017878200858831406, 0.013747496530413628, -0.013670045882463455, - 0.02415170520544052, 0.004766444209963083, -0.007202913984656334, -0.0029737837612628937, - -0.0019136774353682995, -0.0157224889844656, 0.011701507493853569, -0.020679334178566933, - -0.021105311810970306, -0.024693859741091728, -0.016858432441949844, -0.010139585472643375, - 0.012456651777029037, -0.00882937852293253, -0.01062365248799324, -0.024538958445191383, - -0.009287628345191479, -0.015580496750772, -0.00740299466997385, -0.021776551380753517, - -0.028553485870361328, -0.011540152132511139, -0.007596621289849281, -0.00773216038942337, - 0.01576121523976326, -0.02438405714929104, 0.013211796060204506, -0.01869143173098564, - -0.015541771426796913, -0.007557895965874195, -0.03570476546883583, -0.022718867287039757, - 0.0005187582573853433, 0.03206458315253258, 0.01999518647789955, 0.043088398873806, - -0.005715215113013983, 0.011469155550003052, 0.03885442763566971, 0.007486899849027395, - -0.0009269879083149135, 0.009616793133318424, 0.014831806533038616, -0.023415924981236458, - 0.005231148563325405, 0.028527669608592987, 0.02857930399477482, 0.006977016106247902, - 0.012630916200578213, 0.0018927011406049132, 0.010165402665734291, 0.005931431893259287, - 0.00649617612361908, -0.0051117450930178165, -0.03627273812890053, -0.02311903052031994, - -0.011056085117161274, -0.010197673924267292, -0.01093345507979393, 0.0066413963213562965, - 0.0019201316172257066, 0.030670471489429474, 0.023325564339756966, 0.007261001970618963, - 0.009158543311059475, 0.024822944775223732, -0.007899969816207886, 0.008622842840850353, - 0.004082296509295702, 0.00995241291821003, -0.007119008805602789, -0.014999615959823132, - -0.0014578477712348104, 0.010823733173310757, 0.015515954233705997, 0.007254547439515591, - 0.002862448338419199, 0.01674225740134716, -0.004327557049691677, -0.007790248375386, - 0.010668831877410412, -0.03384594991803169, 0.011778958141803741, 0.011333617381751537, - -0.011862863786518574, -0.015851574018597603, -0.016509905457496643, -0.0012739024823531508, - -0.0024897167459130287, -0.001184350112453103, -0.005463500507175922, 0.016251735389232635, - 0.013437693938612938, -0.013231159187853336, -0.025300556793808937, -0.011482064612209797, - -0.008274314925074577, 0.022279981523752213, -0.0004961684462614357, 0.03580803424119949, - 0.0195821151137352, -0.0008398558711633086, -0.0074417199939489365, 0.009261811152100563, - -0.0034271928016096354, 0.00342073873616755, 0.024319514632225037, 0.004214608110487461, - 0.00981042068451643, -0.013147254474461079, -0.00031181969097815454, -0.006860840134322643, - -0.034207385033369064, -0.01400566566735506, -0.012895539402961731, 0.006744664162397385, - 0.00039612798718735576, -0.0035465960390865803, -0.032942358404397964, -0.012869722209870815, - 0.024242063984274864, -0.025158565491437912, -0.008784199133515358, -0.03415575250983238, - -0.03141916170716286, 0.014392918907105923, -0.002097622724249959, -0.000839049112983048, - 0.003014122601598501, -0.01479308120906353, 0.0020266263745725155, 0.0022202529944479465, - -0.033975034952163696, 0.01805891841650009, 0.006622033659368753, -0.001002018223516643, - 0.009797511622309685, -0.012140395119786263, -0.017219869419932365, -0.00237354077398777, - 0.005576449446380138, -0.019491756334900856, 0.0051149725914001465, -0.005611947737634182, - 0.029198909178376198, -0.01511579193174839, -0.010655923746526241, 0.006776934955269098, - 0.002171846339479089, 0.01703915186226368, 0.017232777550816536, 0.001343285315670073, - -0.004950389731675386, -0.011346525512635708, 0.017620030790567398, 0.020782601088285446, - 0.003982256166636944, 0.01191449724137783, -0.005027840379625559, -0.006463905330747366, - -0.0314449779689312, -0.006305776536464691, -0.000754337408579886, 0.004314648453146219, - -0.029327992349863052, -0.031031908467411995, -0.021673284471035004, 0.017219869419932365, - 0.011333617381751537, 0.01044293399900198, -0.0018039555288851261, -0.025197289884090424, - 0.0283469520509243, -0.021621650084853172, 0.005582903511822224, -0.0006430020439438522, - 0.0037434499245136976, -0.012676095589995384, 0.002636550460010767, 0.008151684887707233, - -0.028811655938625336, 0.028398584574460983, -0.021298939362168312, -0.013850764371454716, - -0.017581306397914886, -0.0055441781878471375, -0.011985493823885918, -0.004221062641590834, - -0.02513274736702442, -0.02052443102002144, 0.009474800899624825, 0.0026542996056377888, - -0.018575256690382957, -0.008822924457490444, 0.013386060483753681, 0.012017765082418919, - 0.007196459453552961, 0.0005288429674692452, -0.020072637125849724, -0.029353810474276543, - 0.013244067318737507, -0.012456651777029037, -0.015193242579698563, -0.026255782693624496, - -0.016509905457496643, -0.004446960054337978, 0.005118199624121189, 0.02095041051506996, - 0.012488923035562038, -0.01931103691458702, 0.023299748077988625, -0.006218644790351391, - -0.009752332232892513, 0.0035433690063655376, -0.0077192517928779125, -0.013360243290662766, - 0.019039960578083992, 0.008300132118165493, 0.003927395213395357, 0.007654709741473198, - -0.014831806533038616, -0.006486495025455952, -0.0009189201518893242, -0.02641068398952484, - -0.024629319086670876, -0.022292889654636383, 0.031651515513658524, -0.00046631766599603, - -0.0021831411868333817, -0.012940718792378902, 0.020472798496484756, -0.031935498118400574, - -0.02639777585864067, -0.003507870715111494, 0.02346755750477314, 0.027185190469026566, - 0.013747496530413628, 0.00900364201515913, 0.02380317822098732, -0.008074234239757061, - 0.0023832221049815416, -0.0022121851798146963, -0.0015312646282836795, 0.027778979390859604, - -0.006238007452338934, -1.4912786355125718e-05, -0.005766849033534527, -0.019039960578083992, - 0.007119008805602789, 0.015051250346004963, -0.0059669301845133305, -0.029069824144244194, - -0.010959272272884846, -0.01302462350577116, 0.004521183669567108, -0.02504238858819008, - 0.009016551077365875, -0.005586130544543266, -0.0009035913390107453, 0.014457461424171925, - -0.010288032703101635, 0.011288437992334366, -0.025920163840055466, -0.013876581564545631, - -0.012417926453053951, -0.0012964921770617366, 0.011494972743093967, -0.002906014211475849, - 0.011010905727744102, -0.0009181133355014026, 0.01075273659080267, 0.01736186258494854, - -0.030980274081230164, 0.015657946467399597, 0.015877390280365944, 0.008235589601099491, - 0.007757977116852999, -0.0011859636288136244, 0.013592595234513283, 0.003601456992328167, - -0.013398968614637852, -0.029198909178376198, -0.008267860859632492, 0.013644229620695114, - -0.019194861873984337, 0.03888024389743805, -0.01064301561564207, 0.012669641524553299, - -0.024293698370456696, -0.021415114402770996, -0.00869383942335844, 0.019879009574651718, - -0.017103692516684532, 0.020434072241187096, -0.00017426404519937932, 0.0034723724238574505, - 0.004221062641590834, -0.005666808690875769, 0.002405812032520771, 0.003073824103921652, - -0.014883439987897873, 0.015193242579698563, 0.00998468417674303, -0.014896349050104618, - 0.02798551507294178, -0.023222297430038452, -0.021428022533655167, 0.0036240466870367527, - 0.012837450951337814, 0.004476004280149937, -0.005924977362155914, 0.2447441667318344, - -0.01763293892145157, 0.020072637125849724, -0.0018394538201391697, -0.027494993060827255, - 0.010468751192092896, 0.010255761444568634, -0.017749115824699402, -0.0016587355639785528, - 0.015696672722697258, -0.00962970219552517, 0.030309034511446953, -0.0195821151137352, - 0.010417117737233639, -0.003595002694055438, -0.004214608110487461, -0.024358240887522697, - -0.03224530071020126, -0.012527648359537125, -0.027856430038809776, 0.006170237902551889, - 0.001671643927693367, -0.008358219638466835, -0.03090282343327999, 0.03707306087017059, - 0.013373151421546936, -0.023377198725938797, -0.014418736100196838, 0.005747486371546984, - -0.011991947889328003, -0.014070208184421062, 0.001099638408049941, -0.0013360243756324053, - 0.016910066828131676, 0.01707787625491619, -0.00313029857352376, -0.0020492160692811012, - 0.0007386052166111767, 0.013553869910538197, -0.00044695500400848687, 0.0018717249622568488, - -0.016832616180181503, -0.01173377875238657, -0.028501853346824646, -0.01271482091397047, - 0.024242063984274864, -0.005808801390230656, -0.03531751409173012, -0.03252928704023361, - 0.013734588399529457, -0.0195821151137352, -0.009997593238949776, 0.027520811185240746, - 0.036143653094768524, 0.003267450723797083, 0.006518766283988953, -0.0072997272945940495, - -0.006789843551814556, 0.021144038066267967, 0.02116985432803631, -0.007325544022023678, - 0.009377987124025822, -0.017258593812584877, 0.003991937264800072, -0.0005449785385280848, - 0.04344983398914337, -0.05134980380535126, 0.02317066304385662, 0.02025335468351841, - -0.020408255979418755, 0.0026155742816627026, 0.0022121851798146963, -0.027520811185240746, - 0.025339283049106598, -0.038802795112133026, -0.0064768134616315365, 0.051607973873615265, - 0.024926211684942245, -0.00045098888222128153, 0.02089877612888813, 0.003788629313930869, - -0.014457461424171925, 0.02218962088227272, 0.0014731766423210502, -0.018394537270069122, - -0.014870531857013702, 0.007054466754198074, -0.02989596500992775, 0.02030498906970024, - 0.006873748265206814, -0.0015982271870598197, -0.03503352776169777, -0.0025478049647063017, - 0.0063025495037436485, 0.01412184163928032, 0.006712392903864384, 0.0070931920781731606, - 0.007919332943856716, 0.013902397826313972, -0.007906423881649971, -0.042546242475509644, - -0.0010165402200073004, 0.023338474333286285, 0.018562348559498787, -0.003417511470615864, - 0.0301799513399601, -0.000394514441723004, -0.001199678867124021, 0.003707951633259654, - -0.04270114377140999, -0.02899237349629402, -0.0009205336682498455, 0.025971796363592148, - 0.004337238613516092, -0.0028592210728675127, 0.023390106856822968, -0.008622842840850353, - -0.010526838712394238, 0.019788650795817375, -0.00715128006413579, 0.0074417199939489365, - -0.0314449779689312, -0.016561537981033325, 0.013347335159778595, -0.0205631572753191, - -0.031031908467411995, -0.04208153858780861, -0.012508286163210869, -0.03668580949306488, - -0.022292889654636383, 0.026152515783905983, -0.011933860369026661, -0.01028157863765955, - 0.00835176557302475, -0.012914901599287987, -0.024319514632225037, 0.01794274151325226, - -0.0013941123615950346, -0.00522146699950099, -0.006505857687443495, -0.009713606908917427, - -0.011398158967494965, -0.02439696714282036, 0.00038483311072923243, -0.010765645653009415, - -0.019749924540519714, 0.02181527577340603, 0.0009253743337467313, 0.010959272272884846, - -0.03056720457971096, 0.0006821308052167296, -0.007686980534344912, -0.001215007621794939, - 0.00531182624399662, 0.012605099007487297, -0.007570804562419653, -0.029715247452259064, - -0.01560631301254034, -0.020085545256733894, 0.010985089465975761, -0.03900932893157005, - 0.007370723877102137, 0.03949984908103943, -0.02126021310687065, -0.004869712051004171, - 0.005357005633413792, -0.16347257792949677, -0.0013287633191794157, 0.012630916200578213, - -0.019401397556066513, 0.021789459511637688, 0.004505048040300608, 0.008564755320549011, - -0.004566363524645567, 0.0018636571476235986, 0.01836872100830078, 0.013140799477696419, - 0.00724163930863142, -0.027107739821076393, -0.023854810744524002, 0.001528037479147315, - 0.003107708878815174, 0.010836642235517502, -0.00046268716687336564, 0.027572443708777428, - 0.007648255210369825, 0.02598470449447632, -0.01207585260272026, 0.007396540604531765, - 0.001297299051657319, 0.015825757756829262, -0.005305372178554535, -0.002112144837155938, - 0.008164593018591404, 0.016509905457496643, -0.013928215019404888, -0.006796297617256641, - -0.03278745710849762, 0.026462318375706673, -0.015541771426796913, 0.03085119090974331, - -0.004943935666233301, 0.005905614700168371, -0.030412303283810616, -0.008977825753390789, - 0.0019636976066976786, 0.013282792642712593, 0.05359587445855141, 0.011778958141803741, - -0.00019776145927608013, -0.014470369555056095, 0.00946189183741808, 0.013218250125646591, - -0.017581306397914886, 0.0020266263745725155, 0.0022186394780874252, 0.0328390896320343, - -0.038079921156167984, 0.014431644231081009, 0.001349739613942802, 0.03640182316303253, - 0.002317066304385662, -0.006686575710773468, 0.010404208675026894, 0.0036272737197577953, - -0.009203723631799221, -0.023648276925086975, -0.005589358042925596, 0.02899237349629402, - -0.0015231968136504292, 0.007480445317924023, 0.0013473192229866982, -0.030644655227661133, - -0.014831806533038616, -0.03503352776169777, -0.002605892950668931, 0.000569585245102644, - -0.010636560618877411, 0.02734009176492691, -0.014263834804296494, -0.007286818698048592, - 0.00949416309595108, -0.03689234331250191, 0.00571198808029294, 0.0045502278953790665, - 0.025997614488005638, -0.011030268855392933, 0.026565585285425186, -0.0040887510403990746, - -0.003862852929159999, 0.004866485018283129, -0.022718867287039757, 0.001741026877425611, - 0.016600264236330986, -0.013902397826313972, -0.02570072002708912, 0.01400566566735506, - -0.029198909178376198, -0.028166232630610466, -0.0003967330849263817, 0.008810015395283699, - -0.0039306222461164, 0.005750713404268026, 0.01546432077884674, -0.0005114972591400146, - -0.040377624332904816, -0.0010601063258945942, 0.002492944011464715, -0.00755144190043211, - 0.010062134824693203, 0.03557568043470383, 0.026242874562740326, -0.017620030790567398, - -0.0014981867279857397, 0.019504664465785027, 0.014031482860445976, -0.03642763942480087, - 0.01123034954071045, 0.015180334448814392, 0.02481003664433956, -0.01612265035510063, - 0.025636177510023117, 0.007344906684011221, -0.034284837543964386, 0.0032981084659695625, - -0.014689813368022442, 0.06758863478899002, 0.007603075820952654, 0.002328361151739955, - 0.015812847763299942, -0.01612265035510063, -0.0006869714707136154, -0.08767417818307877, - -0.023235205560922623, 0.006931836251169443, 0.01799437589943409, 0.0069899242371320724, - 0.033019810914993286, 0.00047761257155798376, 0.0013642616104334593, -0.031160993501544, - 0.03221948444843292, -0.016019383445382118, -0.04499885067343712, -0.025313466787338257, - -0.019788650795817375, -0.010836642235517502, -0.016329186037182808, -0.00853248406201601, - -0.02151838317513466, -0.03980965167284012, 0.03671162575483322, -0.009997593238949776, - -0.006789843551814556, 0.018213819712400436, -0.012095215730369091, -0.014405827969312668, - -0.006286413874477148, -0.03123844414949417, 0.009429621510207653, 0.017503855749964714, - 0.012108123861253262, -4.356601129984483e-05, -0.0348011739552021, -0.002810814417898655, - -0.03082537278532982, 0.018239635974168777, 0.0008640591986477375, -0.01827836222946644, - -0.003183546010404825, 0.010630106553435326, 0.013450603000819683, -0.004279150627553463, - -0.009797511622309685, 0.026927022263407707, -0.004175882786512375, -0.003307789796963334, - -0.004472777247428894, -0.01796855963766575, 0.023712817579507828, 0.01350223645567894, - -0.016148468479514122, -0.01737477071583271, -0.0007398154120892286, -0.0228737685829401, - 0.007306181360036135, 0.010836642235517502, -0.015167426317930222, 0.023996803909540176, - 0.028140416368842125, 0.0038047649431973696, -0.0025219880044460297, 0.018717249855399132, - 0.008797107264399529, -0.030773740261793137, 0.01399275753647089, 0.011824138462543488, - 0.0018394538201391697, -0.007854790426790714, -0.01559340488165617, 0.018910875543951988, - -0.02610088139772415, 0.012321113608777523, 0.01734895445406437, -0.014947982504963875, - 0.008455033414065838, 0.0015207765391096473, 0.0010835027787834406, -0.00788060761988163, - 0.020730966702103615, 0.01933685503900051, -0.011966130696237087, 0.0008495372021570802, - -0.0061896005645394325, -0.002718841889873147, -0.008584117516875267, 0.023983895778656006, - 0.0015828984323889017, -0.024345332756638527, -0.00538604985922575, 0.007286818698048592, - -0.004459868650883436, 0.008274314925074577, 0.02669467031955719, 0.019052868708968163, - -0.02505529671907425, -0.023687001317739487, 0.010739828459918499, -0.0048051695339381695, - 0.003814446274191141, 0.011269074864685535, 0.02124730497598648, -0.0008007271680980921, - 0.003969347570091486, -0.06825987249612808, 0.0301799513399601, 0.005937885958701372, - -0.01993064396083355, 0.024306606501340866, -0.007448174525052309, 0.006547810044139624, - -0.010288032703101635, -0.003866080194711685, 0.02793388068675995, -0.02927635982632637, - -0.004146839026361704, -0.009526434354484081, -0.008668022230267525, -0.013670045882463455, - -0.004711583256721497, 0.026255782693624496, 0.0005409446312114596, 0.005831391084939241, - 0.004127476364374161, 0.019775742664933205, -0.0039467578753829, 0.007202913984656334, - 0.02279631793498993, 0.016600264236330986, -0.015670856460928917, -0.010307395830750465, - 0.006121831480413675, -0.04267532750964165, 0.0009592590504325926, -0.007990329526364803, - -0.012676095589995384, -0.015645038336515427, 0.01092054694890976, -0.0012835838133469224, - 0.008609934709966183, 0.017852382734417915, -0.006463905330747366, 0.003343287855386734, - 0.05364750698208809, -0.009384441189467907, -0.029405444860458374, 0.0296119786798954, - -0.0005933851934969425, -0.022292889654636383, -0.0025590998120605946, 0.0012037127744406462, - 0.0017474810592830181, 0.011056085117161274, 0.013095620088279247, -0.003869307227432728, - 0.02896655723452568, -0.018239635974168777, -0.0061605568043887615, -0.006505857687443495, - -0.005495771765708923, 0.0036595449782907963, 0.004082296509295702, 0.019220678135752678, - -0.008151684887707233, 0.02155710756778717, 0.01827836222946644, -0.015993567183613777, - 0.005098836962133646, 0.018252545967698097, 0.014767264015972614, -0.014444553293287754, - 0.012760000303387642, 0.0266688521951437, -0.027727345004677773, 0.0003465111367404461, - -0.020989136770367622, 0.010223490186035633, 0.016935883089900017, -0.00011103282304247841, - 0.01400566566735506, 0.00866156816482544, 0.002312225755304098, -0.03250347077846527, - 0.015515954233705997, 0.02088586799800396, -0.010339667089283466, -0.004688993562012911, - -0.00245583220385015, 0.036763258278369904, -0.0008769676787778735, 0.027469176799058914, - 0.007338452618569136, 0.023970987647771835, 0.016161376610398293, 0.019465940073132515, - 0.009281174279749393, 0.005153697915375233, -0.012985898181796074, 0.0037628125865012407, - 0.0042113810777664185, 0.0026897978968918324, 0.0009891098598018289, 0.02446150779724121, - 0.020330805331468582, 0.029044007882475853, -0.010868912562727928, 0.02703028917312622, - -0.030489753931760788, -0.02767571248114109, 0.031703148037195206, -0.023906445130705833, - -0.04159101843833923, 0.0054215481504797935, 0.020666424185037613, 0.0283469520509243, - 0.02315775491297245, -0.011991947889328003, 0.017878200858831406, -0.042623694986104965, - 0.021724916994571686, 0.013837856240570545, -0.018097642809152603, -0.02572653628885746, - 0.03312307596206665, -0.006338047794997692, 0.0002837841457221657, 0.00021258600463625044, - -0.011843500658869743, 0.014250926673412323, 0.011365888640284538, 0.026927022263407707, - -0.03513679653406143, -0.013211796060204506, -0.017142418771982193, -0.016006475314497948, - -0.013850764371454716, -0.008003237657248974, -0.012101669795811176, 0.0012488922802731395, - -0.016858432441949844, -0.01993064396083355, 0.009991138242185116, -0.018162185326218605, - 0.056435734033584595, 0.008810015395283699, -0.017465129494667053, 0.0047438545152544975, - -0.0036789076402783394, -0.0016829388914629817, 0.024848761036992073, 0.008926191367208958, - -0.020162995904684067, -0.020188812166452408, 0.02215089648962021, -0.0025332828518003225, - -0.00715128006413579, -0.029766879975795746, 0.0017394133610650897, 0.009842691011726856, - 0.005924977362155914, 0.006228325888514519, -0.021298939362168312, -0.010823733173310757, - 0.020679334178566933, 0.0006950392271392047, -0.003107708878815174, -0.002906014211475849, - 0.0032787458039820194, -0.0032497018110007048, 0.023364290595054626, -0.0027285232208669186, - -0.004514729604125023, -0.039422400295734406, -0.0017297320300713181, 0.0022460699547082186, - -0.024706769734621048, -0.016213010996580124, 0.008758381940424442, -0.03495607525110245, - -0.002391289919614792, -0.00020562754070851952, 0.031031908467411995, 0.0002809604338835925, - -0.004995569121092558, 0.022938311100006104, -0.006738209631294012, -0.014263834804296494, - 0.011553061194717884, 0.0016296915709972382, -0.014083116315305233, -0.004869712051004171, - -0.016355004161596298]], "includeMetadata": true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - python-client-2.2.2 (requests:2.31.0, urllib3:1.26.16) - method: POST - uri: https://langchain-retrieval-74ce8fe.svc.us-west1-gcp-free.pinecone.io/query - response: - body: - string: "{\"results\":[],\"matches\":[{\"id\":\"35391d1d-0466-4d92-b457-35f673e516eb\",\"score\":0.901216626,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}},{\"id\":\"ff70f7d5-d84b-42c7-a7b9-8ba673903322\",\"score\":0.901193,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}},{\"id\":\"0b2c67b8-1381-4140-bc35-574c9bd9c8e6\",\"score\":0.901193,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}},{\"id\":\"484eb188-fe55-456f-9aa5-2ca84a301ac3\",\"score\":0.901193,\"values\":[],\"metadata\":{\"chunk\":1,\"source\":\"https://simple.wikipedia.org/wiki/Alan%20Turing\",\"text\":\"A - brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the - lives of an estimated 2 million people, through his effort in shortening World - War II.\\n\\nIn 2013, almost 60 years later, Turing received a posthumous - Royal Pardon from Queen Elizabeth II. Today, the \u201CTuring law\u201D grants - an automatic pardon to men who died before the law came into force, making - it possible for living convicted gay men to seek pardons for offences now - no longer on the statute book.\\n\\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended - his life at the age of 41 years, by eating an apple laced with cyanide.\\n\\nCareer - \\nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it - included the idea of a computer program.\\n\\nTuring was interested in artificial - intelligence. He proposed the Turing test, to say when a machine could be - called \\\"intelligent\\\". A computer could be said to \\\"think\\\" if a - human talking with it could not tell it was a machine.\",\"title\":\"Alan - Turing\",\"wiki-id\":\"13\"}}],\"namespace\":\"\"}" - headers: - content-length: - - '7152' - content-type: - - application/json - date: - - Mon, 03 Jul 2023 21:40:09 GMT - grpc-status: - - '0' - server: - - envoy - x-envoy-upstream-service-time: - - '2' - status: - code: 200 - message: OK -- request: - body: '{"prompt": ["Given the following extracted parts of a long document and - a question, create a final answer with references (\"SOURCES\"). \nIf you don''t - know the answer, just say that you don''t know. Don''t try to make up an answer.\nALWAYS - return a \"SOURCES\" part in your answer.\n\nQUESTION: Which state/country''s - law governs the interpretation of the contract?\n=========\nContent: This Agreement - is governed by English law and the parties submit to the exclusive jurisdiction - of the English courts in relation to any dispute (contractual or non-contractual) - concerning this Agreement save that either party may apply to any court for - an injunction or other relief to protect its Intellectual Property Rights.\nSource: - 28-pl\nContent: No Waiver. Failure or delay in exercising any right or remedy - under this Agreement shall not constitute a waiver of such (or any other) right - or remedy.\n\n11.7 Severability. The invalidity, illegality or unenforceability - of any term (or part of a term) of this Agreement shall not affect the continuation in - force of the remainder of the term (if any) and this Agreement.\n\n11.8 No Agency. - Except as expressly stated otherwise, nothing in this Agreement shall create - an agency, partnership or joint venture of any kind between the parties.\n\n11.9 - No Third-Party Beneficiaries.\nSource: 30-pl\nContent: (b) if Google believes, - in good faith, that the Distributor has violated or caused Google to violate - any Anti-Bribery Laws (as defined in Clause 8.5) or that such a violation is - reasonably likely to occur,\nSource: 4-pl\n=========\nFINAL ANSWER: This Agreement - is governed by English law.\nSOURCES: 28-pl\n\nQUESTION: What did the president - say about Michael Jackson?\n=========\nContent: Madam Speaker, Madam Vice President, - our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices - of the Supreme Court. My fellow Americans. \n\nLast year COVID-19 kept us apart. - This year we are finally together again. \n\nTonight, we meet as Democrats Republicans - and Independents. But most importantly as Americans. \n\nWith a duty to one - another to the American people to the Constitution. \n\nAnd with an unwavering - resolve that freedom will always triumph over tyranny. \n\nSix days ago, Russia\u2019s - Vladimir Putin sought to shake the foundations of the free world thinking he - could make it bend to his menacing ways. But he badly miscalculated. \n\nHe - thought he could roll into Ukraine and the world would roll over. Instead he - met a wall of strength he never imagined. \n\nHe met the Ukrainian people. \n\nFrom - President Zelenskyy to every Ukrainian, their fearlessness, their courage, their - determination, inspires the world. \n\nGroups of citizens blocking tanks with - their bodies. Everyone from students to retirees teachers turned soldiers defending - their homeland.\nSource: 0-pl\nContent: And we won\u2019t stop. \n\nWe have - lost so much to COVID-19. Time with one another. And worst of all, so much loss - of life. \n\nLet\u2019s use this moment to reset. Let\u2019s stop looking at - COVID-19 as a partisan dividing line and see it for what it is: A God-awful - disease. \n\nLet\u2019s stop seeing each other as enemies, and start seeing - each other for who we really are: Fellow Americans. \n\nWe can\u2019t change - how divided we\u2019ve been. But we can change how we move forward\u2014on COVID-19 - and other issues we must face together. \n\nI recently visited the New York - City Police Department days after the funerals of Officer Wilbert Mora and his - partner, Officer Jason Rivera. \n\nThey were responding to a 9-1-1 call when - a man shot and killed them with a stolen gun. \n\nOfficer Mora was 27 years - old. \n\nOfficer Rivera was 22. \n\nBoth Dominican Americans who\u2019d grown - up on the same streets they later chose to patrol as police officers. \n\nI - spoke with their families and told them that we are forever in debt for their - sacrifice, and we will carry on their mission to restore the trust and safety - every community deserves.\nSource: 24-pl\nContent: And a proud Ukrainian people, - who have known 30 years of independence, have repeatedly shown that they will - not tolerate anyone who tries to take their country backwards. \n\nTo all Americans, - I will be honest with you, as I\u2019ve always promised. A Russian dictator, - invading a foreign country, has costs around the world. \n\nAnd I\u2019m taking - robust action to make sure the pain of our sanctions is targeted at Russia\u2019s - economy. And I will use every tool at our disposal to protect American businesses - and consumers. \n\nTonight, I can announce that the United States has worked - with 30 other countries to release 60 Million barrels of oil from reserves around - the world. \n\nAmerica will lead that effort, releasing 30 Million barrels - from our own Strategic Petroleum Reserve. And we stand ready to do more if necessary, - unified with our allies. \n\nThese steps will help blunt gas prices here at - home. And I know the news about what\u2019s happening can seem alarming. \n\nBut - I want you to know that we are going to be okay.\nSource: 5-pl\nContent: More - support for patients and families. \n\nTo get there, I call on Congress to fund - ARPA-H, the Advanced Research Projects Agency for Health. \n\nIt\u2019s based - on DARPA\u2014the Defense Department project that led to the Internet, GPS, - and so much more. \n\nARPA-H will have a singular purpose\u2014to drive breakthroughs - in cancer, Alzheimer\u2019s, diabetes, and more. \n\nA unity agenda for the - nation. \n\nWe can do this. \n\nMy fellow Americans\u2014tonight , we have gathered - in a sacred space\u2014the citadel of our democracy. \n\nIn this Capitol, generation - after generation, Americans have debated great questions amid great strife, - and have done great things. \n\nWe have fought for freedom, expanded liberty, - defeated totalitarianism and terror. \n\nAnd built the strongest, freest, and - most prosperous nation the world has ever known. \n\nNow is the hour. \n\nOur - moment of responsibility. \n\nOur test of resolve and conscience, of history - itself. \n\nIt is in this moment that our character is formed. Our purpose is - found. Our future is forged. \n\nWell I know this nation.\nSource: 34-pl\n=========\nFINAL - ANSWER: The president did not mention Michael Jackson.\nSOURCES:\n\nQUESTION: - Who was Alan Turing?\n=========\nContent: A brilliant mathematician and cryptographer - Alan was to become the founder of modern-day computer science and artificial - intelligence; designing a machine at Bletchley Park to break secret Enigma encrypted - messages used by the Nazi German war machine to protect sensitive commercial, - diplomatic and military communications during World War 2. Thus, Turing made - the single biggest contribution to the Allied victory in the war against Nazi - Germany, possibly saving the lives of an estimated 2 million people, through - his effort in shortening World War II.\n\nIn 2013, almost 60 years later, Turing - received a posthumous Royal Pardon from Queen Elizabeth II. Today, the \u201cTuring - law\u201d grants an automatic pardon to men who died before the law came into - force, making it possible for living convicted gay men to seek pardons for offences - now no longer on the statute book.\n\nAlas, Turing accidentally or otherwise - lost his life in 1954, having been subjected by a British court to chemical - castration, thus avoiding a custodial sentence. He is known to have ended his - life at the age of 41 years, by eating an apple laced with cyanide.\n\nCareer - \nTuring was one of the people who worked on the first computers. He created - the theoretical Turing machine in 1936. The machine was imaginary, but it included - the idea of a computer program.\n\nTuring was interested in artificial intelligence. - He proposed the Turing test, to say when a machine could be called \"intelligent\". - A computer could be said to \"think\" if a human talking with it could not tell - it was a machine.\nSource: https://simple.wikipedia.org/wiki/Alan%20Turing\n\nContent: - A brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the lives - of an estimated 2 million people, through his effort in shortening World War - II.\n\nIn 2013, almost 60 years later, Turing received a posthumous Royal Pardon - from Queen Elizabeth II. Today, the \u201cTuring law\u201d grants an automatic - pardon to men who died before the law came into force, making it possible for - living convicted gay men to seek pardons for offences now no longer on the statute - book.\n\nAlas, Turing accidentally or otherwise lost his life in 1954, having - been subjected by a British court to chemical castration, thus avoiding a custodial - sentence. He is known to have ended his life at the age of 41 years, by eating - an apple laced with cyanide.\n\nCareer \nTuring was one of the people who worked - on the first computers. He created the theoretical Turing machine in 1936. - The machine was imaginary, but it included the idea of a computer program.\n\nTuring - was interested in artificial intelligence. He proposed the Turing test, to say - when a machine could be called \"intelligent\". A computer could be said to - \"think\" if a human talking with it could not tell it was a machine.\nSource: - https://simple.wikipedia.org/wiki/Alan%20Turing\n\nContent: A brilliant mathematician - and cryptographer Alan was to become the founder of modern-day computer science - and artificial intelligence; designing a machine at Bletchley Park to break - secret Enigma encrypted messages used by the Nazi German war machine to protect - sensitive commercial, diplomatic and military communications during World War - 2. Thus, Turing made the single biggest contribution to the Allied victory in - the war against Nazi Germany, possibly saving the lives of an estimated 2 million - people, through his effort in shortening World War II.\n\nIn 2013, almost 60 - years later, Turing received a posthumous Royal Pardon from Queen Elizabeth - II. Today, the \u201cTuring law\u201d grants an automatic pardon to men who - died before the law came into force, making it possible for living convicted - gay men to seek pardons for offences now no longer on the statute book.\n\nAlas, - Turing accidentally or otherwise lost his life in 1954, having been subjected - by a British court to chemical castration, thus avoiding a custodial sentence. - He is known to have ended his life at the age of 41 years, by eating an apple - laced with cyanide.\n\nCareer \nTuring was one of the people who worked on the - first computers. He created the theoretical Turing machine in 1936. The machine - was imaginary, but it included the idea of a computer program.\n\nTuring was - interested in artificial intelligence. He proposed the Turing test, to say when - a machine could be called \"intelligent\". A computer could be said to \"think\" - if a human talking with it could not tell it was a machine.\nSource: https://simple.wikipedia.org/wiki/Alan%20Turing\n\nContent: - A brilliant mathematician and cryptographer Alan was to become the founder of - modern-day computer science and artificial intelligence; designing a machine - at Bletchley Park to break secret Enigma encrypted messages used by the Nazi - German war machine to protect sensitive commercial, diplomatic and military - communications during World War 2. Thus, Turing made the single biggest contribution - to the Allied victory in the war against Nazi Germany, possibly saving the lives - of an estimated 2 million people, through his effort in shortening World War - II.\n\nIn 2013, almost 60 years later, Turing received a posthumous Royal Pardon - from Queen Elizabeth II. Today, the \u201cTuring law\u201d grants an automatic - pardon to men who died before the law came into force, making it possible for - living convicted gay men to seek pardons for offences now no longer on the statute - book.\n\nAlas, Turing accidentally or otherwise lost his life in 1954, having - been subjected by a British court to chemical castration, thus avoiding a custodial - sentence. He is known to have ended his life at the age of 41 years, by eating - an apple laced with cyanide.\n\nCareer \nTuring was one of the people who worked - on the first computers. He created the theoretical Turing machine in 1936. - The machine was imaginary, but it included the idea of a computer program.\n\nTuring - was interested in artificial intelligence. He proposed the Turing test, to say - when a machine could be called \"intelligent\". A computer could be said to - \"think\" if a human talking with it could not tell it was a machine.\nSource: - https://simple.wikipedia.org/wiki/Alan%20Turing\n=========\nFINAL ANSWER:"], - "model": "text-davinci-003", "temperature": 0.7, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '13124' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.9.13", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: !!binary | - H4sIAAAAAAAAA0xSTU8bMRS851eMVuqNJJuEQpJbSxFFrSgFKj5Khd7aL7tuvPbKfpsQEP+98iYF - Lpbs8cybsee5B2RGZ3Nkqm5s//D2+93R4dHs5uQgXs9uP6782c3d1eTbFy8Tle2l2774y0oSQ/hR - HpSvG8tivNvCKjAJJ8XRwXS6P873R3kH1F6z/U/ra1oZp0w/zyc7XuWN4pjN8bsHAM/diu31RMMn - Sw5XbTCuxJoiCEUw1hpygpqk4prEKEMO5DRU2DTiy0BNxQHryqNgRTVDKsbCt05zgF8g2Qqur2mD - FKUVDojKsFPc6VAQs0iyFsYJW2vKhA3wlaE5mtKxBqEmVRnHIMFny6IqyxucU1hCPIrAtERkFVhw - 7ExZE9h1Dlmj5hip5Ig2skax6Rye0ZPBCYeaHNYUXvX1Nv+1D1bjmgLGnZMm+MYneuLu3kg4yl4a - H2mDdcXunU3lW6tRMBRZyxr32Vs4uc86zcCKzapL1/goVVv7NuLCb8imZNo7LIKv8bNldji25okK - lgqnpzAO43w0Gdy7yx+/Lo6OL+eoRJo4Hw6jSX0ZrM3SNKwNDXwoh2k3TP/7YZxv3Xel6P7fOM2P - 2Rz564n1ZRN8kbriWmtfzxfGmVg9BKboXapMFN9kHfrSA/50PWvTW2fzXb+yJvi6kQfxS3ZJcDyd - zraC2Vuz3+BRfrhDxQvZd7zZ7KCX5rz0/gEAAP//AwDQR01CVAMAAA== - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7e12490ff89b42d3-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 03 Jul 2023 21:40:13 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '2357' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 1b72c8880dc82f8063ea75bcb517c816 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_async.yaml b/tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_async.yaml deleted file mode 100644 index c88b93429af..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_async.yaml +++ /dev/null @@ -1,178 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Paraphrase this text:\n\n \n I have convinced - myself that there is absolutely nothing in the world, no sky, no earth, no minds, - no\n bodies. Does it now follow that I too do not exist? No: if I - convinced myself of something then I certainly\n existed. But there - is a deceiver of supreme power and cunning who is deliberately and constantly - deceiving\n me. In that case I too undoubtedly exist, if he is deceiving - me; and let him deceive me as much as he can,\n he will never bring - it about that I am nothing so long as I think that I am something. So after - considering\n everything very thoroughly, I must finally conclude - that this proposition, I am, I exist, is necessarily\n true whenever - it is put forward by me or conceived in my mind.\n \n\n Paraphrase: - "], "model": "text-davinci-003", "temperature": 0.7, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7WuHVi1u9Zpbq89gwIe2EfEDDQbBt\",\n \"object\": - \"text_completion\",\n \"created\": 1688077197,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\nI have convinced myself that - there is no physical world - no sky, earth, minds, or bodies. Does this mean - that I don't exist either? No, if I was able to convince myself of something, - then I must have existed. But there is a trickster with immense power and - skill who is actively trying to deceive me. Even if he succeeds, I cannot - be nothing, because I still believe that I am something. After considering - it carefully, I must accept that I exist whenever I think or propose it.\",\n - \ \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 183,\n \"completion_tokens\": - 106,\n \"total_tokens\": 289\n }\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7df18dd1d8ea436c-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 29 Jun 2023 22:19:59 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '2323' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - 3892a697083cdef3dbccd81c00e6304d - status: - code: 200 - message: OK - url: https://api.openai.com/v1/completions -- request: - body: '{"prompt": ["Make this text rhyme:\n\n \nI have convinced myself - that there is no physical world - no sky, earth, minds, or bodies. Does this - mean that I don''t exist either? No, if I was able to convince myself of something, - then I must have existed. But there is a trickster with immense power and skill - who is actively trying to deceive me. Even if he succeeds, I cannot be nothing, - because I still believe that I am something. After considering it carefully, - I must accept that I exist whenever I think or propose it.\n\n Rhyme: - "], "model": "text-davinci-003", "temperature": 0.7, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}}' - headers: - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4.1-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 - PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64"}' - method: post - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7WuHXVJGcFrx8x8z6wuMhl7qUEfjQ\",\n \"object\": - \"text_completion\",\n \"created\": 1688077199,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\nI've convinced my mind, no physical - world's there, no sky, no earth, no minds, no bodies there. Does this mean - I don't exist, not so, I thought it, I must exist, but here's the plot twist. - A trickster with power, is trying to deceive, but I still believe, I'm something - to believe. Thought it carefully, accept I exist, when I think or propose, - I must resist.\",\n \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 121,\n \"completion_tokens\": - 92,\n \"total_tokens\": 213\n }\n}\n" - headers: - Access-Control-Allow-Origin: - - '*' - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7df18de139f84334-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Thu, 29 Jun 2023 22:20:01 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '2271' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - f95491d00e8d00e6685df068d18c8901 - status: - code: 200 - message: OK - url: https://api.openai.com/v1/completions -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_sync.yaml b/tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_sync.yaml deleted file mode 100644 index 7396814e40b..00000000000 --- a/tests/contrib/langchain/cassettes/langchain/openai_sequential_paraphrase_and_rhyme_sync.yaml +++ /dev/null @@ -1,195 +0,0 @@ -interactions: -- request: - body: '{"prompt": ["Paraphrase this text:\n\n \n I have convinced - myself that there is absolutely nothing in the world, no sky, no earth, no minds, - no bodies. Does it now follow that I too do not exist? No: if I convinced myself - of something then I certainly existed. But there is a deceiver of supreme power - and cunning who is deliberately and constantly deceiving me.\nIn that case I - too undoubtedly exist, if he is deceiving me; and let him deceive me as much - as he can, he will never bring it about that I am nothing so long as I think - that I am something. So after considering everything very thoroughly, I must - finally conclude that this proposition, I am, I exist, is necessarily true whenever - it is put forward by me or conceived in my mind.\n \n\n Paraphrase: - "], "model": "text-davinci-003", "temperature": 0.7, "max_tokens": 256, "top_p": - 1, "frequency_penalty": 0, "presence_penalty": 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '954' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7UclWVHj9jLrEHRtMRt42SFPBBObq\",\n \"object\": - \"text_completion\",\n \"created\": 1687533210,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\nI have come to the conclusion - that there is nothing in the world such as the sky, the earth, minds, or bodies. - Does this mean that I do not exist either? No, if I was able to come to this - conclusion then I must exist. However, there is a deceiver of immense skill - and power who is attempting to deceive me. In this case, I must exist if he - is trying to deceive me. No matter what he does, he will never be able to - make me believe that I am nothing as long as I think that I am something. - In conclusion, I must accept that when I think or say \\\"I am, I exist\\\", - it must be true.\",\n \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 172,\n \"completion_tokens\": - 140,\n \"total_tokens\": 312\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7dbdace38ead1a40-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 23 Jun 2023 15:13:41 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '10806' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - ef1cf91bf6dcaee3d369265db9c8084a - status: - code: 200 - message: OK -- request: - body: '{"prompt": ["Make this text rhyme:\n \n \nI have come to - the conclusion that there is nothing in the world such as the sky, the earth, - minds, or bodies. Does this mean that I do not exist either? No, if I was able - to come to this conclusion then I must exist. However, there is a deceiver of - immense skill and power who is attempting to deceive me. In this case, I must - exist if he is trying to deceive me. No matter what he does, he will never be - able to make me believe that I am nothing as long as I think that I am something. - In conclusion, I must accept that when I think or say \"I am, I exist\", it - must be true.\n \n Rhyme: "], "model": "text-davinci-003", "temperature": - 0.7, "max_tokens": 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": - 0, "n": 1, "logit_bias": {}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '816' - Content-Type: - - application/json - User-Agent: - - OpenAI/v1 PythonBindings/0.27.8 - X-OpenAI-Client-User-Agent: - - '{"bindings_version": "0.27.8", "httplib": "requests", "lang": "python", "lang_version": - "3.10.5", "platform": "macOS-13.4-arm64-arm-64bit", "publisher": "openai", - "uname": "Darwin 22.5.0 Darwin Kernel Version 22.5.0: Mon Apr 24 20:52:24 - PDT 2023; root:xnu-8796.121.2~5/RELEASE_ARM64_T6000 arm64"}' - method: POST - uri: https://api.openai.com/v1/completions - response: - body: - string: "{\n \"id\": \"cmpl-7UclhTPh8kO1yEfNRnyL91hRHjRKs\",\n \"object\": - \"text_completion\",\n \"created\": 1687533221,\n \"model\": \"text-davinci-003\",\n - \ \"choices\": [\n {\n \"text\": \"\\nI've come to the conclusion - it's true,\\nThere's nothing in the world like me and you.\\nDoes this mean - I don't exist? No!\\nFor if I thought, it must be so.\\nA deceiver skilled - and powerful,\\nIs here to make me think I'm nothing at all.\\nBut no matter - what he does to me,\\nHe'll never make me think I'm nothing, you see.\\nIn - conclusion, it must be true,\\nThat when I say \\\"I am, I exist\\\", it's - true!\",\n \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": - \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 159,\n \"completion_tokens\": - 115,\n \"total_tokens\": 274\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 7dbdad27ce701835-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 23 Jun 2023 15:13:43 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-davinci-003 - openai-organization: - - datadog-4 - openai-processing-ms: - - '2245' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '3000' - x-ratelimit-limit-tokens: - - '250000' - x-ratelimit-remaining-requests: - - '2999' - x-ratelimit-remaining-tokens: - - '249744' - x-ratelimit-reset-requests: - - 20ms - x-ratelimit-reset-tokens: - - 61ms - x-request-id: - - b2f8c879a955d21a602ea91d7fe62455 - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_image_input_sync_generate.yaml b/tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_image_input_sync_generate.yaml deleted file mode 100644 index 42bcafca579..00000000000 --- a/tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_image_input_sync_generate.yaml +++ /dev/null @@ -1,103 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"content": [{"type": "text", "text": "What\u2019s in this - image?"}, {"type": "image_url", "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"}], - "role": "user"}], "model": "gpt-4-vision-preview", "max_tokens": 256, "n": 1, - "stream": false, "temperature": 0.0}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '396' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.30.3 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.30.3 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.5 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-9lnJJHGo7wOZFGt5tiEeKi1jiPJwL\",\n \"object\": - \"chat.completion\",\n \"created\": 1721177993,\n \"model\": \"gpt-4-1106-vision-preview\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"The image shows a wooden boardwalk extending - through a lush green meadow with tall grasses on either side. The sky is partly - cloudy with blue skies and some white clouds, suggesting a pleasant day. In - the distance, there are trees and shrubs, and the overall scene is one of a - natural, tranquil environment, possibly a nature reserve or park. The perspective - of the boardwalk draws the viewer's eye towards the horizon, creating a sense - of depth and inviting exploration.\"\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 1118,\n \"completion_tokens\": 95,\n \"total_tokens\": 1213\n },\n \"system_fingerprint\": - null\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8a464aa9dd9fab96-YYZ - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Wed, 17 Jul 2024 00:59:56 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=Fd.3zfjJQz4.Vs7F0ur6HCt2l8hwpFsojFvYBzAR42Q-1721177996-1.0.1.1-bSt7NTRSWGy_k7d9ia3SPCtHDHm4laMZCs2GQ_FbieN_f9qdWKNcKfA9QCkFLGfHgIkNYu82rwsHyPP2EFW7uQ; - path=/; expires=Wed, 17-Jul-24 01:29:56 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=wd8C.hbPpM6whc85tJ0okPtlOA6Dm6X9_qK2fK.2T3U-1721177996450-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - datadog-4 - openai-processing-ms: - - '5658' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '500000' - x-ratelimit-limit-tokens: - - '300000' - x-ratelimit-remaining-requests: - - '499999' - x-ratelimit-remaining-tokens: - - '299736' - x-ratelimit-reset-requests: - - 0s - x-ratelimit-reset-tokens: - - 52ms - x-request-id: - - req_d043fa0cb82f8c22b5cadf6fbc1132d7 - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_embedding_query_integration.yaml b/tests/contrib/langchain/cassettes/langchain_community/openai_embedding_query_integration.yaml deleted file mode 100644 index 102194b5d39..00000000000 --- a/tests/contrib/langchain/cassettes/langchain_community/openai_embedding_query_integration.yaml +++ /dev/null @@ -1,89 +0,0 @@ -interactions: -- request: - body: '{"input": "", "model": "text-embedding-ada-002", "encoding_format": "base64"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '77' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.30.3 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.30.3 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.5 - method: POST - uri: https://api.openai.com/v1/embeddings - response: - content: "{\n \"object\": \"list\",\n \"data\": [\n {\n \"object\": - \"embedding\",\n \"index\": 0,\n \"embedding\": \"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\"\n - \ }\n ],\n \"model\": \"text-embedding-ada-002\",\n \"usage\": {\n \"prompt_tokens\": - 1,\n \"total_tokens\": 1\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8ab773766b878298-IAD - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 30 Jul 2024 18:35:52 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=ggWVHFgioAT1pC5qtmqPKsAx5EYcmz03sJ14ffLSumE-1722364552-1.0.1.1-hQLT0WbxlShI3_4cRRp3AsHQfKlVmKcrGyAUki5OMG5ABAx3zlUdkqomhbmJtS9T8DH0T5fx8MKpn0kYv1nF.w; - path=/; expires=Tue, 30-Jul-24 19:05:52 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=65Hy9XC0Yv6_M0E8DlThaqw38AI.X7VeIW6BvODc3Ic-1722364552959-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-embedding-ada-002 - openai-organization: - - datadog-4 - openai-processing-ms: - - '21' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-reset-requests: - - 6ms - x-request-id: - - req_59eefe40e0302d1cd8eca8b6e780227c - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_math_chain.yaml b/tests/contrib/langchain/cassettes/langchain_community/openai_math_chain.yaml deleted file mode 100644 index 72362139de8..00000000000 --- a/tests/contrib/langchain/cassettes/langchain_community/openai_math_chain.yaml +++ /dev/null @@ -1,109 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo-instruct", "prompt": ["Translate a math problem - into a expression that can be executed using Python''s numexpr library. Use - the output of running this code to answer the question.\n\nQuestion: ${Question - with math problem.}\n```text\n${single line mathematical expression that solves - the problem}\n```\n...numexpr.evaluate(text)...\n```output\n${Output of running - the code}\n```\nAnswer: ${Answer}\n\nBegin.\n\nQuestion: What is 37593 * 67?\n```text\n37593 - * 67\n```\n...numexpr.evaluate(\"37593 * 67\")...\n```output\n2518731\n```\nAnswer: - 2518731\n\nQuestion: 37593^(1/5)\n```text\n37593**(1/5)\n```\n...numexpr.evaluate(\"37593**(1/5)\")...\n```output\n8.222831614237718\n```\nAnswer: - 8.222831614237718\n\nQuestion: what is two raised to the fifty-fourth power?\n"], - "frequency_penalty": 0, "logit_bias": {}, "max_tokens": 256, "n": 1, "presence_penalty": - 0, "stop": ["```output"], "temperature": 0.0, "top_p": 1}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '252' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.37.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.37.0 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.5 - method: POST - uri: https://api.openai.com/v1/completions - response: - content: "{\n \"id\": \"cmpl-9pS59VnEjFk3hqwZ1F5EAaOaCAR2Z\",\n \"object\": - \"text_completion\",\n \"created\": 1722049703,\n \"model\": \"gpt-3.5-turbo-instruct\",\n - \ \"choices\": [\n {\n \"text\": \"```text\\n2**54\\n```\\n...numexpr.evaluate(\\\"2**54\\\")...\\n\",\n - \ \"index\": 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 202,\n \"completion_tokens\": - 19,\n \"total_tokens\": 221\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8a996acbdf858c75-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 27 Jul 2024 03:07:05 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=fMRQZS3bxSftxAMS8IuiE2foYIw3DztE.qryhXhSw9Q-1722049625-1.0.1.1-5awqGo9QRAAIDCxXUvLGbGylWrZW82rdjp2DgYit4qkHqKkswluZK4NivWw6hz98nRQ_bZDSd_IaC5TqXaHwgA; - path=/; expires=Sat, 27-Jul-24 03:37:05 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=LopFDU7cpA3qLvz3LTczXrPp.bw_l.dOe9tDmHcpAxg-1722049625644-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-instruct - openai-organization: - - datadog-4 - openai-processing-ms: - - '495' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '3500' - x-ratelimit-limit-tokens: - - '90000' - x-ratelimit-remaining-requests: - - '3499' - x-ratelimit-remaining-tokens: - - '89733' - x-ratelimit-reset-requests: - - 17ms - x-ratelimit-reset-tokens: - - 178ms - x-request-id: - - req_e1f296af28bb766dc68a53513f516261 - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_async.yaml b/tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_async.yaml deleted file mode 100644 index ddf539d1fb1..00000000000 --- a/tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_async.yaml +++ /dev/null @@ -1,231 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo-instruct", "prompt": ["Paraphrase this text:\n\n \n I - have convinced myself that there is absolutely nothing in the world, no sky, - no earth, no minds, no\n bodies. Does it now follow that I too do - not exist? No: if I convinced myself of something then I certainly\n existed. - But there is a deceiver of supreme power and cunning who is deliberately and - constantly deceiving\n me. In that case I too undoubtedly exist, - if he is deceiving me; and let him deceive me as much as he can,\n he - will never bring it about that I am nothing so long as I think that I am something. - So after considering\n everything very thoroughly, I must finally - conclude that this proposition, I am, I exist, is necessarily\n true - whenever it is put forward by me or conceived in my mind.\n \n\n Paraphrase: - "], "frequency_penalty": 0, "logit_bias": {}, "logprobs": null, "max_tokens": - 256, "n": 1, "presence_penalty": 0, "seed": null, "temperature": 0.7, "top_p": - 1}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '1069' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - AsyncOpenAI/Python 1.37.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.37.0 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.5 - method: POST - uri: https://api.openai.com/v1/completions - response: - content: "{\n \"id\": \"cmpl-9pS5JShqBADikfDtRTJoNR3wEWXBw\",\n \"object\": - \"text_completion\",\n \"created\": 1722049713,\n \"model\": \"gpt-3.5-turbo-instruct\",\n - - - \ \"choices\": [\n {\n \"text\": \"\\nI have convinced myself that nothing truly - exists in the world - no sky, no earth, no minds, no bodies. But does this mean that I, - too, do not exist? No, because if I am capable of convincing myself of something, then I - must exist. However, there is a powerful and cunning deceiver who is constantly trying to - deceive me. Despite this, I am certain of my existence, as long as I believe that I exist. - Therefore, after careful consideration, I must conclude that the statement \\\"I am, I exist\\\" - is always true when it is thought or expressed by myself.\",\n \"index\": 0,\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 178,\n \"completion_tokens\": 125,\n \"total_tokens\": 303\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8a996cf398711a0f-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 27 Jul 2024 03:08:35 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=JWVOSC.aqjn8zdqDAUxmXVhaeyjD8FrwRWNLD7o1GoE-1722049715-1.0.1.1-zQ0JT2EHVl99hvbyookzboIZsbpADfLBtUAVEBWlRFPlG70L9flkTn59eS76yC34M3xP8nFxbX.uIT9qV0yuAA; - path=/; expires=Sat, 27-Jul-24 03:38:35 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=3AkmuSejUFswLRJ_hb02Dvv8xRz8CkXgtXU28zuCsJ4-1722049715326-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-instruct - openai-organization: - - datadog-4 - openai-processing-ms: - - '2012' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '3500' - x-ratelimit-limit-tokens: - - '90000' - x-ratelimit-remaining-requests: - - '3499' - x-ratelimit-remaining-tokens: - - '89532' - x-ratelimit-reset-requests: - - 17ms - x-ratelimit-reset-tokens: - - 312ms - x-request-id: - - req_c8b5188739d7a4dcdc0a7a696285de06 - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"model": "gpt-3.5-turbo-instruct", "prompt": ["Make this text rhyme:\n\n \nI - have convinced myself that nothing in this world exists - no sky, no earth, - no minds, no bodies. But does this mean that I do not exist either? No, because - in order to convince myself of something, I must exist. However, there is a - powerful and cunning deceiver who constantly tricks me. Despite this, I still - exist because I am being deceived. No matter how much this deceiver tries, I - will always believe that I am something and therefore will never be nothing. - After careful consideration, I have come to the conclusion that the statement - \"I am, I exist\" is always true when said or thought by me.\n\n Rhyme: - "], "frequency_penalty": 0, "logit_bias": {}, "logprobs": null, "max_tokens": - 256, "n": 1, "presence_penalty": 0, "seed": null, "temperature": 0.7, "top_p": - 1}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '865' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - AsyncOpenAI/Python 1.37.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - async:asyncio - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.37.0 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.5 - method: POST - uri: https://api.openai.com/v1/completions - response: - content: "{\n \"id\": \"cmpl-9pS5LZMM5CPF1CXDGlrhCgcUmN4M7\",\n \"object\": - \"text_completion\",\n \"created\": 1722049715,\n \"model\": \"gpt-3.5-turbo-instruct\",\n - \ \"choices\": [\n {\n \"text\": \"\\n\\nI have convinced myself that nothing is real,\\nNo - sky, no earth, no minds, no bodies to feel.\\nBut does this mean I don't exist at all?\\nNo, if I can - convince myself, I must stand tall.\\n\\nYet a sly deceiver tries to trick my mind,\\nBut I know my - existence, I am sure to find.\\nAs long as I believe, I will always persist,\\n\\\"I am, I exist,\\\" - a truth I can't resist. \",\n \"index\": 0,\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 135,\n \"completion_tokens\": 97,\n - \ \"total_tokens\": 232\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8a996d014dcfc407-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 27 Jul 2024 03:08:38 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=zB.VmGn6KzHYKCLs8bMvq8p96HYbhzOq_YrxX9cKNBo-1722049718-1.0.1.1-sjvfid9uoffCQ1MMsSRUgzczzR78qAGMCDLluQ.d9t5HBNbQ7l7TaaASstJ6CZ9jZ6Qqc0h8B.lvGbordLRjuw; - path=/; expires=Sat, 27-Jul-24 03:38:38 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=9RR_HkobIWZDj8jFVZn2h6rOtcg0vBV8rvy6Dzpo7YM-1722049718122-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-instruct - openai-organization: - - datadog-4 - openai-processing-ms: - - '2604' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '3500' - x-ratelimit-limit-tokens: - - '90000' - x-ratelimit-remaining-requests: - - '3499' - x-ratelimit-remaining-tokens: - - '89582' - x-ratelimit-reset-requests: - - 17ms - x-ratelimit-reset-tokens: - - 278ms - x-request-id: - - req_bc4a9203e14035a16e63bcc7e66ae783 - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_sync.yaml b/tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_sync.yaml deleted file mode 100644 index 6fa649ad0d3..00000000000 --- a/tests/contrib/langchain/cassettes/langchain_community/openai_sequential_paraphrase_and_rhyme_sync.yaml +++ /dev/null @@ -1,230 +0,0 @@ -interactions: -- request: - body: '{"model": "gpt-3.5-turbo-instruct", "prompt": ["Paraphrase this text:\n\n \n I - have convinced myself that there is absolutely nothing in the world, no sky, - no earth, no minds, no\n bodies. Does it now follow that I too do - not exist? No: if I convinced myself of something then I certainly\n existed. - But there is a deceiver of supreme power and cunning who is deliberately and - constantly deceiving\n me. In that case I too undoubtedly exist, - if he is deceiving me; and let him deceive me as much as he can,\n he - will never bring it about that I am nothing so long as I think that I am something. - So after considering\n everything very thoroughly, I must finally - conclude that this proposition, I am, I exist, is necessarily\n true - whenever it is put forward by me or conceived in my mind.\n \n\n Paraphrase: - "], "frequency_penalty": 0, "logit_bias": {}, "logprobs": null, "max_tokens": - 256, "n": 1, "presence_penalty": 0, "seed": null, "temperature": 0.7, "top_p": - 1}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '1069' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.37.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.37.0 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.5 - method: POST - uri: https://api.openai.com/v1/completions - response: - content: "{\n \"id\": \"cmpl-9pS5eGznRgW4LDGFcJCzW7xNWzAO4\",\n \"object\": - \"text_completion\",\n \"created\": 1722049734,\n \"model\": \"gpt-3.5-turbo-instruct\",\n - \ \"choices\": [\n {\n \"text\": \"\\nI have convinced myself that there - is nothing in existence, no sky, no earth, no minds, no bodies. But does this - mean that I, myself, do not exist? No, because if I am able to convince myself - of something, then I must exist. However, there is a powerful and cunning deceiver - who is constantly tricking me. But even if this deceiver is manipulating me, - I still exist as long as I believe that I do. Therefore, after careful consideration, - I must conclude that the statement \\\"I am, I exist\\\" is always true when - it is expressed or thought by me.\",\n \"index\": 0,\n \"logprobs\": - null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 178,\n \"completion_tokens\": 125,\n \"total_tokens\": 303\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8a996d7788225e6b-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 27 Jul 2024 03:08:56 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=8n5QOhsiB05Bf4CrvqmOl.plWqWEMFoklaR4FEgK8GY-1722049736-1.0.1.1-1kb9RG0UhpMJ8M2McKNhDBHhC00J8XSMp9lKDf6IxH6jvPoBR0M968__U8k2j4fT8su07YPRo_DXlbDpw4Gq7Q; - path=/; expires=Sat, 27-Jul-24 03:38:56 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=GIgMdxx8JL08g99TBz.u1IpSJFExKhzyNzbtymHpeMo-1722049736205-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-instruct - openai-organization: - - datadog-4 - openai-processing-ms: - - '1748' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '3500' - x-ratelimit-limit-tokens: - - '90000' - x-ratelimit-remaining-requests: - - '3499' - x-ratelimit-remaining-tokens: - - '89532' - x-ratelimit-reset-requests: - - 17ms - x-ratelimit-reset-tokens: - - 312ms - x-request-id: - - req_22f16bc00224ac18c3bc85e878d10353 - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"model": "gpt-3.5-turbo-instruct", "prompt": ["Make this text rhyme:\n\n \nI - have convinced myself that there is nothing in existence, no sky, no earth, - no minds, no bodies. But does this mean that I, myself, do not exist? No, because - if I am able to convince myself of something, then I must exist. However, there - is a powerful and cunning deceiver who is constantly tricking me. But even if - this deceiver is manipulating me, I still exist as long as I believe that I - do. Therefore, after careful consideration, I must conclude that the statement - \"I am, I exist\" is always true when it is expressed or thought by me.\n\n Rhyme: - "], "frequency_penalty": 0, "logit_bias": {}, "logprobs": null, "max_tokens": - 256, "n": 1, "presence_penalty": 0, "seed": null, "temperature": 0.7, "top_p": - 1}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '805' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.37.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.37.0 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.5 - method: POST - uri: https://api.openai.com/v1/completions - response: - content: "{\n \"id\": \"cmpl-9pS5gWUoZkr7SgreKp7wagEqmU2Tq\",\n \"object\": - \"text_completion\",\n \"created\": 1722049736,\n \"model\": \"gpt-3.5-turbo-instruct\",\n - \ \"choices\": [\n {\n \"text\": \"\\n\\nI have convinced myself of - a doubt,\\nNo sky, no earth, no minds about.\\nBut do I too not exist,\\nIf - I can convince and persist?\\n\\nA deceiver, ever sly,\\nConstantly tricks and - makes me cry.\\nBut even if they have their way,\\nI still exist, I can say.\\n\\nAfter - much thought, I must declare,\\n\\\"I am, I exist\\\" always to be fair.\\nFor - as long as I believe it true,\\nMy existence will shine through.\",\n \"index\": - 0,\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 135,\n \"completion_tokens\": 99,\n - \ \"total_tokens\": 234\n }\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8a996d83dfbd4277-EWR - Cache-Control: - - no-cache, must-revalidate - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Sat, 27 Jul 2024 03:08:57 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=R0oMXyNSzKB15AXLkbhlmg8aOJdkxgwpnz31Hz2Ox64-1722049737-1.0.1.1-PaYHG.Ph_oOAcNFlyg_2XpgqxEVIXh5rPPv9yTEueG2M5QNBbkYFBDVv53b4Sy0USX4tCOrNHbe5F6UuWh0WJw; - path=/; expires=Sat, 27-Jul-24 03:38:57 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=ygnjuKIzgzurJ12exX1zy_C.603OCzFrqiUCH_vY44s-1722049737881-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - gpt-3.5-turbo-instruct - openai-organization: - - datadog-4 - openai-processing-ms: - - '1454' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15552000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '3500' - x-ratelimit-limit-tokens: - - '90000' - x-ratelimit-remaining-requests: - - '3499' - x-ratelimit-remaining-tokens: - - '89596' - x-ratelimit-reset-requests: - - 17ms - x-ratelimit-reset-tokens: - - 268ms - x-request-id: - - req_dc46a8d426b9375622c9301dc028091e - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_acall.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_acall.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_acall.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_acall.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_batch.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_batch.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_batch.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_batch.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_batch_311.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_batch_311.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_batch_311.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_batch_311.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_batch_async.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_batch_async.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_batch_async.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_batch_async.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_call.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_call.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_call.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_call.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_call_complicated.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_call_complicated.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_call_complicated.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_call_complicated.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_nested.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_nested.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_nested.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_nested.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_schema_io.yaml b/tests/contrib/langchain/cassettes/lcel_openai_chain_schema_io.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chain_schema_io.yaml rename to tests/contrib/langchain/cassettes/lcel_openai_chain_schema_io.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chat_streamed_response.txt b/tests/contrib/langchain/cassettes/lcel_openai_chat_streamed_response.txt similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chat_streamed_response.txt rename to tests/contrib/langchain/cassettes/lcel_openai_chat_streamed_response.txt diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chat_streamed_response_json_output_parser.txt b/tests/contrib/langchain/cassettes/lcel_openai_chat_streamed_response_json_output_parser.txt similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_chat_streamed_response_json_output_parser.txt rename to tests/contrib/langchain/cassettes/lcel_openai_chat_streamed_response_json_output_parser.txt diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_openai_llm_streamed_response.txt b/tests/contrib/langchain/cassettes/lcel_openai_llm_streamed_response.txt similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_openai_llm_streamed_response.txt rename to tests/contrib/langchain/cassettes/lcel_openai_llm_streamed_response.txt diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_with_tools_anthropic.yaml b/tests/contrib/langchain/cassettes/lcel_with_tools_anthropic.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_with_tools_anthropic.yaml rename to tests/contrib/langchain/cassettes/lcel_with_tools_anthropic.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/lcel_with_tools_openai.yaml b/tests/contrib/langchain/cassettes/lcel_with_tools_openai.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/lcel_with_tools_openai.yaml rename to tests/contrib/langchain/cassettes/lcel_with_tools_openai.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_async_call.yaml b/tests/contrib/langchain/cassettes/openai_chat_completion_async_call.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_async_call.yaml rename to tests/contrib/langchain/cassettes/openai_chat_completion_async_call.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_async_generate.yaml b/tests/contrib/langchain/cassettes/openai_chat_completion_async_generate.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_async_generate.yaml rename to tests/contrib/langchain/cassettes/openai_chat_completion_async_generate.yaml diff --git a/tests/contrib/langchain/cassettes/openai_chat_completion_image_input_sync_generate.yaml b/tests/contrib/langchain/cassettes/openai_chat_completion_image_input_sync_generate.yaml new file mode 100644 index 00000000000..309222ba504 --- /dev/null +++ b/tests/contrib/langchain/cassettes/openai_chat_completion_image_input_sync_generate.yaml @@ -0,0 +1,112 @@ +interactions: +- request: + body: '{"messages": [{"content": [{"type": "text", "text": "What\u2019s in this + image?"}, {"type": "image_url", "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"}}], + "role": "user"}], "model": "gpt-4o", "max_tokens": 256, "n": 1, "stream": false, + "temperature": 0.0}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '391' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.30.3 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.30.3 + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.10.13 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AvVRbVB63Y7YqyObD4g19l2rEvVyT\",\n \"object\": + \"chat.completion\",\n \"created\": 1738268931,\n \"model\": \"gpt-4o-2024-08-06\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"The image shows a scenic landscape with + a wooden boardwalk path leading through a lush green field. The sky is blue + with scattered clouds, and there are trees and bushes in the background. The + setting appears to be a natural, open area, possibly a park or nature reserve.\",\n + \ \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": + \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1151,\n \"completion_tokens\": + 56,\n \"total_tokens\": 1207,\n \"prompt_tokens_details\": {\n \"cached_tokens\": + 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n + \ \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": + 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": + \"default\",\n \"system_fingerprint\": \"fp_4691090a87\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 90a435e92e5f3886-IAD + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Thu, 30 Jan 2025 20:28:53 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=EtaA_3HrijluA2A.uMDQOkBRagq6Eqa0ziQjjtoMEkI-1738268933-1.0.1.1-XvP8eM82g.sBn55XMHXky_W9MdyhhpI59F4jjVs6gNGkr3yMhls52I8W17Hq9dALpVfeo6_9JgI_GRR91fCNAw; + path=/; expires=Thu, 30-Jan-25 20:58:53 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=LkUsOec2_120X6243XrZtosQrPDmEid5lf0bvqAXKBM-1738268933437-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - datadog-staging + openai-processing-ms: + - '3853' + openai-version: + - '2020-10-01' + strict-transport-security: + - max-age=31536000; includeSubDomains; preload + x-ratelimit-limit-input-images: + - '50000' + x-ratelimit-limit-requests: + - '10000' + x-ratelimit-limit-tokens: + - '30000000' + x-ratelimit-remaining-input-images: + - '49999' + x-ratelimit-remaining-requests: + - '9999' + x-ratelimit-remaining-tokens: + - '29998972' + x-ratelimit-reset-input-images: + - 1ms + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_2e4b323f38d4af3122652e8eb58377c0 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_sync_call.yaml b/tests/contrib/langchain/cassettes/openai_chat_completion_sync_call.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_sync_call.yaml rename to tests/contrib/langchain/cassettes/openai_chat_completion_sync_call.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_sync_generate.yaml b/tests/contrib/langchain/cassettes/openai_chat_completion_sync_generate.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_chat_completion_sync_generate.yaml rename to tests/contrib/langchain/cassettes/openai_chat_completion_sync_generate.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_completion_async.yaml b/tests/contrib/langchain/cassettes/openai_completion_async.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_completion_async.yaml rename to tests/contrib/langchain/cassettes/openai_completion_async.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_completion_error.yaml b/tests/contrib/langchain/cassettes/openai_completion_error.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_completion_error.yaml rename to tests/contrib/langchain/cassettes/openai_completion_error.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_completion_non_ascii.yaml b/tests/contrib/langchain/cassettes/openai_completion_non_ascii.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_completion_non_ascii.yaml rename to tests/contrib/langchain/cassettes/openai_completion_non_ascii.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_completion_sync.yaml b/tests/contrib/langchain/cassettes/openai_completion_sync.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_completion_sync.yaml rename to tests/contrib/langchain/cassettes/openai_completion_sync.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_completion_sync_multi_prompt.yaml b/tests/contrib/langchain/cassettes/openai_completion_sync_multi_prompt.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_completion_sync_multi_prompt.yaml rename to tests/contrib/langchain/cassettes/openai_completion_sync_multi_prompt.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_embedding_query.yaml b/tests/contrib/langchain/cassettes/openai_embedding_query.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_embedding_query.yaml rename to tests/contrib/langchain/cassettes/openai_embedding_query.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_paraphrase.yaml b/tests/contrib/langchain/cassettes/openai_paraphrase.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_paraphrase.yaml rename to tests/contrib/langchain/cassettes/openai_paraphrase.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_pinecone_similarity_search.yaml b/tests/contrib/langchain/cassettes/openai_pinecone_similarity_search.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_pinecone_similarity_search.yaml rename to tests/contrib/langchain/cassettes/openai_pinecone_similarity_search.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_pinecone_similarity_search_community.yaml b/tests/contrib/langchain/cassettes/openai_pinecone_similarity_search_community.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_pinecone_similarity_search_community.yaml rename to tests/contrib/langchain/cassettes/openai_pinecone_similarity_search_community.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_pinecone_vectorstore_retrieval_chain.yaml b/tests/contrib/langchain/cassettes/openai_pinecone_vectorstore_retrieval_chain.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_pinecone_vectorstore_retrieval_chain.yaml rename to tests/contrib/langchain/cassettes/openai_pinecone_vectorstore_retrieval_chain.yaml diff --git a/tests/contrib/langchain/cassettes/langchain_community/openai_retrieval_embedding.yaml b/tests/contrib/langchain/cassettes/openai_retrieval_embedding.yaml similarity index 100% rename from tests/contrib/langchain/cassettes/langchain_community/openai_retrieval_embedding.yaml rename to tests/contrib/langchain/cassettes/openai_retrieval_embedding.yaml diff --git a/tests/contrib/langchain/conftest.py b/tests/contrib/langchain/conftest.py index 2de8acd19e0..6c1e5816df5 100644 --- a/tests/contrib/langchain/conftest.py +++ b/tests/contrib/langchain/conftest.py @@ -18,34 +18,6 @@ def ddtrace_config_langchain(): return {} -@pytest.fixture(scope="session") -def mock_metrics(): - patcher = mock.patch("ddtrace.llmobs._integrations.base.get_dogstatsd_client") - try: - DogStatsdMock = patcher.start() - m = mock.MagicMock() - DogStatsdMock.return_value = m - yield m - finally: - patcher.stop() - - -@pytest.fixture -def mock_logs(scope="session"): - """ - Note that this fixture must be ordered BEFORE mock_tracer as it needs to patch the log writer - before it is instantiated. - """ - patcher = mock.patch("ddtrace.llmobs._integrations.base.V2LogWriter") - try: - V2LogWriterMock = patcher.start() - m = mock.MagicMock() - V2LogWriterMock.return_value = m - yield m - finally: - patcher.stop() - - @pytest.fixture def snapshot_tracer(langchain, mock_logs, mock_metrics): pin = Pin.get_from(langchain) @@ -55,16 +27,13 @@ def snapshot_tracer(langchain, mock_logs, mock_metrics): @pytest.fixture -def mock_tracer(langchain, mock_logs, mock_metrics): +def mock_tracer(langchain): pin = Pin.get_from(langchain) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) pin.override(langchain, tracer=mock_tracer) pin.tracer._configure() yield mock_tracer - mock_logs.reset_mock() - mock_metrics.reset_mock() - @pytest.fixture def mock_llmobs_span_writer(): @@ -79,7 +48,7 @@ def mock_llmobs_span_writer(): @pytest.fixture -def langchain(ddtrace_config_langchain, mock_logs, mock_metrics): +def langchain(ddtrace_config_langchain): with override_global_config(dict(_dd_api_key="")): with override_config("langchain", ddtrace_config_langchain): with override_env( @@ -94,15 +63,12 @@ def langchain(ddtrace_config_langchain, mock_logs, mock_metrics): patch() import langchain - mock_logs.reset_mock() - mock_metrics.reset_mock() - yield langchain unpatch() @pytest.fixture -def langchain_community(ddtrace_config_langchain, mock_logs, mock_metrics, langchain): +def langchain_community(ddtrace_config_langchain, langchain): try: import langchain_community @@ -112,7 +78,7 @@ def langchain_community(ddtrace_config_langchain, mock_logs, mock_metrics, langc @pytest.fixture -def langchain_core(ddtrace_config_langchain, mock_logs, mock_metrics, langchain): +def langchain_core(ddtrace_config_langchain, langchain): import langchain_core import langchain_core.prompts # noqa: F401 @@ -120,7 +86,7 @@ def langchain_core(ddtrace_config_langchain, mock_logs, mock_metrics, langchain) @pytest.fixture -def langchain_openai(ddtrace_config_langchain, mock_logs, mock_metrics, langchain): +def langchain_openai(ddtrace_config_langchain, langchain): try: import langchain_openai @@ -130,7 +96,7 @@ def langchain_openai(ddtrace_config_langchain, mock_logs, mock_metrics, langchai @pytest.fixture -def langchain_cohere(ddtrace_config_langchain, mock_logs, mock_metrics, langchain): +def langchain_cohere(ddtrace_config_langchain, langchain): try: import langchain_cohere @@ -140,7 +106,7 @@ def langchain_cohere(ddtrace_config_langchain, mock_logs, mock_metrics, langchai @pytest.fixture -def langchain_anthropic(ddtrace_config_langchain, mock_logs, mock_metrics, langchain): +def langchain_anthropic(ddtrace_config_langchain, langchain): try: import langchain_anthropic @@ -150,7 +116,7 @@ def langchain_anthropic(ddtrace_config_langchain, mock_logs, mock_metrics, langc @pytest.fixture -def langchain_pinecone(ddtrace_config_langchain, mock_logs, mock_metrics, langchain): +def langchain_pinecone(ddtrace_config_langchain, langchain): with override_env( dict( PINECONE_API_KEY=os.getenv("PINECONE_API_KEY", ""), @@ -179,7 +145,7 @@ def __init__(self, file: str): def handle_request(self, request: httpx.Request) -> httpx.Response: with open( - os.path.join(os.path.dirname(__file__), f"cassettes/langchain_community/{self.file}"), + os.path.join(os.path.dirname(__file__), f"cassettes/{self.file}"), "r", encoding="utf-8", ) as f: @@ -219,7 +185,7 @@ def __init__(self, file: str): async def handle_async_request(self, request: httpx.Request) -> httpx.Response: with open( - os.path.join(os.path.dirname(__file__), f"cassettes/langchain_community/{self.file}"), + os.path.join(os.path.dirname(__file__), f"cassettes/{self.file}"), "r", encoding="utf-8", ) as f: diff --git a/tests/contrib/langchain/test_langchain.py b/tests/contrib/langchain/test_langchain.py new file mode 100644 index 00000000000..f0865867826 --- /dev/null +++ b/tests/contrib/langchain/test_langchain.py @@ -0,0 +1,681 @@ +from operator import itemgetter +import os +import sys + +import langchain +import langchain.prompts # noqa: F401 +import mock +import pytest + +from ddtrace.internal.utils.version import parse_version +from tests.contrib.langchain.utils import get_request_vcr +from tests.utils import flaky + + +LANGCHAIN_VERSION = parse_version(langchain.__version__) + +IGNORE_FIELDS = [ + "resources", + "meta.openai.request.logprobs", # langchain-openai llm call now includes logprobs as param + "meta.error.stack", + "meta.http.useragent", + "meta.langchain.request.openai-chat.parameters.logprobs", + "meta.langchain.request.openai.parameters.logprobs", + "meta.langchain.request.openai.parameters.seed", # langchain-openai llm call now includes seed as param + "meta.langchain.request.openai.parameters.logprobs", # langchain-openai llm call now includes seed as param + "metrics.langchain.tokens.total_cost", # total_cost depends on if tiktoken is installed + # these are sometimes named differently + "meta.langchain.request.openai.parameters.max_tokens", + "meta.langchain.request.openai.parameters.max_completion_tokens", + "meta.langchain.request.openai-chat.parameters.max_completion_tokens" + "meta.langchain.request.openai-chat.parameters.max_tokens", +] + + +@pytest.fixture(scope="session") +def request_vcr(): + yield get_request_vcr() + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_openai_llm_sync(langchain_openai, request_vcr): + llm = langchain_openai.OpenAI() + with request_vcr.use_cassette("openai_completion_sync.yaml"): + llm.invoke("Can you explain what Descartes meant by 'I think, therefore I am'?") + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_openai_llm_sync_multiple_prompts(langchain_openai, request_vcr): + llm = langchain_openai.OpenAI() + with request_vcr.use_cassette("openai_completion_sync_multi_prompt.yaml"): + llm.generate( + prompts=[ + "What is the best way to teach a baby multiple languages?", + "How many times has Spongebob failed his road test?", + ] + ) + + +@pytest.mark.asyncio +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +async def test_openai_llm_async(langchain_openai, request_vcr): + llm = langchain_openai.OpenAI() + with request_vcr.use_cassette("openai_completion_async.yaml"): + await llm.agenerate(["Which team won the 2019 NBA finals?"]) + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_openai_llm_error(langchain, langchain_openai, request_vcr): + import openai # Imported here because the os env OPENAI_API_KEY needs to be set via langchain fixture before import + + llm = langchain_openai.OpenAI() + + if parse_version(openai.__version__) >= (1, 0, 0): + invalid_error = openai.BadRequestError + else: + invalid_error = openai.InvalidRequestError + with pytest.raises(invalid_error): + with request_vcr.use_cassette("openai_completion_error.yaml"): + llm.generate([12345, 123456]) + + +@pytest.mark.skipif(LANGCHAIN_VERSION < (0, 2), reason="Requires separate cassette for langchain v0.1") +@pytest.mark.snapshot +def test_cohere_llm_sync(langchain_cohere, request_vcr): + llm = langchain_cohere.llms.Cohere(cohere_api_key=os.getenv("COHERE_API_KEY", "")) + with request_vcr.use_cassette("cohere_completion_sync.yaml"): + llm.invoke("What is the secret Krabby Patty recipe?") + + +@pytest.mark.skipif( + LANGCHAIN_VERSION < (0, 2) or sys.version_info < (3, 10), + reason="Requires separate cassette for langchain v0.1, Python 3.9", +) +@pytest.mark.snapshot +def test_ai21_llm_sync(langchain_community, request_vcr): + if langchain_community is None: + pytest.skip("langchain-community not installed which is required for this test.") + llm = langchain_community.llms.AI21(ai21_api_key=os.getenv("AI21_API_KEY", "")) + with request_vcr.use_cassette("ai21_completion_sync.yaml"): + llm.invoke("Why does everyone in Bikini Bottom hate Plankton?") + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_openai_chat_model_sync_call_langchain_openai(langchain_openai, request_vcr): + chat = langchain_openai.ChatOpenAI(temperature=0, max_tokens=256) + with request_vcr.use_cassette("openai_chat_completion_sync_call.yaml"): + chat.invoke(input=[langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")]) + + +@pytest.mark.skipif(LANGCHAIN_VERSION < (0, 3), reason="Requires at least LangChain 0.3") +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_openai_chat_model_sync_generate(langchain_openai, request_vcr): + chat = langchain_openai.ChatOpenAI(temperature=0, max_tokens=256) + with request_vcr.use_cassette("openai_chat_completion_sync_generate.yaml"): + chat.generate( + [ + [ + langchain.schema.SystemMessage(content="Respond like a frat boy."), + langchain.schema.HumanMessage( + content="Where's the nearest equinox gym from Hudson Yards manhattan?" + ), + ], + [ + langchain.schema.SystemMessage(content="Respond with a pirate accent."), + langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"), + ], + ] + ) + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_openai_chat_model_vision_generate(langchain_openai, request_vcr): + """ + Test that input messages with nested contents are still tagged without error + Regression test for https://github.com/DataDog/dd-trace-py/issues/8149. + """ + image_url = ( + "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk" + ".jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" + ) + chat = langchain_openai.ChatOpenAI(model="gpt-4o", temperature=0, max_tokens=256) + with request_vcr.use_cassette("openai_chat_completion_image_input_sync_generate.yaml"): + chat.generate( + [ + [ + langchain.schema.HumanMessage( + content=[ + {"type": "text", "text": "What’s in this image?"}, + { + "type": "image_url", + "image_url": {"url": image_url}, + }, + ], + ), + ], + ] + ) + + +@flaky(until=1735812000, reason="Batch call has a non-deterministic response order.") +@pytest.mark.asyncio +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +async def test_openai_chat_model_async_generate(langchain_openai, request_vcr): + chat = langchain_openai.ChatOpenAI(temperature=0, max_tokens=256) + with request_vcr.use_cassette("openai_chat_completion_async_generate.yaml"): + await chat.agenerate( + [ + [ + langchain.schema.SystemMessage(content="Respond like a frat boy."), + langchain.schema.HumanMessage( + content="Where's the nearest equinox gym from Hudson Yards manhattan?" + ), + ], + [ + langchain.schema.SystemMessage(content="Respond with a pirate accent."), + langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"), + ], + ] + ) + + +@pytest.mark.snapshot +def test_openai_embedding_query(langchain_openai, request_vcr): + with mock.patch("langchain_openai.OpenAIEmbeddings._get_len_safe_embeddings", return_value=[0.0] * 1536): + embeddings = langchain_openai.OpenAIEmbeddings() + with request_vcr.use_cassette("openai_embedding_query.yaml"): + embeddings.embed_query("this is a test query.") + + +@pytest.mark.snapshot +def test_fake_embedding_query(langchain_community): + if langchain_community is None: + pytest.skip("langchain-community not installed which is required for this test.") + embeddings = langchain_community.embeddings.FakeEmbeddings(size=99) + embeddings.embed_query(text="foo") + + +@pytest.mark.snapshot +def test_fake_embedding_document(langchain_community): + if langchain_community is None: + pytest.skip("langchain-community not installed which is required for this test.") + embeddings = langchain_community.embeddings.FakeEmbeddings(size=99) + embeddings.embed_documents(texts=["foo", "bar"]) + + +@pytest.mark.snapshot +def test_pinecone_vectorstore_similarity_search(langchain_openai, request_vcr): + """ + Test that calling a similarity search on a Pinecone vectorstore with langchain will + result in a 2-span trace with a vectorstore span and underlying OpenAI embedding interface span. + """ + import langchain_pinecone + import pinecone + + with mock.patch("langchain_openai.OpenAIEmbeddings._get_len_safe_embeddings", return_value=[0.0] * 1536): + with request_vcr.use_cassette("openai_pinecone_similarity_search.yaml"): + pc = pinecone.Pinecone( + api_key=os.getenv("PINECONE_API_KEY", ""), + environment=os.getenv("PINECONE_ENV", ""), + ) + embed = langchain_openai.OpenAIEmbeddings(model="text-embedding-ada-002") + index = pc.Index("langchain-retrieval") + vectorstore = langchain_pinecone.PineconeVectorStore(index, embed, "text") + vectorstore.similarity_search("Who was Alan Turing?", 1) + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_lcel_chain_simple(langchain_core, langchain_openai, request_vcr): + prompt = langchain_core.prompts.ChatPromptTemplate.from_messages( + [("system", "You are world class technical documentation writer."), ("user", "{input}")] + ) + llm = langchain_openai.OpenAI() + + chain = prompt | llm + with request_vcr.use_cassette("lcel_openai_chain_call.yaml"): + chain.invoke({"input": "how can langsmith help with testing?"}) + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_lcel_chain_complicated(langchain_core, langchain_openai, request_vcr): + prompt = langchain_core.prompts.ChatPromptTemplate.from_template( + "Tell me a short joke about {topic} in the style of {style}" + ) + + chat_openai = langchain_openai.ChatOpenAI() + openai = langchain_openai.OpenAI() + + model = chat_openai.configurable_alternatives( + langchain_core.runnables.ConfigurableField(id="model"), + default_key="chat_openai", + openai=openai, + ) + + chain = ( + { + "topic": langchain_core.runnables.RunnablePassthrough(), + "style": langchain_core.runnables.RunnablePassthrough(), + } + | prompt + | model + | langchain_core.output_parsers.StrOutputParser() + ) + + with request_vcr.use_cassette("lcel_openai_chain_call_complicated.yaml"): + chain.invoke({"topic": "chickens", "style": "a 90s rapper"}) + + +@pytest.mark.asyncio +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +async def test_lcel_chain_simple_async(langchain_core, langchain_openai, request_vcr): + prompt = langchain_core.prompts.ChatPromptTemplate.from_messages( + [("system", "You are world class technical documentation writer."), ("user", "{input}")] + ) + llm = langchain_openai.OpenAI() + + chain = prompt | llm + with request_vcr.use_cassette("lcel_openai_chain_acall.yaml"): + await chain.ainvoke({"input": "how can langsmith help with testing?"}) + + +@flaky(1735812000, reason="batch() is non-deterministic in which order it processes inputs") +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +@pytest.mark.skipif(sys.version_info >= (3, 11), reason="Python <3.11 test") +def test_lcel_chain_batch(langchain_core, langchain_openai, request_vcr): + """ + Test that invoking a chain with a batch of inputs will result in a 4-span trace, + with a root RunnableSequence span, then 3 LangChain ChatOpenAI spans underneath + """ + prompt = langchain_core.prompts.ChatPromptTemplate.from_template("Tell me a short joke about {topic}") + output_parser = langchain_core.output_parsers.StrOutputParser() + model = langchain_openai.ChatOpenAI() + chain = {"topic": langchain_core.runnables.RunnablePassthrough()} | prompt | model | output_parser + + with request_vcr.use_cassette("lcel_openai_chain_batch.yaml"): + chain.batch(inputs=["chickens", "pigs"]) + + +@flaky(1735812000, reason="batch() is non-deterministic in which order it processes inputs") +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +@pytest.mark.skipif(sys.version_info < (3, 11), reason="Python 3.11+ required") +def test_lcel_chain_batch_311(langchain_core, langchain_openai, request_vcr): + """ + Test that invoking a chain with a batch of inputs will result in a 4-span trace, + with a root RunnableSequence span, then 3 LangChain ChatOpenAI spans underneath + """ + prompt = langchain_core.prompts.ChatPromptTemplate.from_template("Tell me a short joke about {topic}") + output_parser = langchain_core.output_parsers.StrOutputParser() + model = langchain_openai.ChatOpenAI() + chain = {"topic": langchain_core.runnables.RunnablePassthrough()} | prompt | model | output_parser + + with request_vcr.use_cassette("lcel_openai_chain_batch_311.yaml"): + chain.batch(inputs=["chickens", "pigs"]) + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_lcel_chain_nested(langchain_core, langchain_openai, request_vcr): + """ + Test that invoking a nested chain will result in a 4-span trace with a root + RunnableSequence span (complete_chain), then another RunnableSequence (chain1) + + LangChain ChatOpenAI span (chain1's llm call) and finally a second LangChain ChatOpenAI span (chain2's llm call) + """ + prompt1 = langchain_core.prompts.ChatPromptTemplate.from_template("what is the city {person} is from?") + prompt2 = langchain_core.prompts.ChatPromptTemplate.from_template( + "what country is the city {city} in? respond in {language}" + ) + + model = langchain_openai.ChatOpenAI() + + chain1 = prompt1 | model | langchain_core.output_parsers.StrOutputParser() + chain2 = prompt2 | model | langchain_core.output_parsers.StrOutputParser() + + complete_chain = {"city": chain1, "language": itemgetter("language")} | chain2 + + with request_vcr.use_cassette("lcel_openai_chain_nested.yaml"): + complete_chain.invoke({"person": "Spongebob Squarepants", "language": "Spanish"}) + + +@flaky(1735812000, reason="batch() is non-deterministic in which order it processes inputs") +@pytest.mark.asyncio +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +async def test_lcel_chain_batch_async(langchain_core, langchain_openai, request_vcr): + """ + Test that invoking a chain with a batch of inputs will result in a 4-span trace, + with a root RunnableSequence span, then 3 LangChain ChatOpenAI spans underneath + """ + prompt = langchain_core.prompts.ChatPromptTemplate.from_template("Tell me a short joke about {topic}") + output_parser = langchain_core.output_parsers.StrOutputParser() + model = langchain_openai.ChatOpenAI() + chain = {"topic": langchain_core.runnables.RunnablePassthrough()} | prompt | model | output_parser + + with request_vcr.use_cassette("lcel_openai_chain_batch_async.yaml"): + await chain.abatch(inputs=["chickens", "pigs"]) + + +@pytest.mark.snapshot +def test_lcel_chain_non_dict_input(langchain_core): + """ + Tests that non-dict inputs (specifically also non-string) are stringified properly + """ + add_one = langchain_core.runnables.RunnableLambda(lambda x: x + 1) + multiply_two = langchain_core.runnables.RunnableLambda(lambda x: x * 2) + sequence = add_one | multiply_two + + sequence.invoke(1) + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_lcel_with_tools_openai(langchain_core, langchain_openai, request_vcr): + import langchain_core.tools + + @langchain_core.tools.tool + def add(a: int, b: int) -> int: + """Adds a and b. + + Args: + a: first int + b: second int + """ + return a + b + + llm = langchain_openai.ChatOpenAI(model="gpt-3.5-turbo-0125") + llm_with_tools = llm.bind_tools([add]) + with request_vcr.use_cassette("lcel_with_tools_openai.yaml"): + llm_with_tools.invoke("What is the sum of 1 and 2?") + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_lcel_with_tools_anthropic(langchain_core, langchain_anthropic, request_vcr): + import langchain_core.tools + + @langchain_core.tools.tool + def add(a: int, b: int) -> int: + """Adds a and b. + + Args: + a: first int + b: second int + """ + return a + b + + llm = langchain_anthropic.ChatAnthropic(temperature=1, model_name="claude-3-opus-20240229") + llm_with_tools = llm.bind_tools([add]) + with request_vcr.use_cassette("lcel_with_tools_anthropic.yaml"): + llm_with_tools.invoke("What is the sum of 1 and 2?") + + +@pytest.mark.snapshot +def test_faiss_vectorstore_retrieval(langchain_community, langchain_openai, request_vcr): + if langchain_community is None: + pytest.skip("langchain-community not installed which is required for this test.") + pytest.importorskip("faiss", reason="faiss required for this test.") + with mock.patch("langchain_openai.OpenAIEmbeddings._get_len_safe_embeddings", return_value=[[0.0] * 1536]): + with request_vcr.use_cassette("openai_embedding_query.yaml"): + faiss = langchain_community.vectorstores.faiss.FAISS.from_texts( + ["this is a test query."], + embedding=langchain_openai.OpenAIEmbeddings(), + ) + retriever = faiss.as_retriever() + with request_vcr.use_cassette("openai_retrieval_embedding.yaml"): + retriever.invoke("What was the message of the last test query?") + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_streamed_chain(langchain_core, langchain_openai, streamed_response_responder): + client = streamed_response_responder( + module="openai", + client_class_key="OpenAI", + http_client_key="http_client", + endpoint_path=["chat", "completions"], + file="lcel_openai_chat_streamed_response.txt", + ) + + prompt = langchain_core.prompts.ChatPromptTemplate.from_messages( + [("system", "You are world class technical documentation writer."), ("user", "{input}")] + ) + llm = langchain_openai.ChatOpenAI(client=client) + parser = langchain_core.output_parsers.StrOutputParser() + + chain = prompt | llm | parser + for _ in chain.stream({"input": "how can langsmith help with testing?"}): + pass + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_streamed_chat(langchain_openai, streamed_response_responder): + client = streamed_response_responder( + module="openai", + client_class_key="OpenAI", + http_client_key="http_client", + endpoint_path=["chat", "completions"], + file="lcel_openai_chat_streamed_response.txt", + ) + model = langchain_openai.ChatOpenAI(client=client) + + for _ in model.stream(input="how can langsmith help with testing?"): + pass + + +@pytest.mark.snapshot(ignores=IGNORE_FIELDS) +def test_streamed_llm(langchain_openai, streamed_response_responder): + client = streamed_response_responder( + module="openai", + client_class_key="OpenAI", + http_client_key="http_client", + endpoint_path=["completions"], + file="lcel_openai_llm_streamed_response.txt", + ) + + llm = langchain_openai.OpenAI(client=client) + + for _ in llm.stream(input="How do I write technical documentation?"): + pass + + +@pytest.mark.snapshot( + ignores=IGNORE_FIELDS, + token="tests.contrib.langchain.test_langchain.test_streamed_chain", +) +async def test_astreamed_chain(langchain_core, langchain_openai, async_streamed_response_responder): + client = async_streamed_response_responder( + module="openai", + client_class_key="AsyncOpenAI", + http_client_key="http_client", + endpoint_path=["chat", "completions"], + file="lcel_openai_chat_streamed_response.txt", + ) + + prompt = langchain_core.prompts.ChatPromptTemplate.from_messages( + [("system", "You are world class technical documentation writer."), ("user", "{input}")] + ) + llm = langchain_openai.ChatOpenAI(async_client=client) + parser = langchain_core.output_parsers.StrOutputParser() + + chain = prompt | llm | parser + async for _ in chain.astream({"input": "how can langsmith help with testing?"}): + pass + + +@pytest.mark.snapshot( + ignores=IGNORE_FIELDS, + token="tests.contrib.langchain.test_langchain.test_streamed_chat", +) +async def test_astreamed_chat(langchain_openai, async_streamed_response_responder): + client = async_streamed_response_responder( + module="openai", + client_class_key="AsyncOpenAI", + http_client_key="http_client", + endpoint_path=["chat", "completions"], + file="lcel_openai_chat_streamed_response.txt", + ) + + model = langchain_openai.ChatOpenAI(async_client=client) + + async for _ in model.astream(input="how can langsmith help with testing?"): + pass + + +@pytest.mark.snapshot( + ignores=IGNORE_FIELDS, + token="tests.contrib.langchain.test_langchain.test_streamed_llm", +) +async def test_astreamed_llm(langchain_openai, async_streamed_response_responder): + client = async_streamed_response_responder( + module="openai", + client_class_key="AsyncOpenAI", + http_client_key="http_client", + endpoint_path=["completions"], + file="lcel_openai_llm_streamed_response.txt", + ) + + llm = langchain_openai.OpenAI(async_client=client) + + async for _ in llm.astream(input="How do I write technical documentation?"): + pass + + +# TODO: needs fixing in follow-up +@pytest.mark.skip(reason="Problematic test that needs fixing") +@pytest.mark.snapshot(ignores=(IGNORE_FIELDS + ["meta.langchain.request.inputs.0"])) +def test_streamed_json_output_parser(langchain, langchain_core, langchain_openai, streamed_response_responder): + client = streamed_response_responder( + module="openai", + client_class_key="OpenAI", + http_client_key="http_client", + endpoint_path=["chat", "completions"], + file="lcel_openai_chat_streamed_response_json_output_parser.txt", + ) + + model = langchain_openai.ChatOpenAI(model="gpt-4o", max_tokens=50, client=client) + parser = langchain_core.output_parsers.JsonOutputParser() + + chain = model | parser + inp = ( + "output a list of the country france their population in JSON format. " + 'Use a dict with an outer key of "countries" which contains a list of countries. ' + "Each country should have the key `name` and `population`" + ) + + messages = [ + langchain.schema.SystemMessage(content="You know everything about the world."), + langchain.schema.HumanMessage(content=inp), + ] + + for _ in chain.stream(input=messages): + pass + + +# until we fully support `astream_events`, we do not need a snapshot here +# this is just a regression test to make sure we don't throw +async def test_astreamed_events_does_not_throw(langchain_openai, langchain_core, async_streamed_response_responder): + client = async_streamed_response_responder( + module="openai", + client_class_key="AsyncOpenAI", + http_client_key="http_client", + endpoint_path=["chat", "completions"], + file="lcel_openai_chat_streamed_response.txt", + ) + + model = langchain_openai.ChatOpenAI(async_client=client) + parser = langchain_core.output_parsers.StrOutputParser() + + chain = model | parser + + async for _ in chain.astream_events(input="some input", version="v1"): + pass + + +@pytest.mark.snapshot( + # tool description is generated differently is some langchain_core versions + ignores=["meta.langchain.request.tool.description"], + token="tests.contrib.langchain.test_langchain.test_base_tool_invoke", +) +def test_base_tool_invoke(langchain_core, request_vcr): + """ + Test that invoking a tool with langchain will + result in a 1-span trace with a tool span. + """ + if langchain_core is None: + pytest.skip("langchain-core not installed which is required for this test.") + + from math import pi + + from langchain_core.tools import StructuredTool + + def circumference_tool(radius: float) -> float: + return float(radius) * 2.0 * pi + + calculator = StructuredTool.from_function( + func=circumference_tool, + name="Circumference calculator", + description="Use this tool when you need to calculate a circumference using the radius of a circle", + return_direct=True, + response_format="content", + ) + + calculator.invoke("2") + + +@pytest.mark.asyncio +@pytest.mark.snapshot( + # tool description is generated differently is some langchain_core versions + ignores=["meta.langchain.request.tool.description"], + token="tests.contrib.langchain.test_langchain.test_base_tool_invoke", +) +async def test_base_tool_ainvoke(langchain_core, request_vcr): + """ + Test that invoking a tool with langchain will + result in a 1-span trace with a tool span. Async mode + """ + + if langchain_core is None: + pytest.skip("langchain-core not installed which is required for this test.") + + from math import pi + + from langchain_core.tools import StructuredTool + + def circumference_tool(radius: float) -> float: + return float(radius) * 2.0 * pi + + calculator = StructuredTool.from_function( + func=circumference_tool, + name="Circumference calculator", + description="Use this tool when you need to calculate a circumference using the radius of a circle", + return_direct=True, + response_format="content", + ) + + await calculator.ainvoke("2") + + +@pytest.mark.asyncio +@pytest.mark.snapshot( + # tool description is generated differently is some langchain_core versions + ignores=["meta.langchain.request.tool.description", "meta.langchain.request.config"], +) +def test_base_tool_invoke_non_json_serializable_config(langchain_core, request_vcr): + """ + Test that invoking a tool with langchain will + result in a 1-span trace with a tool span. Async mode + """ + + if langchain_core is None: + pytest.skip("langchain-core not installed which is required for this test.") + + from math import pi + + from langchain_core.tools import StructuredTool + + def circumference_tool(radius: float) -> float: + return float(radius) * 2.0 * pi + + calculator = StructuredTool.from_function( + func=circumference_tool, + name="Circumference calculator", + description="Use this tool when you need to calculate a circumference using the radius of a circle", + return_direct=True, + response_format="content", + ) + + calculator.invoke("2", config={"unserializable": object()}) diff --git a/tests/contrib/langchain/test_langchain_patch.py b/tests/contrib/langchain/test_langchain_patch.py index 56c1697179f..51e758918ed 100644 --- a/tests/contrib/langchain/test_langchain_patch.py +++ b/tests/contrib/langchain/test_langchain_patch.py @@ -27,8 +27,6 @@ def assert_module_patched(self, langchain): self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) - self.assert_wrapped(langchain.chains.base.Chain.invoke) - self.assert_wrapped(langchain.chains.base.Chain.ainvoke) self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.batch) @@ -49,9 +47,6 @@ def assert_module_patched(self, langchain): self.assert_wrapped(vectorstore_interface.similarity_search) def assert_not_module_patched(self, langchain): - from langchain import chains # noqa: F401 - from langchain.chains import base # noqa: F401 - try: import langchain_community as gated_langchain from langchain_community import embeddings # noqa: F401 @@ -66,8 +61,6 @@ def assert_not_module_patched(self, langchain): self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) - self.assert_not_wrapped(langchain.chains.base.Chain.invoke) - self.assert_not_wrapped(langchain.chains.base.Chain.ainvoke) self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.batch) @@ -88,8 +81,6 @@ def assert_not_module_patched(self, langchain): self.assert_not_wrapped(vectorstore_interface.similarity_search) def assert_not_module_double_patched(self, langchain): - from langchain.chains import base # noqa: F401 - try: import langchain_community as gated_langchain except ImportError: @@ -102,8 +93,6 @@ def assert_not_module_double_patched(self, langchain): self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate) self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate) self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate) - self.assert_not_double_wrapped(langchain.chains.base.Chain.invoke) - self.assert_not_double_wrapped(langchain.chains.base.Chain.ainvoke) self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.invoke) self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke) self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.batch) diff --git a/tests/contrib/langchain/utils.py b/tests/contrib/langchain/utils.py index 783701deec7..d388ab19915 100644 --- a/tests/contrib/langchain/utils.py +++ b/tests/contrib/langchain/utils.py @@ -28,7 +28,7 @@ # between cassettes generated for requests and aiohttp. def get_request_vcr(subdirectory_name=""): return vcr.VCR( - cassette_library_dir=os.path.join(os.path.dirname(__file__), "cassettes/%s" % subdirectory_name), + cassette_library_dir=os.path.join(os.path.dirname(__file__), "cassettes"), record_mode="once", match_on=["path"], filter_headers=["authorization", "OpenAI-Organization", "api-key", "x-api-key"], diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_ai21_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_ai21_llm_sync.json index f874cb0c997..c654c4a99f9 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_ai21_llm_sync.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_ai21_llm_sync.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.llms.ai21.AI21", + "resource": "langchain_community.llms.ai21.AI21", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca8f00000000", "langchain.request.ai21.parameters.countPenalty.applyToEmojis": "True", "langchain.request.ai21.parameters.countPenalty.applyToNumbers": "True", "langchain.request.ai21.parameters.countPenalty.applyToPunctuations": "True", @@ -41,17 +41,17 @@ "langchain.request.prompts.0": "Why does everyone in Bikini Bottom hate Plankton?", "langchain.request.provider": "ai21", "langchain.request.type": "llm", - "langchain.response.completions.0.text": "\\nPlankton is a character in the SpongeBob SquarePants cartoon series who is often portrayed as a villain. He is the owner of a ...", + "langchain.response.completions.0.text": "\\nPlankton is trying to steal the Krabby Patty secret formula from Mr. Krabs, so Mr. Krabs wants him gone.", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "8eb5b60d8a5747e8b4b74b5a0bd313b5" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 10515 + "process_id": 84563 }, - "duration": 4435905, - "start": 1694032467210461763 + "duration": 4171000, + "start": 1738263183039739000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_base_tool_invoke.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_base_tool_invoke.json similarity index 82% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_base_tool_invoke.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_base_tool_invoke.json index 2b7ff2241e9..30b9ca6fa50 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_base_tool_invoke.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_base_tool_invoke.json @@ -10,22 +10,22 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66d9b51700000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.input": "2", "langchain.request.tool.description": "Circumference calculator(radius: float) -> float - Use this tool when you need to calculate a circumference using the radius of a circle", "langchain.request.tool.name": "Circumference calculator", "langchain.request.type": "tool", "langchain.response.output": "12.566370614359172", "language": "python", - "runtime-id": "1c282316e6b0428483146d38d872a4a0" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 57408 + "process_id": 82010 }, - "duration": 963000, - "start": 1725543703717589000 + "duration": 180000, + "start": 1738263109266159000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_base_tool_invoke_non_json_serializable_config.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_base_tool_invoke_non_json_serializable_config.json similarity index 79% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_base_tool_invoke_non_json_serializable_config.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_base_tool_invoke_non_json_serializable_config.json index 4ac7e76b583..ed42f879f22 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_base_tool_invoke_non_json_serializable_config.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_base_tool_invoke_non_json_serializable_config.json @@ -10,23 +10,23 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66ea049500000000", - "langchain.request.config": "{\"unserializable\": \"[Unserializable object: ]\"}", + "_dd.p.tid": "679bca4500000000", + "langchain.request.config": "{\"unserializable\": \"[Unserializable object: ]\"}", "langchain.request.input": "2", "langchain.request.tool.description": "Circumference calculator(radius: float) -> float - Use this tool when you need to calculate a circumference using the radius of a circle", "langchain.request.tool.name": "Circumference calculator", "langchain.request.type": "tool", "langchain.response.output": "12.566370614359172", "language": "python", - "runtime-id": "3547c0cae3d64339b0ce6e427181be46" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 82999 + "process_id": 82010 }, - "duration": 375000, - "start": 1726612629324406000 + "duration": 370000, + "start": 1738263109282464000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_llm_sync.json index 50ac99f6b80..543abb80372 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_llm_sync.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_llm_sync.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.llms.cohere.Cohere", + "resource": "langchain_cohere.llms.Cohere", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,30 +10,22 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca6900000000", "langchain.request.api_key": "...key>", - "langchain.request.cohere.parameters.frequency_penalty": "0.0", - "langchain.request.cohere.parameters.k": "0", - "langchain.request.cohere.parameters.max_tokens": "256", - "langchain.request.cohere.parameters.model": "None", - "langchain.request.cohere.parameters.p": "1", - "langchain.request.cohere.parameters.presence_penalty": "0.0", - "langchain.request.cohere.parameters.temperature": "0.75", - "langchain.request.cohere.parameters.truncate": "None", "langchain.request.prompts.0": "What is the secret Krabby Patty recipe?", "langchain.request.provider": "cohere", "langchain.request.type": "llm", - "langchain.response.completions.0.text": "\\nThe secret Krabby Patty recipe is a closely guarded trade secret, known only to a select few people at the Krusty Krab restaur...", + "langchain.response.completions.0.text": " The secret Krabby Patty recipe has been kept under strict security measures and has never been publicly revealed. While there i...", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "b66738590cc84f2cbdf48350b6a67fae" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 10515 + "process_id": 83375 }, - "duration": 7677868, - "start": 1694032466637690894 + "duration": 2707000, + "start": 1738263145040994000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_math_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_math_chain.json deleted file mode 100644 index 955b01e825d..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_cohere_math_chain.json +++ /dev/null @@ -1,85 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm_math.base.LLMMathChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615aa1500000000", - "langchain.request.inputs.question": "what is thirteen raised to the .3432 power?", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.answer": "Answer: 2.4116004626599237", - "langchain.response.outputs.question": "what is thirteen raised to the .3432 power?", - "language": "python", - "runtime-id": "5bdc2648fed64ec2a49138caab5a0bf0" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 45546 - }, - "duration": 2699000, - "start": 1712695829194297000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.question": "what is thirteen raised to the .3432 power?", - "langchain.request.inputs.stop": "['```output']", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.question": "what is thirteen raised to the .3432 power?", - "langchain.response.outputs.stop": "['```output']", - "langchain.response.outputs.text": "```text\\n13**(0.3432)\\n```\\n...numexpr.evaluate(\"13**(0.3432)\")...\\n" - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 2297000, - "start": 1712695829194433000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.cohere.Cohere", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.cohere.parameters.frequency_penalty": "0.0", - "langchain.request.cohere.parameters.k": "0", - "langchain.request.cohere.parameters.max_tokens": "256", - "langchain.request.cohere.parameters.model": "None", - "langchain.request.cohere.parameters.p": "1", - "langchain.request.cohere.parameters.presence_penalty": "0.0", - "langchain.request.cohere.parameters.temperature": "0.75", - "langchain.request.cohere.parameters.truncate": "None", - "langchain.request.prompts.0": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.provider": "cohere", - "langchain.request.type": "llm", - "langchain.response.completions.0.text": "```text\\n13**(0.3432)\\n```\\n...numexpr.evaluate(\"13**(0.3432)\")...\\n" - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 2068000, - "start": 1712695829194606000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_faiss_vectorstore_retrieval.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_faiss_vectorstore_retrieval.json similarity index 84% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_faiss_vectorstore_retrieval.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_faiss_vectorstore_retrieval.json index aaad5aeb7a9..f60f389d1fc 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_faiss_vectorstore_retrieval.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_faiss_vectorstore_retrieval.json @@ -10,14 +10,14 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "668c5dde00000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.api_key": "...key>", "langchain.request.inputs.0.text": "this is a test query.", "langchain.request.model": "text-embedding-ada-002", "langchain.request.provider": "openai", "langchain.request.type": "embedding", "language": "python", - "runtime-id": "2a1d7ab4ff064afb95e895ce7aa565e0" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -26,10 +26,10 @@ "_sampling_priority_v1": 1, "langchain.request.input_count": 1, "langchain.response.outputs.0.embedding_length": 1536, - "process_id": 69484 + "process_id": 82010 }, - "duration": 406798000, - "start": 1720475102021903000 + "duration": 88000, + "start": 1738263109998107000 }], [ { @@ -43,14 +43,14 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "668c5dde00000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.api_key": "", "langchain.request.provider": "faiss", "langchain.request.query": "What was the message of the last test query?", "langchain.request.type": "similarity_search", "langchain.response.document.0.page_content": "this is a test query.", "language": "python", - "runtime-id": "2a1d7ab4ff064afb95e895ce7aa565e0" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -58,10 +58,10 @@ "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, "langchain.response.document_count": 1, - "process_id": 69484 + "process_id": 82010 }, - "duration": 3710000, - "start": 1720475102468386000 + "duration": 1453000, + "start": 1738263110003391000 }, { "name": "langchain.request", @@ -84,6 +84,6 @@ "langchain.request.input_count": 1, "langchain.response.outputs.0.embedding_length": 1536 }, - "duration": 1714000, - "start": 1720475102468505000 + "duration": 39000, + "start": 1738263110003495000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_document.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_document.json index 59dbbd54fd8..f4e7b9ae63f 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_document.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_document.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.embeddings.fake.FakeEmbeddings", + "resource": "langchain_community.embeddings.fake.FakeEmbeddings", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,14 +10,14 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.api_key": "", "langchain.request.inputs.0.text": "foo", "langchain.request.inputs.1.text": "bar", "langchain.request.provider": "fake", "langchain.request.type": "embedding", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -27,8 +27,8 @@ "langchain.request.input_count": 2, "langchain.response.outputs.0.embedding_length": 99, "langchain.response.outputs.1.embedding_length": 99, - "process_id": 10515 + "process_id": 82010 }, - "duration": 149490, - "start": 1694032467412894596 + "duration": 79000, + "start": 1738263110027265000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_query.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_query.json index 27094157302..3f5167fe3fe 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_query.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_fake_embedding_query.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.embeddings.fake.FakeEmbeddings", + "resource": "langchain_community.embeddings.fake.FakeEmbeddings", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,13 +10,13 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.api_key": "", "langchain.request.inputs.0.text": "foo", "langchain.request.provider": "fake", "langchain.request.type": "embedding", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -25,8 +25,8 @@ "_sampling_priority_v1": 1, "langchain.request.input_count": 1, "langchain.response.outputs.embedding_length": 99, - "process_id": 10515 + "process_id": 82010 }, - "duration": 164135, - "start": 1694032467406250335 + "duration": 196000, + "start": 1738263109469499000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_huggingfacehub_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_huggingfacehub_llm_sync.json deleted file mode 100644 index 5161352b053..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_huggingfacehub_llm_sync.json +++ /dev/null @@ -1,36 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.huggingface_hub.HuggingFaceHub", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.huggingface_hub.parameters.model_kwargs.max_length": "256", - "langchain.request.huggingface_hub.parameters.model_kwargs.temperature": "0.5", - "langchain.request.huggingface_hub.parameters.repo_id": "google/flan-t5-xxl", - "langchain.request.huggingface_hub.parameters.task": "None", - "langchain.request.model": "google/flan-t5-xxl", - "langchain.request.prompts.0": "Why does Mr. Krabs have a whale daughter?", - "langchain.request.provider": "huggingface_hub", - "langchain.request.type": "llm", - "langchain.response.completions.0.text": "she's a mermaid", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 10515 - }, - "duration": 8053693, - "start": 1694032467190677469 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json similarity index 87% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json index 3031a3d2804..4788830f558 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json @@ -10,14 +10,14 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "661947f300000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.inputs.0": "chickens", "langchain.request.inputs.1": "pigs", "langchain.request.type": "chain", - "langchain.response.outputs.0": "Why did the pig go to the casino? To play the slop machines!", - "langchain.response.outputs.1": "Why did the chicken join a band?\\n\\nBecause it had the drumsticks!", + "langchain.response.outputs.0": "Why did the pig go to the casino?\\n\\nTo play the slop machine!", + "langchain.response.outputs.1": "Why did the chicken join a band? Because it had the drumsticks!", "language": "python", - "runtime-id": "bcccff62f55d4f07867621396c96315f" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -28,10 +28,10 @@ "langchain.tokens.prompt_tokens": 28, "langchain.tokens.total_cost": 0.00010400000000000001, "langchain.tokens.total_tokens": 59, - "process_id": 44014 + "process_id": 82010 }, - "duration": 11912000, - "start": 1712932851929161000 + "duration": 12476000, + "start": 1738263110292401000 }, { "name": "langchain.request", @@ -54,7 +54,7 @@ "langchain.request.openai.parameters.temperature": "0.7", "langchain.request.provider": "openai", "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Why did the pig go to the casino? To play the slop machines!", + "langchain.response.completions.0.0.content": "Why did the pig go to the casino?\\n\\nTo play the slop machine!", "langchain.response.completions.0.0.message_type": "AIMessage" }, "metrics": { @@ -64,8 +64,8 @@ "langchain.tokens.total_cost": 5.3e-05, "langchain.tokens.total_tokens": 30 }, - "duration": 3477000, - "start": 1712932851933449000 + "duration": 6742000, + "start": 1738263110297341000 }, { "name": "langchain.request", @@ -88,7 +88,7 @@ "langchain.request.openai.parameters.temperature": "0.7", "langchain.request.provider": "openai", "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Why did the chicken join a band?\\n\\nBecause it had the drumsticks!", + "langchain.response.completions.0.0.content": "Why did the chicken join a band? Because it had the drumsticks!", "langchain.response.completions.0.0.message_type": "AIMessage" }, "metrics": { @@ -98,6 +98,6 @@ "langchain.tokens.total_cost": 5.1000000000000006e-05, "langchain.tokens.total_tokens": 29 }, - "duration": 3317000, - "start": 1712932851937078000 + "duration": 3314000, + "start": 1738263110300645000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_complicated.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json similarity index 87% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_complicated.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json index 26386ef066b..92121180dfd 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_complicated.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json @@ -10,13 +10,13 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "6615ac1d00000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.inputs.0.style": "a 90s rapper", "langchain.request.inputs.0.topic": "chickens", "langchain.request.type": "chain", "langchain.response.outputs.0": "Why did the chicken cross the road? To drop some sick rhymes on the other side!", "language": "python", - "runtime-id": "2304ee41d4dc442c862ba4160e934dcd" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -25,12 +25,12 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 19, "langchain.tokens.prompt_tokens": 53, - "langchain.tokens.total_cost": 0.0001275, + "langchain.tokens.total_cost": 0.0001175, "langchain.tokens.total_tokens": 72, - "process_id": 74685 + "process_id": 82010 }, - "duration": 10750000, - "start": 1712696349137704000 + "duration": 6933000, + "start": 1738263109330109000 }, { "name": "langchain.request", @@ -60,9 +60,9 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 19, "langchain.tokens.prompt_tokens": 53, - "langchain.tokens.total_cost": 0.0001275, + "langchain.tokens.total_cost": 0.0001175, "langchain.tokens.total_tokens": 72 }, - "duration": 3579000, - "start": 1712696349144587000 + "duration": 3680000, + "start": 1738263109333162000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_nested.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json similarity index 90% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_nested.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json index 3262cea3b96..3910e614529 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_nested.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json @@ -10,13 +10,13 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66a46fd100000000", + "_dd.p.tid": "679bca4400000000", "langchain.request.inputs.0.language": "Spanish", "langchain.request.inputs.0.person": "Spongebob Squarepants", "langchain.request.type": "chain", "langchain.response.outputs.0": "La ciudad ficticia de Fondo de Bikini, de la serie de televisi\u00f3n Spongebob Squarepants, est\u00e1 ubicada en el fondo del mar en un l...", "language": "python", - "runtime-id": "76bcc12588344062863846979a3d8190" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -27,10 +27,10 @@ "langchain.tokens.prompt_tokens": 50, "langchain.tokens.total_cost": 0.000181, "langchain.tokens.total_tokens": 103, - "process_id": 87304 + "process_id": 82010 }, - "duration": 56510000, - "start": 1722052561070001000 + "duration": 76825000, + "start": 1738263108943331000 }, { "name": "langchain.request", @@ -54,8 +54,8 @@ "langchain.tokens.total_cost": 5.9e-05, "langchain.tokens.total_tokens": 34 }, - "duration": 41000000, - "start": 1722052561080769000 + "duration": 63808000, + "start": 1738263108951960000 }, { "name": "langchain.request", @@ -71,7 +71,6 @@ "langchain.request.messages.0.0.content": "what is the city Spongebob Squarepants is from?", "langchain.request.messages.0.0.message_type": "HumanMessage", "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.logprobs": "False", "langchain.request.openai.parameters.model": "gpt-3.5-turbo", "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", "langchain.request.openai.parameters.n": "1", @@ -89,8 +88,8 @@ "langchain.tokens.total_cost": 5.9e-05, "langchain.tokens.total_tokens": 34 }, - "duration": 38428000, - "start": 1722052561082726000 + "duration": 61552000, + "start": 1738263108953638000 }, { "name": "langchain.request", @@ -106,7 +105,6 @@ "langchain.request.messages.0.0.content": "what country is the city Spongebob Squarepants is from the fictional underwater city of Bikini Bottom. in? respond in Spanish", "langchain.request.messages.0.0.message_type": "HumanMessage", "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.logprobs": "False", "langchain.request.openai.parameters.model": "gpt-3.5-turbo", "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", "langchain.request.openai.parameters.n": "1", @@ -124,6 +122,6 @@ "langchain.tokens.total_cost": 0.000122, "langchain.tokens.total_tokens": 69 }, - "duration": 3395000, - "start": 1722052561122782000 + "duration": 3288000, + "start": 1738263109016607000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_non_dict_input.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_non_dict_input.json similarity index 76% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_non_dict_input.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_non_dict_input.json index dcc77d8a33c..4e68c9c8505 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_non_dict_input.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_non_dict_input.json @@ -10,20 +10,20 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "669ee23700000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.inputs.0": "1", "langchain.request.type": "chain", "langchain.response.outputs.0": "4", "language": "python", - "runtime-id": "919cb1528b424d42988633fa49608826" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 43636 + "process_id": 82010 }, - "duration": 2821000, - "start": 1721688631858351000 + "duration": 3723000, + "start": 1738263109042519000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json similarity index 91% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json index 305bd4e751f..9548083a9ee 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json @@ -10,12 +10,12 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "6615ac1d00000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.inputs.0.input": "how can langsmith help with testing?", "langchain.request.type": "chain", "langchain.response.outputs.0": "\\nSystem: Langsmith can help with testing in several ways. First, it can generate automated tests based on your technical docume...", "language": "python", - "runtime-id": "2304ee41d4dc442c862ba4160e934dcd" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -26,10 +26,10 @@ "langchain.tokens.prompt_tokens": 20, "langchain.tokens.total_cost": 0.000232, "langchain.tokens.total_tokens": 121, - "process_id": 74685 + "process_id": 82010 }, - "duration": 5099000, - "start": 1712696349182802000 + "duration": 8281000, + "start": 1738263109118903000 }, { "name": "langchain.request", @@ -64,6 +64,6 @@ "langchain.tokens.total_cost": 0.000232, "langchain.tokens.total_tokens": 121 }, - "duration": 3341000, - "start": 1712696349184509000 + "duration": 6142000, + "start": 1738263109120997000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json similarity index 87% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple_async.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json index ce966306e68..a0c1a1e6c53 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_simple_async.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json @@ -10,12 +10,12 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66a474e300000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.inputs.0.input": "how can langsmith help with testing?", "langchain.request.type": "chain", "langchain.response.outputs.0": "\\nSystem: Langsmith's advanced natural language processing technology can assist with testing by automatically generating test c...", "language": "python", - "runtime-id": "5c9a7de458cd41f2a754bdd5a6fb91df" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -26,10 +26,10 @@ "langchain.tokens.prompt_tokens": 20, "langchain.tokens.total_cost": 0.000186, "langchain.tokens.total_tokens": 98, - "process_id": 92902 + "process_id": 82010 }, - "duration": 43112000, - "start": 1722053859262380000 + "duration": 4689000, + "start": 1738263109680310000 }, { "name": "langchain.request", @@ -44,12 +44,10 @@ "langchain.request.api_key": "...key>", "langchain.request.model": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.logprobs": "None", "langchain.request.openai.parameters.max_tokens": "256", "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.n": "1", "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.seed": "None", "langchain.request.openai.parameters.temperature": "0.7", "langchain.request.openai.parameters.top_p": "1", "langchain.request.prompts.0": "System: You are world class technical documentation writer.\\nHuman: how can langsmith help with testing?", @@ -66,6 +64,6 @@ "langchain.tokens.total_cost": 0.000186, "langchain.tokens.total_tokens": 98 }, - "duration": 35830000, - "start": 1722053859269492000 + "duration": 3399000, + "start": 1738263109681498000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_anthropic.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_anthropic.json similarity index 91% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_anthropic.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_anthropic.json index 2ac2dcc75f1..5ccb386a636 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_anthropic.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_anthropic.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66a5254800000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.anthropic.parameters.default_request_timeout": "None", "langchain.request.anthropic.parameters.max_retries": "2", "langchain.request.anthropic.parameters.max_tokens": "1024", @@ -32,15 +32,15 @@ "langchain.response.completions.0.0.tool_calls.0.id": "toolu_01QLnLDPgrFLbBWTSCju4uao", "langchain.response.completions.0.0.tool_calls.0.name": "add", "language": "python", - "runtime-id": "2773596c35474b64964954f9caa5a34b" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 38329 + "process_id": 82010 }, - "duration": 15366000, - "start": 1722099016426715000 + "duration": 18026000, + "start": 1738263110454272000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_openai.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json similarity index 90% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_openai.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json index 3e6131fdcb8..2b865bb7371 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_with_tools_openai.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "669e753600000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.api_key": "...key>", "langchain.request.messages.0.0.content": "What is the sum of 1 and 2?", "langchain.request.messages.0.0.message_type": "HumanMessage", @@ -28,7 +28,7 @@ "langchain.response.completions.0.0.tool_calls.0.id": "call_HlX90uizLM5c3ZHoMkRB1tPt", "langchain.response.completions.0.0.tool_calls.0.name": "add", "language": "python", - "runtime-id": "f2c27a8722184b388adf87e161937455" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -39,8 +39,8 @@ "langchain.tokens.prompt_tokens": 85, "langchain.tokens.total_cost": 9.05e-05, "langchain.tokens.total_tokens": 117, - "process_id": 99349 + "process_id": 82010 }, - "duration": 913548000, - "start": 1721660726371226000 + "duration": 8071000, + "start": 1738263109237865000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json similarity index 90% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_generate.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json index 5088caae82a..57fe006a65a 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_generate.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66a7ed9200000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.api_key": "...key>", "langchain.request.messages.0.0.content": "Respond like a frat boy.", "langchain.request.messages.0.0.message_type": "SystemMessage", @@ -21,7 +21,6 @@ "langchain.request.messages.1.1.content": "How does one get to Bikini Bottom from New York?", "langchain.request.messages.1.1.message_type": "HumanMessage", "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.logprobs": "False", "langchain.request.openai.parameters.max_tokens": "256", "langchain.request.openai.parameters.model": "gpt-3.5-turbo", "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", @@ -35,7 +34,7 @@ "langchain.response.completions.1.0.content": "Arrr matey, ye be needin' to sail the high seas to reach Bikini Bottom from New York! Hoist the sails, set a course for the east...", "langchain.response.completions.1.0.message_type": "AIMessage", "language": "python", - "runtime-id": "878729bb4463422abd45c94b7e5f3c04" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -46,8 +45,8 @@ "langchain.tokens.prompt_tokens": 60, "langchain.tokens.total_cost": 0.00038999999999999994, "langchain.tokens.total_tokens": 210, - "process_id": 58590 + "process_id": 82010 }, - "duration": 45084000, - "start": 1722281362764762000 + "duration": 7706000, + "start": 1738263109445840000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_call.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_call.json deleted file mode 100644 index 0eda22db2e6..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_call.json +++ /dev/null @@ -1,45 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chat_models.openai.ChatOpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "When do you use 'whom' instead of 'who'?", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "'Whom' is used instead of 'who' when referring to the object of a sentence or clause. It is used when the person being referred ...", - "langchain.response.completions.0.0.message_type": "AIMessage", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 59, - "langchain.tokens.prompt_tokens": 21, - "langchain.tokens.total_cost": 0.00016, - "langchain.tokens.total_tokens": 80, - "process_id": 10515 - }, - "duration": 1797997, - "start": 1694032467296087472 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_generate.json deleted file mode 100644 index d577c723a89..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_generate.json +++ /dev/null @@ -1,53 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chat_models.openai.ChatOpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "Respond like a frat boy.", - "langchain.request.messages.0.0.message_type": "SystemMessage", - "langchain.request.messages.0.1.content": "Where's the nearest equinox gym from Hudson Yards manhattan?", - "langchain.request.messages.0.1.message_type": "HumanMessage", - "langchain.request.messages.1.0.content": "Respond with a pirate accent.", - "langchain.request.messages.1.0.message_type": "SystemMessage", - "langchain.request.messages.1.1.content": "How does one get to Bikini Bottom from New York?", - "langchain.request.messages.1.1.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Dude, I have no idea. Why don't you just Google it like a normal person? Or better yet, just skip the gym and come crush some be...", - "langchain.response.completions.0.0.message_type": "AIMessage", - "langchain.response.completions.1.0.content": "Arrr, ye be lookin' to sail to Bikini Bottom, eh? Well shiver me timbers, ye'll need to set sail from New York and head southwar...", - "langchain.response.completions.1.0.message_type": "AIMessage", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 133, - "langchain.tokens.prompt_tokens": 64, - "langchain.tokens.total_cost": 0.00039400000000000004, - "langchain.tokens.total_tokens": 197, - "process_id": 10515 - }, - "duration": 2516908, - "start": 1694032467310152213 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_39.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_39.json deleted file mode 100644 index 8e1db682c34..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_39.json +++ /dev/null @@ -1,45 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chat_models.openai.ChatOpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "When do you use 'whom' instead of 'who'?", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "'Whom' is used instead of 'who' when it is the object of a verb or preposition in a sentence. It is used to refer to the person ...", - "langchain.response.completions.0.0.message_type": "AIMessage", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 59, - "langchain.tokens.prompt_tokens": 21, - "langchain.tokens.total_cost": 0.00016, - "langchain.tokens.total_tokens": 80, - "process_id": 10515 - }, - "duration": 4905056, - "start": 1694032467258102111 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json index 97f062deee8..dd9e0c392da 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json @@ -7,13 +7,10 @@ "span_id": 1, "parent_id": 0, "type": "", - "error": 1, + "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "65e0fc5c00000000", - "error.message": "Connection error.", - "error.stack": "Traceback (most recent call last):\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_decoders.py\", line 78, in decode\n return self.decompressor.decompress(data)\nzlib.error: Error -3 while decompressing data: incorrect header check\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 918, in _request\n response = self._client.send(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 928, in send\n raise exc\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 922, in send\n response.read()\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_models.py\", line 813, in read\n self._content = b\"\".join(self.iter_bytes())\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_models.py\", line 830, in iter_bytes\n decoded = decoder.decode(raw_bytes)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_decoders.py\", line 80, in decode\n raise DecodingError(str(exc)) from exc\nhttpx.DecodingError: Error -3 while decompressing data: incorrect header check\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 918, in _request\n response = self._client.send(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 914, in send\n response = self._send_handling_auth(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 942, in _send_handling_auth\n response = self._send_handling_redirects(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 979, in _send_handling_redirects\n response = self._send_single_request(request)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/vcr/stubs/httpx_stubs.py\", line 184, in _inner_send\n return _sync_vcr_send(cassette, real_send, *args, **kwargs)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/vcr/stubs/httpx_stubs.py\", line 170, in _sync_vcr_send\n vcr_request, response = _shared_vcr_send(cassette, real_send, *args, **kwargs)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/vcr/stubs/httpx_stubs.py\", line 123, in _shared_vcr_send\n raise CannotOverwriteExistingCassetteException(cassette=cassette, failed_request=vcr_request)\nvcr.errors.CannotOverwriteExistingCassetteException: Can't overwrite existing cassette ('/Users/sam.brenner/Development/ml-obs/dd-trace-py/tests/contrib/langchain/cassettes/openai_chat_completion_sync_call.yaml') in your current record mode ('once').\nNo match for the request () was found.\nFound 1 similar requests with 0 different matcher(s) :\n\n1 - ().\nMatchers succeeded : ['path']\nMatchers failed :\n\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 918, in _request\n response = self._client.send(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 914, in send\n response = self._send_handling_auth(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 942, in _send_handling_auth\n response = self._send_handling_redirects(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/httpx/_client.py\", line 979, in _send_handling_redirects\n response = self._send_single_request(request)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/vcr/stubs/httpx_stubs.py\", line 184, in _inner_send\n return _sync_vcr_send(cassette, real_send, *args, **kwargs)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/vcr/stubs/httpx_stubs.py\", line 170, in _sync_vcr_send\n vcr_request, response = _shared_vcr_send(cassette, real_send, *args, **kwargs)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/vcr/stubs/httpx_stubs.py\", line 123, in _shared_vcr_send\n raise CannotOverwriteExistingCassetteException(cassette=cassette, failed_request=vcr_request)\nvcr.errors.CannotOverwriteExistingCassetteException: Can't overwrite existing cassette ('/Users/sam.brenner/Development/ml-obs/dd-trace-py/tests/contrib/langchain/cassettes/openai_chat_completion_sync_call.yaml') in your current record mode ('once').\nNo match for the request () was found.\nFound 1 similar requests with 0 different matcher(s) :\n\n1 - ().\nMatchers succeeded : ['path']\nMatchers failed :\n\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/ddtrace/contrib/langchain/patch.py\", line 312, in traced_chat_model_generate\n chat_completions = func(*args, **kwargs)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py\", line 408, in generate\n raise e\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py\", line 398, in generate\n self._generate_with_cache(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py\", line 577, in _generate_with_cache\n return self._generate(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/langchain_openai/chat_models/base.py\", line 462, in _generate\n response = self.client.create(messages=message_dicts, **params)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_utils/_utils.py\", line 275, in wrapper\n return func(*args, **kwargs)\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/resources/chat/completions.py\", line 663, in create\n return self._post(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 1200, in post\n return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls))\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 889, in request\n return self._request(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 942, in _request\n return self._retry_request(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 1013, in _retry_request\n return self._request(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 942, in _request\n return self._retry_request(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 1013, in _retry_request\n return self._request(\n File \"/Users/sam.brenner/Development/ml-obs/dd-trace-py/.riot/venv_py31013_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 952, in _request\n raise APIConnectionError(request=request) from err\nopenai.APIConnectionError: Connection error.\n", - "error.type": "openai.APIConnectionError", + "_dd.p.tid": "679bca4600000000", "langchain.request.api_key": "...key>", "langchain.request.messages.0.0.content": "When do you use 'whom' instead of 'who'?", "langchain.request.messages.0.0.message_type": "HumanMessage", @@ -26,17 +23,22 @@ "langchain.request.openai.parameters.temperature": "0.0", "langchain.request.provider": "openai", "langchain.request.type": "chat_model", + "langchain.response.completions.0.0.content": "'Who' is used as a subject pronoun, while 'whom' is used as an object pronoun. \\n\\nYou use 'who' when referring to the subject o...", + "langchain.response.completions.0.0.message_type": "AIMessage", "language": "python", - "runtime-id": "63f1c5d90fb14360a74783a6292b1299" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, - "_sample_rate": 1.0, "_sampling_priority_v1": 1, - "process_id": 83490 + "langchain.tokens.completion_tokens": 83, + "langchain.tokens.prompt_tokens": 20, + "langchain.tokens.total_cost": 0.00019600000000000002, + "langchain.tokens.total_tokens": 103, + "process_id": 82010 }, - "duration": 2516389000, - "start": 1709243484927811000 + "duration": 4431000, + "start": 1738263110097279000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json similarity index 92% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_generate.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json index 96529bb8b3d..f5de86a6836 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_generate.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "6697185500000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.api_key": "...key>", "langchain.request.messages.0.0.content": "Respond like a frat boy.", "langchain.request.messages.0.0.message_type": "SystemMessage", @@ -34,7 +34,7 @@ "langchain.response.completions.1.0.content": "Arrr matey, ye be needin' to sail the high seas to reach Bikini Bottom from New York! Hoist the sails, chart a course, and bewar...", "langchain.response.completions.1.0.message_type": "AIMessage", "language": "python", - "runtime-id": "83d5f8c67690465e800659270e2abb1a" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -45,8 +45,8 @@ "langchain.tokens.prompt_tokens": 60, "langchain.tokens.total_cost": 0.00031, "langchain.tokens.total_tokens": 170, - "process_id": 66487 + "process_id": 82010 }, - "duration": 6795000, - "start": 1721178197571648000 + "duration": 7357000, + "start": 1738263109749677000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate_39.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate_39.json deleted file mode 100644 index 9e3586dbdf8..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate_39.json +++ /dev/null @@ -1,53 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chat_models.openai.ChatOpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "Respond like a frat boy.", - "langchain.request.messages.0.0.message_type": "SystemMessage", - "langchain.request.messages.0.1.content": "Where's the nearest equinox gym from Hudson Yards manhattan?", - "langchain.request.messages.0.1.message_type": "HumanMessage", - "langchain.request.messages.1.0.content": "Respond with a pirate accent.", - "langchain.request.messages.1.0.message_type": "SystemMessage", - "langchain.request.messages.1.1.content": "How does one get to Bikini Bottom from New York?", - "langchain.request.messages.1.1.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Yo bro, I got you covered! The nearest Equinox gym from Hudson Yards in Manhattan is just a few blocks away, man. It's on 10th A...", - "langchain.response.completions.0.0.message_type": "AIMessage", - "langchain.response.completions.1.0.content": "Arr, me heartie! To get to Bikini Bottom from New York, ye be needin' a sturdy ship and a compass that points true. Set sail fro...", - "langchain.response.completions.1.0.message_type": "AIMessage", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 169, - "langchain.tokens.prompt_tokens": 60, - "langchain.tokens.total_cost": 0.000458, - "langchain.tokens.total_tokens": 229, - "process_id": 10515 - }, - "duration": 6974763, - "start": 1694032467277505864 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_vision_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json similarity index 60% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_vision_generate.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json index 89f6dcb9251..38bf8bc9a95 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_vision_generate.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json @@ -10,35 +10,35 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "6697185500000000", + "_dd.p.tid": "679be13400000000", "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "[{'type': 'text', 'text': 'What\u2019s in this image?'}, {'type': 'image_url', 'image_url': 'https://upload.wikimedia.org/wikipedia/c...", + "langchain.request.messages.0.0.content": "[{'type': 'text', 'text': 'What\u2019s in this image?'}, {'type': 'image_url', 'image_url': {'url': 'https://upload.wikimedia.org/wik...", "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-4-vision-preview", + "langchain.request.model": "gpt-4o", "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model": "gpt-4-vision-preview", - "langchain.request.openai.parameters.model_name": "gpt-4-vision-preview", + "langchain.request.openai.parameters.model": "gpt-4o", + "langchain.request.openai.parameters.model_name": "gpt-4o", "langchain.request.openai.parameters.n": "1", "langchain.request.openai.parameters.stream": "False", "langchain.request.openai.parameters.temperature": "0.0", "langchain.request.provider": "openai", "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "The image shows a wooden boardwalk extending through a lush green meadow with tall grasses on either side. The sky is partly clo...", + "langchain.response.completions.0.0.content": "The image shows a scenic landscape with a wooden boardwalk path leading through a lush green field. The sky is blue with scatter...", "langchain.response.completions.0.0.message_type": "AIMessage", "language": "python", - "runtime-id": "83d5f8c67690465e800659270e2abb1a" + "runtime-id": "19b72b45843c4dc58a27069788eee8d3" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 1118, - "langchain.tokens.total_cost": 0.01403, - "langchain.tokens.total_tokens": 1213, - "process_id": 66487 + "langchain.tokens.completion_tokens": 56, + "langchain.tokens.prompt_tokens": 1151, + "langchain.tokens.total_cost": 0, + "langchain.tokens.total_tokens": 1207, + "process_id": 34354 }, - "duration": 3274000, - "start": 1721178197657452000 + "duration": 33752000, + "start": 1738268980686452000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_document.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_document.json deleted file mode 100644 index 498fb90b0ed..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_document.json +++ /dev/null @@ -1,34 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.embeddings.openai.OpenAIEmbeddings", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.inputs.0.text": "this is", - "langchain.request.inputs.1.text": "a test document.", - "langchain.request.model": "text-embedding-ada-002", - "langchain.request.provider": "openai", - "language": "python", - "runtime-id": "fee8e436b6394c02893eb6af74d2ada2" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.request.input_count": 2, - "langchain.response.outputs.0.embedding_length": 1536, - "langchain.response.outputs.1.embedding_length": 1536, - "process_id": 98111 - }, - "duration": 157758000, - "start": 1688048579281109000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_query.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_query.json index 0223a8f96ac..3690d1b2c38 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_query.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_embedding_query.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.embeddings.openai.OpenAIEmbeddings", + "resource": "langchain_openai.embeddings.base.OpenAIEmbeddings", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,14 +10,14 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.api_key": "...key>", "langchain.request.inputs.0.text": "this is a test query.", "langchain.request.model": "text-embedding-ada-002", "langchain.request.provider": "openai", "langchain.request.type": "embedding", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -26,8 +26,8 @@ "_sampling_priority_v1": 1, "langchain.request.input_count": 1, "langchain.response.outputs.embedding_length": 1536, - "process_id": 10515 + "process_id": 82010 }, - "duration": 4395745, - "start": 1694032467388932642 + "duration": 77000, + "start": 1738263110174027000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_integration.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_integration.json deleted file mode 100644 index d0bf23b3d9e..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_integration.json +++ /dev/null @@ -1,114 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "656758d100000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "language": "python", - "runtime-id": "6c46774a35e24435b83c273cfa16ce82" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 52422 - }, - "duration": 20264000, - "start": 1701271761974560000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "text-davinci-003", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "stop", - "openai.response.choices.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "openai.response.created": "1687283761", - "openai.response.id": "cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP", - "openai.response.model": "text-davinci-003", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249744 - }, - "duration": 19788000, - "start": 1701271761974762000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "ddtrace_subprocess_dir", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.8", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 2468000, - "start": 1701271761990731000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json index bd3e6e31b97..f1a7884c2bf 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", + "resource": "langchain_openai.llms.base.OpenAI", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,15 +10,14 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", + "langchain.request.model": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.frequency_penalty": "0", "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", + "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.n": "1", "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", "langchain.request.openai.parameters.temperature": "0.7", "langchain.request.openai.parameters.top_p": "1", "langchain.request.prompts.0": "Which team won the 2019 NBA finals?", @@ -28,19 +27,19 @@ "langchain.response.completions.0.logprobs": "None", "langchain.response.completions.0.text": "\\n\\nThe Toronto Raptors won the 2019 NBA Finals.", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 11, - "langchain.tokens.prompt_tokens": 8, - "langchain.tokens.total_cost": 0.00038, - "langchain.tokens.total_tokens": 19, - "process_id": 10515 + "langchain.tokens.completion_tokens": 12, + "langchain.tokens.prompt_tokens": 10, + "langchain.tokens.total_cost": 3.9e-05, + "langchain.tokens.total_tokens": 22, + "process_id": 82010 }, - "duration": 2442415, - "start": 1694032466539856680 + "duration": 3471000, + "start": 1738263109367504000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_error.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_error.json index 36a22643a49..19d5b71e02e 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_error.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_error.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", + "resource": "langchain_openai.llms.base.OpenAI", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,18 +10,17 @@ "error": 1, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "error.message": "Invalid token in prompt: 123456. Minimum value is 0, maximum value is 50280 (inclusive).", - "error.stack": "Traceback (most recent call last):\n File \"/root/project/ddtrace/contrib/langchain/patch.py\", line 221, in traced_llm_generate\n completions = func(*args, **kwargs)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/langchain/llms/base.py\", line 192, in generate\n raise e\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/langchain/llms/base.py\", line 186, in generate\n self._generate(prompts, stop=stop, run_manager=run_manager)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/langchain/llms/openai.py\", line 317, in _generate\n response = completion_with_retry(self, prompt=_prompts, **params)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/langchain/llms/openai.py\", line 106, in completion_with_retry\n return _completion_with_retry(**kwargs)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/tenacity/__init__.py\", line 289, in wrapped_f\n return self(f, *args, **kw)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/tenacity/__init__.py\", line 379, in __call__\n do = self.iter(retry_state=retry_state)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/tenacity/__init__.py\", line 314, in iter\n return fut.result()\n File \"/root/.pyenv/versions/3.9.16/lib/python3.9/concurrent/futures/_base.py\", line 439, in result\n return self.__get_result()\n File \"/root/.pyenv/versions/3.9.16/lib/python3.9/concurrent/futures/_base.py\", line 391, in __get_result\n raise self._exception\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/tenacity/__init__.py\", line 382, in __call__\n result = fn(*args, **kwargs)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/langchain/llms/openai.py\", line 104, in _completion_with_retry\n return llm.client.create(**kwargs)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/openai/api_resources/completion.py\", line 25, in create\n return super().create(*args, **kwargs)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/openai/api_resources/abstract/engine_api_resource.py\", line 153, in create\n response, _, api_key = requestor.request(\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/openai/api_requestor.py\", line 298, in request\n resp, got_stream = self._interpret_response(result, stream)\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/openai/api_requestor.py\", line 700, in _interpret_response\n self._interpret_response_line(\n File \"/root/project/.riot/venv_py3916_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_langchain00192_openai_vcrpy_pytest-asyncio_tiktoken_pinecone-client_cohere_huggingface-hub_ai21_exceptiongroup_psutil/lib/python3.9/site-packages/openai/api_requestor.py\", line 763, in _interpret_response_line\n raise self.handle_error_response(\nopenai.error.InvalidRequestError: Invalid token in prompt: 123456. Minimum value is 0, maximum value is 50280 (inclusive).\n", - "error.type": "openai.error.InvalidRequestError", + "_dd.p.tid": "679bca4500000000", + "error.message": "Error code: 400 - {'error': {'message': 'Invalid token in prompt: 123456. Minimum value is 0, maximum value is 100257 (inclusive).', 'type': 'invalid_request_error', 'param': None, 'code': None}}", + "error.stack": "Traceback (most recent call last):\n File \"/Users/sam.brenner/dd/dd-trace-py/ddtrace/contrib/internal/langchain/patch.py\", line 221, in traced_llm_generate\n completions = func(*args, **kwargs)\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/langchain_core/language_models/llms.py\", line 803, in generate\n output = self._generate_helper(\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/langchain_core/language_models/llms.py\", line 670, in _generate_helper\n raise e\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/langchain_core/language_models/llms.py\", line 657, in _generate_helper\n self._generate(\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/langchain_openai/llms/base.py\", line 350, in _generate\n response = self.client.create(prompt=_prompts, **params)\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/openai/_utils/_utils.py\", line 277, in wrapper\n return func(*args, **kwargs)\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/openai/resources/completions.py\", line 528, in create\n return self._post(\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/openai/_base_client.py\", line 1240, in post\n return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls))\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/openai/_base_client.py\", line 921, in request\n return self._request(\n File \"/Users/sam.brenner/dd/dd-trace-py/.riot/venv_py31013_19f22257743a59a1/lib/python3.10/site-packages/openai/_base_client.py\", line 1020, in _request\n raise self._make_status_error_from_response(err.response) from None\nopenai.BadRequestError: Error code: 400 - {'error': {'message': 'Invalid token in prompt: 123456. Minimum value is 0, maximum value is 100257 (inclusive).', 'type': 'invalid_request_error', 'param': None, 'code': None}}\n", + "error.type": "openai.BadRequestError", "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", + "langchain.request.model": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.frequency_penalty": "0", "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", + "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.n": "1", "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", "langchain.request.openai.parameters.temperature": "0.7", "langchain.request.openai.parameters.top_p": "1", "langchain.request.prompts.0": "12345", @@ -29,15 +28,15 @@ "langchain.request.provider": "openai", "langchain.request.type": "llm", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 10515 + "process_id": 82010 }, - "duration": 5327422, - "start": 1694032466592782456 + "duration": 7324000, + "start": 1738263109621524000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json index 7cd8ad9bb80..a527a18d4a2 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", + "resource": "langchain_openai.llms.base.OpenAI", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,37 +10,36 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", + "langchain.request.model": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.frequency_penalty": "0", "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", + "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.n": "1", "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", "langchain.request.openai.parameters.temperature": "0.7", "langchain.request.openai.parameters.top_p": "1", "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", "langchain.request.provider": "openai", "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", + "langchain.response.completions.0.finish_reason": "length", "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", + "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", "language": "python", - "runtime-id": "cfe560562fe5439bb5acb2287ceb37cb" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, + "langchain.tokens.completion_tokens": 256, "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 13644 + "langchain.tokens.total_cost": 0.0005375, + "langchain.tokens.total_tokens": 273, + "process_id": 82010 }, - "duration": 4408688, - "start": 1694032716771432465 + "duration": 3387000, + "start": 1738263110205796000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_39.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_39.json deleted file mode 100644 index 58564950a4a..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_39.json +++ /dev/null @@ -1,46 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \u201cI think, therefore I am\u201d is a fundamental idea from his work, Meditations on First Philosophy. It ...", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 10515 - }, - "duration": 4999908, - "start": 1694032466462121667 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json index 438d48c7ad2..fb587526043 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", + "resource": "langchain_openai.llms.base.OpenAI", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,41 +10,40 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", + "langchain.request.model": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.frequency_penalty": "0", "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", + "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.n": "1", "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", "langchain.request.openai.parameters.temperature": "0.7", "langchain.request.openai.parameters.top_p": "1", "langchain.request.prompts.0": "What is the best way to teach a baby multiple languages?", "langchain.request.prompts.1": "How many times has Spongebob failed his road test?", "langchain.request.provider": "openai", "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", + "langchain.response.completions.0.finish_reason": "length", "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nThe best way to teach a baby multiple languages is to start as early as possible and to make the learning experience fun and...", + "langchain.response.completions.0.text": "\\n\\n1. Start early: It is easier for babies to learn multiple languages when exposed to them from a young age. Babies are born w...", "langchain.response.completions.1.finish_reason": "stop", "langchain.response.completions.1.logprobs": "None", - "langchain.response.completions.1.text": "\\n\\nSpongebob has failed his road test a total of three times.", + "langchain.response.completions.1.text": "\\n\\nSpongebob has failed his road test at least 26 times.", "language": "python", - "runtime-id": "cfe560562fe5439bb5acb2287ceb37cb" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 114, - "langchain.tokens.prompt_tokens": 24, - "langchain.tokens.total_cost": 0.0027600000000000003, - "langchain.tokens.total_tokens": 138, - "process_id": 13644 + "langchain.tokens.completion_tokens": 271, + "langchain.tokens.prompt_tokens": 23, + "langchain.tokens.total_cost": 0.0005765000000000001, + "langchain.tokens.total_tokens": 294, + "process_id": 82010 }, - "duration": 5029091, - "start": 1694032716836039205 + "duration": 3334000, + "start": 1738263110060841000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts_39.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts_39.json deleted file mode 100644 index c9671dc85bb..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts_39.json +++ /dev/null @@ -1,50 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "What is the best way to teach a baby multiple languages?", - "langchain.request.prompts.1": "How many times has Spongebob failed his road test?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nThe best way to teach a baby multiple languages is to make sure that all caregivers are speaking the languages to the baby f...", - "langchain.response.completions.1.finish_reason": "stop", - "langchain.response.completions.1.logprobs": "None", - "langchain.response.completions.1.text": "\\n\\nSpongebob has failed his road test nine times.", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 110, - "langchain.tokens.prompt_tokens": 24, - "langchain.tokens.total_cost": 0.00268, - "langchain.tokens.total_tokens": 134, - "process_id": 10515 - }, - "duration": 4974081, - "start": 1694032466521927880 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_math_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_math_chain.json deleted file mode 100644 index fa869bf353d..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_math_chain.json +++ /dev/null @@ -1,100 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm_math.base.LLMMathChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615aa1200000000", - "langchain.request.inputs.question": "what is two raised to the fifty-fourth power?", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.answer": "Answer: 18014398509481984", - "langchain.response.outputs.question": "what is two raised to the fifty-fourth power?", - "language": "python", - "runtime-id": "5bdc2648fed64ec2a49138caab5a0bf0" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 24, - "langchain.tokens.prompt_tokens": 236, - "langchain.tokens.total_cost": 0.0052, - "langchain.tokens.total_tokens": 260, - "process_id": 45546 - }, - "duration": 1914000, - "start": 1712695826515267000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.question": "what is two raised to the fifty-fourth power?", - "langchain.request.inputs.stop": "['```output']", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.question": "what is two raised to the fifty-fourth power?", - "langchain.response.outputs.stop": "['```output']", - "langchain.response.outputs.text": "\\n```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 24, - "langchain.tokens.prompt_tokens": 236, - "langchain.tokens.total_cost": 0.0052, - "langchain.tokens.total_tokens": 260 - }, - "duration": 1540000, - "start": 1712695826515512000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 24, - "langchain.tokens.prompt_tokens": 236, - "langchain.tokens.total_cost": 0.0052, - "langchain.tokens.total_tokens": 260 - }, - "duration": 1260000, - "start": 1712695826515748000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain.json deleted file mode 100644 index 444430e4efb..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain.json +++ /dev/null @@ -1,121 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.sequential.SequentialChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615aa0f00000000", - "langchain.request.inputs.style": "a 90s rapper", - "langchain.request.inputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nChains be like a link, let us connect the pieces, creatin' a single app. We can write a chain to take input, format it with a ...", - "langchain.response.outputs.style": "a 90s rapper", - "langchain.response.outputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "language": "python", - "runtime-id": "5bdc2648fed64ec2a49138caab5a0bf0" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 69, - "langchain.tokens.prompt_tokens": 105, - "langchain.tokens.total_cost": 0.0034800000000000005, - "langchain.tokens.total_tokens": 174, - "process_id": 45546 - }, - "duration": 3665000, - "start": 1712695823984238000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.transform.TransformChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.style": "a 90s rapper", - "langchain.request.inputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "langchain.request.type": "chain", - "langchain.response.outputs.output_text": "\\n Chains allow us to combine multiple\\n components together to create a single, coherent application.\\n For example, we can cre..." - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 204000, - "start": 1712695823984369000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.output_text": "\\n Chains allow us to combine multiple\\n components together to create a single, coherent application.\\n For example, we can cre...", - "langchain.request.inputs.style": "a 90s rapper", - "langchain.request.inputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "langchain.request.prompt": "Paraphrase this text:\\n\\n {output_text}\\n\\n In the style of a {style}.\\n\\n Paraphrase: ", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nChains be like a link, let us connect the pieces, creatin' a single app. We can write a chain to take input, format it with a ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 69, - "langchain.tokens.prompt_tokens": 105, - "langchain.tokens.total_cost": 0.0034800000000000005, - "langchain.tokens.total_tokens": 174 - }, - "duration": 3248000, - "start": 1712695823984622000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 4, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Paraphrase this text:\\n\\n \\n Chains allow us to combine multiple\\n components together to create a single, coherent appli...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nChains be like a link, let us connect the pieces, creatin' a single app. We can write a chain to take input, format it with a ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 69, - "langchain.tokens.prompt_tokens": 105, - "langchain.tokens.total_cost": 0.0034800000000000005, - "langchain.tokens.total_tokens": 174 - }, - "duration": 3063000, - "start": 1712695823984765000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_async.json deleted file mode 100644 index d46dff4d757..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_async.json +++ /dev/null @@ -1,159 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.sequential.SequentialChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66566a3300000000", - "langchain.request.inputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nI've convinced my mind, no physical world's there, no sky, no earth, no minds, no bodies there. Does this mean I don't exist, ...", - "langchain.response.outputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "language": "python", - "runtime-id": "103801afb5f54bf4b14c4af40585cea5" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 198, - "langchain.tokens.prompt_tokens": 304, - "langchain.tokens.total_cost": 0.01004, - "langchain.tokens.total_tokens": 502, - "process_id": 69928 - }, - "duration": 39665000, - "start": 1716939315688098000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "langchain.request.prompt": "Paraphrase this text:\\n\\n {input_text}\\n\\n Paraphrase: ", - "langchain.request.type": "chain", - "langchain.response.outputs.paraphrased_output": "\\nI have convinced myself that there is no physical world - no sky, earth, minds, or bodies. Does this mean that I don't exist e..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 106, - "langchain.tokens.prompt_tokens": 183, - "langchain.tokens.total_cost": 0.00578, - "langchain.tokens.total_tokens": 289 - }, - "duration": 37649000, - "start": 1716939315688241000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 4, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Paraphrase this text:\\n\\n \\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no m...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nI have convinced myself that there is no physical world - no sky, earth, minds, or bodies. Does this mean that I don't exist e..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 106, - "langchain.tokens.prompt_tokens": 183, - "langchain.tokens.total_cost": 0.00578, - "langchain.tokens.total_tokens": 289 - }, - "duration": 37325000, - "start": 1716939315688408000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "langchain.request.inputs.paraphrased_output": "\\nI have convinced myself that there is no physical world - no sky, earth, minds, or bodies. Does this mean that I don't exist e...", - "langchain.request.prompt": "Make this text rhyme:\\n\\n {paraphrased_output}\\n\\n Rhyme: ", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nI've convinced my mind, no physical world's there, no sky, no earth, no minds, no bodies there. Does this mean I don't exist, ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 92, - "langchain.tokens.prompt_tokens": 121, - "langchain.tokens.total_cost": 0.00426, - "langchain.tokens.total_tokens": 213 - }, - "duration": 1727000, - "start": 1716939315725990000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 5, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Make this text rhyme:\\n\\n \\nI have convinced myself that there is no physical world - no sky, earth, minds, or bodies. Do...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nI've convinced my mind, no physical world's there, no sky, no earth, no minds, no bodies there. Does this mean I don't exist, ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 92, - "langchain.tokens.prompt_tokens": 121, - "langchain.tokens.total_cost": 0.00426, - "langchain.tokens.total_tokens": 213 - }, - "duration": 1248000, - "start": 1716939315726416000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_sync.json deleted file mode 100644 index b9b5ef33eee..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_sequential_chain_with_multiple_llm_sync.json +++ /dev/null @@ -1,159 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.sequential.SequentialChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66566a3300000000", - "langchain.request.inputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nI've come to the conclusion it's true,\\nThere's nothing in the world like me and you.\\nDoes this mean I don't exist? No!\\nFor ...", - "langchain.response.outputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "language": "python", - "runtime-id": "103801afb5f54bf4b14c4af40585cea5" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 255, - "langchain.tokens.prompt_tokens": 331, - "langchain.tokens.total_cost": 0.011720000000000001, - "langchain.tokens.total_tokens": 586, - "process_id": 69928 - }, - "duration": 8782000, - "start": 1716939315772875000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "langchain.request.prompt": "Paraphrase this text:\\n\\n {input_text}\\n\\n Paraphrase: ", - "langchain.request.type": "chain", - "langchain.response.outputs.paraphrased_output": "\\nI have come to the conclusion that there is nothing in the world such as the sky, the earth, minds, or bodies. Does this mean ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 140, - "langchain.tokens.prompt_tokens": 172, - "langchain.tokens.total_cost": 0.006240000000000001, - "langchain.tokens.total_tokens": 312 - }, - "duration": 6067000, - "start": 1716939315773033000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 4, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Paraphrase this text:\\n\\n \\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no m...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nI have come to the conclusion that there is nothing in the world such as the sky, the earth, minds, or bodies. Does this mean ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 140, - "langchain.tokens.prompt_tokens": 172, - "langchain.tokens.total_cost": 0.006240000000000001, - "langchain.tokens.total_tokens": 312 - }, - "duration": 5836000, - "start": 1716939315773210000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\nI have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\nbodies. Does it now fol...", - "langchain.request.inputs.paraphrased_output": "\\nI have come to the conclusion that there is nothing in the world such as the sky, the earth, minds, or bodies. Does this mean ...", - "langchain.request.prompt": "Make this text rhyme:\\n\\n {paraphrased_output}\\n\\n Rhyme: ", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nI've come to the conclusion it's true,\\nThere's nothing in the world like me and you.\\nDoes this mean I don't exist? No!\\nFor ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 115, - "langchain.tokens.prompt_tokens": 159, - "langchain.tokens.total_cost": 0.0054800000000000005, - "langchain.tokens.total_tokens": 274 - }, - "duration": 2486000, - "start": 1716939315779141000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 5, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Make this text rhyme:\\n\\n \\nI have come to the conclusion that there is nothing in the world such as the sky, the earth, ...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nI've come to the conclusion it's true,\\nThere's nothing in the world like me and you.\\nDoes this mean I don't exist? No!\\nFor ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 115, - "langchain.tokens.prompt_tokens": 159, - "langchain.tokens.total_cost": 0.0054800000000000005, - "langchain.tokens.total_tokens": 274 - }, - "duration": 2254000, - "start": 1716939315779332000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-None].json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-None].json deleted file mode 100644 index 5698f8f83b1..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-None].json +++ /dev/null @@ -1,114 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6567589f00000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "language": "python", - "runtime-id": "491c4af28ded4893a7b34f6d38a271e1" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 51991 - }, - "duration": 37883000, - "start": 1701271711482100000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "text-davinci-003", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "stop", - "openai.response.choices.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "openai.response.created": "1687283761", - "openai.response.id": "cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP", - "openai.response.model": "text-davinci-003", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249744 - }, - "duration": 37306000, - "start": 1701271711482371000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "ddtrace_subprocess_dir", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.8", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 2814000, - "start": 1701271711515500000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v0].json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v0].json deleted file mode 100644 index cb87e41b4d0..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v0].json +++ /dev/null @@ -1,114 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "656758a100000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "language": "python", - "runtime-id": "6e89770723f848ba9694a1c7bfd2e1ea" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 52031 - }, - "duration": 23089000, - "start": 1701271713207812000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "text-davinci-003", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "stop", - "openai.response.choices.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "openai.response.created": "1687283761", - "openai.response.id": "cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP", - "openai.response.model": "text-davinci-003", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249744 - }, - "duration": 22505000, - "start": 1701271713208094000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "ddtrace_subprocess_dir", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.8", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 2689000, - "start": 1701271713226580000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v1].json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v1].json deleted file mode 100644 index d3a0104bb8d..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[None-v1].json +++ /dev/null @@ -1,114 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "656758a200000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "language": "python", - "runtime-id": "6698aff8b6bc4a9bbc13caad0ff10116" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 52046 - }, - "duration": 22017000, - "start": 1701271714856850000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "text-davinci-003", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "stop", - "openai.response.choices.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "openai.response.created": "1687283761", - "openai.response.id": "cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP", - "openai.response.model": "text-davinci-003", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249744 - }, - "duration": 21537000, - "start": 1701271714857046000 - }, - { - "name": "http.client.request", - "service": "ddtrace_subprocess_dir", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "http", - "error": 0, - "meta": { - "_dd.peer.service.source": "out.host", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.8", - "out.host": "api.openai.com", - "peer.service": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 2505000, - "start": 1701271714874919000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-None].json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-None].json deleted file mode 100644 index 12452e090e9..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-None].json +++ /dev/null @@ -1,114 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "mysvc", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "656758a400000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "language": "python", - "runtime-id": "84494f4ac33249e48add2d4b11ca14fd" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 52055 - }, - "duration": 22217000, - "start": 1701271716419934000 - }, - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "text-davinci-003", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "stop", - "openai.response.choices.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "openai.response.created": "1687283761", - "openai.response.id": "cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP", - "openai.response.model": "text-davinci-003", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249744 - }, - "duration": 21687000, - "start": 1701271716420187000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "mysvc", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.8", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 2612000, - "start": 1701271716437980000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v0].json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v0].json deleted file mode 100644 index 57de85ba2a5..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v0].json +++ /dev/null @@ -1,114 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "mysvc", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "656758a600000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "language": "python", - "runtime-id": "a775474efd2447d9a75dd40e0852a206" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 52069 - }, - "duration": 23592000, - "start": 1701271718196087000 - }, - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "text-davinci-003", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "stop", - "openai.response.choices.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "openai.response.created": "1687283761", - "openai.response.id": "cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP", - "openai.response.model": "text-davinci-003", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249744 - }, - "duration": 23083000, - "start": 1701271718196332000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "mysvc", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.8", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 2478000, - "start": 1701271718215723000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v1].json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v1].json deleted file mode 100644 index a262598f155..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_service_name[mysvc-v1].json +++ /dev/null @@ -1,114 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "mysvc", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "656758a700000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "language": "python", - "runtime-id": "f3513b3e1a9f487097c01f070a2d354f" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 95, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0022400000000000002, - "langchain.tokens.total_tokens": 112, - "process_id": 52087 - }, - "duration": 27488000, - "start": 1701271719975267000 - }, - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "text-davinci-003", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "stop", - "openai.response.choices.0.text": "\\n\\nDescartes' famous phrase \"I think, therefore I am\" is a fundamental statement of his philosophical approach, known as Cartes...", - "openai.response.created": "1687283761", - "openai.response.id": "cmpl-7TZs9SoIjYLVNCYmAqIz9ihMX1grP", - "openai.response.model": "text-davinci-003", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249744 - }, - "duration": 26956000, - "start": 1701271719975544000 - }, - { - "name": "http.client.request", - "service": "mysvc", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "http", - "error": 0, - "meta": { - "_dd.peer.service.source": "out.host", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.8", - "out.host": "api.openai.com", - "peer.service": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 2451000, - "start": 1701271719998828000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain.json deleted file mode 100644 index c37a59fa5c9..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain.json +++ /dev/null @@ -1,196 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.qa_with_sources.retrieval.RetrievalQAWithSourcesChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615aa1d00000000", - "langchain.request.inputs.question": "Who was Alan Turing?", - "langchain.request.type": "chain", - "langchain.response.outputs.answer": " Alan Turing was a brilliant mathematician and cryptographer who was the founder of modern-day computer science and artificial i...", - "langchain.response.outputs.question": "Who was Alan Turing?", - "langchain.response.outputs.sources": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "language": "python", - "runtime-id": "5bdc2648fed64ec2a49138caab5a0bf0" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 132, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.06042, - "langchain.tokens.total_tokens": 3021, - "process_id": 45546 - }, - "duration": 13629000, - "start": 1712695837726187000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.vectorstores.pinecone.Pinecone", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.pinecone.environment": "", - "langchain.request.pinecone.index_name": "langchain-retrieval", - "langchain.request.pinecone.project_name": "74ce8fe", - "langchain.request.provider": "pinecone", - "langchain.request.query": "Who was Alan Turing?", - "langchain.request.type": "similarity_search", - "langchain.response.document.0.metadata.chunk": "1.0", - "langchain.response.document.0.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.0.metadata.title": "Alan Turing", - "langchain.response.document.0.metadata.wiki-id": "13", - "langchain.response.document.0.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", - "langchain.response.document.1.metadata.chunk": "1.0", - "langchain.response.document.1.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.1.metadata.title": "Alan Turing", - "langchain.response.document.1.metadata.wiki-id": "13", - "langchain.response.document.1.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", - "langchain.response.document.2.metadata.chunk": "1.0", - "langchain.response.document.2.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.2.metadata.title": "Alan Turing", - "langchain.response.document.2.metadata.wiki-id": "13", - "langchain.response.document.2.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", - "langchain.response.document.3.metadata.chunk": "1.0", - "langchain.response.document.3.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.3.metadata.title": "Alan Turing", - "langchain.response.document.3.metadata.wiki-id": "13", - "langchain.response.document.3.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.response.document_count": 4 - }, - "duration": 10320000, - "start": 1712695837726395000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.embeddings.openai.OpenAIEmbeddings", - "trace_id": 0, - "span_id": 4, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.inputs.0.text": "Who was Alan Turing?", - "langchain.request.model": "text-embedding-ada-002", - "langchain.request.provider": "openai", - "langchain.request.type": "embedding" - }, - "metrics": { - "_dd.measured": 1, - "langchain.request.input_count": 1, - "langchain.response.outputs.embedding_length": 1536 - }, - "duration": 2073000, - "start": 1712695837726458000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.combine_documents.stuff.StuffDocumentsChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_documents": "[Document(page_content='A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer scienc...", - "langchain.request.inputs.question": "Who was Alan Turing?", - "langchain.request.type": "chain", - "langchain.response.outputs.input_documents": "[Document(page_content='A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer scienc...", - "langchain.response.outputs.output_text": " Alan Turing was a brilliant mathematician and cryptographer who was the founder of modern-day computer science and artificial i...", - "langchain.response.outputs.question": "Who was Alan Turing?" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 132, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.06042, - "langchain.tokens.total_tokens": 3021 - }, - "duration": 2907000, - "start": 1712695837736786000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 5, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.question": "Who was Alan Turing?", - "langchain.request.inputs.summaries": "Content: A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificia...", - "langchain.request.prompt": "Given the following extracted parts of a long document and a question, create a final answer with references (\"SOURCES\"). \\nIf y...", - "langchain.request.type": "chain", - "langchain.response.outputs.question": "Who was Alan Turing?", - "langchain.response.outputs.summaries": "Content: A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificia...", - "langchain.response.outputs.text": " Alan Turing was a brilliant mathematician and cryptographer who was the founder of modern-day computer science and artificial i..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 132, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.06042, - "langchain.tokens.total_tokens": 3021 - }, - "duration": 2595000, - "start": 1712695837737017000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 6, - "parent_id": 5, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Given the following extracted parts of a long document and a question, create a final answer with references (\"SOURCES\"). \\nIf y...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": " Alan Turing was a brilliant mathematician and cryptographer who was the founder of modern-day computer science and artificial i..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 132, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.06042, - "langchain.tokens.total_tokens": 3021 - }, - "duration": 2345000, - "start": 1712695837737211000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain_39.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain_39.json deleted file mode 100644 index e2e365bd57d..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_retrieval_chain_39.json +++ /dev/null @@ -1,201 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.qa_with_sources.retrieval.RetrievalQAWithSourcesChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.inputs.question": "Who was Alan Turing?", - "langchain.request.type": "chain", - "langchain.response.outputs.answer": " Alan Turing was a brilliant mathematician and cryptographer who became the founder of modern-day computer science and artificia...", - "langchain.response.outputs.question": "Who was Alan Turing?", - "langchain.response.outputs.sources": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 107, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.05992, - "langchain.tokens.total_tokens": 2996, - "process_id": 10515 - }, - "duration": 30021024, - "start": 1694032468369861765 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.vectorstores.pinecone.Pinecone", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.pinecone.environment": "", - "langchain.request.pinecone.index_name": "langchain-retrieval", - "langchain.request.pinecone.project_name": "74ce8fe", - "langchain.request.provider": "pinecone", - "langchain.request.query": "Who was Alan Turing?", - "langchain.request.type": "similarity_search", - "langchain.response.document.0.metadata.chunk": "1.0", - "langchain.response.document.0.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.0.metadata.title": "Alan Turing", - "langchain.response.document.0.metadata.wiki-id": "13", - "langchain.response.document.0.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", - "langchain.response.document.1.metadata.chunk": "1.0", - "langchain.response.document.1.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.1.metadata.title": "Alan Turing", - "langchain.response.document.1.metadata.wiki-id": "13", - "langchain.response.document.1.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", - "langchain.response.document.2.metadata.chunk": "1.0", - "langchain.response.document.2.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.2.metadata.title": "Alan Turing", - "langchain.response.document.2.metadata.wiki-id": "13", - "langchain.response.document.2.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", - "langchain.response.document.3.metadata.chunk": "1.0", - "langchain.response.document.3.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.3.metadata.title": "Alan Turing", - "langchain.response.document.3.metadata.wiki-id": "13", - "langchain.response.document.3.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.response.document_count": 4 - }, - "duration": 24933899, - "start": 1694032468370134562 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.embeddings.openai.OpenAIEmbeddings", - "trace_id": 0, - "span_id": 4, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.inputs.0.text": "Who was Alan Turing?", - "langchain.request.model": "text-embedding-ada-002", - "langchain.request.provider": "openai", - "langchain.request.type": "embedding" - }, - "metrics": { - "_dd.measured": 1, - "langchain.request.input_count": 1, - "langchain.response.outputs.embedding_length": 1536 - }, - "duration": 3675449, - "start": 1694032468370246372 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.combine_documents.stuff.StuffDocumentsChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "_dd.p.tid": "654a694400000000", - "langchain.request.inputs.input_documents": "[Document(page_content='A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer scienc...", - "langchain.request.inputs.question": "Who was Alan Turing?", - "langchain.request.type": "chain", - "langchain.response.outputs.input_documents": "[Document(page_content='A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer scienc...", - "langchain.response.outputs.output_text": " Alan Turing was a brilliant mathematician and cryptographer who became the founder of modern-day computer science and artificia...", - "langchain.response.outputs.question": "Who was Alan Turing?" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 107, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.05992, - "langchain.tokens.total_tokens": 2996 - }, - "duration": 4316682, - "start": 1694032468395268588 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 5, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "_dd.p.tid": "654a694400000000", - "langchain.request.inputs.question": "Who was Alan Turing?", - "langchain.request.inputs.summaries": "Content: A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificia...", - "langchain.request.prompt": "Given the following extracted parts of a long document and a question, create a final answer with references (\"SOURCES\"). \\nIf y...", - "langchain.request.type": "chain", - "langchain.response.outputs.question": "Who was Alan Turing?", - "langchain.response.outputs.summaries": "Content: A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificia...", - "langchain.response.outputs.text": " Alan Turing was a brilliant mathematician and cryptographer who became the founder of modern-day computer science and artificia..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 107, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.05992, - "langchain.tokens.total_tokens": 2996 - }, - "duration": 3750931, - "start": 1694032468395646274 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.llms.openai.OpenAI", - "trace_id": 0, - "span_id": 6, - "parent_id": 5, - "type": "", - "error": 0, - "meta": { - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "text-davinci-003", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "text-davinci-003", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.request_timeout": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Given the following extracted parts of a long document and a question, create a final answer with references (\"SOURCES\"). \\nIf y...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": " Alan Turing was a brilliant mathematician and cryptographer who became the founder of modern-day computer science and artificia..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 107, - "langchain.tokens.prompt_tokens": 2889, - "langchain.tokens.total_cost": 0.05992, - "langchain.tokens.total_tokens": 2996 - }, - "duration": 3310781, - "start": 1694032468395951381 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_similarity_search.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_similarity_search.json index e2707a9ea5b..04022afed1f 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_similarity_search.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_pinecone_vectorstore_similarity_search.json @@ -2,7 +2,7 @@ { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.vectorstores.pinecone.Pinecone", + "resource": "langchain_pinecone.vectorstores.PineconeVectorStore", "trace_id": 0, "span_id": 1, "parent_id": 0, @@ -10,13 +10,10 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "654a694400000000", - "langchain.request.api_key": "...key>", + "_dd.p.tid": "679bca4900000000", + "langchain.request.api_key": "", "langchain.request.k": "1", - "langchain.request.pinecone.environment": "", - "langchain.request.pinecone.index_name": "langchain-retrieval", - "langchain.request.pinecone.project_name": "74ce8fe", - "langchain.request.provider": "pinecone", + "langchain.request.provider": "pineconevectorstore", "langchain.request.query": "Who was Alan Turing?", "langchain.request.type": "similarity_search", "langchain.response.document.0.metadata.chunk": "1.0", @@ -25,7 +22,7 @@ "langchain.response.document.0.metadata.wiki-id": "13", "langchain.response.document.0.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", "language": "python", - "runtime-id": "e3591036c91f49bfa00c0a77feefcb9b" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, @@ -33,22 +30,21 @@ "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, "langchain.response.document_count": 1, - "process_id": 10515 + "process_id": 82010 }, - "duration": 12926462, - "start": 1694032468335861335 + "duration": 2112000, + "start": 1738263113379347000 }, { "name": "langchain.request", "service": "tests.contrib.langchain", - "resource": "langchain.embeddings.openai.OpenAIEmbeddings", + "resource": "langchain_openai.embeddings.base.OpenAIEmbeddings", "trace_id": 0, "span_id": 2, "parent_id": 1, "type": "", "error": 0, "meta": { - "_dd.p.tid": "654a694400000000", "langchain.request.api_key": "...key>", "langchain.request.inputs.0.text": "Who was Alan Turing?", "langchain.request.model": "text-embedding-ada-002", @@ -60,6 +56,6 @@ "langchain.request.input_count": 1, "langchain.response.outputs.embedding_length": 1536 }, - "duration": 3701578, - "start": 1694032468336059072 + "duration": 43000, + "start": 1738263113379475000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_chain.json similarity index 89% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_chain.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_chain.json index adec02f3eee..d03f7bc4722 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_chain.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_chain.json @@ -10,23 +10,23 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66fc049a00000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.inputs.0.input": "how can langsmith help with testing?", "langchain.request.stream": "True", "langchain.request.type": "chain", "langchain.response.outputs": "Python is\\n\\nthe best!", "language": "python", - "runtime-id": "afbd64218eba449eb252c9dd82c75727" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 43442 + "process_id": 82010 }, - "duration": 7276000, - "start": 1727792282788378000 + "duration": 18877000, + "start": 1738263109393591000 }, { "name": "langchain.request", @@ -58,6 +58,6 @@ "metrics": { "_dd.measured": 1 }, - "duration": 4675000, - "start": 1727792282790857000 + "duration": 6074000, + "start": 1738263109406147000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_chat.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_chat.json similarity index 87% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_chat.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_chat.json index 7705ec0697e..0b4db6d1d29 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_chat.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_chat.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66fc049a00000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.api_key": "...key>", "langchain.request.messages.0.content": "how can langsmith help with testing?", "langchain.request.model": "gpt-3.5-turbo", @@ -25,15 +25,15 @@ "langchain.response.content": "Python is\\n\\nthe best!", "langchain.response.message_type": "AIMessage", "language": "python", - "runtime-id": "afbd64218eba449eb252c9dd82c75727" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 43442 + "process_id": 82010 }, - "duration": 33999000, - "start": 1727792282655302000 + "duration": 4712000, + "start": 1738263109587520000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_json_output_parser.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_json_output_parser.json similarity index 91% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_json_output_parser.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_json_output_parser.json index 6e763167ca7..2dc7611d537 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_json_output_parser.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_json_output_parser.json @@ -10,24 +10,24 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66fc049a00000000", + "_dd.p.tid": "679bca4500000000", "langchain.request.inputs.0": "content='You know everything about the world.'", "langchain.request.inputs.1": "content='output a list of the country france their population in JSON format. Use a dict with an outer key of \"countries\" which ...", "langchain.request.stream": "True", "langchain.request.type": "chain", "langchain.response.outputs": "{\"countries\": \"France is a country!\"}", "language": "python", - "runtime-id": "afbd64218eba449eb252c9dd82c75727" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 43442 + "process_id": 82010 }, - "duration": 13421000, - "start": 1727792282751749000 + "duration": 15748000, + "start": 1738263109069056000 }, { "name": "langchain.request", @@ -60,6 +60,6 @@ "metrics": { "_dd.measured": 1 }, - "duration": 9210000, - "start": 1727792282755690000 + "duration": 14195000, + "start": 1738263109070356000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_llm.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_llm.json similarity index 87% rename from tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_llm.json rename to tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_llm.json index 6a34bbed9fc..9f0e75b55f3 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_streamed_llm.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_streamed_llm.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "66fc049a00000000", + "_dd.p.tid": "679bca4600000000", "langchain.request.api_key": "...key>", "langchain.request.messages.0.content": "How do I write technical documentation?", "langchain.request.model": "gpt-3.5-turbo-instruct", @@ -26,15 +26,15 @@ "langchain.request.type": "llm", "langchain.response.content": "\\n\\nPython is cool!", "language": "python", - "runtime-id": "afbd64218eba449eb252c9dd82c75727" + "runtime-id": "a3a3f4530e0641dcb8e323c08c91c8ce" }, "metrics": { "_dd.measured": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 43442 + "process_id": 82010 }, - "duration": 7867000, - "start": 1727792282719000000 + "duration": 3698000, + "start": 1738263110128412000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_ai21_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_ai21_llm_sync.json deleted file mode 100644 index b23b73d1409..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_ai21_llm_sync.json +++ /dev/null @@ -1,57 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_community.llms.ai21.AI21", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66a4712d00000000", - "langchain.request.ai21.parameters.countPenalty.applyToEmojis": "True", - "langchain.request.ai21.parameters.countPenalty.applyToNumbers": "True", - "langchain.request.ai21.parameters.countPenalty.applyToPunctuations": "True", - "langchain.request.ai21.parameters.countPenalty.applyToStopwords": "True", - "langchain.request.ai21.parameters.countPenalty.applyToWhitespaces": "True", - "langchain.request.ai21.parameters.countPenalty.scale": "0", - "langchain.request.ai21.parameters.frequencyPenalty.applyToEmojis": "True", - "langchain.request.ai21.parameters.frequencyPenalty.applyToNumbers": "True", - "langchain.request.ai21.parameters.frequencyPenalty.applyToPunctuations": "True", - "langchain.request.ai21.parameters.frequencyPenalty.applyToStopwords": "True", - "langchain.request.ai21.parameters.frequencyPenalty.applyToWhitespaces": "True", - "langchain.request.ai21.parameters.frequencyPenalty.scale": "0", - "langchain.request.ai21.parameters.logitBias": "None", - "langchain.request.ai21.parameters.maxTokens": "256", - "langchain.request.ai21.parameters.minTokens": "0", - "langchain.request.ai21.parameters.model": "j2-jumbo-instruct", - "langchain.request.ai21.parameters.numResults": "1", - "langchain.request.ai21.parameters.presencePenalty.applyToEmojis": "True", - "langchain.request.ai21.parameters.presencePenalty.applyToNumbers": "True", - "langchain.request.ai21.parameters.presencePenalty.applyToPunctuations": "True", - "langchain.request.ai21.parameters.presencePenalty.applyToStopwords": "True", - "langchain.request.ai21.parameters.presencePenalty.applyToWhitespaces": "True", - "langchain.request.ai21.parameters.presencePenalty.scale": "0", - "langchain.request.ai21.parameters.temperature": "0.7", - "langchain.request.ai21.parameters.topP": "1.0", - "langchain.request.api_key": "...key>", - "langchain.request.model": "j2-jumbo-instruct", - "langchain.request.prompts.0": "Why does everyone in Bikini Bottom hate Plankton?", - "langchain.request.provider": "ai21", - "langchain.request.type": "llm", - "langchain.response.completions.0.text": "\\nPlankton is trying to steal the Krabby Patty secret formula from Mr. Krabs, so Mr. Krabs wants him gone.", - "language": "python", - "runtime-id": "ebef68ede30342bab185e0fba7035c8e" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 88600 - }, - "duration": 6954000, - "start": 1722052909315503000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_chain_invoke.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_chain_invoke.json deleted file mode 100644 index b8e1c37819a..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_chain_invoke.json +++ /dev/null @@ -1,73 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66a475c300000000", - "langchain.request.inputs.base": "two", - "langchain.request.prompt": "what is {base} raised to the fifty-fourth power?", - "langchain.request.type": "chain", - "langchain.response.outputs.base": "two", - "langchain.response.outputs.text": "```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n", - "language": "python", - "runtime-id": "144e1ba699e547e5804fbae9c8b7c635" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221, - "process_id": 93816 - }, - "duration": 45582000, - "start": 1722054083557749000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.logprobs": "None", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.seed": "None", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "what is two raised to the fifty-fourth power?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221 - }, - "duration": 40460000, - "start": 1722054083562715000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_cohere_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_cohere_llm_sync.json deleted file mode 100644 index 4abd4ac9c43..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_cohere_llm_sync.json +++ /dev/null @@ -1,31 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_cohere.llms.Cohere", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615ac1600000000", - "langchain.request.api_key": "...key>", - "langchain.request.prompts.0": "What is the secret Krabby Patty recipe?", - "langchain.request.provider": "cohere", - "langchain.request.type": "llm", - "langchain.response.completions.0.text": " The secret Krabby Patty recipe has been kept under strict security measures and has never been publicly revealed. While there i...", - "language": "python", - "runtime-id": "2304ee41d4dc442c862ba4160e934dcd" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 74685 - }, - "duration": 2543000, - "start": 1712696342073636000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_document.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_document.json deleted file mode 100644 index b0ba4091fa4..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_document.json +++ /dev/null @@ -1,34 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_community.embeddings.fake.FakeEmbeddings", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615ac1c00000000", - "langchain.request.api_key": "", - "langchain.request.inputs.0.text": "foo", - "langchain.request.inputs.1.text": "bar", - "langchain.request.provider": "fake", - "langchain.request.type": "embedding", - "language": "python", - "runtime-id": "2304ee41d4dc442c862ba4160e934dcd" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.request.input_count": 2, - "langchain.response.outputs.0.embedding_length": 99, - "langchain.response.outputs.1.embedding_length": 99, - "process_id": 74685 - }, - "duration": 111000, - "start": 1712696348763298000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_query.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_query.json deleted file mode 100644 index 95fa195d2ea..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_fake_embedding_query.json +++ /dev/null @@ -1,32 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_community.embeddings.fake.FakeEmbeddings", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615ac1900000000", - "langchain.request.api_key": "", - "langchain.request.inputs.0.text": "foo", - "langchain.request.provider": "fake", - "langchain.request.type": "embedding", - "language": "python", - "runtime-id": "2304ee41d4dc442c862ba4160e934dcd" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.request.input_count": 1, - "langchain.response.outputs.embedding_length": 99, - "process_id": 74685 - }, - "duration": 87000, - "start": 1712696345494470000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_huggingfacehub_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_huggingfacehub_llm_sync.json deleted file mode 100644 index 43a52f7f154..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_huggingfacehub_llm_sync.json +++ /dev/null @@ -1,36 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_community.llms.huggingface_endpoint.HuggingFaceEndpoint", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafd500000000", - "langchain.request.api_key": "", - "langchain.request.huggingface_endpoint.parameters.endpoint_url": "None", - "langchain.request.huggingface_endpoint.parameters.model_kwargs.huggingface_api_token": "", - "langchain.request.huggingface_endpoint.parameters.model_kwargs.max_length": "256", - "langchain.request.huggingface_endpoint.parameters.task": "None", - "langchain.request.model": "google/flan-t5-xxl", - "langchain.request.prompts.0": "Why does Mr. Krabs have a whale daughter?", - "langchain.request.provider": "huggingface_endpoint", - "langchain.request.type": "llm", - "langchain.response.completions.0.text": "she is a mermaid", - "language": "python", - "runtime-id": "9f52b7e016c04b4a994ec1df509018a4" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 88379 - }, - "duration": 5092000, - "start": 1709944789391747000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcecl_chain_non_dict_input.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcecl_chain_non_dict_input.json deleted file mode 100644 index 2a25652e285..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcecl_chain_non_dict_input.json +++ /dev/null @@ -1,29 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_core.runnables.base.RunnableSequence", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "668bfb9100000000", - "langchain.request.inputs.0": "1", - "langchain.request.type": "chain", - "langchain.response.outputs.0": "4", - "language": "python", - "runtime-id": "f7e2ec0951f9471e8fd2857fbeb4ee5f" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 59445 - }, - "duration": 6687000, - "start": 1720449937260976000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_311.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_311.json deleted file mode 100644 index 5ff0e2d7bd8..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_311.json +++ /dev/null @@ -1,103 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_core.runnables.base.RunnableSequence", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6619490700000000", - "langchain.request.inputs.0": "chickens", - "langchain.request.inputs.1": "pigs", - "langchain.request.type": "chain", - "langchain.response.outputs.0": "Why did the chicken join a band? Because it had the drumsticks!", - "langchain.response.outputs.1": "Why did the pig go to the casino?\\n\\nTo bring home the bacon!", - "language": "python", - "runtime-id": "43a1417abf3441ff9235f239d8b721fa" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 30, - "langchain.tokens.prompt_tokens": 28, - "langchain.tokens.total_cost": 0.00010200000000000001, - "langchain.tokens.total_tokens": 58, - "process_id": 60120 - }, - "duration": 45649000, - "start": 1712933127875287000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.chat_models.base.ChatOpenAI", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "Tell me a short joke about chickens", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Why did the chicken join a band? Because it had the drumsticks!", - "langchain.response.completions.0.0.message_type": "AIMessage" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 15, - "langchain.tokens.prompt_tokens": 14, - "langchain.tokens.total_cost": 5.1000000000000006e-05, - "langchain.tokens.total_tokens": 29 - }, - "duration": 32710000, - "start": 1712933127887160000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.chat_models.base.ChatOpenAI", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "Tell me a short joke about pigs", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Why did the pig go to the casino?\\n\\nTo bring home the bacon!", - "langchain.response.completions.0.0.message_type": "AIMessage" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 15, - "langchain.tokens.prompt_tokens": 14, - "langchain.tokens.total_cost": 5.1000000000000006e-05, - "langchain.tokens.total_tokens": 29 - }, - "duration": 29429000, - "start": 1712933127888888000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_async.json deleted file mode 100644 index c43504bac7a..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_lcel_chain_batch_async.json +++ /dev/null @@ -1,103 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_core.runnables.base.RunnableSequence", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6619479f00000000", - "langchain.request.inputs.0": "chickens", - "langchain.request.inputs.1": "pigs", - "langchain.request.type": "chain", - "langchain.response.outputs.0": "Why did the chicken join a band? Because it had the drumsticks!", - "langchain.response.outputs.1": "Why did the pig go to the casino? To play the slop machines!", - "language": "python", - "runtime-id": "e4cadf206c5a42adb62bdc2bdd3dab2a" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 31, - "langchain.tokens.prompt_tokens": 28, - "langchain.tokens.total_cost": 0.00010400000000000001, - "langchain.tokens.total_tokens": 59, - "process_id": 38944 - }, - "duration": 44640000, - "start": 1712932767729190000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.chat_models.base.ChatOpenAI", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "Tell me a short joke about chickens", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Why did the chicken join a band? Because it had the drumsticks!", - "langchain.response.completions.0.0.message_type": "AIMessage" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 15, - "langchain.tokens.prompt_tokens": 14, - "langchain.tokens.total_cost": 5.1000000000000006e-05, - "langchain.tokens.total_tokens": 29 - }, - "duration": 28909000, - "start": 1712932767743545000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.chat_models.base.ChatOpenAI", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "Tell me a short joke about pigs", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "Why did the pig go to the casino? To play the slop machines!", - "langchain.response.completions.0.0.message_type": "AIMessage" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 16, - "langchain.tokens.prompt_tokens": 14, - "langchain.tokens.total_cost": 5.3e-05, - "langchain.tokens.total_tokens": 30 - }, - "duration": 28693000, - "start": 1712932767743912000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_call.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_call.json deleted file mode 100644 index a748cbecd51..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_async_call.json +++ /dev/null @@ -1,44 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.chat_models.base.ChatOpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6697185500000000", - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "When do you use 'whom' instead of 'who'?", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "'Whom' is used as the object of a verb or preposition, while 'who' is used as the subject of a verb. \\n\\nFor example:\\n- Whom di...", - "langchain.response.completions.0.0.message_type": "AIMessage", - "language": "python", - "runtime-id": "83d5f8c67690465e800659270e2abb1a" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 96, - "langchain.tokens.prompt_tokens": 20, - "langchain.tokens.total_cost": 0.000222, - "langchain.tokens.total_tokens": 116, - "process_id": 66487 - }, - "duration": 3206000, - "start": 1721178197691860000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_call_langchain_openai.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_call_langchain_openai.json deleted file mode 100644 index 269a94e6705..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_chat_model_sync_call_langchain_openai.json +++ /dev/null @@ -1,44 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.chat_models.base.ChatOpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6697185500000000", - "langchain.request.api_key": "...key>", - "langchain.request.messages.0.0.content": "When do you use 'whom' instead of 'who'?", - "langchain.request.messages.0.0.message_type": "HumanMessage", - "langchain.request.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model": "gpt-3.5-turbo", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.stream": "False", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.provider": "openai", - "langchain.request.type": "chat_model", - "langchain.response.completions.0.0.content": "'Who' is used as a subject pronoun, while 'whom' is used as an object pronoun. \\n\\nYou use 'who' when referring to the subject o...", - "langchain.response.completions.0.0.message_type": "AIMessage", - "language": "python", - "runtime-id": "83d5f8c67690465e800659270e2abb1a" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 83, - "langchain.tokens.prompt_tokens": 20, - "langchain.tokens.total_cost": 0.00019600000000000002, - "langchain.tokens.total_tokens": 103, - "process_id": 66487 - }, - "duration": 33649000, - "start": 1721178197485215000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_embedding_query.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_embedding_query.json deleted file mode 100644 index 924c715454f..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_embedding_query.json +++ /dev/null @@ -1,33 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.embeddings.base.OpenAIEmbeddings", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebc52600000000", - "langchain.request.api_key": "...key>", - "langchain.request.inputs.0.text": "this is a test query.", - "langchain.request.model": "text-embedding-ada-002", - "langchain.request.provider": "openai", - "langchain.request.type": "embedding", - "language": "python", - "runtime-id": "3f89ada65cff4ebeabeeeef1044c9cf8" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.request.input_count": 1, - "langchain.response.outputs.embedding_length": 1536, - "process_id": 8331 - }, - "duration": 2193000, - "start": 1709950246890259000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_integration.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_integration.json deleted file mode 100644 index 216e12124d0..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_integration.json +++ /dev/null @@ -1,86 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafd200000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "55f5396319d643488b2b7fe6f7069e14" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88474 - }, - "duration": 34394000, - "start": 1709944786908157000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.base_url": "https://api.openai.com/v1/", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "gpt-3.5-turbo-instruct", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "openai.response.created": "1709758080", - "openai.response.id": "cmpl-8zsTACzA7l5GniCRnYiNASkkEuVaO", - "openai.response.model": "gpt-3.5-turbo-instruct", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249727 - }, - "duration": 29336000, - "start": 1709944786912931000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_async.json deleted file mode 100644 index c82822de607..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_async.json +++ /dev/null @@ -1,45 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafd000000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Which team won the 2019 NBA finals?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nThe Toronto Raptors won the 2019 NBA Finals.", - "language": "python", - "runtime-id": "9f52b7e016c04b4a994ec1df509018a4" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 12, - "langchain.tokens.prompt_tokens": 10, - "langchain.tokens.total_cost": 3.9e-05, - "langchain.tokens.total_tokens": 22, - "process_id": 88379 - }, - "duration": 3411000, - "start": 1709944784958825000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_error.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_error.json deleted file mode 100644 index 31df1b37550..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_error.json +++ /dev/null @@ -1,42 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 1, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafd000000000", - "error.message": "Error code: 400 - {'error': {'message': 'Invalid token in prompt: 123456. Minimum value is 0, maximum value is 100257 (inclusive).', 'type': 'invalid_request_error', 'param': None, 'code': None}}", - "error.stack": "Traceback (most recent call last):\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/ddtrace/contrib/langchain/patch.py\", line 174, in traced_llm_generate\n completions = func(*args, **kwargs)\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/langchain_core/language_models/llms.py\", line 741, in generate\n output = self._generate_helper(\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/langchain_core/language_models/llms.py\", line 605, in _generate_helper\n raise e\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/langchain_core/language_models/llms.py\", line 592, in _generate_helper\n self._generate(\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/langchain_openai/llms/base.py\", line 356, in _generate\n response = self.client.create(prompt=_prompts, **params)\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/openai/_utils/_utils.py\", line 275, in wrapper\n return func(*args, **kwargs)\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/openai/resources/completions.py\", line 506, in create\n return self._post(\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 1200, in post\n return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls))\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 889, in request\n return self._request(\n File \"/Users/yun.kim/go/src/github.com/DataDog/dd-trace-py/.riot/venv_py3105_89644d2be2d95c1/lib/python3.10/site-packages/openai/_base_client.py\", line 980, in _request\n raise self._make_status_error_from_response(err.response) from None\nopenai.BadRequestError: Error code: 400 - {'error': {'message': 'Invalid token in prompt: 123456. Minimum value is 0, maximum value is 100257 (inclusive).', 'type': 'invalid_request_error', 'param': None, 'code': None}}\n", - "error.type": "openai.BadRequestError", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "12345", - "langchain.request.prompts.1": "123456", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "language": "python", - "runtime-id": "9f52b7e016c04b4a994ec1df509018a4" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 88379 - }, - "duration": 4726000, - "start": 1709944784987818000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync.json deleted file mode 100644 index 1460467119b..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync.json +++ /dev/null @@ -1,45 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafc800000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "9f52b7e016c04b4a994ec1df509018a4" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88379 - }, - "duration": 3941000, - "start": 1709944776407362000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync_multiple_prompts.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync_multiple_prompts.json deleted file mode 100644 index 317a7ab5f21..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_llm_sync_multiple_prompts.json +++ /dev/null @@ -1,51 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66a474a100000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.logprobs": "None", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.seed": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "What is the best way to teach a baby multiple languages?", - "langchain.request.prompts.1": "How many times has Spongebob failed his road test?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\n1. Start early: It is easier for babies to learn multiple languages when exposed to them from a young age. Babies are born w...", - "langchain.response.completions.1.finish_reason": "stop", - "langchain.response.completions.1.logprobs": "None", - "langchain.response.completions.1.text": "\\n\\nSpongebob has failed his road test at least 26 times.", - "language": "python", - "runtime-id": "5449602048d14453bb66e1ca558d34cd" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 271, - "langchain.tokens.prompt_tokens": 23, - "langchain.tokens.total_cost": 0.0005765000000000001, - "langchain.tokens.total_tokens": 294, - "process_id": 92624 - }, - "duration": 84649000, - "start": 1722053793376634000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain.json deleted file mode 100644 index 666916702e0..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain.json +++ /dev/null @@ -1,99 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm_math.base.LLMMathChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615ac1600000000", - "langchain.request.inputs.question": "what is two raised to the fifty-fourth power?", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.answer": "Answer: 18014398509481984", - "langchain.response.outputs.question": "what is two raised to the fifty-fourth power?", - "language": "python", - "runtime-id": "2304ee41d4dc442c862ba4160e934dcd" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221, - "process_id": 74685 - }, - "duration": 4994000, - "start": 1712696342123503000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.question": "what is two raised to the fifty-fourth power?", - "langchain.request.inputs.stop": "['```output']", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.question": "what is two raised to the fifty-fourth power?", - "langchain.response.outputs.stop": "['```output']", - "langchain.response.outputs.text": "```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221 - }, - "duration": 4094000, - "start": 1712696342124144000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221 - }, - "duration": 3366000, - "start": 1712696342124822000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain_async.json deleted file mode 100644 index 76129c4bc3e..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_math_chain_async.json +++ /dev/null @@ -1,99 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm_math.base.LLMMathChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafd000000000", - "langchain.request.inputs.question": "what is two raised to the fifty-fourth power?", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.answer": "Answer: 18014398509481984", - "langchain.response.outputs.question": "what is two raised to the fifty-fourth power?", - "language": "python", - "runtime-id": "9f52b7e016c04b4a994ec1df509018a4" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221, - "process_id": 88379 - }, - "duration": 6797000, - "start": 1709944784906069000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.question": "what is two raised to the fifty-fourth power?", - "langchain.request.inputs.stop": "['```output']", - "langchain.request.prompt": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.type": "chain", - "langchain.response.outputs.question": "what is two raised to the fifty-fourth power?", - "langchain.response.outputs.stop": "['```output']", - "langchain.response.outputs.text": "```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221 - }, - "duration": 5680000, - "start": 1709944784906848000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 3, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.0", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Translate a math problem into a expression that can be executed using Python's numexpr library. Use the output of running this c...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "```text\\n2**54\\n```\\n...numexpr.evaluate(\"2**54\")...\\n" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 19, - "langchain.tokens.prompt_tokens": 202, - "langchain.tokens.total_cost": 0.00034100000000000005, - "langchain.tokens.total_tokens": 221 - }, - "duration": 4887000, - "start": 1709944784907511000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain.json deleted file mode 100644 index 9ed77b47f8a..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain.json +++ /dev/null @@ -1,122 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.sequential.SequentialChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66a4745800000000", - "langchain.request.inputs.style": "a 90s rapper", - "langchain.request.inputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nYo, with chains we can link up different parts\\nMake one dope app, ain't gotta stress or start\\nJust take user input, use a fl...", - "langchain.response.outputs.style": "a 90s rapper", - "langchain.response.outputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "language": "python", - "runtime-id": "ab9b351e5eb84487ac4fa512809e727b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 69, - "langchain.tokens.prompt_tokens": 96, - "langchain.tokens.total_cost": 0.000282, - "langchain.tokens.total_tokens": 165, - "process_id": 91692 - }, - "duration": 6802000, - "start": 1722053720187171000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.transform.TransformChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.style": "a 90s rapper", - "langchain.request.inputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "langchain.request.type": "chain", - "langchain.response.outputs.output_text": "\\n Chains allow us to combine multiple\\n components together to create a single, coherent application.\\n For example, we can cre..." - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 946000, - "start": 1722053720188250000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.output_text": "\\n Chains allow us to combine multiple\\n components together to create a single, coherent application.\\n For example, we can cre...", - "langchain.request.inputs.style": "a 90s rapper", - "langchain.request.inputs.text": "\\n Chains allow us to combine multiple\\n\\n\\n components together to create a single, coherent application.\\n\\n ...", - "langchain.request.prompt": "Paraphrase this text:\\n\\n {output_text}\\n\\n In the style of a {style}.\\n\\n Paraphrase: ", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\nYo, with chains we can link up different parts\\nMake one dope app, ain't gotta stress or start\\nJust take user input, use a fl..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 69, - "langchain.tokens.prompt_tokens": 96, - "langchain.tokens.total_cost": 0.000282, - "langchain.tokens.total_tokens": 165 - }, - "duration": 4586000, - "start": 1722053720189351000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 4, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.logprobs": "None", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.seed": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Paraphrase this text:\\n\\n \\n Chains allow us to combine multiple\\n components together to create a single, coherent appli...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nYo, with chains we can link up different parts\\nMake one dope app, ain't gotta stress or start\\nJust take user input, use a fl..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 69, - "langchain.tokens.prompt_tokens": 96, - "langchain.tokens.total_cost": 0.000282, - "langchain.tokens.total_tokens": 165 - }, - "duration": 2846000, - "start": 1722053720191037000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_async.json deleted file mode 100644 index 77d4bba6755..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_async.json +++ /dev/null @@ -1,157 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.sequential.SequentialChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "6615ac1d00000000", - "langchain.request.inputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\n\\nI have convinced myself that nothing is real,\\nNo sky, no earth, no minds, no bodies to feel.\\nBut does this mean I don't ex...", - "langchain.response.outputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "language": "python", - "runtime-id": "2304ee41d4dc442c862ba4160e934dcd" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 222, - "langchain.tokens.prompt_tokens": 313, - "langchain.tokens.total_cost": 0.0009135, - "langchain.tokens.total_tokens": 535, - "process_id": 74685 - }, - "duration": 8267000, - "start": 1712696349088487000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "langchain.request.prompt": "Paraphrase this text:\\n\\n {input_text}\\n\\n Paraphrase: ", - "langchain.request.type": "chain", - "langchain.response.outputs.paraphrased_output": "\\nI have convinced myself that nothing truly exists in the world - no sky, no earth, no minds, no bodies. But does this mean tha..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 125, - "langchain.tokens.prompt_tokens": 178, - "langchain.tokens.total_cost": 0.000517, - "langchain.tokens.total_tokens": 303 - }, - "duration": 3971000, - "start": 1712696349089086000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 4, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Paraphrase this text:\\n\\n \\n I have convinced myself that there is absolutely nothing in the world, no sky, no...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nI have convinced myself that nothing truly exists in the world - no sky, no earth, no minds, no bodies. But does this mean tha..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 125, - "langchain.tokens.prompt_tokens": 178, - "langchain.tokens.total_cost": 0.000517, - "langchain.tokens.total_tokens": 303 - }, - "duration": 3246000, - "start": 1712696349089699000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "langchain.request.inputs.paraphrased_output": "\\nI have convinced myself that nothing truly exists in the world - no sky, no earth, no minds, no bodies. But does this mean tha...", - "langchain.request.prompt": "Make this text rhyme:\\n\\n {paraphrased_output}\\n\\n Rhyme: ", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\n\\nI have convinced myself that nothing is real,\\nNo sky, no earth, no minds, no bodies to feel.\\nBut does this mean I don't ex..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 97, - "langchain.tokens.prompt_tokens": 135, - "langchain.tokens.total_cost": 0.00039650000000000004, - "langchain.tokens.total_tokens": 232 - }, - "duration": 3536000, - "start": 1712696349093132000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 5, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Make this text rhyme:\\n\\n \\nI have convinced myself that nothing truly exists in the world - no sky, no earth, no minds, ...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nI have convinced myself that nothing is real,\\nNo sky, no earth, no minds, no bodies to feel.\\nBut does this mean I don't ex..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 97, - "langchain.tokens.prompt_tokens": 135, - "langchain.tokens.total_cost": 0.00039650000000000004, - "langchain.tokens.total_tokens": 232 - }, - "duration": 2778000, - "start": 1712696349093791000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_sync.json deleted file mode 100644 index ba77f275645..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_sequential_chain_with_multiple_llm_sync.json +++ /dev/null @@ -1,161 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.sequential.SequentialChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66a46f3f00000000", - "langchain.request.inputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\n\\nI have convinced myself of a doubt,\\nNo sky, no earth, no minds about.\\nBut do I too not exist,\\nIf I can convince and persi...", - "langchain.response.outputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "language": "python", - "runtime-id": "3e68466b79dc42bfbd6a9a94ad137dd1" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 224, - "langchain.tokens.prompt_tokens": 313, - "langchain.tokens.total_cost": 0.0009175, - "langchain.tokens.total_tokens": 537, - "process_id": 86811 - }, - "duration": 47637000, - "start": 1722052415125592000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "langchain.request.prompt": "Paraphrase this text:\\n\\n {input_text}\\n\\n Paraphrase: ", - "langchain.request.type": "chain", - "langchain.response.outputs.paraphrased_output": "\\nI have convinced myself that there is nothing in existence, no sky, no earth, no minds, no bodies. But does this mean that I, ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 125, - "langchain.tokens.prompt_tokens": 178, - "langchain.tokens.total_cost": 0.000517, - "langchain.tokens.total_tokens": 303 - }, - "duration": 39593000, - "start": 1722052415128704000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 4, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.logprobs": "None", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.seed": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Paraphrase this text:\\n\\n \\n I have convinced myself that there is absolutely nothing in the world, no sky, no...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\nI have convinced myself that there is nothing in existence, no sky, no earth, no minds, no bodies. But does this mean that I, ..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 125, - "langchain.tokens.prompt_tokens": 178, - "langchain.tokens.total_cost": 0.000517, - "langchain.tokens.total_tokens": 303 - }, - "duration": 35391000, - "start": 1722052415132759000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_text": "\\n I have convinced myself that there is absolutely nothing in the world, no sky, no earth, no minds, no\\n ...", - "langchain.request.inputs.paraphrased_output": "\\nI have convinced myself that there is nothing in existence, no sky, no earth, no minds, no bodies. But does this mean that I, ...", - "langchain.request.prompt": "Make this text rhyme:\\n\\n {paraphrased_output}\\n\\n Rhyme: ", - "langchain.request.type": "chain", - "langchain.response.outputs.final_output": "\\n\\nI have convinced myself of a doubt,\\nNo sky, no earth, no minds about.\\nBut do I too not exist,\\nIf I can convince and persi..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 99, - "langchain.tokens.prompt_tokens": 135, - "langchain.tokens.total_cost": 0.00040050000000000003, - "langchain.tokens.total_tokens": 234 - }, - "duration": 4744000, - "start": 1722052415168446000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 5, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.logprobs": "None", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.seed": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Make this text rhyme:\\n\\n \\nI have convinced myself that there is nothing in existence, no sky, no earth, no minds, no bo...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nI have convinced myself of a doubt,\\nNo sky, no earth, no minds about.\\nBut do I too not exist,\\nIf I can convince and persi..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 99, - "langchain.tokens.prompt_tokens": 135, - "langchain.tokens.total_cost": 0.00040050000000000003, - "langchain.tokens.total_tokens": 234 - }, - "duration": 2763000, - "start": 1722052415170375000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-None].json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-None].json deleted file mode 100644 index 5f5b96687de..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-None].json +++ /dev/null @@ -1,86 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafd700000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "622aedb612674284be354e91bfbb454b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88492 - }, - "duration": 34262000, - "start": 1709944791148865000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.base_url": "https://api.openai.com/v1/", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "gpt-3.5-turbo-instruct", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "openai.response.created": "1709758080", - "openai.response.id": "cmpl-8zsTACzA7l5GniCRnYiNASkkEuVaO", - "openai.response.model": "gpt-3.5-turbo-instruct", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249727 - }, - "duration": 29601000, - "start": 1709944791153211000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v0].json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v0].json deleted file mode 100644 index fa19c5f7a95..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v0].json +++ /dev/null @@ -1,86 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafbe00000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "1410174787814a83860b054266161682" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88392 - }, - "duration": 32625000, - "start": 1709944766438339000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.base_url": "https://api.openai.com/v1/", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "gpt-3.5-turbo-instruct", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "openai.response.created": "1709758080", - "openai.response.id": "cmpl-8zsTACzA7l5GniCRnYiNASkkEuVaO", - "openai.response.model": "gpt-3.5-turbo-instruct", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249727 - }, - "duration": 28037000, - "start": 1709944766442657000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v1].json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v1].json deleted file mode 100644 index d8d70bc7b4a..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[None-v1].json +++ /dev/null @@ -1,86 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "ddtrace_subprocess_dir", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafc600000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "bafc5fae2c2e4b139534dc3bb267c633" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88416 - }, - "duration": 32928000, - "start": 1709944774087954000 - }, - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.base_url": "https://api.openai.com/v1/", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "gpt-3.5-turbo-instruct", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "openai.response.created": "1709758080", - "openai.response.id": "cmpl-8zsTACzA7l5GniCRnYiNASkkEuVaO", - "openai.response.model": "gpt-3.5-turbo-instruct", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249727 - }, - "duration": 28301000, - "start": 1709944774092276000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-None].json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-None].json deleted file mode 100644 index 111508ee688..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-None].json +++ /dev/null @@ -1,86 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "mysvc", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafce00000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "44b11a5f85ff4e0b92446a7c261fa27e" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88457 - }, - "duration": 35753000, - "start": 1709944782793188000 - }, - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.base_url": "https://api.openai.com/v1/", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "gpt-3.5-turbo-instruct", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "openai.response.created": "1709758080", - "openai.response.id": "cmpl-8zsTACzA7l5GniCRnYiNASkkEuVaO", - "openai.response.model": "gpt-3.5-turbo-instruct", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249727 - }, - "duration": 30863000, - "start": 1709944782797702000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v0].json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v0].json deleted file mode 100644 index 7d8a71a3838..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v0].json +++ /dev/null @@ -1,86 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "mysvc", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafca00000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "8affdb4f2ea94e38a6c9d4952834d98c" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88439 - }, - "duration": 32856000, - "start": 1709944778768469000 - }, - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.base_url": "https://api.openai.com/v1/", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "gpt-3.5-turbo-instruct", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "openai.response.created": "1709758080", - "openai.response.id": "cmpl-8zsTACzA7l5GniCRnYiNASkkEuVaO", - "openai.response.model": "gpt-3.5-turbo-instruct", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249727 - }, - "duration": 28363000, - "start": 1709944778772664000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v1].json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v1].json deleted file mode 100644 index d6bec0192e0..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_openai_service_name[mysvc-v1].json +++ /dev/null @@ -1,86 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "mysvc", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebafc200000000", - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "length", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "language": "python", - "runtime-id": "6326fdbe8bcc456d973700e07717fe4b" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 256, - "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, - "langchain.tokens.total_tokens": 273, - "process_id": 88400 - }, - "duration": 33407000, - "start": 1709944770257882000 - }, - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "component": "openai", - "openai.base_url": "https://api.openai.com/v1/", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.frequency_penalty": "0", - "openai.request.max_tokens": "256", - "openai.request.method": "POST", - "openai.request.model": "gpt-3.5-turbo-instruct", - "openai.request.n": "1", - "openai.request.presence_penalty": "0", - "openai.request.prompt.0": "Can you explain what Descartes meant by 'I think, therefore I am'?", - "openai.request.temperature": "0.7", - "openai.request.top_p": "1", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": "\\n\\nDescartes, a 17th-century French philosopher, is known for his famous statement \"Cogito, ergo sum\" which is often translated...", - "openai.response.created": "1709758080", - "openai.response.id": "cmpl-8zsTACzA7l5GniCRnYiNASkkEuVaO", - "openai.response.model": "gpt-3.5-turbo-instruct", - "openai.user.api_key": "sk-...key>" - }, - "metrics": { - "_dd.measured": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249727 - }, - "duration": 28455000, - "start": 1709944770262493000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_retrieval_chain.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_retrieval_chain.json deleted file mode 100644 index e7aa94842af..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_retrieval_chain.json +++ /dev/null @@ -1,176 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.qa_with_sources.retrieval.RetrievalQAWithSourcesChain", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "66a52f1b00000000", - "langchain.request.inputs.question": "What did the president say about Ketanji Brown Jackson?", - "langchain.request.type": "chain", - "langchain.response.outputs.answer": " The president nominated Circuit Court of Appeals Judge Ketanji Brown Jackson to serve on the United States Supreme Court.\\n", - "langchain.response.outputs.question": "What did the president say about Ketanji Brown Jackson?", - "langchain.response.outputs.sources": "https://www.whitehouse.gov/briefing-room/speeches-remarks/2021/10/28/remarks-by-president-biden-on-nominating-judges/", - "language": "python", - "runtime-id": "02780e93cd304f8486f5958b27d15a94" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.tokens.completion_tokens": 61, - "langchain.tokens.prompt_tokens": 1542, - "langchain.tokens.total_cost": 0.002435, - "langchain.tokens.total_tokens": 1603, - "process_id": 49015 - }, - "duration": 57052000, - "start": 1722101531310397000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_pinecone.vectorstores.PineconeVectorStore", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "", - "langchain.request.provider": "pineconevectorstore", - "langchain.request.query": "What did the president say about Ketanji Brown Jackson?", - "langchain.request.type": "similarity_search", - "langchain.response.document.0.metadata.source": "https://www.whitehouse.gov/state-of-the-union-2024/", - "langchain.response.document.0.page_content": "\\n Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you\u2019re at..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.response.document_count": 1 - }, - "duration": 3282000, - "start": 1722101531313170000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.embeddings.base.OpenAIEmbeddings", - "trace_id": 0, - "span_id": 4, - "parent_id": 2, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.inputs.0.text": "What did the president say about Ketanji Brown Jackson?", - "langchain.request.model": "text-embedding-ada-002", - "langchain.request.provider": "openai", - "langchain.request.type": "embedding" - }, - "metrics": { - "_dd.measured": 1, - "langchain.request.input_count": 1, - "langchain.response.outputs.0.embedding_length": 1536 - }, - "duration": 40000, - "start": 1722101531313250000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.combine_documents.stuff.StuffDocumentsChain", - "trace_id": 0, - "span_id": 3, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.input_documents": "[Document(metadata={'source': 'https://www.whitehouse.gov/state-of-the-union-2024/'}, page_content='\\n Tonight. I call on the...", - "langchain.request.inputs.question": "What did the president say about Ketanji Brown Jackson?", - "langchain.request.type": "chain", - "langchain.response.outputs.input_documents": "[Document(metadata={'source': 'https://www.whitehouse.gov/state-of-the-union-2024/'}, page_content='\\n Tonight. I call on the...", - "langchain.response.outputs.output_text": " The president nominated Circuit Court of Appeals Judge Ketanji Brown Jackson to serve on the United States Supreme Court.\\nSOUR...", - "langchain.response.outputs.question": "What did the president say about Ketanji Brown Jackson?" - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 61, - "langchain.tokens.prompt_tokens": 1542, - "langchain.tokens.total_cost": 0.002435, - "langchain.tokens.total_tokens": 1603 - }, - "duration": 50718000, - "start": 1722101531316557000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain.chains.llm.LLMChain", - "trace_id": 0, - "span_id": 5, - "parent_id": 3, - "type": "", - "error": 0, - "meta": { - "langchain.request.inputs.question": "What did the president say about Ketanji Brown Jackson?", - "langchain.request.inputs.summaries": "Content: \\n Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while ...", - "langchain.request.prompt": "Given the following extracted parts of a long document and a question, create a final answer with references (\"SOURCES\"). \\nIf y...", - "langchain.request.type": "chain", - "langchain.response.outputs.question": "What did the president say about Ketanji Brown Jackson?", - "langchain.response.outputs.summaries": "Content: \\n Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while ...", - "langchain.response.outputs.text": " The president nominated Circuit Court of Appeals Judge Ketanji Brown Jackson to serve on the United States Supreme Court.\\nSOUR..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 61, - "langchain.tokens.prompt_tokens": 1542, - "langchain.tokens.total_cost": 0.002435, - "langchain.tokens.total_tokens": 1603 - }, - "duration": 49468000, - "start": 1722101531317721000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.llms.base.OpenAI", - "trace_id": 0, - "span_id": 6, - "parent_id": 5, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.model": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.frequency_penalty": "0", - "langchain.request.openai.parameters.logprobs": "None", - "langchain.request.openai.parameters.max_tokens": "256", - "langchain.request.openai.parameters.model_name": "gpt-3.5-turbo-instruct", - "langchain.request.openai.parameters.n": "1", - "langchain.request.openai.parameters.presence_penalty": "0", - "langchain.request.openai.parameters.seed": "None", - "langchain.request.openai.parameters.temperature": "0.7", - "langchain.request.openai.parameters.top_p": "1", - "langchain.request.prompts.0": "Given the following extracted parts of a long document and a question, create a final answer with references (\"SOURCES\"). \\nIf y...", - "langchain.request.provider": "openai", - "langchain.request.type": "llm", - "langchain.response.completions.0.finish_reason": "stop", - "langchain.response.completions.0.logprobs": "None", - "langchain.response.completions.0.text": " The president nominated Circuit Court of Appeals Judge Ketanji Brown Jackson to serve on the United States Supreme Court.\\nSOUR..." - }, - "metrics": { - "_dd.measured": 1, - "langchain.tokens.completion_tokens": 61, - "langchain.tokens.prompt_tokens": 1542, - "langchain.tokens.total_cost": 0.002435, - "langchain.tokens.total_tokens": 1603 - }, - "duration": 45899000, - "start": 1722101531321146000 - }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_similarity_search.json b/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_similarity_search.json deleted file mode 100644 index 22a66a8c0a7..00000000000 --- a/tests/snapshots/tests.contrib.langchain.test_langchain_community.test_pinecone_vectorstore_similarity_search.json +++ /dev/null @@ -1,61 +0,0 @@ -[[ - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_pinecone.vectorstores.PineconeVectorStore", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65ebc8f300000000", - "langchain.request.api_key": "", - "langchain.request.k": "1", - "langchain.request.provider": "pineconevectorstore", - "langchain.request.query": "Who was Alan Turing?", - "langchain.request.type": "similarity_search", - "langchain.response.document.0.metadata.chunk": "1.0", - "langchain.response.document.0.metadata.source": "https://simple.wikipedia.org/wiki/Alan%20Turing", - "langchain.response.document.0.metadata.title": "Alan Turing", - "langchain.response.document.0.metadata.wiki-id": "13", - "langchain.response.document.0.page_content": "A brilliant mathematician and cryptographer Alan was to become the founder of modern-day computer science and artificial intelli...", - "language": "python", - "runtime-id": "5c835d6b89de4230a8102c63db6e2205" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "langchain.response.document_count": 1, - "process_id": 11520 - }, - "duration": 4786000, - "start": 1709951219265302000 - }, - { - "name": "langchain.request", - "service": "tests.contrib.langchain", - "resource": "langchain_openai.embeddings.base.OpenAIEmbeddings", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "", - "error": 0, - "meta": { - "langchain.request.api_key": "...key>", - "langchain.request.inputs.0.text": "Who was Alan Turing?", - "langchain.request.model": "text-embedding-ada-002", - "langchain.request.provider": "openai", - "langchain.request.type": "embedding" - }, - "metrics": { - "_dd.measured": 1, - "langchain.request.input_count": 1, - "langchain.response.outputs.embedding_length": 1536 - }, - "duration": 2140000, - "start": 1709951219265424000 - }]] From 94a6d91bf68734a8cf6cc2a4e11ba88795600360 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Fri, 31 Jan 2025 16:06:03 +0100 Subject: [PATCH 26/63] chore(iast): update evidence redaction suite tests (#12114) - Update suite tests to the latest version https://github.com/DataDog/experimental/blob/main/teams/asm/iast/redaction/suite/evidence-redaction-suite.json. - Refactor the redaction class and add a default redaction for Code Injection. - Mark as "redacted" if the string is too long (partial implementation of this RFC https://docs.google.com/document/d/1cAsBBOusoAvU6wRMez2M5JXqTwUwG6tddmX4LsxSAyI/edit?tab=t.0. - Skip tests by description instead of list position to improve readability. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .../_evidence_redaction/_sensitive_handler.py | 10 +- .../default_sensitive_analyzer.py | 11 + ddtrace/appsec/_iast/_handlers.py | 1 + .../iast/taint_sinks/_taint_sinks_utils.py | 18 +- .../evidence-redaction-suite.json | 285 ++++++++++++++++-- .../test_code_injection_redacted.py | 48 +++ .../test_command_injection_redacted.py | 8 +- .../test_header_injection_redacted.py | 4 +- .../test_path_traversal_redacted.py | 43 +++ .../test_sql_injection_redacted.py | 14 +- .../iast/taint_sinks/test_ssrf_redacted.py | 6 +- 11 files changed, 400 insertions(+), 48 deletions(-) create mode 100644 ddtrace/appsec/_iast/_evidence_redaction/default_sensitive_analyzer.py create mode 100644 tests/appsec/iast/taint_sinks/test_code_injection_redacted.py diff --git a/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py b/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py index 545f578d878..a10455dee42 100644 --- a/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py +++ b/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py @@ -6,10 +6,12 @@ from .._utils import _get_source_index from ..constants import VULN_CMDI +from ..constants import VULN_CODE_INJECTION from ..constants import VULN_HEADER_INJECTION from ..constants import VULN_SQL_INJECTION from ..constants import VULN_SSRF from .command_injection_sensitive_analyzer import command_injection_sensitive_analyzer +from .default_sensitive_analyzer import default_sensitive_analyzer from .header_injection_sensitive_analyzer import header_injection_sensitive_analyzer from .sql_sensitive_analyzer import sql_sensitive_analyzer from .url_sensitive_analyzer import url_sensitive_analyzer @@ -19,6 +21,7 @@ REDACTED_SOURCE_BUFFER = string.ascii_letters + string.digits LEN_SOURCE_BUFFER = len(REDACTED_SOURCE_BUFFER) +VALUE_MAX_LENGHT = 45 def get_redacted_source(length): @@ -42,6 +45,7 @@ def __init__(self): VULN_SQL_INJECTION: sql_sensitive_analyzer, VULN_SSRF: url_sensitive_analyzer, VULN_HEADER_INJECTION: header_injection_sensitive_analyzer, + VULN_CODE_INJECTION: default_sensitive_analyzer, } @staticmethod @@ -288,7 +292,7 @@ def to_redacted_json(self, evidence_value, sensitive, tainted_ranges, sources): return {"redacted_value_parts": value_parts, "redacted_sources": redacted_sources} def redact_source(self, sources, redacted_sources, redacted_sources_context, source_index, start, end): - if source_index is not None: + if source_index is not None and source_index < len(sources): if not sources[source_index].redacted: redacted_sources.append(source_index) sources[source_index].pattern = get_redacted_source(len(sources[source_index].value)) @@ -303,8 +307,10 @@ def write_value_part(self, value_parts, value, source_index=None): if value: if source_index is not None: value_parts.append({"value": value, "source": source_index}) - else: + elif len(value) < VALUE_MAX_LENGHT: value_parts.append({"value": value}) + else: + value_parts.append({"redacted": True}) def write_redacted_value_part( self, diff --git a/ddtrace/appsec/_iast/_evidence_redaction/default_sensitive_analyzer.py b/ddtrace/appsec/_iast/_evidence_redaction/default_sensitive_analyzer.py new file mode 100644 index 00000000000..d2e29484528 --- /dev/null +++ b/ddtrace/appsec/_iast/_evidence_redaction/default_sensitive_analyzer.py @@ -0,0 +1,11 @@ +from ddtrace.internal.logger import get_logger + + +log = get_logger(__name__) + + +def default_sensitive_analyzer(evidence, name_pattern, value_pattern): + if name_pattern.search(evidence.value) or value_pattern.search(evidence.value): + return [{"start": 0, "end": len(evidence.value)}] + + return [] diff --git a/ddtrace/appsec/_iast/_handlers.py b/ddtrace/appsec/_iast/_handlers.py index 4d4628d910e..c3761451e99 100644 --- a/ddtrace/appsec/_iast/_handlers.py +++ b/ddtrace/appsec/_iast/_handlers.py @@ -153,6 +153,7 @@ def _on_django_patch(): functools.partial(if_iast_taint_returned_object_for, OriginType.PARAMETER), ) ) + # we instrument those sources on _on_django_func_wrapped _set_metric_iast_instrumented_source(OriginType.HEADER_NAME) _set_metric_iast_instrumented_source(OriginType.HEADER) diff --git a/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py b/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py index c089ac4c3dc..288b72d015c 100644 --- a/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py +++ b/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py @@ -17,6 +17,14 @@ def get_parametrize(vuln_type, ignore_list=None): data = json.loads(open(fixtures_filename).read()) idx = -1 for element in data["suite"]: + if element["description"] in ( + "$1 with query parameters or fragment", + "$1 - Tainted range based redaction - multiple ranges", + "Redacted source that needs to be truncated", + "Query with single quoted string literal and null source", + ): + continue + if element["type"] == "VULNERABILITIES": evidence_parameters = [ param for k, params in element.get("parameters", {}).items() for param in params if param == vuln_type @@ -46,13 +54,19 @@ def get_parametrize(vuln_type, ignore_list=None): if value_part.get("value"): value_part["value"] = value_part["value"].replace(replace, value) - yield evidence_input_copy, sources_expected, vulnerabilities_expected_copy + if all( + [ + bool(input_ranges["iinfo"].get("parameterName", {})) + for input_ranges in evidence_input_copy.get("ranges", {}) + ] + ): + yield evidence_input_copy, sources_expected, vulnerabilities_expected_copy, element else: idx += 1 if ignore_list and idx in ignore_list: continue - yield evidence_input[0], sources_expected, vulnerabilities_expected + yield evidence_input[0], sources_expected, vulnerabilities_expected, element def _taint_pyobject_multiranges(pyobject, elements): diff --git a/tests/appsec/iast/taint_sinks/redaction_fixtures/evidence-redaction-suite.json b/tests/appsec/iast/taint_sinks/redaction_fixtures/evidence-redaction-suite.json index 0719edb550a..1c41f7c1917 100644 --- a/tests/appsec/iast/taint_sinks/redaction_fixtures/evidence-redaction-suite.json +++ b/tests/appsec/iast/taint_sinks/redaction_fixtures/evidence-redaction-suite.json @@ -8,6 +8,7 @@ "$1": [ "access_key_id", "accessKeyId", + "address", "apikey", "api_key", "apiToken", @@ -21,8 +22,11 @@ "consumer_key", "consumerSecret", "consumer_secret", + "email", "expirationToken", "expiration_token", + "lastname", + "mail", "pass", "passwd", "password", @@ -43,7 +47,10 @@ "sign", "signature", "signed", - "token" + "surname", + "token", + "user", + "username" ] }, "input": [ @@ -70,7 +77,8 @@ "glpat-xxxxxxxxxxxxxxxxxxxx", "-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAkVDOAMenPclQ7z5U3i3QYw4lQuijEyxnEgTXkk88L20moFBU 4vJkSguvUXrGzNiH+WMWWWTAXBTDdtOHApQJSdU0P4lY+0P3Lw3WeZaetPm583ac DlaCk9DaqPQnjpZ/9DLqmx1r5JYAZbCiuXWMA0lzJUOOniwt94BWCnz3+0LbrC7j NsiaC7cRc1kmj/Nmu8ydA4eop44tJMlaXb9nnUIxglUm0yL1NDOTzokTP03Fa7JW t46gMo6co751nYm43MwOb/cY0Uh6+i59czXuCs0hFpWyEkQJDjcQNXgy9ctI0R/J nBbQykSJG8C0cB9nsfwbtuRIQVrgoj65erlXawIDAQABAoIBAByGkTnj93eQilu8 j6phsfOP9k6RHloIMF+AJdUpyrXApoF344H9dSR38L187YOOyfpxshRwS7aHuOsd kPY3my8sNCp4ysfgSqio/b42jAcYsqERWocSAmYD7LiX3SAHeSy1xgoXF3Py4jcU Go1vfsGybHEXNurj304jmkBK0d83rYdYFNa58jY+6fCrt7b7SdxcjImvRbx0ByvB O/igAQxHLYZAVM+9eD8kHRt6nFkdllGkdynMPx82RllpjyZvxBm8hXeRCXvT78Ja 9aOx6YZLND6iLinAh2J+zFKTtl+iX8DD+39DMFEgLjgKJB84phux1h/2PP8RS2tp 5TqWy7ECgYEA+A8HEKKFTaYD4GQaiD+L4gOh2ZcLykdG8IIXRxzCPtv5VWKS2SCz WWyFoVRlV4b6q96PJwdS/6skbbWS98HIg3aqhOVaXyGxZHlzRgopE3OfRiDcf/Xd bO+Y7phH6h+hMBWpAAojJ+lWzGkg2DewCY0NjkUdOrFAZZWWLrQqGGMCgYEAlfe+ S3gXGqVk3ZyS4f8TyWrkKfVaRVa2KT0GGBJ8TNOB7xlf0oVmKCKSGoWbY5znt2e2 OTb6/zL0qzm1R9pNw5tUE5k/cCReZ20TpcHExoc+1prvmoCO8ToYMfGPOTBpRKBo Hdtx4xjBVe9omP6c/U8jfMDUL+cEKgvvjHUXv1kCgYEApTo1RYJLcoYjTOLAvYI+ ZYRv2SSAKPNDME4mvSpNxFr3gEVRdSkP7X+YnvY9LojtDXAIQEHjqgLQF/d69mZw bgir2it+/6DMrRUskDmSVK+OJsMavG0DWV1aq4ppVGxPDF1RHYKjGiGVvEBGLV8i daornlkw9/g64a86ws8kvusCgYBvnRs7//zyD/aqGUYYfUe0uKFnuPueb5LTzl8i u19XrnMeCLyQakhFxrUGmDm2QakTj1TH8GuOU9ZVOXX6LDeERa6lh4D3bZn1T/E3 hKd3OmFCR73cN6IrVxl60lXOMoGmWdwjnJd+dYYu9yfZ9mXRAX1f9AP4Qu+Oe6Ol 3d/2wQKBgQCgdA48bkRGFR/OqcGACNVQFcXQYvSabKOZkg303NH7p4pD8Ng6FDW+ r8r8+M/iMF9q7XvcX5pF8zgGk/MfHOdf9wWv7Uih7CIQzJLEs+OzNqx//Jn1EuV4 GBudByVPLqUDB5nvcDxTTsDP+gPFQtQ1mAWB1r18s9x4OioqvoV/6Q== -----END RSA PRIVATE KEY-----", "-----BEGIN OPENSSH PRIVATE KEY----- MIIEpAIBAAKCAQEAkVDOAMenPclQ7z5U3i3QYw4lQuijEyxnEgTXkk88L20moFBU 4vJkSguvUXrGzNiH+WMWWWTAXBTDdtOHApQJSdU0P4lY+0P3Lw3WeZaetPm583ac DlaCk9DaqPQnjpZ/9DLqmx1r5JYAZbCiuXWMA0lzJUOOniwt94BWCnz3+0LbrC7j NsiaC7cRc1kmj/Nmu8ydA4eop44tJMlaXb9nnUIxglUm0yL1NDOTzokTP03Fa7JW t46gMo6co751nYm43MwOb/cY0Uh6+i59czXuCs0hFpWyEkQJDjcQNXgy9ctI0R/J nBbQykSJG8C0cB9nsfwbtuRIQVrgoj65erlXawIDAQABAoIBAByGkTnj93eQilu8 j6phsfOP9k6RHloIMF+AJdUpyrXApoF344H9dSR38L187YOOyfpxshRwS7aHuOsd kPY3my8sNCp4ysfgSqio/b42jAcYsqERWocSAmYD7LiX3SAHeSy1xgoXF3Py4jcU Go1vfsGybHEXNurj304jmkBK0d83rYdYFNa58jY+6fCrt7b7SdxcjImvRbx0ByvB O/igAQxHLYZAVM+9eD8kHRt6nFkdllGkdynMPx82RllpjyZvxBm8hXeRCXvT78Ja 9aOx6YZLND6iLinAh2J+zFKTtl+iX8DD+39DMFEgLjgKJB84phux1h/2PP8RS2tp 5TqWy7ECgYEA+A8HEKKFTaYD4GQaiD+L4gOh2ZcLykdG8IIXRxzCPtv5VWKS2SCz WWyFoVRlV4b6q96PJwdS/6skbbWS98HIg3aqhOVaXyGxZHlzRgopE3OfRiDcf/Xd bO+Y7phH6h+hMBWpAAojJ+lWzGkg2DewCY0NjkUdOrFAZZWWLrQqGGMCgYEAlfe+ S3gXGqVk3ZyS4f8TyWrkKfVaRVa2KT0GGBJ8TNOB7xlf0oVmKCKSGoWbY5znt2e2 OTb6/zL0qzm1R9pNw5tUE5k/cCReZ20TpcHExoc+1prvmoCO8ToYMfGPOTBpRKBo Hdtx4xjBVe9omP6c/U8jfMDUL+cEKgvvjHUXv1kCgYEApTo1RYJLcoYjTOLAvYI+ ZYRv2SSAKPNDME4mvSpNxFr3gEVRdSkP7X+YnvY9LojtDXAIQEHjqgLQF/d69mZw bgir2it+/6DMrRUskDmSVK+OJsMavG0DWV1aq4ppVGxPDF1RHYKjGiGVvEBGLV8i daornlkw9/g64a86ws8kvusCgYBvnRs7//zyD/aqGUYYfUe0uKFnuPueb5LTzl8i u19XrnMeCLyQakhFxrUGmDm2QakTj1TH8GuOU9ZVOXX6LDeERa6lh4D3bZn1T/E3 hKd3OmFCR73cN6IrVxl60lXOMoGmWdwjnJd+dYYu9yfZ9mXRAX1f9AP4Qu+Oe6Ol 3d/2wQKBgQCgdA48bkRGFR/OqcGACNVQFcXQYvSabKOZkg303NH7p4pD8Ng6FDW+ r8r8+M/iMF9q7XvcX5pF8zgGk/MfHOdf9wWv7Uih7CIQzJLEs+OzNqx//Jn1EuV4 GBudByVPLqUDB5nvcDxTTsDP+gPFQtQ1mAWB1r18s9x4OioqvoV/6Q== -----END OPENSSH PRIVATE KEY-----", - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRUM4Ax6c9yVDvPlTeLdBjDiVC6KMTLGcSBNeSTzwvbSagUFTi8mRKC69ResbM2If5YxZZZMBcFMN204cClAlJ1TQ/iVj7Q/cvDdZ5lp60+bnzdpwOVoKT0Nqo9CeOln/0MuqbHWvklgBlsKK5dYwDSXMlQ46eLC33gFYKfPf7QtusLuM2yJoLtxFzWSaP82a7zJ0Dh6inji0kyVpdv2edQjGCVSbTIvU0M5POiRM/TcVrsla3jqAyjpyjvnWdibjczA5v9xjRSHr6Ln1zNe4KzSEWlbISRAkONxA1eDL1y0jRH8mcFtDKRIkbwLRwH2ex/Bu25EhBWuCiPrl6uVdr" + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRUM4Ax6c9yVDvPlTeLdBjDiVC6KMTLGcSBNeSTzwvbSagUFTi8mRKC69ResbM2If5YxZZZMBcFMN204cClAlJ1TQ/iVj7Q/cvDdZ5lp60+bnzdpwOVoKT0Nqo9CeOln/0MuqbHWvklgBlsKK5dYwDSXMlQ46eLC33gFYKfPf7QtusLuM2yJoLtxFzWSaP82a7zJ0Dh6inji0kyVpdv2edQjGCVSbTIvU0M5POiRM/TcVrsla3jqAyjpyjvnWdibjczA5v9xjRSHr6Ln1zNe4KzSEWlbISRAkONxA1eDL1y0jRH8mcFtDKRIkbwLRwH2ex/Bu25EhBWuCiPrl6uVdr", + "mail@to.net" ] }, "input": [ @@ -299,6 +307,54 @@ ] } }, + { + "type": "VULNERABILITIES", + "description": "Query with single quoted string literal and null source", + "input": [ + { + "type": "SQL_INJECTION", + "evidence": { + "value": "select * from users where username = 'user'", + "ranges": [ + { + "start": 38, + "end": 42, + "iinfo": { + "type": "http.request.body" + } + } + ] + } + } + ], + "expected": { + "sources": [ + { + "origin": "http.request.body" + } + ], + "vulnerabilities": [ + { + "type": "SQL_INJECTION", + "evidence": { + "valueParts": [ + { + "value": "select * from users where username = '" + }, + { + "redacted": true, + "source": 0, + "pattern": "****" + }, + { + "value": "'" + } + ] + } + } + ] + } + }, { "type": "VULNERABILITIES", "description": "$1 query with double quoted string literal $2", @@ -2694,7 +2750,7 @@ "end": 47, "iinfo": { "type": "http.request.parameter", - "parameterName": "email", + "parameterName": "param", "parameterValue": "' OR TRUE --" } } @@ -2706,7 +2762,7 @@ "sources": [ { "origin": "http.request.parameter", - "name": "email", + "name": "param", "value": "' OR TRUE --" } ], @@ -2850,10 +2906,19 @@ }, { "type": "VULNERABILITIES", - "description": "Tainted range based redaction ", + "description": "$1 - Tainted range based redaction ", + "parameters": { + "$1": [ + "XSS", + "CODE_INJECTION", + "EMAIL_HTML_INJECTION", + "TEMPLATE_INJECTION", + "UNTRUSTED_DESERIALIZATION" + ] + }, "input": [ { - "type": "XSS", + "type": "$1", "evidence": { "value": "this could be a super long text, so we need to reduce it before send it to the backend. This redaction strategy applies to XSS vulnerability but can be extended to future ones", "ranges": [ @@ -2880,7 +2945,7 @@ ], "vulnerabilities": [ { - "type": "XSS", + "type": "$1", "evidence": { "valueParts": [ { @@ -2901,10 +2966,19 @@ }, { "type": "VULNERABILITIES", - "description": "Tainted range based redaction - with redactable source ", + "description": "$1 - Tainted range based redaction - with redactable source ", + "parameters": { + "$1": [ + "XSS", + "CODE_INJECTION", + "EMAIL_HTML_INJECTION", + "TEMPLATE_INJECTION", + "UNTRUSTED_DESERIALIZATION" + ] + }, "input": [ { - "type": "XSS", + "type": "$1", "evidence": { "value": "this could be a super long text, so we need to reduce it before send it to the backend. This redaction strategy applies to XSS vulnerability but can be extended to future ones", "ranges": [ @@ -2932,7 +3006,7 @@ ], "vulnerabilities": [ { - "type": "XSS", + "type": "$1", "evidence": { "valueParts": [ { @@ -2954,10 +3028,19 @@ }, { "type": "VULNERABILITIES", - "description": "Tainted range based redaction - with null source ", + "description": "$1 - Tainted range based redaction - with null source ", + "parameters": { + "$1": [ + "XSS", + "CODE_INJECTION", + "EMAIL_HTML_INJECTION", + "TEMPLATE_INJECTION", + "UNTRUSTED_DESERIALIZATION" + ] + }, "input": [ { - "type": "XSS", + "type": "$1", "evidence": { "value": "this could be a super long text, so we need to reduce it before send it to the backend. This redaction strategy applies to XSS vulnerability but can be extended to future ones", "ranges": [ @@ -2980,7 +3063,7 @@ ], "vulnerabilities": [ { - "type": "XSS", + "type": "$1", "evidence": { "valueParts": [ { @@ -3001,10 +3084,19 @@ }, { "type": "VULNERABILITIES", - "description": "Tainted range based redaction - multiple ranges", + "description": "$1 - Tainted range based redaction - multiple ranges", + "parameters": { + "$1": [ + "XSS", + "CODE_INJECTION", + "EMAIL_HTML_INJECTION", + "TEMPLATE_INJECTION", + "UNTRUSTED_DESERIALIZATION" + ] + }, "input": [ { - "type": "XSS", + "type": "$1", "evidence": { "value": "this could be a super long text, so we need to reduce it before send it to the backend. This redaction strategy applies to XSS vulnerability but can be extended to future ones", "ranges": [ @@ -3045,7 +3137,7 @@ ], "vulnerabilities": [ { - "type": "XSS", + "type": "$1", "evidence": { "valueParts": [ { @@ -3073,10 +3165,19 @@ }, { "type": "VULNERABILITIES", - "description": "Tainted range based redaction - first range at the beginning ", + "description": "$1 - Tainted range based redaction - first range at the beginning ", + "parameters": { + "$1": [ + "XSS", + "CODE_INJECTION", + "EMAIL_HTML_INJECTION", + "TEMPLATE_INJECTION", + "UNTRUSTED_DESERIALIZATION" + ] + }, "input": [ { - "type": "XSS", + "type": "$1", "evidence": { "value": "this could be a super long text, so we need to reduce it before send it to the backend. This redaction strategy applies to XSS vulnerability but can be extended to future ones", "ranges": [ @@ -3117,7 +3218,7 @@ ], "vulnerabilities": [ { - "type": "XSS", + "type": "$1", "evidence": { "valueParts": [ { @@ -3142,10 +3243,19 @@ }, { "type": "VULNERABILITIES", - "description": "Tainted range based redaction - last range at the end ", + "description": "$1 - Tainted range based redaction - last range at the end ", + "parameters": { + "$1": [ + "XSS", + "CODE_INJECTION", + "EMAIL_HTML_INJECTION", + "TEMPLATE_INJECTION", + "UNTRUSTED_DESERIALIZATION" + ] + }, "input": [ { - "type": "XSS", + "type": "$1", "evidence": { "value": "this could be a super long text, so we need to reduce it before send it to the backend. This redaction strategy applies to XSS", "ranges": [ @@ -3186,7 +3296,7 @@ ], "vulnerabilities": [ { - "type": "XSS", + "type": "$1", "evidence": { "valueParts": [ { @@ -3208,10 +3318,19 @@ }, { "type": "VULNERABILITIES", - "description": "Tainted range based redaction - whole text ", + "description": "$1 - Tainted range based redaction - whole text ", + "parameters": { + "$1": [ + "XSS", + "CODE_INJECTION", + "EMAIL_HTML_INJECTION", + "TEMPLATE_INJECTION", + "UNTRUSTED_DESERIALIZATION" + ] + }, "input": [ { - "type": "XSS", + "type": "$1", "evidence": { "value": "this could be a super long text, so we need to reduce it before send it to the backend. This redaction strategy applies to XSS", "ranges": [ @@ -3238,7 +3357,7 @@ ], "vulnerabilities": [ { - "type": "XSS", + "type": "$1", "evidence": { "valueParts": [ { @@ -3403,7 +3522,7 @@ "end": 4, "iinfo": { "type": "http.request.parameter", - "parameterName": "username", + "parameterName": "param", "parameterValue": "PREFIX_user" } } @@ -3415,7 +3534,7 @@ "end": 4, "iinfo": { "type": "http.request.parameter", - "parameterName": "username", + "parameterName": "param", "parameterValue": "PREFIX_user" } } @@ -3428,7 +3547,7 @@ "sources": [ { "origin": "http.request.parameter", - "name": "username", + "name": "param", "redacted": true, "pattern": "abcdefghijk" } @@ -3613,6 +3732,66 @@ ] } }, + { + "type": "VULNERABILITIES", + "description": "Redacted source that needs to be truncated", + "input": [ + { + "type": "SQL_INJECTION", + "evidence": { + "value": "select * from users where username = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Sed ut perspiciatis unde omnis iste natus error sit voluptatem ac'", + "ranges": [ + { + "start": 26, + "end": 549, + "iinfo": { + "type": "http.request.parameter", + "parameterName": "clause", + "parameterValue": "username = 'Lorem%20ipsum%20dolor%20sit%20amet,%20consectetur%20adipiscing%20elit,%20sed%20do%20eiusmod%20tempor%20incididunt%20ut%20labore%20et%20dolore%20magna%20aliqua.%20Ut%20enim%20ad%20minim%20veniam,%20quis%20nostrud%20exercitation%20ullamco%20laboris%20nisi%20ut%20aliquip%20ex%20ea%20commodo%20consequat.%20Duis%20aute%20irure%20dolor%20in%20reprehenderit%20in%20voluptate%20velit%20esse%20cillum%20dolore%20eu%20fugiat%20nulla%20pariatur.%20Excepteur%20sint%20occaecat%20cupidatat%20non%20proident,%20sunt%20in%20culpa%20qui%20officia%20deserunt%20mollit%20anim%20id%20est%20laborum.Sed%20ut%20perspiciatis%20unde%20omnis%20iste%20natus%20error%20sit%20voluptatem%20ac'" + } + } + ] + } + } + ], + "expected": { + "sources": [ + { + "origin": "http.request.parameter", + "name": "clause", + "redacted": true, + "pattern": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ab", + "truncated": "right" + } + ], + "vulnerabilities": [ + { + "type": "SQL_INJECTION", + "evidence": { + "valueParts": [ + { + "value": "select * from users where " + }, + { + "source": 0, + "value": "username = '" + }, + { + "source": 0, + "redacted": true, + "truncated": "right", + "pattern": "**********************************************************************************************************************************************************************************************************************************************************" + }, + { + "source": 0, + "value": "'" + } + ] + } + } + ] + } + }, { "type": "VULNERABILITIES", "description": "No redacted that needs to be truncated - whole text", @@ -4016,6 +4195,54 @@ } ] } + }, + { + "type": "VULNERABILITIES", + "description": "Hardcoded password with sensitive data in the variable name", + "input": [ + { + "type": "HARDCODED_PASSWORD", + "evidence": { + "value": "gho_apasswapasswapasswapasswapasswapassw" + } + } + ], + "expected": { + "vulnerabilities": [ + { + "type": "HARDCODED_PASSWORD", + "evidence": { + "valueParts": [ + { + "redacted": true + } + ] + } + } + ] + } + }, + { + "type": "VULNERABILITIES", + "description": "Hardcoded password without sensitive data in the variable name", + "input": [ + { + "type": "HARDCODED_PASSWORD", + "evidence": { + "value": "this_is_a_password" + } + } + ], + "expected": { + "vulnerabilities": [ + { + "type": "HARDCODED_PASSWORD", + "evidence": { + "value": "this_is_a_password" + } + } + ] + } } ] -} +} \ No newline at end of file diff --git a/tests/appsec/iast/taint_sinks/test_code_injection_redacted.py b/tests/appsec/iast/taint_sinks/test_code_injection_redacted.py new file mode 100644 index 00000000000..3d9890e04bb --- /dev/null +++ b/tests/appsec/iast/taint_sinks/test_code_injection_redacted.py @@ -0,0 +1,48 @@ +import pytest + +from ddtrace.appsec._iast._taint_tracking import origin_to_str +from ddtrace.appsec._iast._taint_tracking import str_to_origin +from ddtrace.appsec._iast.constants import VULN_CODE_INJECTION +from ddtrace.appsec._iast.taint_sinks.code_injection import CodeInjection +from tests.appsec.iast.taint_sinks._taint_sinks_utils import _taint_pyobject_multiranges +from tests.appsec.iast.taint_sinks._taint_sinks_utils import get_parametrize +from tests.appsec.iast.taint_sinks.conftest import _get_iast_data + + +# FIXME: ideally all these should pass, through the key is that we don't leak any potential PII +_ignore_list = {} + + +@pytest.mark.parametrize( + "evidence_input,sources_expected,vulnerabilities_expected,element", + list(get_parametrize(VULN_CODE_INJECTION, ignore_list=_ignore_list)), +) +def test_code_injection_redaction_suite( + evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults, element +): + tainted_object = evidence_input_value = evidence_input.get("value", "") + if evidence_input_value: + tainted_object = _taint_pyobject_multiranges( + evidence_input_value, + [ + ( + input_ranges["iinfo"]["parameterName"], + input_ranges["iinfo"]["parameterValue"], + str_to_origin(input_ranges["iinfo"]["type"]), + input_ranges["start"], + input_ranges["end"] - input_ranges["start"], + ) + for input_ranges in evidence_input.get("ranges", {}) + ], + ) + + CodeInjection.report(tainted_object) + + data = _get_iast_data() + vulnerability = list(data["vulnerabilities"])[0] + source = list(data["sources"])[0] + source["origin"] = origin_to_str(source["origin"]) + + assert vulnerability["type"] == VULN_CODE_INJECTION + assert vulnerability["evidence"] == vulnerabilities_expected["evidence"] + assert source == sources_expected diff --git a/tests/appsec/iast/taint_sinks/test_command_injection_redacted.py b/tests/appsec/iast/taint_sinks/test_command_injection_redacted.py index 4c25cda8dc2..e8bce5ba22d 100644 --- a/tests/appsec/iast/taint_sinks/test_command_injection_redacted.py +++ b/tests/appsec/iast/taint_sinks/test_command_injection_redacted.py @@ -16,8 +16,12 @@ from tests.appsec.iast.taint_sinks.conftest import _get_iast_data -@pytest.mark.parametrize("evidence_input, sources_expected, vulnerabilities_expected", list(get_parametrize(VULN_CMDI))) -def test_cmdi_redaction_suite(evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults): +@pytest.mark.parametrize( + "evidence_input,sources_expected,vulnerabilities_expected,element", list(get_parametrize(VULN_CMDI)) +) +def test_cmdi_redaction_suite( + evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults, element +): tainted_object = _taint_pyobject_multiranges( evidence_input["value"], [ diff --git a/tests/appsec/iast/taint_sinks/test_header_injection_redacted.py b/tests/appsec/iast/taint_sinks/test_header_injection_redacted.py index 61a3aa83a49..05eca6bf3db 100644 --- a/tests/appsec/iast/taint_sinks/test_header_injection_redacted.py +++ b/tests/appsec/iast/taint_sinks/test_header_injection_redacted.py @@ -92,11 +92,11 @@ def test_common_django_header_injection_redact(header_name, header_value, value_ @pytest.mark.parametrize( - "evidence_input, sources_expected, vulnerabilities_expected", + "evidence_input,sources_expected,vulnerabilities_expected,element", list(get_parametrize(VULN_HEADER_INJECTION)), ) def test_header_injection_redaction_suite( - evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults + evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults, element ): tainted_object = _taint_pyobject_multiranges( evidence_input["value"], diff --git a/tests/appsec/iast/taint_sinks/test_path_traversal_redacted.py b/tests/appsec/iast/taint_sinks/test_path_traversal_redacted.py index 996bc2ee356..75fa02802e4 100644 --- a/tests/appsec/iast/taint_sinks/test_path_traversal_redacted.py +++ b/tests/appsec/iast/taint_sinks/test_path_traversal_redacted.py @@ -4,12 +4,19 @@ import pytest from ddtrace.appsec._iast._taint_tracking import OriginType +from ddtrace.appsec._iast._taint_tracking import origin_to_str +from ddtrace.appsec._iast._taint_tracking import str_to_origin +from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject from ddtrace.appsec._iast.constants import VULN_PATH_TRAVERSAL from ddtrace.appsec._iast.reporter import Evidence from ddtrace.appsec._iast.reporter import IastSpanReporter from ddtrace.appsec._iast.reporter import Location from ddtrace.appsec._iast.reporter import Vulnerability +from ddtrace.appsec._iast.taint_sinks.path_traversal import PathTraversal +from tests.appsec.iast.taint_sinks._taint_sinks_utils import _taint_pyobject_multiranges +from tests.appsec.iast.taint_sinks._taint_sinks_utils import get_parametrize +from tests.appsec.iast.taint_sinks.conftest import _get_iast_data ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -124,3 +131,39 @@ def test_path_traversal_redact_abs_paths(iast_context_defaults): } ], } + + +@pytest.mark.parametrize( + "evidence_input,sources_expected,vulnerabilities_expected,element", + list(get_parametrize(VULN_PATH_TRAVERSAL)), +) +def test_path_traversal_redaction_suite( + evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults, element +): + tainted_object = _taint_pyobject_multiranges( + evidence_input["value"], + [ + ( + input_ranges["iinfo"]["parameterName"], + input_ranges["iinfo"]["parameterValue"], + str_to_origin(input_ranges["iinfo"]["type"]), + input_ranges["start"], + input_ranges["end"] - input_ranges["start"], + ) + for input_ranges in evidence_input["ranges"] + ], + ) + + assert is_pyobject_tainted(tainted_object) + + PathTraversal.report(tainted_object) + + data = _get_iast_data() + + vulnerability = list(data["vulnerabilities"])[0] + source = list(data["sources"])[0] + source["origin"] = origin_to_str(source["origin"]) + + assert vulnerability["type"] == VULN_PATH_TRAVERSAL + assert vulnerability["evidence"] == vulnerabilities_expected["evidence"] + assert source == sources_expected diff --git a/tests/appsec/iast/taint_sinks/test_sql_injection_redacted.py b/tests/appsec/iast/taint_sinks/test_sql_injection_redacted.py index e00af701427..c30475b4cba 100644 --- a/tests/appsec/iast/taint_sinks/test_sql_injection_redacted.py +++ b/tests/appsec/iast/taint_sinks/test_sql_injection_redacted.py @@ -18,17 +18,13 @@ from tests.utils import override_global_config -# FIXME: ideally all these should pass, through the key is that we don't leak any potential PII -_ignore_list = { - 46, -} - - @pytest.mark.parametrize( - "evidence_input, sources_expected, vulnerabilities_expected", - list(get_parametrize(VULN_SQL_INJECTION, ignore_list=_ignore_list)), + "evidence_input,sources_expected,vulnerabilities_expected,element", + list(get_parametrize(VULN_SQL_INJECTION)), ) -def test_sqli_redaction_suite(evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults): +def test_sqli_redaction_suite( + evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults, element +): with override_global_config(dict(_iast_deduplication_enabled=False)): tainted_object = _taint_pyobject_multiranges( evidence_input["value"], diff --git a/tests/appsec/iast/taint_sinks/test_ssrf_redacted.py b/tests/appsec/iast/taint_sinks/test_ssrf_redacted.py index d5f60e8878e..6b7ef145371 100644 --- a/tests/appsec/iast/taint_sinks/test_ssrf_redacted.py +++ b/tests/appsec/iast/taint_sinks/test_ssrf_redacted.py @@ -21,9 +21,11 @@ @pytest.mark.parametrize( - "evidence_input, sources_expected, vulnerabilities_expected", list(get_parametrize(VULN_SSRF, ignore_list={9, 10})) + "evidence_input,sources_expected,vulnerabilities_expected,element", list(get_parametrize(VULN_SSRF)) ) -def test_ssrf_redaction_suite(evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults): +def test_ssrf_redaction_suite( + evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults, element +): tainted_object = evidence_input_value = evidence_input.get("value", "") if evidence_input_value: tainted_object = _taint_pyobject_multiranges( From ef5021d74144375fc2f4b156ce28bb34c8abd886 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Fri, 31 Jan 2025 16:43:04 +0100 Subject: [PATCH 27/63] ci(appsec): move Flask (appsec and iast) tests (#12115) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- tests/appsec/appsec/test_telemetry.py | 2 +- .../flask_tests/test_appsec_flask.py} | 0 .../test_appsec_flask_telemetry.py} | 0 .../flask_tests/test_iast_flask.py} | 10 +++++---- .../flask_tests/test_iast_flask_telemetry.py | 21 +++++++++++-------- .../flask/test_appsec_flask_snapshot.py | 5 +++-- 6 files changed, 22 insertions(+), 16 deletions(-) rename tests/{contrib/flask/test_flask_appsec.py => appsec/integrations/flask_tests/test_appsec_flask.py} (100%) rename tests/{contrib/flask/test_flask_appsec_telemetry.py => appsec/integrations/flask_tests/test_appsec_flask_telemetry.py} (100%) rename tests/{contrib/flask/test_flask_appsec_iast.py => appsec/integrations/flask_tests/test_iast_flask.py} (99%) diff --git a/tests/appsec/appsec/test_telemetry.py b/tests/appsec/appsec/test_telemetry.py index 5ac21ceaa2e..ce1887defc7 100644 --- a/tests/appsec/appsec/test_telemetry.py +++ b/tests/appsec/appsec/test_telemetry.py @@ -1,7 +1,7 @@ import os from time import sleep +from unittest import mock -import mock import pytest import ddtrace.appsec._asm_request_context as asm_request_context diff --git a/tests/contrib/flask/test_flask_appsec.py b/tests/appsec/integrations/flask_tests/test_appsec_flask.py similarity index 100% rename from tests/contrib/flask/test_flask_appsec.py rename to tests/appsec/integrations/flask_tests/test_appsec_flask.py diff --git a/tests/contrib/flask/test_flask_appsec_telemetry.py b/tests/appsec/integrations/flask_tests/test_appsec_flask_telemetry.py similarity index 100% rename from tests/contrib/flask/test_flask_appsec_telemetry.py rename to tests/appsec/integrations/flask_tests/test_appsec_flask_telemetry.py diff --git a/tests/contrib/flask/test_flask_appsec_iast.py b/tests/appsec/integrations/flask_tests/test_iast_flask.py similarity index 99% rename from tests/contrib/flask/test_flask_appsec_iast.py rename to tests/appsec/integrations/flask_tests/test_iast_flask.py index ceeb7ecadc8..b50d9a6ad0f 100644 --- a/tests/contrib/flask/test_flask_appsec_iast.py +++ b/tests/appsec/integrations/flask_tests/test_iast_flask.py @@ -10,6 +10,7 @@ from ddtrace.appsec._iast import oce from ddtrace.appsec._iast._iast_request_context import _iast_start_request from ddtrace.appsec._iast._patches.json_tainting import patch as patch_json +from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._utils import _is_python_version_supported as python_supported_by_iast from ddtrace.appsec._iast.constants import VULN_HEADER_INJECTION from ddtrace.appsec._iast.constants import VULN_INSECURE_COOKIE @@ -25,7 +26,7 @@ from tests.utils import override_global_config -TEST_FILE_PATH = "tests/contrib/flask/test_flask_appsec_iast.py" +TEST_FILE_PATH = "tests/appsec/integrations/flask_tests/test_iast_flask.py" werkzeug_version = version("werkzeug") flask_version = tuple([int(v) for v in version("flask").split(".")]) @@ -1582,7 +1583,10 @@ def stacktrace_leak(): vulnerability = loaded["vulnerabilities"][0] assert vulnerability["type"] == VULN_STACKTRACE_LEAK assert "valueParts" in vulnerability["evidence"] - assert "tests.contrib.flask.test_flask_appsec_iast" in vulnerability["evidence"]["valueParts"][0]["value"] + assert ( + "tests.appsec.integrations.flask_tests.test_iast_flask" + in vulnerability["evidence"]["valueParts"][0]["value"] + ) assert "Exception: ValueError" in vulnerability["evidence"]["valueParts"][0]["value"] @@ -1734,8 +1738,6 @@ def test_flask_simple_iast_path_header_and_querystring_not_tainted_if_iast_disab def test_sqli(param_str): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - assert not is_pyobject_tainted(request.headers["User-Agent"]) assert not is_pyobject_tainted(request.query_string) assert not is_pyobject_tainted(param_str) diff --git a/tests/appsec/integrations/flask_tests/test_iast_flask_telemetry.py b/tests/appsec/integrations/flask_tests/test_iast_flask_telemetry.py index 0d5899d0a7f..901d58eca37 100644 --- a/tests/appsec/integrations/flask_tests/test_iast_flask_telemetry.py +++ b/tests/appsec/integrations/flask_tests/test_iast_flask_telemetry.py @@ -1,5 +1,6 @@ from ddtrace.appsec._iast._handlers import _on_flask_patch -from ddtrace.appsec._iast.constants import VULN_PATH_TRAVERSAL +from ddtrace.appsec._iast._taint_tracking import OriginType +from ddtrace.appsec._iast._taint_tracking import origin_to_str from tests.appsec.appsec_utils import flask_server from tests.utils import override_global_config @@ -16,17 +17,18 @@ def test_iast_span_metrics(): def test_flask_instrumented_metrics(telemetry_writer): - from ddtrace.appsec._iast._taint_tracking import OriginType - from ddtrace.appsec._iast._taint_tracking import origin_to_str - with override_global_config(dict(_iast_enabled=True)): _on_flask_patch((2, 0, 0)) metrics_result = telemetry_writer._namespace._metrics_data - metrics_source_tags_result = [metric._tags[0][1] for metric in metrics_result["generate-metrics"]["iast"].values()] + assert metrics_result["generate-metrics"]["iast"] + + metrics_source_tags_result = [ + metric._tags[0][1] + for metric in metrics_result["generate-metrics"]["iast"].values() + if metric.name == "instrumented.source" + ] - assert len(metrics_source_tags_result) == 11 - assert VULN_PATH_TRAVERSAL in metrics_source_tags_result assert origin_to_str(OriginType.HEADER_NAME) in metrics_source_tags_result assert origin_to_str(OriginType.HEADER) in metrics_source_tags_result assert origin_to_str(OriginType.PARAMETER_NAME) in metrics_source_tags_result @@ -37,13 +39,14 @@ def test_flask_instrumented_metrics(telemetry_writer): assert origin_to_str(OriginType.BODY) in metrics_source_tags_result assert origin_to_str(OriginType.COOKIE_NAME) in metrics_source_tags_result assert origin_to_str(OriginType.COOKIE) in metrics_source_tags_result + assert len(metrics_source_tags_result) == 10 def test_flask_instrumented_metrics_iast_disabled(telemetry_writer): with override_global_config(dict(_iast_enabled=False)): - _on_flask_patch("2.0.0") + _on_flask_patch((2, 0, 0)) metrics_result = telemetry_writer._namespace._metrics_data - metrics_source_tags_result = [metric._tags[0][1] for metric in metrics_result["generate-metrics"]["iast"].values()] + metrics_source_tags_result = [metric._tags for metric in metrics_result["generate-metrics"]["iast"].values()] assert len(metrics_source_tags_result) == 0 diff --git a/tests/contrib/flask/test_appsec_flask_snapshot.py b/tests/contrib/flask/test_appsec_flask_snapshot.py index 47465883395..4ccc4261e0a 100644 --- a/tests/contrib/flask/test_appsec_flask_snapshot.py +++ b/tests/contrib/flask/test_appsec_flask_snapshot.py @@ -16,8 +16,6 @@ from ddtrace.internal.constants import BLOCKED_RESPONSE_JSON from ddtrace.internal.utils.retry import RetryError import tests.appsec.rules as rules -from tests.contrib.flask.test_flask_appsec import _ALLOWED_USER -from tests.contrib.flask.test_flask_appsec import _BLOCKED_USER from tests.webclient import Client @@ -27,6 +25,9 @@ APPSEC_JSON_TAG = f"meta.{APPSEC.JSON}" +_BLOCKED_USER = "123456" +_ALLOWED_USER = "111111" + @pytest.fixture def flask_port(): From 4ebedf022d8ddaff160dd8cb231acfe050329a1c Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 31 Jan 2025 10:49:47 -0500 Subject: [PATCH 28/63] chore(config): remove ddtrace.settings.config (#12169) ## Checklist - [ ] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/internal/remoteconfig/product.py | 2 +- ddtrace/settings/_config.py | 106 ------------------ ...remove-core-settings-c2c7518876a1ca20.yaml | 4 + tests/internal/test_settings.py | 31 ----- tests/tracer/test_settings.py | 95 ---------------- tests/tracer/test_trace_utils.py | 12 +- 6 files changed, 11 insertions(+), 239 deletions(-) create mode 100644 releasenotes/notes/remove-core-settings-c2c7518876a1ca20.yaml diff --git a/ddtrace/internal/remoteconfig/product.py b/ddtrace/internal/remoteconfig/product.py index f7d1ff04fd4..81d952099d5 100644 --- a/ddtrace/internal/remoteconfig/product.py +++ b/ddtrace/internal/remoteconfig/product.py @@ -11,7 +11,7 @@ def start(): from ddtrace.internal.remoteconfig.worker import remoteconfig_poller remoteconfig_poller.enable() - config.enable_remote_configuration() + config._enable_remote_configuration() def restart(join=False): diff --git a/ddtrace/settings/_config.py b/ddtrace/settings/_config.py index df3fe4177d1..2052f939457 100644 --- a/ddtrace/settings/_config.py +++ b/ddtrace/settings/_config.py @@ -324,32 +324,6 @@ class Config(object): available and can be updated by users. """ - # Maps deprecated configuration attributes to their corresponding environment variable and - # internalized attribute name - _DEPRECATED_ATTRS = { - "http_tag_query_string": ("_http_tag_query_string", "DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING"), - "trace_http_header_tags": ("_trace_http_header_tags", "DD_TRACE_HEADER_TAGS"), - "report_hostname": ("_report_hostname", "DD_TRACE_REPORT_HOSTNAME"), - "health_metrics_enabled": ("_health_metrics_enabled", "DD_TRACE_HEALTH_METRICS_ENABLED"), - "analytics_enabled": ("_analytics_enabled", "DD_TRACE_ANALYTICS_ENABLED"), - "client_ip_header": ("_client_ip_header", "DD_TRACE_CLIENT_IP_HEADER"), - "retrieve_client_ip": ("_retrieve_client_ip", "DD_TRACE_CLIENT_IP_ENABLED"), - "propagation_http_baggage_enabled": ( - "_propagation_http_baggage_enabled", - "DD_TRACE_PROPAGATION_HTTP_BAGGAGE_ENABLED", - ), - "global_query_string_obfuscation_disabled": ( - "_global_query_string_obfuscation_disabled", - 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP=""', - ), - "trace_methods": ("_trace_methods", "DD_TRACE_METHODS"), - "ci_visibility_log_level": ("_ci_visibility_log_level", "DD_CIVISIBILITY_LOG_LEVEL"), - "test_session_name": ("_test_session_name", "DD_TEST_SESSION_NAME"), - "logs_injection": ("_logs_injection", "DD_LOGS_INJECTION"), - "http_server": ("_http_server", "DD_TRACE_HTTP_SERVER_ERROR_STATUSES"), - "http": ("_http", "DD_TRACE_HEADER_TAGS"), - } - class _HTTPServerConfig(object): _error_statuses = _get_config("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "500-599") # type: str _error_ranges = get_error_ranges(_error_statuses) # type: List[Tuple[int, int]] @@ -642,22 +616,6 @@ def __init__(self): self._inject_was_attempted = _get_config("_DD_INJECT_WAS_ATTEMPTED", False, asbool) def __getattr__(self, name) -> Any: - if name in self._DEPRECATED_ATTRS: - new_name, env_var = self._DEPRECATED_ATTRS[name] - deprecate( - f"ddtrace.config.{name} is deprecated", - message=f"Use the environment variable {env_var} instead. " - "This variable must be set before importing ddtrace.", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - if name == new_name: - raise RuntimeError( - f"Circular mapping detected: deprecated attribute {name} " - f"in {self._DEPRECATED_ATTRS} maps to a deprecated attribute {new_name}" - ) - return getattr(self, new_name) - if name in self._config: return self._config[name].value() @@ -681,13 +639,6 @@ def _get_extra_services(self): self._extra_services.pop() return self._extra_services - def get_from(self, obj): - deprecate( - "ddtrace.config.get_from is deprecated", - message="Use the `config` attribute directly.", - ) - self._get_from(obj) - def _get_from(self, obj): """Retrieves the configuration for the given object. Any object that has an attached `Pin` must have a configuration @@ -732,36 +683,6 @@ def _add(self, integration, settings, merge=True): else: self._integration_configs[integration] = IntegrationConfig(self, integration, settings) - def trace_headers(self, whitelist): - """ - Registers a set of headers to be traced at global level or integration level. - :param whitelist: the case-insensitive list of traced headers - :type whitelist: list of str or str - :return: self - :rtype: HttpConfig - """ - deprecate( - "ddtrace.config.trace_headers is deprecated", - message="Use the environment variable DD_TRACE_HEADER_TAGS instead.", - removal_version="3.0.0", - ) - self._http.trace_headers(whitelist) - return self - - def header_is_traced(self, header_name): - # type: (str) -> bool - """ - Returns whether or not the current header should be traced. - :param header_name: the header name - :type header_name: str - :rtype: bool - """ - deprecate( - "ddtrace.config.header_is_traced is deprecated", - removal_version="3.0.0", - ) - return self._http.header_is_traced(header_name) - @cachedmethod() def _header_tag_name(self, header_name): # type: (str) -> Optional[str] @@ -812,17 +733,6 @@ def __setattr__(self, key, value): self._set_config_items([(key, value, "code")]) return None else: - if key in self._DEPRECATED_ATTRS: - # replace deprecated attribute name with the new name - new_key, env_var = self._DEPRECATED_ATTRS[key] - deprecate( - f"ddtrace.config.{key} is deprecated", - message=f"Use the environment variable {env_var} instead. " - "This variable must be set before importing ddtrace.", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - key = new_key return super(self.__class__, self).__setattr__(key, value) def _set_config_items(self, items): @@ -933,14 +843,6 @@ def _format_tags(self, tags: List[Union[str, Dict]]) -> Dict[str, str]: pairs = [t.split(":") for t in tags] # type: ignore[union-attr,misc] return {k: v for k, v in pairs} - def enable_remote_configuration(self): - deprecate( - "ddtrace.config.enable_remote_configuration(...) is deprecated", - message="Use DD_TRACE_REMOTE_CONFIG_ENABLED instead.", - version="3.0.0", - ) - self._enable_remote_configuration() - def _enable_remote_configuration(self): # type: () -> None """Enable fetching configuration from Datadog.""" @@ -978,14 +880,6 @@ def _tags_to_dict(self, tags: List[Dict]): return {tag["key"]: tag["value_glob"] for tag in tags} return tags - def convert_rc_trace_sampling_rules(self, rc_rules: List[Dict[str, Any]]) -> Optional[str]: - deprecate( - "ddtrace.config.convert_rc_trace_sampling_rules(...) is deprecated", - message="Use DD_REMOTE_CONFIGURATION_ENABLED instead.", - version="3.0.0", - ) - return self._convert_rc_trace_sampling_rules(rc_rules) - def _convert_rc_trace_sampling_rules(self, rc_rules: List[Dict[str, Any]]) -> Optional[str]: """Example of an incoming rule: [ diff --git a/releasenotes/notes/remove-core-settings-c2c7518876a1ca20.yaml b/releasenotes/notes/remove-core-settings-c2c7518876a1ca20.yaml new file mode 100644 index 00000000000..295419b99ea --- /dev/null +++ b/releasenotes/notes/remove-core-settings-c2c7518876a1ca20.yaml @@ -0,0 +1,4 @@ +--- +deprecations: + - | + configurations: Removes deprecated attributes from ``ddtrace.config``. diff --git a/tests/internal/test_settings.py b/tests/internal/test_settings.py index 14f52092f4d..a3f5fa97802 100644 --- a/tests/internal/test_settings.py +++ b/tests/internal/test_settings.py @@ -615,34 +615,3 @@ def test_remoteconfig_header_tags(run_python_code_in_subprocess): env=env, ) assert status == 0, f"err={err.decode('utf-8')} out={out.decode('utf-8')}" - - -def test_config_public_properties_and_methods(): - # Regression test to prevent unexpected changes to public attributes in Config - # By default most attributes should be private and set via Environment Variables - from ddtrace.settings import Config - - public_attrs = set() - c = Config() - # Check for public attributes in Config - for attr in dir(c): - if not attr.startswith("_") and not attr.startswith("__"): - public_attrs.add(attr) - # Check for public keys in Config._config - for key in c._config: - if not key.startswith("_"): - public_attrs.add(key) - - assert public_attrs == { - "service", - "service_mapping", - "env", - "tags", - "version", - # Attributes below are deprecated and will be removed in v3.0 - "trace_headers", - "header_is_traced", - "convert_rc_trace_sampling_rules", - "enable_remote_configuration", - "get_from", - }, public_attrs diff --git a/tests/tracer/test_settings.py b/tests/tracer/test_settings.py index ac94404200a..caddbb81f20 100644 --- a/tests/tracer/test_settings.py +++ b/tests/tracer/test_settings.py @@ -1,5 +1,3 @@ -import warnings - import pytest from ddtrace.settings import Config @@ -136,16 +134,6 @@ def test_allow_configuring_http(self): assert self.integration_config.http.header_is_traced("integration_header") assert not self.integration_config.http.header_is_traced("other_header") - def test_allow_exist_both_global_and_integration_config(self): - self.config.trace_headers("global_header") - assert self.integration_config.header_is_traced("global_header") - - self.integration_config.http.trace_headers("integration_header") - assert self.integration_config.header_is_traced("integration_header") - - assert not self.integration_config.http.header_is_traced("global_header") - assert not self.config.header_is_traced("integration_header") - def test_service(self): ic = IntegrationConfig(self.config, "foo") assert ic.service is None @@ -161,34 +149,6 @@ def test_service_name_env_var(self): assert ic.service == "foo-svc" -@pytest.mark.parametrize( - "global_headers,int_headers,expected", - ( - (None, None, (False, False, False)), - ([], None, (False, False, False)), - (["Header"], None, (True, False, True)), - (None, ["Header"], (False, True, True)), - (None, [], (False, False, False)), - (["Header"], ["Header"], (True, True, True)), - ([], [], (False, False, False)), - ), -) -def test_config_is_header_tracing_configured(global_headers, int_headers, expected): - config = Config() - integration_config = config.myint - - if global_headers is not None: - config.trace_headers(global_headers) - if int_headers is not None: - integration_config.http.trace_headers(int_headers) - - assert ( - config._http.is_header_tracing_configured, - integration_config.http.is_header_tracing_configured, - integration_config.is_header_tracing_configured, - ) == expected - - def test_environment_header_tags(): with override_env(dict(DD_TRACE_HEADER_TAGS="Host:http.host,User-agent:http.user_agent")): config = Config() @@ -213,58 +173,3 @@ def test_x_datadog_tags(env, expected): with override_env(env): _ = Config() assert expected == (_._x_datadog_tags_max_length, _._x_datadog_tags_enabled) - - -@pytest.mark.parametrize( - "deprecated_name,name,test_value,env", - ( - ("http_tag_query_string", "_http_tag_query_string", True, "DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING"), - ("trace_http_header_tags", "_trace_http_header_tags", {"x-dd": "x_dd"}, "DD_TRACE_HEADER_TAGS"), - ("report_hostname", "_report_hostname", True, "DD_TRACE_REPORT_HOSTNAME"), - ("health_metrics_enabled", "_health_metrics_enabled", True, "DD_TRACE_HEALTH_METRICS_ENABLED"), - ("analytics_enabled", "_analytics_enabled", True, "DD_TRACE_ANALYTICS_ENABLED"), - ("client_ip_header", "_client_ip_header", True, "DD_TRACE_CLIENT_IP_HEADER"), - ("retrieve_client_ip", "_retrieve_client_ip", True, "DD_TRACE_CLIENT_IP_ENABLED"), - ( - "propagation_http_baggage_enabled", - "_propagation_http_baggage_enabled", - True, - "DD_TRACE_PROPAGATION_HTTP_BAGGAGE_ENABLED", - ), - ( - "global_query_string_obfuscation_disabled", - "_global_query_string_obfuscation_disabled", - True, - 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP=""', - ), - ("trace_methods", "_trace_methods", ["monkey.banana_melon"], "DD_TRACE_METHODS"), - ("ci_visibility_log_level", "_ci_visibility_log_level", True, "DD_CIVISIBILITY_LOG_LEVEL"), - ("test_session_name", "_test_session_name", "yessirapp", "DD_TEST_SESSION_NAME"), - ("logs_injection", "_logs_injection", False, "DD_LOGS_INJECTION"), - ), -) -def test_deprecated_config_attributes(deprecated_name, name, test_value, env): - """Ensures setting and getting deprecated attributes log a warning and still - set/return the expected values. - """ - with warnings.catch_warnings(record=True) as warns: - warnings.simplefilter("always") - config = Config() - # Test getting/setting a configuration by the expected name - setattr(config, name, test_value) - assert getattr(config, name) == test_value - assert len(warns) == 0 - expected_warning = ( - f"ddtrace.config.{deprecated_name} is deprecated and will be " - f"removed in version '3.0.0': Use the environment variable {env} " - "instead. This variable must be set before importing ddtrace." - ) - # Test getting the configuration by the deprecated name - getattr(config, deprecated_name) == test_value - assert len(warns) == 1 - assert str(warns[0].message) == expected_warning - # Test setting the configuration by the deprecated name - setattr(config, deprecated_name, None) - assert getattr(config, name) is None - assert len(warns) == 2 - assert str(warns[1].message) == expected_warning diff --git a/tests/tracer/test_trace_utils.py b/tests/tracer/test_trace_utils.py index 31099763d50..ca564cac394 100644 --- a/tests/tracer/test_trace_utils.py +++ b/tests/tracer/test_trace_utils.py @@ -407,8 +407,8 @@ def test_set_http_meta( appsec_enabled, span_type, ): - int_config.http.trace_headers(["my-header"]) - int_config.trace_query_string = True + int_config._http.trace_headers(["my-header"]) + int_config._trace_query_string = True span.span_type = span_type with asm_context(config={"_asm_enabled": appsec_enabled}): trace_utils.set_http_meta( @@ -443,7 +443,7 @@ def test_set_http_meta( else: expected_url = url - if query and int_config.trace_query_string: + if query and int_config._trace_query_string: assert span.get_tag(http.URL) == str(expected_url + "?" + query) else: assert span.get_tag(http.URL) == str(expected_url) @@ -462,7 +462,7 @@ def test_set_http_meta( if status_msg is not None: assert span.get_tag(http.STATUS_MSG) == str(status_msg) - if query is not None and int_config.trace_query_string: + if query is not None and int_config._trace_query_string: assert span.get_tag(http.QUERY_STRING) == query if request_headers is not None: @@ -1071,11 +1071,11 @@ def test_url_in_http_with_obfuscation_enabled_and_empty_regex(): from ddtrace.trace import tracer # assert obfuscation is disabled when the regex is an empty string - assert config.global_query_string_obfuscation_disabled is True + assert config._global_query_string_obfuscation_disabled is True assert config._obfuscation_query_string_pattern is not None # Enable obfucation with an empty regex - config.global_query_string_obfuscation_disabled = False + config._global_query_string_obfuscation_disabled = False config._add("myint", dict()) with tracer.trace("s") as span: From 1779b195174cb099cfe3c29bbf4551be70be59dc Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 31 Jan 2025 12:17:19 -0500 Subject: [PATCH 29/63] chore(aws_lambda): bump minimum supported version (#12178) `aws_lambda<6.105.0` requires imports that were removed in ddtrace v3.0. This PR documents a new minimum supported version for aws_lambda and updates tests. Blocked by: https://github.com/DataDog/datadog-lambda-python/pull/557 ## Checklist - [ ] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [ ] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .riot/requirements/1460efe.txt | 47 ++++++++++++++++++ .riot/requirements/16af7e0.txt | 6 +-- .riot/requirements/1965d6b.txt | 45 +++++++++++++++++ .riot/requirements/1aaf6f6.txt | 49 ------------------- .riot/requirements/1aec773.txt | 45 +++++++++++++++++ .riot/requirements/1ecfbd7.txt | 46 +++++++++++++++++ .riot/requirements/1fa807e.txt | 6 +-- .riot/requirements/6824c99.txt | 47 ++++++++++++++++++ .riot/requirements/7cf5b29.txt | 47 ++++++++++++++++++ .riot/requirements/b0f80c7.txt | 45 +++++++++++++++++ .riot/requirements/bc071f4.txt | 47 ++++++++++++++++++ .riot/requirements/ce0b0e6.txt | 45 +++++++++++++++++ .riot/requirements/d3868d9.txt | 46 +++++++++++++++++ .riot/requirements/dd525d9.txt | 49 ------------------- .riot/requirements/e39f833.txt | 48 ------------------ .riot/requirements/edb39c1.txt | 48 ------------------ .../sources/min_compatible_versions.csv | 2 +- min_compatible_versions.csv | 2 +- ...grade-min-aws-lambda-f9d9d31cf1f8685f.yaml | 4 ++ riotfile.py | 4 +- 20 files changed, 474 insertions(+), 204 deletions(-) create mode 100644 .riot/requirements/1460efe.txt create mode 100644 .riot/requirements/1965d6b.txt delete mode 100644 .riot/requirements/1aaf6f6.txt create mode 100644 .riot/requirements/1aec773.txt create mode 100644 .riot/requirements/1ecfbd7.txt create mode 100644 .riot/requirements/6824c99.txt create mode 100644 .riot/requirements/7cf5b29.txt create mode 100644 .riot/requirements/b0f80c7.txt create mode 100644 .riot/requirements/bc071f4.txt create mode 100644 .riot/requirements/ce0b0e6.txt create mode 100644 .riot/requirements/d3868d9.txt delete mode 100644 .riot/requirements/dd525d9.txt delete mode 100644 .riot/requirements/e39f833.txt delete mode 100644 .riot/requirements/edb39c1.txt create mode 100644 releasenotes/notes/upgrade-min-aws-lambda-f9d9d31cf1f8685f.yaml diff --git a/.riot/requirements/1460efe.txt b/.riot/requirements/1460efe.txt new file mode 100644 index 00000000000..88d3edb3c68 --- /dev/null +++ b/.riot/requirements/1460efe.txt @@ -0,0 +1,47 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1460efe.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/16af7e0.txt b/.riot/requirements/16af7e0.txt index df479a84c64..8ade9c10320 100644 --- a/.riot/requirements/16af7e0.txt +++ b/.riot/requirements/16af7e0.txt @@ -12,10 +12,10 @@ cattrs==23.2.3 certifi==2024.7.4 charset-normalizer==3.3.2 coverage[toml]==7.5.4 -datadog==0.49.1 -datadog-lambda==6.96.0 +datadog==0.51.0 +datadog-lambda==6.105.0 ddsketch==3.0.1 -ddtrace==2.9.2 +ddtrace==2.20.0 deprecated==1.2.14 envier==0.5.2 exceptiongroup==1.2.1 diff --git a/.riot/requirements/1965d6b.txt b/.riot/requirements/1965d6b.txt new file mode 100644 index 00000000000..71a4f91d8cf --- /dev/null +++ b/.riot/requirements/1965d6b.txt @@ -0,0 +1,45 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1965d6b.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/1aaf6f6.txt b/.riot/requirements/1aaf6f6.txt deleted file mode 100644 index 5c36c6f9871..00000000000 --- a/.riot/requirements/1aaf6f6.txt +++ /dev/null @@ -1,49 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1aaf6f6.in -# -attrs==23.2.0 -boto3==1.34.139 -botocore==1.34.139 -bytecode==0.15.1 -cattrs==23.2.3 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.5.4 -datadog==0.49.1 -datadog-lambda==6.96.0 -ddsketch==3.0.1 -ddtrace==2.9.2 -deprecated==1.2.14 -envier==0.5.2 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==7.1.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -opentelemetry-api==1.26.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.27.2 -pytest==8.2.2 -pytest-asyncio==0.21.1 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -python-dateutil==2.9.0.post0 -requests==2.32.3 -s3transfer==0.10.2 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.12.2 -ujson==5.10.0 -urllib3==1.26.19 -wrapt==1.16.0 -xmltodict==0.13.0 -zipp==3.19.2 diff --git a/.riot/requirements/1aec773.txt b/.riot/requirements/1aec773.txt new file mode 100644 index 00000000000..813b6aa028c --- /dev/null +++ b/.riot/requirements/1aec773.txt @@ -0,0 +1,45 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1aec773.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/1ecfbd7.txt b/.riot/requirements/1ecfbd7.txt new file mode 100644 index 00000000000..165bdc2dde6 --- /dev/null +++ b/.riot/requirements/1ecfbd7.txt @@ -0,0 +1,46 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1ecfbd7.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +legacy-cgi==2.6.2 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/1fa807e.txt b/.riot/requirements/1fa807e.txt index ca1c67d95b6..445f66032c8 100644 --- a/.riot/requirements/1fa807e.txt +++ b/.riot/requirements/1fa807e.txt @@ -12,10 +12,10 @@ cattrs==23.2.3 certifi==2024.7.4 charset-normalizer==3.3.2 coverage[toml]==7.5.4 -datadog==0.49.1 -datadog-lambda==6.96.0 +datadog==0.51.0 +datadog-lambda==6.105.0 ddsketch==3.0.1 -ddtrace==2.9.2 +ddtrace==2.20.0 deprecated==1.2.14 envier==0.5.2 exceptiongroup==1.2.1 diff --git a/.riot/requirements/6824c99.txt b/.riot/requirements/6824c99.txt new file mode 100644 index 00000000000..d4bb270d8d0 --- /dev/null +++ b/.riot/requirements/6824c99.txt @@ -0,0 +1,47 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/6824c99.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.1 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==1.26.20 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.20.2 diff --git a/.riot/requirements/7cf5b29.txt b/.riot/requirements/7cf5b29.txt new file mode 100644 index 00000000000..071c7d7fd7e --- /dev/null +++ b/.riot/requirements/7cf5b29.txt @@ -0,0 +1,47 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/7cf5b29.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/b0f80c7.txt b/.riot/requirements/b0f80c7.txt new file mode 100644 index 00000000000..6e1f4faa53d --- /dev/null +++ b/.riot/requirements/b0f80c7.txt @@ -0,0 +1,45 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/b0f80c7.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/bc071f4.txt b/.riot/requirements/bc071f4.txt new file mode 100644 index 00000000000..5292c276c7e --- /dev/null +++ b/.riot/requirements/bc071f4.txt @@ -0,0 +1,47 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/bc071f4.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==1.26.20 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/ce0b0e6.txt b/.riot/requirements/ce0b0e6.txt new file mode 100644 index 00000000000..02c1978a081 --- /dev/null +++ b/.riot/requirements/ce0b0e6.txt @@ -0,0 +1,45 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/ce0b0e6.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/d3868d9.txt b/.riot/requirements/d3868d9.txt new file mode 100644 index 00000000000..d369ff90575 --- /dev/null +++ b/.riot/requirements/d3868d9.txt @@ -0,0 +1,46 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/d3868d9.in +# +attrs==25.1.0 +boto3==1.36.10 +botocore==1.36.10 +bytecode==0.16.1 +certifi==2024.12.14 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +datadog==0.51.0 +datadog-lambda==6.105.0 +ddtrace==2.20.0 +deprecated==1.2.18 +envier==0.5.2 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +legacy-cgi==2.6.2 +mock==5.1.0 +opentelemetry-api==1.29.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +pytest==8.3.4 +pytest-asyncio==0.21.1 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +python-dateutil==2.9.0.post0 +requests==2.32.3 +s3transfer==0.11.2 +six==1.17.0 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +ujson==5.10.0 +urllib3==2.3.0 +wrapt==1.17.2 +xmltodict==0.14.2 +zipp==3.21.0 diff --git a/.riot/requirements/dd525d9.txt b/.riot/requirements/dd525d9.txt deleted file mode 100644 index 03c376f19df..00000000000 --- a/.riot/requirements/dd525d9.txt +++ /dev/null @@ -1,49 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/dd525d9.in -# -attrs==23.2.0 -boto3==1.34.139 -botocore==1.34.139 -bytecode==0.15.1 -cattrs==23.2.3 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.5.4 -datadog==0.49.1 -datadog-lambda==6.96.0 -ddsketch==3.0.1 -ddtrace==2.9.2 -deprecated==1.2.14 -envier==0.5.2 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==7.1.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -opentelemetry-api==1.26.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -protobuf==5.27.2 -pytest==8.2.2 -pytest-asyncio==0.21.1 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -python-dateutil==2.9.0.post0 -requests==2.32.3 -s3transfer==0.10.2 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.12.2 -ujson==5.10.0 -urllib3==1.26.19 -wrapt==1.16.0 -xmltodict==0.13.0 -zipp==3.19.2 diff --git a/.riot/requirements/e39f833.txt b/.riot/requirements/e39f833.txt deleted file mode 100644 index e71709e9da3..00000000000 --- a/.riot/requirements/e39f833.txt +++ /dev/null @@ -1,48 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/e39f833.in -# -attrs==23.2.0 -boto3==1.33.13 -botocore==1.33.13 -bytecode==0.13.0 -cattrs==23.1.2 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -datadog==0.49.1 -datadog-lambda==5.85.0 -ddsketch==3.0.1 -ddtrace==2.9.2 -deprecated==1.2.14 -envier==0.5.2 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.5.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -opentelemetry-api==1.22.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -requests==2.31.0 -s3transfer==0.8.2 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -wrapt==1.16.0 -xmltodict==0.13.0 -zipp==3.15.0 diff --git a/.riot/requirements/edb39c1.txt b/.riot/requirements/edb39c1.txt deleted file mode 100644 index 667e74f25cd..00000000000 --- a/.riot/requirements/edb39c1.txt +++ /dev/null @@ -1,48 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/edb39c1.in -# -attrs==23.2.0 -boto3==1.33.13 -botocore==1.33.13 -bytecode==0.13.0 -cattrs==23.1.2 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -datadog==0.49.1 -datadog-lambda==5.85.0 -ddsketch==3.0.1 -ddtrace==2.9.2 -deprecated==1.2.14 -envier==0.5.2 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.5.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -opentelemetry-api==1.22.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -requests==2.31.0 -s3transfer==0.8.2 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -wrapt==1.16.0 -xmltodict==0.13.0 -zipp==3.15.0 diff --git a/lib-injection/sources/min_compatible_versions.csv b/lib-injection/sources/min_compatible_versions.csv index 4537863f24c..c7366036a89 100644 --- a/lib-injection/sources/min_compatible_versions.csv +++ b/lib-injection/sources/min_compatible_versions.csv @@ -42,7 +42,7 @@ coverage,0 cryptography,<39 daphne,0 databases,0 -datadog-lambda,>=4.66.0 +datadog-lambda,>=6.105.0 django,>=2.2 django-pylibmc,>=0.6 django-q,0 diff --git a/min_compatible_versions.csv b/min_compatible_versions.csv index 4537863f24c..c7366036a89 100644 --- a/min_compatible_versions.csv +++ b/min_compatible_versions.csv @@ -42,7 +42,7 @@ coverage,0 cryptography,<39 daphne,0 databases,0 -datadog-lambda,>=4.66.0 +datadog-lambda,>=6.105.0 django,>=2.2 django-pylibmc,>=0.6 django-q,0 diff --git a/releasenotes/notes/upgrade-min-aws-lambda-f9d9d31cf1f8685f.yaml b/releasenotes/notes/upgrade-min-aws-lambda-f9d9d31cf1f8685f.yaml new file mode 100644 index 00000000000..1d632ce8988 --- /dev/null +++ b/releasenotes/notes/upgrade-min-aws-lambda-f9d9d31cf1f8685f.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + aws_lambda: Drops support for ``aws_lambda<=6.105.0``. \ No newline at end of file diff --git a/riotfile.py b/riotfile.py index d6fd8a1e89b..dac8b01fc0c 100644 --- a/riotfile.py +++ b/riotfile.py @@ -2857,10 +2857,10 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( name="aws_lambda", command="pytest --no-ddtrace {cmdargs} tests/contrib/aws_lambda", - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.13"), pkgs={ "boto3": latest, - "datadog-lambda": [">=4.66.0", latest], + "datadog-lambda": [">=6.105.0", latest], "pytest-asyncio": "==0.21.1", "pytest-randomly": latest, "envier": "==0.5.2", From 19f237807fd79085090234e1e665f583d90efc97 Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Fri, 31 Jan 2025 19:23:56 +0100 Subject: [PATCH 30/63] ci: add `3.x-staging` to the build job trigger branches (#12192) It was flagged that Build jobs were not running on 3.x-staging. This adds the branch to the Build job trigger branches. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [ ] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .github/workflows/build_deploy.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_deploy.yml b/.github/workflows/build_deploy.yml index bc6a8b0b3d2..1a13a751d29 100644 --- a/.github/workflows/build_deploy.yml +++ b/.github/workflows/build_deploy.yml @@ -11,6 +11,8 @@ on: - build_deploy* - 'upgrade-latest-*' - 'mq-working-branch**' + # TODO: Remove this after 3.x work is done + - 3.x-staging pull_request: release: types: From 7257296a482a92197fb43957c92ee3c908d61092 Mon Sep 17 00:00:00 2001 From: lievan <42917263+lievan@users.noreply.github.com> Date: Fri, 31 Jan 2025 14:43:44 -0500 Subject: [PATCH 31/63] feat(llmobs): introduce ragas eval integration (#12143) Publicize the RAGAS integration [RAGAS](https://docs.ragas.io/en/stable/getstarted/index.html) is an evaluation framework for RAG Applications. The integration supports evaluating LLM inferences with three RAGAS metrics - faithfulness - answer relevancy - context precision dupe of https://github.com/DataDog/dd-trace-py/pull/11939 to get in ddtrace 3.0 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: lievan --- ddtrace/llmobs/_evaluators/runner.py | 4 +++- ddtrace/llmobs/_evaluators/sampler.py | 5 +++-- .../ragas-integration-a81b696757c0e7a5.yaml | 21 +++++++++++++++++++ tests/llmobs/test_llmobs_evaluator_runner.py | 2 +- tests/llmobs/test_llmobs_ragas_evaluators.py | 5 +++-- tests/llmobs/test_llmobs_service.py | 8 +++---- 6 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 releasenotes/notes/ragas-integration-a81b696757c0e7a5.yaml diff --git a/ddtrace/llmobs/_evaluators/runner.py b/ddtrace/llmobs/_evaluators/runner.py index 5e0ab2737f4..780293563d8 100644 --- a/ddtrace/llmobs/_evaluators/runner.py +++ b/ddtrace/llmobs/_evaluators/runner.py @@ -32,6 +32,8 @@ class EvaluatorRunner(PeriodicService): 2. triggers evaluator runs over buffered finished spans on each `periodic` call """ + EVALUATORS_ENV_VAR = "DD_LLMOBS_EVALUATORS" + def __init__(self, interval: float, llmobs_service=None, evaluators=None): super(EvaluatorRunner, self).__init__(interval=interval) self._lock = forksafe.RLock() @@ -46,7 +48,7 @@ def __init__(self, interval: float, llmobs_service=None, evaluators=None): if len(self.evaluators) > 0: return - evaluator_str = os.getenv("_DD_LLMOBS_EVALUATORS") + evaluator_str = os.getenv(self.EVALUATORS_ENV_VAR) if evaluator_str is None: return diff --git a/ddtrace/llmobs/_evaluators/sampler.py b/ddtrace/llmobs/_evaluators/sampler.py index 3598e90f7f3..524af217f83 100644 --- a/ddtrace/llmobs/_evaluators/sampler.py +++ b/ddtrace/llmobs/_evaluators/sampler.py @@ -46,7 +46,7 @@ def __repr__(self): class EvaluatorRunnerSampler: - SAMPLING_RULES_ENV_VAR = "_DD_LLMOBS_EVALUATOR_SAMPLING_RULES" + SAMPLING_RULES_ENV_VAR = "DD_LLMOBS_EVALUATOR_SAMPLING_RULES" def __init__(self): self.rules = self.parse_rules() @@ -59,8 +59,9 @@ def sample(self, evaluator_label, span): def parse_rules(self) -> List[EvaluatorRunnerSamplingRule]: rules = [] + sampling_rules_str = os.getenv(self.SAMPLING_RULES_ENV_VAR) - telemetry_writer.add_configuration("_DD_LLMOBS_EVALUATOR_SAMPLING_RULES", sampling_rules_str, origin="env") + telemetry_writer.add_configuration(self.SAMPLING_RULES_ENV_VAR, sampling_rules_str, origin="env") def parsing_failed_because(msg, maybe_throw_this): telemetry_writer.add_log( diff --git a/releasenotes/notes/ragas-integration-a81b696757c0e7a5.yaml b/releasenotes/notes/ragas-integration-a81b696757c0e7a5.yaml new file mode 100644 index 00000000000..7963f891661 --- /dev/null +++ b/releasenotes/notes/ragas-integration-a81b696757c0e7a5.yaml @@ -0,0 +1,21 @@ +--- +features: + - | + LLM Observability: This introduces an integration with the `RAGAS `_ evaluation framework to continuously monitor + the performance of context-augmented LLM generations in production. + + The integration supports evaluating LLM inferences with the following RAGAS metrics: + - `Faithfulness `_: measures if the LLM response is faithful to the provided context. + - `Answer Relevancy `_: measures how relevant the LLM response is to the user input. + - `Context Precision `_: measures how effectively the context is used in the generated response. + + To learn more, see the `LLM Observability evaluations guide `_. +deprecations: + - | + LLM Observability: The `_DD_LLMOBS_EVALUATORS` environment variable is deprecated and will be removed in ddtrace 3.0.0. + As an alternative to `_DD_LLMOBS_EVALUATORS`, you can use `DD_LLMOBS_EVALUATORS` instead. + To migrate, replace `_DD_LLMOBS_EVALUATORS` with `DD_LLMOBS_EVALUATORS`. + - | + LLM Observability: The `_DD_LLMOBS_EVALUATOR_SAMPLING_RULES` environment variable is deprecated and will be removed in ddtrace 3.0.0. + As an alternative to `_DD_LLMOBS_EVALUATOR_SAMPLING_RULES`, you can use `DD_LLMOBS_EVALUATOR_SAMPLING_RULES` instead. + To migrate, replace `_DD_LLMOBS_EVALUATOR_SAMPLING_RULES` with `DD_LLMOBS_EVALUATOR_SAMPLING_RULES`. \ No newline at end of file diff --git a/tests/llmobs/test_llmobs_evaluator_runner.py b/tests/llmobs/test_llmobs_evaluator_runner.py index a2c4278297c..1c941c52d83 100644 --- a/tests/llmobs/test_llmobs_evaluator_runner.py +++ b/tests/llmobs/test_llmobs_evaluator_runner.py @@ -120,7 +120,7 @@ def test_evaluator_runner_on_exit(mock_writer_logs, run_python_code_in_subproces def test_evaluator_runner_unsupported_evaluator(): - with override_env({"_DD_LLMOBS_EVALUATORS": "unsupported"}): + with override_env({EvaluatorRunner.EVALUATORS_ENV_VAR: "unsupported"}): with pytest.raises(ValueError): EvaluatorRunner(interval=0.01, llmobs_service=mock.MagicMock()) diff --git a/tests/llmobs/test_llmobs_ragas_evaluators.py b/tests/llmobs/test_llmobs_ragas_evaluators.py index 9766c18c1e5..c46dce740c2 100644 --- a/tests/llmobs/test_llmobs_ragas_evaluators.py +++ b/tests/llmobs/test_llmobs_ragas_evaluators.py @@ -6,7 +6,8 @@ from ddtrace.llmobs._evaluators.ragas.answer_relevancy import RagasAnswerRelevancyEvaluator from ddtrace.llmobs._evaluators.ragas.context_precision import RagasContextPrecisionEvaluator from ddtrace.llmobs._evaluators.ragas.faithfulness import RagasFaithfulnessEvaluator -from ddtrace.trace import Span +from ddtrace.llmobs._evaluators.runner import EvaluatorRunner +from ddtrace.span import Span from tests.llmobs._utils import _expected_llmobs_llm_span_event from tests.llmobs._utils import _expected_ragas_answer_relevancy_spans from tests.llmobs._utils import _expected_ragas_context_precision_spans @@ -235,7 +236,7 @@ def test_llmobs_with_faithfulness_emits_traces_and_evals_on_exit(mock_writer_log "PYTHONPATH": ":".join(pypath), "OPENAI_API_KEY": os.getenv("OPENAI_API_KEY", "dummy-openai-api-key"), "_DD_LLMOBS_EVALUATOR_INTERVAL": "5", - "_DD_LLMOBS_EVALUATORS": "ragas_faithfulness", + EvaluatorRunner.EVALUATORS_ENV_VAR: "ragas_faithfulness", "DD_TRACE_ENABLED": "0", } ) diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py index ff099ae3f71..2fe3e1fbfab 100644 --- a/tests/llmobs/test_llmobs_service.py +++ b/tests/llmobs/test_llmobs_service.py @@ -1384,7 +1384,7 @@ def test_llmobs_fork_recreates_and_restarts_eval_metric_writer(): def test_llmobs_fork_recreates_and_restarts_evaluator_runner(mock_ragas_evaluator): """Test that forking a process correctly recreates and restarts the EvaluatorRunner.""" pytest.importorskip("ragas") - with override_env(dict(_DD_LLMOBS_EVALUATORS="ragas_faithfulness")): + with override_env(dict(DD_LLMOBS_EVALUATORS="ragas_faithfulness")): with mock.patch("ddtrace.llmobs._evaluators.runner.EvaluatorRunner.periodic"): llmobs_service.enable(_tracer=DummyTracer(), ml_app="test_app") original_pid = llmobs_service._instance.tracer._pid @@ -1464,9 +1464,9 @@ def test_llmobs_fork_submit_evaluation(monkeypatch): def test_llmobs_fork_evaluator_runner_run(monkeypatch): """Test that forking a process correctly encodes new spans created in each process.""" - monkeypatch.setenv("_DD_LLMOBS_EVALUATOR_INTERVAL", 5.0) + monkeypatch.setenv("DD_LLMOBS_EVALUATOR_INTERVAL", 5.0) pytest.importorskip("ragas") - monkeypatch.setenv("_DD_LLMOBS_EVALUATORS", "ragas_faithfulness") + monkeypatch.setenv("DD_LLMOBS_EVALUATORS", "ragas_faithfulness") with mock.patch("ddtrace.llmobs._evaluators.runner.EvaluatorRunner.periodic"): llmobs_service.enable(_tracer=DummyTracer(), ml_app="test_app", api_key="test_api_key") pid = os.fork() @@ -1757,7 +1757,7 @@ async def test_annotation_context_async_nested(llmobs): def test_service_enable_starts_evaluator_runner_when_evaluators_exist(): pytest.importorskip("ragas") with override_global_config(dict(_dd_api_key="", _llmobs_ml_app="")): - with override_env(dict(_DD_LLMOBS_EVALUATORS="ragas_faithfulness")): + with override_env(dict(DD_LLMOBS_EVALUATORS="ragas_faithfulness")): dummy_tracer = DummyTracer() llmobs_service.enable(_tracer=dummy_tracer) llmobs_instance = llmobs_service._instance From 4d20460faeeedd3e0d288ebbb7e29203b7dbd01f Mon Sep 17 00:00:00 2001 From: Christoph Hamsen <37963496+xopham@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:35:26 +0100 Subject: [PATCH 32/63] ci: pin all GitHub Actions by SHA and update via dependabot (#12189) --- .github/dependabot.yml | 15 ++++ .github/workflows/backport.yml | 2 +- .github/workflows/build-and-publish-image.yml | 8 +- .github/workflows/build_deploy.yml | 12 +-- .github/workflows/build_python_3.yml | 14 ++-- .github/workflows/changelog.yml | 6 +- .github/workflows/check_old_target_branch.yml | 2 +- .github/workflows/codeowners.yml | 8 +- .github/workflows/codeql-analysis.yml | 8 +- .github/workflows/django-overhead-profile.yml | 6 +- .github/workflows/encoders-profile.yml | 6 +- .github/workflows/flask-overhead-profile.yml | 6 +- .../workflows/generate-package-versions.yml | 24 +++--- .../workflows/generate-supported-versions.yml | 22 +++--- .github/workflows/pr-name.yml | 6 +- .github/workflows/profiling-native.yml | 4 +- .github/workflows/prune_workflow.yml | 2 +- .github/workflows/pytorch_gpu_tests.yml | 8 +- .github/workflows/require-checklist.yaml | 2 +- .github/workflows/requirements-locks.yml | 2 +- .github/workflows/rust-ci.yml | 2 +- .github/workflows/set-target-milestone.yml | 6 +- .github/workflows/stale.yml | 2 +- .github/workflows/system-tests.yml | 24 +++--- .github/workflows/test_frameworks.yml | 76 +++++++++---------- .github/workflows/test_lib_injection.yml | 2 +- .github/workflows/unit_tests.yml | 6 +- .github/workflows/upstream-issues.yml | 4 +- 28 files changed, 150 insertions(+), 135 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..c272b36b581 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + groups: + gh-actions-packages: + patterns: + - "*" diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index 3dc596bb2f9..ac3fc0c8702 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -24,7 +24,7 @@ jobs: ) ) steps: - - uses: tibdex/backport@v2 + - uses: tibdex/backport@9565281eda0731b1d20c4025c43339fb0a23812e # v2.0.4 with: github_token: ${{ secrets.GITHUB_TOKEN }} body_template: "Backport <%= mergeCommitSha %> from #<%= number %> to <%= base %>.\n\n<%= body %>" diff --git a/.github/workflows/build-and-publish-image.yml b/.github/workflows/build-and-publish-image.yml index 55647245109..da0bd86f550 100644 --- a/.github/workflows/build-and-publish-image.yml +++ b/.github/workflows/build-and-publish-image.yml @@ -30,21 +30,21 @@ jobs: contents: read packages: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2.10.0 with: # Images after this version (>=v0.10) are incompatible with gcr and aws. version: v0.9.1 # https://github.com/docker/buildx/issues/1533 - name: Login to Docker run: docker login -u publisher -p ${{ secrets.token }} ghcr.io - name: Docker Build - uses: docker/build-push-action@v4 + uses: docker/build-push-action@0a97817b6ade9f46837855d676c4cca3a2471fc9 # v4.2.1 with: push: true tags: ${{ inputs.tags }} diff --git a/.github/workflows/build_deploy.yml b/.github/workflows/build_deploy.yml index 1a13a751d29..179ed367141 100644 --- a/.github/workflows/build_deploy.yml +++ b/.github/workflows/build_deploy.yml @@ -33,13 +33,13 @@ jobs: name: Build source distribution runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Include all history and tags with: persist-credentials: false fetch-depth: 0 - - uses: actions-rust-lang/setup-rust-toolchain@v1 - - uses: actions/setup-python@v5 + - uses: actions-rust-lang/setup-rust-toolchain@11df97af8e8102fd60b60a77dfbf58d40cd843b8 # v1.10.1 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 name: Install Python with: python-version: '3.12' @@ -47,7 +47,7 @@ jobs: run: | pip install "setuptools_scm[toml]>=4" "cython" "cmake>=3.24.2,<3.28" "setuptools-rust" python setup.py sdist - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: source-dist path: dist/*.tar.gz @@ -60,10 +60,10 @@ jobs: container: image: python:3.9-alpine steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: source-dist path: dist diff --git a/.github/workflows/build_python_3.yml b/.github/workflows/build_python_3.yml index f03c3c1bdcd..663eb8b5077 100644 --- a/.github/workflows/build_python_3.yml +++ b/.github/workflows/build_python_3.yml @@ -19,10 +19,10 @@ jobs: outputs: include: ${{steps.set-matrix.outputs.include}} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: '3.8' - run: pip install cibuildwheel==2.22.0 @@ -52,13 +52,13 @@ jobs: include: ${{ fromJson(needs.build-wheels-matrix.outputs.include) }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Include all history and tags with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: matrix.os != 'arm-4core-linux' name: Install Python with: @@ -79,7 +79,7 @@ jobs: - name: Set up QEMU if: runner.os == 'Linux' && matrix.os != 'arm-4core-linux' - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 with: platforms: all @@ -120,7 +120,7 @@ jobs: - name: Build wheels if: always() && matrix.os != 'arm-4core-linux' - uses: pypa/cibuildwheel@v2.22.0 + uses: pypa/cibuildwheel@ee63bf16da6cddfb925f542f2c7b59ad50e93969 # v2.22.0 with: only: ${{ matrix.only }} env: @@ -166,7 +166,7 @@ jobs: run: | chcp 65001 #set code page to utf-8 echo "ARTIFACT_NAME=${{ matrix.only }}" >> $env:GITHUB_ENV - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: wheels-${{ env.ARTIFACT_NAME }} path: ./wheelhouse/*.whl diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index aa705d8a02f..b3a4e8107a3 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -12,7 +12,7 @@ jobs: name: Validate changelog runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Include all history and tags with: persist-credentials: false @@ -26,7 +26,7 @@ jobs: if: github.event_name == 'pull_request' run: scripts/check-releasenotes - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 name: Install Python with: python-version: '3.8' @@ -43,7 +43,7 @@ jobs: rst2html.py CHANGELOG.rst CHANGELOG.html - name: Upload CHANGELOG.rst - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: changelog path: | diff --git a/.github/workflows/check_old_target_branch.yml b/.github/workflows/check_old_target_branch.yml index 73925f75290..a2308ae9e89 100644 --- a/.github/workflows/check_old_target_branch.yml +++ b/.github/workflows/check_old_target_branch.yml @@ -26,7 +26,7 @@ jobs: - name: Old branch warning on PR if: env.old_branch == 'true' - uses: thollander/actions-comment-pull-request@v2 + uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0 with: message: | 🚫 **This target branch is too old or unsupported. Please update the target branch to continue.** diff --git a/.github/workflows/codeowners.yml b/.github/workflows/codeowners.yml index 3a0b5993058..03335a44eea 100644 --- a/.github/workflows/codeowners.yml +++ b/.github/workflows/codeowners.yml @@ -10,15 +10,15 @@ jobs: permissions: pull-requests: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false fetch-depth: 0 - name: Get changed files id: changed-files - uses: tj-actions/changed-files@v44 + uses: tj-actions/changed-files@c65cd883420fd2eb864698a825fc4162dd94482c # v44.5.7 - name: Setup go - uses: actions/setup-go@v5 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 - name: Install codeowners run: go install github.com/hmarr/codeowners/cmd/codeowners@latest - name: List owners of all changed files @@ -29,7 +29,7 @@ jobs: echo "$(codeowners ${{ steps.changed-files.outputs.all_changed_files }})" >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" - name: Comment PR - uses: thollander/actions-comment-pull-request@v2 + uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0 with: filePath: resolved.txt comment_tag: codeowners_resolved diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 5af69a81073..07db9ebcf6d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -26,13 +26,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@b8d3b6e8af63cde30bdc382c0bc28114f4346c88 # v2.28.1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -42,7 +42,7 @@ jobs: config-file: .github/codeql-config.yml - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@b8d3b6e8af63cde30bdc382c0bc28114f4346c88 # v2.28.1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@b8d3b6e8af63cde30bdc382c0bc28114f4346c88 # v2.28.1 diff --git a/.github/workflows/django-overhead-profile.yml b/.github/workflows/django-overhead-profile.yml index 8fb697daa14..bb0933c237b 100644 --- a/.github/workflows/django-overhead-profile.yml +++ b/.github/workflows/django-overhead-profile.yml @@ -31,12 +31,12 @@ jobs: run: working-directory: ddtrace steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false path: ddtrace - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.10" @@ -48,7 +48,7 @@ jobs: run: | bash scripts/profiles/django-simple/run.sh ${PREFIX} - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: django-overhead-profile${{ matrix.suffix }} path: ${{ github.workspace }}/prefix/artifacts diff --git a/.github/workflows/encoders-profile.yml b/.github/workflows/encoders-profile.yml index ed77daa6d5a..9c0cb8f7321 100644 --- a/.github/workflows/encoders-profile.yml +++ b/.github/workflows/encoders-profile.yml @@ -19,12 +19,12 @@ jobs: run: working-directory: ddtrace steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false path: ddtrace - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.10" @@ -40,7 +40,7 @@ jobs: sed -i 's|${{ github.workspace }}/ddtrace/||g' ${PREFIX}/artifacts/$a done - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: encoders-profile path: ${{ github.workspace }}/prefix/artifacts diff --git a/.github/workflows/flask-overhead-profile.yml b/.github/workflows/flask-overhead-profile.yml index 8f4dce9e5c7..43ae7a24262 100644 --- a/.github/workflows/flask-overhead-profile.yml +++ b/.github/workflows/flask-overhead-profile.yml @@ -19,12 +19,12 @@ jobs: run: working-directory: ddtrace steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false path: ddtrace - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.10" @@ -36,7 +36,7 @@ jobs: run: | bash scripts/profiles/flask-simple/run.sh ${PREFIX} - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: flask-overhead-profile path: ${{ github.workspace }}/prefix/artifacts diff --git a/.github/workflows/generate-package-versions.yml b/.github/workflows/generate-package-versions.yml index b8729e882c9..5bb5f7a2f89 100644 --- a/.github/workflows/generate-package-versions.yml +++ b/.github/workflows/generate-package-versions.yml @@ -15,50 +15,50 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: Setup Python 3.7 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.7" - name: Setup Python 3.8 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.8" - name: Setup Python 3.9 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.9" - name: Setup Python 3.10 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.10" - name: Setup Python 3.11 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.11" - name: Setup Python 3.12 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" - name: Setup Python 3.13 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.13" - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Install Docker Compose run: | @@ -75,7 +75,7 @@ jobs: sudo apt-get install -y libmariadb-dev - name: Install hatch - uses: pypa/hatch@install + uses: pypa/hatch@257e27e51a6a5616ed08a39a408a21c35c9931bc # install with: version: "1.12.0" @@ -97,7 +97,7 @@ jobs: - name: Create Pull Request id: pr - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0 with: token: ${{ secrets.GITHUB_TOKEN }} branch: "upgrade-latest-${{ env.VENV_NAME }}-version" diff --git a/.github/workflows/generate-supported-versions.yml b/.github/workflows/generate-supported-versions.yml index c802e91bcf3..ed2a0c44308 100644 --- a/.github/workflows/generate-supported-versions.yml +++ b/.github/workflows/generate-supported-versions.yml @@ -13,50 +13,50 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: Setup Python 3.7 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.7" - name: Setup Python 3.8 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.8" - name: Setup Python 3.9 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.9" - name: Setup Python 3.10 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.10" - name: Setup Python 3.11 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.11" - name: Setup Python 3.12 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" - name: Setup Python 3.13 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.13" - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Install system dependencies run: | @@ -84,7 +84,7 @@ jobs: - name: Create Pull Request id: pr - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0 with: token: ${{ secrets.GITHUB_TOKEN }} branch: "update-supported-versions" diff --git a/.github/workflows/pr-name.yml b/.github/workflows/pr-name.yml index a66c9f506e8..bbeb199f615 100644 --- a/.github/workflows/pr-name.yml +++ b/.github/workflows/pr-name.yml @@ -9,11 +9,11 @@ jobs: pr_name_lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 name: Install Node.js with: node-version: 16 @@ -21,7 +21,7 @@ jobs: run: | npm install @commitlint/lint@18.6.1 @commitlint/load@18.6.1 @commitlint/config-conventional@18.6.2 @actions/core - name: Lint PR name - uses: actions/github-script@v6.4.1 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: script: | const load = require('@commitlint/load').default; diff --git a/.github/workflows/profiling-native.yml b/.github/workflows/profiling-native.yml index 09dd262b933..668e8070e41 100644 --- a/.github/workflows/profiling-native.yml +++ b/.github/workflows/profiling-native.yml @@ -23,12 +23,12 @@ jobs: sanitizer: ["safety", "thread", "valgrind"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false fetch-depth: 1 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/prune_workflow.yml b/.github/workflows/prune_workflow.yml index 1c8a8479a8c..0f1ae92098d 100644 --- a/.github/workflows/prune_workflow.yml +++ b/.github/workflows/prune_workflow.yml @@ -50,7 +50,7 @@ jobs: actions: write steps: - name: Delete workflow runs - uses: Mattraks/delete-workflow-runs@v2 + uses: Mattraks/delete-workflow-runs@4c9f24749b7996562658e3d6e10662489e22caca # v2.0.0 with: token: ${{ github.token }} repository: ${{ github.repository }} diff --git a/.github/workflows/pytorch_gpu_tests.yml b/.github/workflows/pytorch_gpu_tests.yml index 1db504ae61d..0f522819ff1 100644 --- a/.github/workflows/pytorch_gpu_tests.yml +++ b/.github/workflows/pytorch_gpu_tests.yml @@ -16,23 +16,23 @@ jobs: unit-tests: runs-on: APM-4-CORE-GPU-LINUX steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Include all history and tags with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 name: Install Python with: python-version: '3.12' - - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions-rust-lang/setup-rust-toolchain@11df97af8e8102fd60b60a77dfbf58d40cd843b8 # v1.10.1 - name: Install latest stable toolchain and rustfmt run: rustup update stable && rustup default stable && rustup component add rustfmt clippy - name: Install hatch - uses: pypa/hatch@install + uses: pypa/hatch@257e27e51a6a5616ed08a39a408a21c35c9931bc # install with: version: "1.12.0" diff --git a/.github/workflows/require-checklist.yaml b/.github/workflows/require-checklist.yaml index 521e28573bb..8d30dfa53f8 100644 --- a/.github/workflows/require-checklist.yaml +++ b/.github/workflows/require-checklist.yaml @@ -6,7 +6,7 @@ jobs: require-checklist: runs-on: ubuntu-latest steps: - - uses: mheap/require-checklist-action@v2 + - uses: mheap/require-checklist-action@efef3b1b39d03d12be5ce427c15064f287ba5843 # v2.4.0 with: # require a checklist to be present in the PR description requireChecklist: true diff --git a/.github/workflows/requirements-locks.yml b/.github/workflows/requirements-locks.yml index 23a1c05a517..a61506dddf0 100644 --- a/.github/workflows/requirements-locks.yml +++ b/.github/workflows/requirements-locks.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest container: ghcr.io/datadog/dd-trace-py/testrunner:0a50e839f4b1600f02157518b8d016451b346578@sha256:5dae9bc7872f69b31b612690f0748c7ad71ab90ef28a754b2ae93d0ba505837b steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false fetch-depth: 0 diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index 3241a0b763e..cb79f7eda4a 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -13,7 +13,7 @@ jobs: matrix: extension: ["src/native"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: Install latest stable toolchain and rustfmt diff --git a/.github/workflows/set-target-milestone.yml b/.github/workflows/set-target-milestone.yml index 31dcb1a9938..ce6f775ceb7 100644 --- a/.github/workflows/set-target-milestone.yml +++ b/.github/workflows/set-target-milestone.yml @@ -12,12 +12,12 @@ jobs: name: Add milestone to merged pull requests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Include all history and tags with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 name: Install Python with: python-version: '3.8' @@ -29,7 +29,7 @@ jobs: scripts/get-target-milestone.py - name: Update Pull Request if: steps.milestones.outputs.milestone != null - uses: actions/github-script@v6.4.1 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 63a045d498b..608f5b331c9 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,7 +12,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 with: # DEV: GitHub Actions have an API rate limit of 1000 operations per hour per repository # This limit is shared across all actions diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index 3f9d9308c83..443be12b62d 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout system tests - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false repository: 'DataDog/system-tests' @@ -29,7 +29,7 @@ jobs: run: | docker image save system_tests/agent:latest | gzip > agent_${{ github.sha }}.tar.gz - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: agent_${{ github.sha }} path: | @@ -62,13 +62,13 @@ jobs: steps: - name: Checkout system tests - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false repository: 'DataDog/system-tests' - name: Checkout dd-trace-py - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false path: 'binaries/dd-trace-py' @@ -85,7 +85,7 @@ jobs: run: | docker image save system_tests/weblog:latest | gzip > ${{ matrix.weblog-variant}}_weblog_${{ github.sha }}.tar.gz - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.weblog-variant }}_${{ github.sha }} path: | @@ -114,7 +114,7 @@ jobs: steps: - name: Checkout system tests - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false repository: 'DataDog/system-tests' @@ -122,12 +122,12 @@ jobs: - name: Build runner uses: ./.github/actions/install_runner - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: ${{ matrix.weblog-variant }}_${{ github.sha }} path: images_artifacts/ - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: agent_${{ github.sha }} path: images_artifacts/ @@ -273,7 +273,7 @@ jobs: run: tar -czvf artifact.tar.gz $(ls | grep logs) - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 if: always() && steps.docker_load.outcome == 'success' with: name: logs_${{ matrix.weblog-variant }}_${{ matrix.scenario }} @@ -287,12 +287,12 @@ jobs: TEST_LIBRARY: python steps: - name: Checkout system tests - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false repository: 'DataDog/system-tests' - name: Checkout dd-trace-py - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false path: 'binaries/dd-trace-py' @@ -312,7 +312,7 @@ jobs: run: tar -czvf artifact.tar.gz $(ls | grep logs) - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 if: always() && steps.build_runner.outcome == 'success' with: name: logs_parametric diff --git a/.github/workflows/test_frameworks.yml b/.github/workflows/test_frameworks.yml index 2e1502b4d3d..378806e11ba 100644 --- a/.github/workflows/test_frameworks.yml +++ b/.github/workflows/test_frameworks.yml @@ -25,7 +25,7 @@ jobs: outputs: outcome: ${{ steps.run_needed.outcome }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - id: run_needed @@ -71,16 +71,16 @@ jobs: run: working-directory: bottle steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: path: ddtrace persist-credentials: false - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false @@ -170,19 +170,19 @@ jobs: run: working-directory: django steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false repository: django/django ref: 5.0.7 path: django - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: "3.11" @@ -268,12 +268,12 @@ jobs: run: working-directory: graphene steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false @@ -282,7 +282,7 @@ jobs: # Unreleased CI fix: https://github.com/graphql-python/graphene/pull/1412 ref: 03277a55123fd2f8a8465c5fa671f7fb0d004c26 path: graphene - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: "3.9" @@ -338,23 +338,23 @@ jobs: run: working-directory: fastapi steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false repository: tiangolo/fastapi ref: 0.92.0 path: fastapi - - uses: actions/cache@v4.1.2 + - uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 if: needs.needs-run.outputs.outcome == 'success' id: cache with: @@ -409,19 +409,19 @@ jobs: run: working-directory: flask steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false repository: pallets/flask ref: 3.0.3 path: flask - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.12' @@ -461,19 +461,19 @@ jobs: run: working-directory: httpx steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false repository: encode/httpx ref: 0.22.0 path: httpx - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' @@ -535,19 +535,19 @@ jobs: run: working-directory: mako steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false repository: sqlalchemy/mako ref: rel_1_3_5 path: mako - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.12' @@ -603,16 +603,16 @@ jobs: run: working-directory: starlette steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false @@ -670,16 +670,16 @@ jobs: run: working-directory: requests steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false @@ -739,16 +739,16 @@ jobs: run: working-directory: asyncpg steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false @@ -796,16 +796,16 @@ jobs: run: working-directory: gunicorn steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false @@ -855,16 +855,16 @@ jobs: run: working-directory: uwsgi steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 if: needs.needs-run.outputs.outcome == 'success' with: python-version: '3.9' - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false path: ddtrace - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: needs.needs-run.outputs.outcome == 'success' with: persist-credentials: false diff --git a/.github/workflows/test_lib_injection.yml b/.github/workflows/test_lib_injection.yml index c30988db6d1..9e7ebbe0935 100644 --- a/.github/workflows/test_lib_injection.yml +++ b/.github/workflows/test_lib_injection.yml @@ -31,7 +31,7 @@ jobs: - "3.12" - "3.13" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: Install pyenv diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 3de25fa22b0..f3d867796fd 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -19,18 +19,18 @@ jobs: python-version: ["3.7", "3.10", "3.12"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Include all history and tags with: persist-credentials: false fetch-depth: 0 - - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions-rust-lang/setup-rust-toolchain@11df97af8e8102fd60b60a77dfbf58d40cd843b8 # v1.10.1 - name: Install latest stable toolchain and rustfmt run: rustup update stable && rustup default stable && rustup component add rustfmt clippy - name: Install hatch - uses: pypa/hatch@install + uses: pypa/hatch@257e27e51a6a5616ed08a39a408a21c35c9931bc # install with: version: "1.12.0" diff --git a/.github/workflows/upstream-issues.yml b/.github/workflows/upstream-issues.yml index 5c838bc894c..d0862034cb2 100644 --- a/.github/workflows/upstream-issues.yml +++ b/.github/workflows/upstream-issues.yml @@ -7,10 +7,10 @@ jobs: upstream-issues: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - - uses: Kyle-Verhoog/upstream-issue-notifier@v0.1.3 + - uses: Kyle-Verhoog/upstream-issue-notifier@673cde7836a29e5549146261217982ce0cf91858 # v0.1.3 env: GITHUB_TOKEN: ${{ github.token }} IGNORE_DIRS: ddtrace/vendor From 1b095284a4ae262aaa1846c2d5bdb91e6db8471a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Mon, 3 Feb 2025 13:47:13 +0000 Subject: [PATCH 33/63] feat(ci_visibility): make pytest v2 plugin the default version (#12066) Previously, the pytest v2 plugin was disabled by default, and could be enabled by setting the `DD_PYTEST_USE_NEW_PLUGIN_BETA` variable to true. In ddtrace 3.0, the pytest v2 plugin will be *enabled* by default, and `DD_PYTEST_USE_NEW_PLUGIN_BETA` will not be used anymore. For now I'm not removing the code for the old plugin version. Instead, I'm adding an internal environment variable `_DD_PYTEST_USE_LEGACY_PLUGIN` that allows running pytest with the old plugin, and using that in the tests that depend on it. We can remove the code (and the variable) after the 3.x release, since this is not part of the public interface. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .gitlab/tests.yml | 1 - ddtrace/contrib/internal/pytest/_plugin_v1.py | 5 ++-- ddtrace/contrib/internal/pytest/_plugin_v2.py | 18 +++++++------- ddtrace/contrib/internal/pytest/_utils.py | 2 +- docs/configuration.rst | 16 ------------- hatch.toml | 8 ++----- ...at-pytest-v2-default-db160906c0ba26dc.yaml | 19 +++++++++++++++ riotfile.py | 24 ++++++++----------- ...st_appsec_flask_pytest_iast_no_snapshot.py | 6 ++--- tests/contrib/pytest/test_pytest_snapshot.py | 3 +++ .../contrib/pytest/test_pytest_snapshot_v2.py | 3 --- .../contrib/selenium/test_selenium_chrome.py | 6 ++--- 12 files changed, 52 insertions(+), 59 deletions(-) create mode 100644 releasenotes/notes/ci_visibility-feat-pytest-v2-default-db160906c0ba26dc.yaml diff --git a/.gitlab/tests.yml b/.gitlab/tests.yml index b8c9a3d9897..80c08f543d9 100644 --- a/.gitlab/tests.yml +++ b/.gitlab/tests.yml @@ -6,7 +6,6 @@ stages: variables: RIOT_RUN_CMD: riot -P -v run --exitfirst --pass-env -s REPO_LANG: python # "python" is used everywhere rather than "py" - DD_PYTEST_USE_NEW_PLUGIN_BETA: "true" PYTEST_ADDOPTS: "-s" # CI_DEBUG_SERVICES: "true" diff --git a/ddtrace/contrib/internal/pytest/_plugin_v1.py b/ddtrace/contrib/internal/pytest/_plugin_v1.py index fc4982bdc67..d45a925f773 100644 --- a/ddtrace/contrib/internal/pytest/_plugin_v1.py +++ b/ddtrace/contrib/internal/pytest/_plugin_v1.py @@ -452,9 +452,8 @@ def pytest_load_initial_conftests(early_config, parser, args): def pytest_configure(config): deprecate( - "this version of the pytest ddtrace plugin is slated for deprecation", - message="set DD_PYTEST_USE_NEW_PLUGIN_BETA=true in your environment to preview the next version of the plugin.", - removal_version="3.0.0", + "this version of the pytest ddtrace plugin is deprecated", + message="remove _DD_PYTEST_USE_LEGACY_PLUGIN from your environment to use the currently supported version.", category=DDTraceDeprecationWarning, ) unpatch_unittest() diff --git a/ddtrace/contrib/internal/pytest/_plugin_v2.py b/ddtrace/contrib/internal/pytest/_plugin_v2.py index 0b25af62e51..79435f94576 100644 --- a/ddtrace/contrib/internal/pytest/_plugin_v2.py +++ b/ddtrace/contrib/internal/pytest/_plugin_v2.py @@ -1,3 +1,4 @@ +import os from pathlib import Path import re import typing as t @@ -182,7 +183,6 @@ def pytest_load_initial_conftests(early_config, parser, args): try: take_over_logger_stream_handler() - log.warning("This version of the ddtrace pytest plugin is currently in beta.") # Freezegun is proactively patched to avoid it interfering with internal timing patch(freezegun=True) dd_config.test_visibility.itr_skipping_level = ITR_SKIPPING_LEVEL.SUITE @@ -199,14 +199,14 @@ def pytest_load_initial_conftests(early_config, parser, args): def pytest_configure(config: pytest_Config) -> None: - # The only way we end up in pytest_configure is if the environment variable is being used, and logging the warning - # now ensures it shows up in output regardless of the use of the -s flag - deprecate( - "the DD_PYTEST_USE_NEW_PLUGIN_BETA environment variable is deprecated", - message="this preview version of the pytest ddtrace plugin will become the only version.", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) + if os.getenv("DD_PYTEST_USE_NEW_PLUGIN_BETA"): + # Logging the warning at this point ensures it shows up in output regardless of the use of the -s flag. + deprecate( + "the DD_PYTEST_USE_NEW_PLUGIN_BETA environment variable is deprecated", + message="the new pytest plugin is now the default version. No additional configurations are required.", + removal_version="3.0.0", + category=DDTraceDeprecationWarning, + ) try: if is_enabled(config): diff --git a/ddtrace/contrib/internal/pytest/_utils.py b/ddtrace/contrib/internal/pytest/_utils.py index 7e8b2bc2714..f2af0bd47bd 100644 --- a/ddtrace/contrib/internal/pytest/_utils.py +++ b/ddtrace/contrib/internal/pytest/_utils.py @@ -30,7 +30,7 @@ _NODEID_REGEX = re.compile("^(((?P.*)/)?(?P[^/]*?))::(?P.*?)$") -_USE_PLUGIN_V2 = asbool(os.environ.get("DD_PYTEST_USE_NEW_PLUGIN_BETA", "false")) +_USE_PLUGIN_V2 = not asbool(os.environ.get("_DD_PYTEST_USE_LEGACY_PLUGIN", "false")) class _PYTEST_STATUS: diff --git a/docs/configuration.rst b/docs/configuration.rst index 853050195fe..276656cc1d6 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -616,22 +616,6 @@ Test Visibility version_added: v2.16.0: - DD_PYTEST_USE_NEW_PLUGIN_BETA: - type: Boolean - default: False - - description: | - Configures the ``CIVisibility`` service to use a beta release of the new version of the pytest plugin, - supporting `Auto Test Retries `_, - `Early Flake Detection `_, and - improved coverage collection for `Test Impact Analysis - `_. This version of the plugin will become the default in - the future. See the `release notes for v2.18.0 `_ - for more information. - - version_added: - v2.18.0: - DD_CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS: type: Integer default: 500 diff --git a/hatch.toml b/hatch.toml index d0063aaa751..554db588865 100644 --- a/hatch.toml +++ b/hatch.toml @@ -558,7 +558,6 @@ dependencies = [ ] [envs.pytest_plugin_v2.env-vars] -DD_PYTEST_USE_NEW_PLUGIN_BETA = "true" DD_AGENT_PORT = "9126" [envs.pytest_plugin_v2.scripts] @@ -599,9 +598,6 @@ dependencies = [ "hypothesis", ] -[envs.freezegun.env-vars] -DD_PYTEST_USE_NEW_PLUGIN_BETA = "true" - [envs.freezegun.scripts] test = [ "pytest tests/contrib/freezegun {args:}", @@ -637,6 +633,6 @@ tested_pytest_plugin_version = ["v1", "v2"] [envs.selenium.overrides] matrix.tested_pytest_plugin_version.env-vars = [ - { key = "_TESTED_PYTEST_PLUGIN_VERSION", value = "false", if = ["v1"]}, - { key = "_TESTED_PYTEST_PLUGIN_VERSION", value = "true", if = ["v2"]} + { key = "_TESTED_PYTEST_LEGACY_PLUGIN", value = "true", if = ["v1"]}, + { key = "_TESTED_PYTEST_LEGACY_PLUGIN", value = "false", if = ["v2"]} ] diff --git a/releasenotes/notes/ci_visibility-feat-pytest-v2-default-db160906c0ba26dc.yaml b/releasenotes/notes/ci_visibility-feat-pytest-v2-default-db160906c0ba26dc.yaml new file mode 100644 index 00000000000..f2987f4c4fd --- /dev/null +++ b/releasenotes/notes/ci_visibility-feat-pytest-v2-default-db160906c0ba26dc.yaml @@ -0,0 +1,19 @@ +--- +upgrade: + - | + CI Visibility: Official release of the new version of the pytest plugin, introducing the following features: + - `Auto Test Retries `_ + - `Early Flake Detection `_ + - Improved coverage collection for `Test Impact Analysis `_ + (formerly Intelligent Test Runner), using an internal collection method instead of `coverage.py + `_, with improved dependency discovery. + + **NOTE:** this new version of the plugin introduces breaking changes: + - ``module``, ``suite``, and ``test`` names are now parsed from the ``item.nodeid`` attribute + - test names now include the class for class-based tests + - Test skipping by Test Impact Analysis (formerly Intelligent Test Runner) is now done at the suite level, instead + of at the test level + + A beta version of the plugin had been available since v2.18.0, and could be enabled via the + ``DD_PYTEST_USE_NEW_PLUGIN_BETA`` environment variable. The new version is now the default, and the environment + variable is not used anymore. diff --git a/riotfile.py b/riotfile.py index dac8b01fc0c..23ba3e78465 100644 --- a/riotfile.py +++ b/riotfile.py @@ -103,7 +103,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "DD_INJECT_FORCE": "1", "DD_PATCH_MODULES": "unittest:false", "CMAKE_BUILD_PARALLEL_LEVEL": "12", - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "true", }, venvs=[ Venv( @@ -1604,7 +1603,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, env={ "DD_AGENT_PORT": "9126", - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "1", }, venvs=[ Venv( @@ -1634,12 +1632,12 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "0", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "true", }, ), Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "1", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "false", }, ), ], @@ -1662,12 +1660,12 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "0", + "DD_PYTEST_LEGACY_PLUGIN": "true", }, ), Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "1", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "false", }, ), ], @@ -1734,12 +1732,12 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "0", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "true", }, ), Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "1", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "false", }, ), ], @@ -1755,12 +1753,12 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "0", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "true", }, ), Venv( env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "1", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "false", }, ), ], @@ -1783,7 +1781,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ] }, env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "0", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "true", }, ), Venv( @@ -1793,7 +1791,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ] }, env={ - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "1", + "_DD_PYTEST_USE_LEGACY_PLUGIN": "false", }, ), ], @@ -3072,8 +3070,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT env={ "DD_PROFILING_ENABLE_ASSERTS": "1", "DD_PROFILING_EXPORT_LIBDD_ENABLED": "1", - # Enable pytest v2 plugin to handle pytest-cpp items in the test suite - "DD_PYTEST_USE_NEW_PLUGIN_BETA": "1", "CPUCOUNT": "12", }, pkgs={ diff --git a/tests/contrib/flask/test_appsec_flask_pytest_iast_no_snapshot.py b/tests/contrib/flask/test_appsec_flask_pytest_iast_no_snapshot.py index 801cffa4b8a..07f95a55933 100644 --- a/tests/contrib/flask/test_appsec_flask_pytest_iast_no_snapshot.py +++ b/tests/contrib/flask/test_appsec_flask_pytest_iast_no_snapshot.py @@ -9,8 +9,8 @@ @pytest.mark.parametrize("iast_enabled", ["true", "false"]) @pytest.mark.parametrize("iast_request_sampling", ["100.0", "0.0"]) -@pytest.mark.parametrize("pytest_use_new_plugin", ["true", "false"]) -def test_flask_pytest_iast(iast_enabled, iast_request_sampling, pytest_use_new_plugin): +@pytest.mark.parametrize("pytest_use_legacy_plugin", ["false", "true"]) +def test_flask_pytest_iast(iast_enabled, iast_request_sampling, pytest_use_legacy_plugin): from tests.utils import _build_env env = _build_env() @@ -21,7 +21,7 @@ def test_flask_pytest_iast(iast_enabled, iast_request_sampling, pytest_use_new_p "DD_TRACE_SQLITE_ENABLED": "0", "DD_IAST_ENABLED": iast_enabled, "DD_TRACE_DEBUG": "true", - "DD_PYTEST_USE_NEW_PLUGIN_BETA": pytest_use_new_plugin, + "_DD_PYTEST_USE_LEGACY_PLUGIN": pytest_use_legacy_plugin, "DD_IAST_REQUEST_SAMPLING": iast_request_sampling, # "DD_API_KEY": "invalidapikey", # "DD_CIVISIBILITY_AGENTLESS_ENABLED": "1", diff --git a/tests/contrib/pytest/test_pytest_snapshot.py b/tests/contrib/pytest/test_pytest_snapshot.py index 8b298c28c95..17876eea2f0 100644 --- a/tests/contrib/pytest/test_pytest_snapshot.py +++ b/tests/contrib/pytest/test_pytest_snapshot.py @@ -85,6 +85,7 @@ def test_add_two_number_list(): DD_PATCH_MODULES="sqlite3:false", CI_PROJECT_DIR=str(self.testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", + _DD_PYTEST_USE_LEGACY_PLUGIN="true", ) ), ) @@ -130,6 +131,7 @@ def test_add_two_number_list(): DD_PATCH_MODULES="sqlite3:false", CI_PROJECT_DIR=str(self.testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", + _DD_PYTEST_USE_LEGACY_PLUGIN="true", ) ), ) @@ -164,6 +166,7 @@ def test_call_urllib(): DD_CIVISIBILITY_ITR_ENABLED="false", CI_PROJECT_DIR=str(self.testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", + _DD_PYTEST_USE_LEGACY_PLUGIN="true", DD_PATCH_MODULES="httpx:true", ) ), diff --git a/tests/contrib/pytest/test_pytest_snapshot_v2.py b/tests/contrib/pytest/test_pytest_snapshot_v2.py index dad546df23b..f7a123129a6 100644 --- a/tests/contrib/pytest/test_pytest_snapshot_v2.py +++ b/tests/contrib/pytest/test_pytest_snapshot_v2.py @@ -85,7 +85,6 @@ def test_add_two_number_list(): DD_PATCH_MODULES="sqlite3:false", CI_PROJECT_DIR=str(self.testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", - DD_PYTEST_USE_NEW_PLUGIN_BETA="true", ) ), ) @@ -131,7 +130,6 @@ def test_add_two_number_list(): DD_PATCH_MODULES="sqlite3:false", CI_PROJECT_DIR=str(self.testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", - DD_PYTEST_USE_NEW_PLUGIN_BETA="true", ) ), ) @@ -167,7 +165,6 @@ def test_call_urllib(): CI_PROJECT_DIR=str(self.testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", DD_PATCH_MODULES="httpx:true", - DD_PYTEST_USE_NEW_PLUGIN_BETA="true", ) ), ) diff --git a/tests/contrib/selenium/test_selenium_chrome.py b/tests/contrib/selenium/test_selenium_chrome.py index c8f9c9145c8..d820e384113 100644 --- a/tests/contrib/selenium/test_selenium_chrome.py +++ b/tests/contrib/selenium/test_selenium_chrome.py @@ -116,7 +116,7 @@ def test_selenium_local_pass(): DD_PATCH_MODULES="sqlite3:false", CI_PROJECT_DIR=str(testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", - DD_PYTEST_USE_NEW_PLUGIN_BETA=os.environ.get("_TESTED_PYTEST_PLUGIN_VERSION"), + _DD_PYTEST_USE_LEGACY_PLUGIN=os.environ.get("_TESTED_PYTEST_LEGACY_PLUGIN"), ) ), ) @@ -167,7 +167,7 @@ def test_selenium_local_pass(): DD_PATCH_MODULES="sqlite3:false", CI_PROJECT_DIR=str(testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", - DD_PYTEST_USE_NEW_PLUGIN_BETA=os.environ.get("_TESTED_PYTEST_PLUGIN_VERSION"), + _DD_PYTEST_USE_LEGACY_PLUGIN=os.environ.get("_TESTED_PYTEST_LEGACY_PLUGIN"), ) ), ) @@ -221,7 +221,7 @@ def test_selenium_local_unpatch(): DD_PATCH_MODULES="sqlite3:false", CI_PROJECT_DIR=str(testdir.tmpdir), DD_CIVISIBILITY_AGENTLESS_ENABLED="false", - DD_PYTEST_USE_NEW_PLUGIN_BETA=os.environ.get("_TESTED_PYTEST_PLUGIN_VERSION"), + _DD_PYTEST_USE_LEGACY_PLUGIN=os.environ.get("_TESTED_PYTEST_LEGACY_PLUGIN"), ) ), ) From a22143d2997f78120a5a0e84597b5099892b3f5e Mon Sep 17 00:00:00 2001 From: Federico Mon Date: Mon, 3 Feb 2025 14:58:42 +0100 Subject: [PATCH 34/63] feat(iast): add support for pymysql, mysqldb integrations (#12127) --- .gitlab/services.yml | 8 ++++ .riot/requirements/106990f.txt | 40 ++++++++++++++++++ .riot/requirements/1140d28.txt | 42 +++++++++++++++++++ .riot/requirements/1568a2f.txt | 42 +++++++++++++++++++ .riot/requirements/16a770c.txt | 40 ++++++++++++++++++ .../requirements/{18695ab.txt => 18c560e.txt} | 28 +++++++------ .riot/requirements/1aedbda.txt | 40 ------------------ .riot/requirements/4628049.txt | 38 ----------------- .riot/requirements/58881b9.txt | 40 ------------------ .riot/requirements/63b44e2.txt | 40 ------------------ .riot/requirements/8fd54b8.txt | 42 +++++++++++++++++++ .riot/requirements/aba89a0.txt | 38 ----------------- .../sql_sensitive_analyzer.py | 4 ++ ddtrace/appsec/_iast/constants.py | 4 +- ...iast-pymysql-support-d7f79f0355bb85d1.yaml | 4 ++ riotfile.py | 2 + .../taint_sinks/sql_injection_mysqldb.py | 33 +++++++++++++++ .../taint_sinks/sql_injection_pymysql.py | 33 +++++++++++++++ .../iast/taint_sinks/test_sql_injection.py | 25 ++++++++++- tests/appsec/suitespec.yml | 2 + 20 files changed, 333 insertions(+), 212 deletions(-) create mode 100644 .riot/requirements/106990f.txt create mode 100644 .riot/requirements/1140d28.txt create mode 100644 .riot/requirements/1568a2f.txt create mode 100644 .riot/requirements/16a770c.txt rename .riot/requirements/{18695ab.txt => 18c560e.txt} (65%) delete mode 100644 .riot/requirements/1aedbda.txt delete mode 100644 .riot/requirements/4628049.txt delete mode 100644 .riot/requirements/58881b9.txt delete mode 100644 .riot/requirements/63b44e2.txt create mode 100644 .riot/requirements/8fd54b8.txt delete mode 100644 .riot/requirements/aba89a0.txt create mode 100644 releasenotes/notes/feat-iast-pymysql-support-d7f79f0355bb85d1.yaml create mode 100644 tests/appsec/iast/fixtures/taint_sinks/sql_injection_mysqldb.py create mode 100644 tests/appsec/iast/fixtures/taint_sinks/sql_injection_pymysql.py diff --git a/.gitlab/services.yml b/.gitlab/services.yml index 51e28c38cc5..0282dd9e9d0 100644 --- a/.gitlab/services.yml +++ b/.gitlab/services.yml @@ -77,3 +77,11 @@ rabbitmq: name: registry.ddbuild.io/images/mirror/rabbitmq:3.12.7-management-alpine alias: rabbitmq + mysql: + name: registry.ddbuild.io/images/mirror/mysql:5.7 + alias: mysql + variables: + MYSQL_ROOT_PASSWORD: admin + MYSQL_PASSWORD: test + MYSQL_USER: test + MYSQL_DATABASE: test diff --git a/.riot/requirements/106990f.txt b/.riot/requirements/106990f.txt new file mode 100644 index 00000000000..56ab09719e7 --- /dev/null +++ b/.riot/requirements/106990f.txt @@ -0,0 +1,40 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/106990f.in +# +astunparse==1.6.3 +attrs==24.3.0 +certifi==2024.12.14 +cffi==1.17.1 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +cryptography==44.0.0 +googleapis-common-protos==1.66.0 +greenlet==3.1.1 +grpcio==1.70.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.0.0 +mock==5.1.0 +mysqlclient==2.1.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +psycopg2-binary==2.9.10 +pycparser==2.22 +pycryptodome==3.21.0 +pymysql==1.1.1 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +requests==2.32.3 +simplejson==3.19.3 +six==1.17.0 +sortedcontainers==2.4.0 +sqlalchemy==2.0.22 +typing-extensions==4.12.2 +urllib3==2.3.0 +wheel==0.45.1 diff --git a/.riot/requirements/1140d28.txt b/.riot/requirements/1140d28.txt new file mode 100644 index 00000000000..c88bf934c45 --- /dev/null +++ b/.riot/requirements/1140d28.txt @@ -0,0 +1,42 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/1140d28.in +# +astunparse==1.6.3 +attrs==24.3.0 +certifi==2024.12.14 +cffi==1.17.1 +charset-normalizer==3.4.1 +coverage[toml]==7.6.1 +cryptography==44.0.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.66.0 +greenlet==3.1.1 +grpcio==1.70.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.0.0 +mock==5.1.0 +mysqlclient==2.1.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +psycopg2-binary==2.9.10 +pycparser==2.22 +pycryptodome==3.21.0 +pymysql==1.1.1 +pytest==8.3.4 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +requests==2.32.3 +simplejson==3.19.3 +six==1.17.0 +sortedcontainers==2.4.0 +sqlalchemy==2.0.22 +tomli==2.2.1 +typing-extensions==4.12.2 +urllib3==2.2.3 +wheel==0.45.1 diff --git a/.riot/requirements/1568a2f.txt b/.riot/requirements/1568a2f.txt new file mode 100644 index 00000000000..03419e15f7c --- /dev/null +++ b/.riot/requirements/1568a2f.txt @@ -0,0 +1,42 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/1568a2f.in +# +astunparse==1.6.3 +attrs==24.3.0 +certifi==2024.12.14 +cffi==1.17.1 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +cryptography==44.0.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.66.0 +greenlet==3.1.1 +grpcio==1.70.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.0.0 +mock==5.1.0 +mysqlclient==2.1.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +psycopg2-binary==2.9.10 +pycparser==2.22 +pycryptodome==3.21.0 +pymysql==1.1.1 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +requests==2.32.3 +simplejson==3.19.3 +six==1.17.0 +sortedcontainers==2.4.0 +sqlalchemy==2.0.22 +tomli==2.2.1 +typing-extensions==4.12.2 +urllib3==2.3.0 +wheel==0.45.1 diff --git a/.riot/requirements/16a770c.txt b/.riot/requirements/16a770c.txt new file mode 100644 index 00000000000..629c4bd5c39 --- /dev/null +++ b/.riot/requirements/16a770c.txt @@ -0,0 +1,40 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/16a770c.in +# +astunparse==1.6.3 +attrs==24.3.0 +certifi==2024.12.14 +cffi==1.17.1 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +cryptography==44.0.0 +googleapis-common-protos==1.66.0 +greenlet==3.1.1 +grpcio==1.70.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.0.0 +mock==5.1.0 +mysqlclient==2.1.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +psycopg2-binary==2.9.10 +pycparser==2.22 +pycryptodome==3.21.0 +pymysql==1.1.1 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +requests==2.32.3 +simplejson==3.19.3 +six==1.17.0 +sortedcontainers==2.4.0 +sqlalchemy==2.0.22 +typing-extensions==4.12.2 +urllib3==2.3.0 +wheel==0.45.1 diff --git a/.riot/requirements/18695ab.txt b/.riot/requirements/18c560e.txt similarity index 65% rename from .riot/requirements/18695ab.txt rename to .riot/requirements/18c560e.txt index 85d64016cdd..b34b418c367 100644 --- a/.riot/requirements/18695ab.txt +++ b/.riot/requirements/18c560e.txt @@ -2,37 +2,39 @@ # This file is autogenerated by pip-compile with Python 3.7 # by the following command: # -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/18695ab.in +# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/18c560e.in # astunparse==1.6.3 -attrs==23.2.0 -certifi==2024.6.2 +attrs==24.2.0 +certifi==2024.12.14 cffi==1.15.1 -charset-normalizer==3.3.2 +charset-normalizer==3.4.1 coverage[toml]==7.2.7 -cryptography==42.0.7 -exceptiongroup==1.2.1 -googleapis-common-protos==1.63.1 -greenlet==3.0.3 -grpcio==1.62.2 +cryptography==44.0.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.66.0 +greenlet==3.1.1 +grpcio==1.62.3 hypothesis==6.45.0 -idna==3.7 +idna==3.10 importlib-metadata==6.7.0 iniconfig==2.0.0 mock==5.1.0 +mysqlclient==2.1.1 opentracing==2.4.0 packaging==24.0 pluggy==1.2.0 protobuf==4.24.4 psycopg2-binary==2.9.9 pycparser==2.21 -pycryptodome==3.20.0 +pycryptodome==3.21.0 +pymysql==1.1.1 pytest==7.4.4 pytest-cov==4.1.0 pytest-mock==3.11.1 requests==2.31.0 -simplejson==3.19.2 -six==1.16.0 +simplejson==3.19.3 +six==1.17.0 sortedcontainers==2.4.0 sqlalchemy==2.0.22 tomli==2.0.1 diff --git a/.riot/requirements/1aedbda.txt b/.riot/requirements/1aedbda.txt deleted file mode 100644 index 22280dbbcf1..00000000000 --- a/.riot/requirements/1aedbda.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1aedbda.in -# -astunparse==1.6.3 -attrs==23.2.0 -certifi==2024.6.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -coverage[toml]==7.5.3 -cryptography==42.0.7 -exceptiongroup==1.2.1 -googleapis-common-protos==1.63.1 -greenlet==3.0.3 -grpcio==1.64.1 -hypothesis==6.45.0 -idna==3.7 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.5.0 -protobuf==5.27.0 -psycopg2-binary==2.9.9 -pycparser==2.22 -pycryptodome==3.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -requests==2.32.3 -simplejson==3.19.2 -six==1.16.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.22 -tomli==2.0.1 -typing-extensions==4.12.1 -urllib3==2.2.1 -wheel==0.43.0 diff --git a/.riot/requirements/4628049.txt b/.riot/requirements/4628049.txt deleted file mode 100644 index 2871068f57e..00000000000 --- a/.riot/requirements/4628049.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/4628049.in -# -astunparse==1.6.3 -attrs==23.2.0 -certifi==2024.6.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -coverage[toml]==7.5.3 -cryptography==42.0.7 -googleapis-common-protos==1.63.1 -greenlet==3.0.3 -grpcio==1.64.1 -hypothesis==6.45.0 -idna==3.7 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.5.0 -protobuf==5.27.0 -psycopg2-binary==2.9.9 -pycparser==2.22 -pycryptodome==3.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -requests==2.32.3 -simplejson==3.19.2 -six==1.16.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.22 -typing-extensions==4.12.1 -urllib3==2.2.1 -wheel==0.43.0 diff --git a/.riot/requirements/58881b9.txt b/.riot/requirements/58881b9.txt deleted file mode 100644 index 18d9931d5f0..00000000000 --- a/.riot/requirements/58881b9.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/58881b9.in -# -astunparse==1.6.3 -attrs==23.2.0 -certifi==2024.6.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -coverage[toml]==7.5.3 -cryptography==42.0.7 -exceptiongroup==1.2.1 -googleapis-common-protos==1.63.1 -greenlet==3.0.3 -grpcio==1.64.1 -hypothesis==6.45.0 -idna==3.7 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.5.0 -protobuf==5.27.0 -psycopg2-binary==2.9.9 -pycparser==2.22 -pycryptodome==3.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -requests==2.32.3 -simplejson==3.19.2 -six==1.16.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.22 -tomli==2.0.1 -typing-extensions==4.12.1 -urllib3==2.2.1 -wheel==0.43.0 diff --git a/.riot/requirements/63b44e2.txt b/.riot/requirements/63b44e2.txt deleted file mode 100644 index 25063f7fdc2..00000000000 --- a/.riot/requirements/63b44e2.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with python 3.9 -# To update, run: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/63b44e2.in -# -astunparse==1.6.3 -attrs==23.2.0 -certifi==2024.6.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -coverage[toml]==7.5.3 -cryptography==42.0.7 -exceptiongroup==1.2.1 -googleapis-common-protos==1.63.1 -greenlet==3.0.3 -grpcio==1.64.1 -hypothesis==6.45.0 -idna==3.7 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.5.0 -protobuf==5.27.0 -psycopg2-binary==2.9.9 -pycparser==2.22 -pycryptodome==3.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -requests==2.32.3 -simplejson==3.19.2 -six==1.16.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.22 -tomli==2.0.1 -typing-extensions==4.12.1 -urllib3==2.2.1 -wheel==0.43.0 diff --git a/.riot/requirements/8fd54b8.txt b/.riot/requirements/8fd54b8.txt new file mode 100644 index 00000000000..bab8538fb66 --- /dev/null +++ b/.riot/requirements/8fd54b8.txt @@ -0,0 +1,42 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/8fd54b8.in +# +astunparse==1.6.3 +attrs==24.3.0 +certifi==2024.12.14 +cffi==1.17.1 +charset-normalizer==3.4.1 +coverage[toml]==7.6.10 +cryptography==44.0.0 +exceptiongroup==1.2.2 +googleapis-common-protos==1.66.0 +greenlet==3.1.1 +grpcio==1.70.0 +hypothesis==6.45.0 +idna==3.10 +iniconfig==2.0.0 +mock==5.1.0 +mysqlclient==2.1.1 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +protobuf==5.29.3 +psycopg2-binary==2.9.10 +pycparser==2.22 +pycryptodome==3.21.0 +pymysql==1.1.1 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +requests==2.32.3 +simplejson==3.19.3 +six==1.17.0 +sortedcontainers==2.4.0 +sqlalchemy==2.0.22 +tomli==2.2.1 +typing-extensions==4.12.2 +urllib3==2.3.0 +wheel==0.45.1 diff --git a/.riot/requirements/aba89a0.txt b/.riot/requirements/aba89a0.txt deleted file mode 100644 index de15004bcf0..00000000000 --- a/.riot/requirements/aba89a0.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/aba89a0.in -# -astunparse==1.6.3 -attrs==23.2.0 -certifi==2024.6.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -coverage[toml]==7.5.3 -cryptography==42.0.7 -googleapis-common-protos==1.63.1 -greenlet==3.0.3 -grpcio==1.64.1 -hypothesis==6.45.0 -idna==3.7 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.5.0 -protobuf==5.27.0 -psycopg2-binary==2.9.9 -pycparser==2.22 -pycryptodome==3.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -requests==2.32.3 -simplejson==3.19.2 -six==1.16.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.22 -typing-extensions==4.12.1 -urllib3==2.2.1 -wheel==0.43.0 diff --git a/ddtrace/appsec/_iast/_evidence_redaction/sql_sensitive_analyzer.py b/ddtrace/appsec/_iast/_evidence_redaction/sql_sensitive_analyzer.py index 7410ec46b4a..24223f59e4c 100644 --- a/ddtrace/appsec/_iast/_evidence_redaction/sql_sensitive_analyzer.py +++ b/ddtrace/appsec/_iast/_evidence_redaction/sql_sensitive_analyzer.py @@ -2,7 +2,9 @@ from ddtrace.appsec._iast.constants import DBAPI_MARIADB from ddtrace.appsec._iast.constants import DBAPI_MYSQL +from ddtrace.appsec._iast.constants import DBAPI_MYSQLDB from ddtrace.appsec._iast.constants import DBAPI_PSYCOPG +from ddtrace.appsec._iast.constants import DBAPI_PYMYSQL from ddtrace.appsec._iast.constants import DBAPI_SQLITE from ddtrace.internal.logger import get_logger @@ -35,6 +37,8 @@ } patterns[DBAPI_SQLITE] = patterns[DBAPI_MYSQL] patterns[DBAPI_MARIADB] = patterns[DBAPI_MYSQL] +patterns[DBAPI_PYMYSQL] = patterns[DBAPI_MYSQL] +patterns[DBAPI_MYSQLDB] = patterns[DBAPI_MYSQL] def sql_sensitive_analyzer(evidence, name_pattern, value_pattern): diff --git a/ddtrace/appsec/_iast/constants.py b/ddtrace/appsec/_iast/constants.py index 83284094dcf..9ac6edb0ab1 100644 --- a/ddtrace/appsec/_iast/constants.py +++ b/ddtrace/appsec/_iast/constants.py @@ -92,5 +92,7 @@ DBAPI_SQLITE = "sqlite" DBAPI_PSYCOPG = "psycopg" DBAPI_MYSQL = "mysql" +DBAPI_MYSQLDB = "mysqldb" +DBAPI_PYMYSQL = "pymysql" DBAPI_MARIADB = "mariadb" -DBAPI_INTEGRATIONS = (DBAPI_SQLITE, DBAPI_PSYCOPG, DBAPI_MYSQL, DBAPI_MARIADB) +DBAPI_INTEGRATIONS = (DBAPI_SQLITE, DBAPI_PSYCOPG, DBAPI_MYSQL, DBAPI_MYSQLDB, DBAPI_MARIADB, DBAPI_PYMYSQL) diff --git a/releasenotes/notes/feat-iast-pymysql-support-d7f79f0355bb85d1.yaml b/releasenotes/notes/feat-iast-pymysql-support-d7f79f0355bb85d1.yaml new file mode 100644 index 00000000000..c6a9edc1c76 --- /dev/null +++ b/releasenotes/notes/feat-iast-pymysql-support-d7f79f0355bb85d1.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Code Security (IAST): This introduces Code Security support to PyMySQL and MySQLDB integrations. diff --git a/riotfile.py b/riotfile.py index 23ba3e78465..4aa662f14dc 100644 --- a/riotfile.py +++ b/riotfile.py @@ -153,6 +153,8 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "simplejson": latest, "SQLAlchemy": "==2.0.22", "psycopg2-binary": "~=2.9.9", + "pymysql": latest, + "mysqlclient": "==2.1.1", "googleapis-common-protos": latest, "grpcio": latest, }, diff --git a/tests/appsec/iast/fixtures/taint_sinks/sql_injection_mysqldb.py b/tests/appsec/iast/fixtures/taint_sinks/sql_injection_mysqldb.py new file mode 100644 index 00000000000..a359db2390f --- /dev/null +++ b/tests/appsec/iast/fixtures/taint_sinks/sql_injection_mysqldb.py @@ -0,0 +1,33 @@ +import os + +import MySQLdb +from MySQLdb import OperationalError + +from ddtrace.appsec._iast._taint_tracking._taint_objects import get_tainted_ranges +from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted + + +MYSQL_HOST = os.getenv("TEST_MYSQL_HOST", "127.0.0.1") + + +def get_connection(): + connection = MySQLdb.connect(user="test", passwd="test", host=MYSQL_HOST, port=3306, database="test") + return connection + + +def close_connection(connection): + if connection: + connection.close() + + +def sqli_simple(table): + connection = get_connection() + cur = connection.cursor() + try: + cur.execute("CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)") + except OperationalError: + connection.rollback() + # label test_sql_injection + cur.execute("SELECT 1 FROM " + table) + rows = cur.fetchone() + return {"result": rows, "tainted": is_pyobject_tainted(table), "ranges": str(get_tainted_ranges(table))} diff --git a/tests/appsec/iast/fixtures/taint_sinks/sql_injection_pymysql.py b/tests/appsec/iast/fixtures/taint_sinks/sql_injection_pymysql.py new file mode 100644 index 00000000000..a23eebf07df --- /dev/null +++ b/tests/appsec/iast/fixtures/taint_sinks/sql_injection_pymysql.py @@ -0,0 +1,33 @@ +import os + +import pymysql +from pymysql.err import OperationalError + +from ddtrace.appsec._iast._taint_tracking._taint_objects import get_tainted_ranges +from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted + + +MYSQL_HOST = os.getenv("TEST_MYSQL_HOST", "127.0.0.1") + + +def get_connection(): + connection = pymysql.connect(user="test", password="test", host=MYSQL_HOST, port=3306, database="test") + return connection + + +def close_connection(connection): + if connection: + connection.close() + + +def sqli_simple(table): + connection = get_connection() + cur = connection.cursor() + try: + cur.execute("CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)") + except OperationalError: + connection.rollback() + # label test_sql_injection + cur.execute("SELECT 1 FROM " + table) + rows = cur.fetchone() + return {"result": rows, "tainted": is_pyobject_tainted(table), "ranges": str(get_tainted_ranges(table))} diff --git a/tests/appsec/iast/taint_sinks/test_sql_injection.py b/tests/appsec/iast/taint_sinks/test_sql_injection.py index bf2190cdf99..cf1b5c18b64 100644 --- a/tests/appsec/iast/taint_sinks/test_sql_injection.py +++ b/tests/appsec/iast/taint_sinks/test_sql_injection.py @@ -1,5 +1,6 @@ import pytest +from ddtrace import patch from ddtrace.appsec._iast._taint_tracking import OriginType from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject @@ -15,6 +16,14 @@ "tests/appsec/iast/fixtures/taint_sinks/sql_injection_sqlite3.py", "tests.appsec.iast.fixtures.taint_sinks.sql_injection_sqlite3", ), + ( + "tests/appsec/iast/fixtures/taint_sinks/sql_injection_mysqldb.py", + "tests.appsec.iast.fixtures.taint_sinks.sql_injection_mysqldb", + ), + ( + "tests/appsec/iast/fixtures/taint_sinks/sql_injection_pymysql.py", + "tests.appsec.iast.fixtures.taint_sinks.sql_injection_pymysql", + ), ( "tests/appsec/iast/fixtures/taint_sinks/sql_injection_psycopg2.py", "tests.appsec.iast.fixtures.taint_sinks.sql_injection_psycopg2", @@ -26,6 +35,10 @@ ] +def setup_module(): + patch(pymysql=True, mysqldb=True) + + @pytest.mark.parametrize("fixture_path,fixture_module", DDBBS) def test_sql_injection(fixture_path, fixture_module, iast_context_defaults): mod = _iast_patched_module(fixture_module) @@ -39,7 +52,12 @@ def test_sql_injection(fixture_path, fixture_module, iast_context_defaults): mod.sqli_simple(table) data = _get_iast_data() - vulnerability = data["vulnerabilities"][0] + assert len(data["vulnerabilities"]) >= 1 + # We will pick up weak hash vulnerabilities in some db connector libraries + # but we are only interested in SQL Injection vulnerabilities + sqli_vulnerabilities = [x for x in data["vulnerabilities"] if x["type"] == VULN_SQL_INJECTION] + assert len(sqli_vulnerabilities) == 1 + vulnerability = sqli_vulnerabilities[0] source = data["sources"][0] assert vulnerability["type"] == VULN_SQL_INJECTION assert vulnerability["evidence"]["valueParts"] == [ @@ -74,5 +92,8 @@ def test_sql_injection_deduplication(fixture_path, fixture_module, iast_context_ mod.sqli_simple(table) data = _get_iast_data() - assert len(data["vulnerabilities"]) == 1 + # We will pick up weak hash vulnerabilities in some db connector libraries + # but we are only interested in SQL Injection vulnerabilities + sqli_vulnerabilities = [x for x in data["vulnerabilities"] if x["type"] == VULN_SQL_INJECTION] + assert len(sqli_vulnerabilities) == 1 VulnerabilityBase._prepare_report._reset_cache() diff --git a/tests/appsec/suitespec.yml b/tests/appsec/suitespec.yml index cde49287a2a..e2e3e331cec 100644 --- a/tests/appsec/suitespec.yml +++ b/tests/appsec/suitespec.yml @@ -29,6 +29,7 @@ suites: appsec_iast: env: TEST_POSTGRES_HOST: postgres + TEST_MYSQL_HOST: mysql parallelism: 6 paths: - '@bootstrap' @@ -43,6 +44,7 @@ suites: runner: riot services: - postgres + - mysql snapshot: true timeout: 25m appsec_iast_memcheck: From 7ec9f6a8dddc14c1eb9029470d1771d39db3fe1b Mon Sep 17 00:00:00 2001 From: Federico Mon Date: Mon, 3 Feb 2025 16:28:49 +0100 Subject: [PATCH 35/63] ci: skip current flaky tests (#12194) --- tests/contrib/langchain/test_langchain.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/contrib/langchain/test_langchain.py b/tests/contrib/langchain/test_langchain.py index f0865867826..a811a53099b 100644 --- a/tests/contrib/langchain/test_langchain.py +++ b/tests/contrib/langchain/test_langchain.py @@ -100,6 +100,7 @@ def test_ai21_llm_sync(langchain_community, request_vcr): llm.invoke("Why does everyone in Bikini Bottom hate Plankton?") +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_openai_chat_model_sync_call_langchain_openai(langchain_openai, request_vcr): chat = langchain_openai.ChatOpenAI(temperature=0, max_tokens=256) @@ -107,6 +108,7 @@ def test_openai_chat_model_sync_call_langchain_openai(langchain_openai, request_ chat.invoke(input=[langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")]) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.skipif(LANGCHAIN_VERSION < (0, 3), reason="Requires at least LangChain 0.3") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_openai_chat_model_sync_generate(langchain_openai, request_vcr): @@ -128,6 +130,7 @@ def test_openai_chat_model_sync_generate(langchain_openai, request_vcr): ) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_openai_chat_model_vision_generate(langchain_openai, request_vcr): """ @@ -472,6 +475,7 @@ def test_streamed_llm(langchain_openai, streamed_response_responder): pass +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot( ignores=IGNORE_FIELDS, token="tests.contrib.langchain.test_langchain.test_streamed_chain", @@ -496,6 +500,7 @@ async def test_astreamed_chain(langchain_core, langchain_openai, async_streamed_ pass +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot( ignores=IGNORE_FIELDS, token="tests.contrib.langchain.test_langchain.test_streamed_chat", From ea2a9a505f8f46fccb704c30580780783f26d8e6 Mon Sep 17 00:00:00 2001 From: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:29:35 +0100 Subject: [PATCH 36/63] chore(asm): don't load appsec modules (iast) if disabled (#12184) The goal is to make sure no appsec module is loaded if appsec is disabled. This PR is the first one of 2, handling IAST. It removes all non guarded IAST import from outside appsec. - ensure we don't load any iast module if iast is disabled - replace `_is_iast_enabled()` by a field `_iast_enabled` in the asm config APPSEC-56626 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/_monkey.py | 4 +- ddtrace/appsec/_asm_request_context.py | 3 +- ddtrace/appsec/_iast/__init__.py | 3 +- ddtrace/appsec/_iast/_handlers.py | 34 ++++----- ddtrace/appsec/_iast/_iast_request_context.py | 8 +-- ddtrace/appsec/_iast/_loader.py | 4 +- ddtrace/appsec/_iast/_pytest_plugin.py | 6 +- ddtrace/appsec/_iast/_utils.py | 21 ------ .../_iast/taint_sinks/insecure_cookie.py | 5 +- ddtrace/contrib/dbapi/__init__.py | 8 +-- ddtrace/contrib/dbapi_async/__init__.py | 8 +-- ddtrace/contrib/internal/fastapi/patch.py | 4 +- ddtrace/contrib/internal/langchain/patch.py | 4 +- ddtrace/contrib/internal/pytest/plugin.py | 4 +- ddtrace/contrib/internal/starlette/patch.py | 4 +- ddtrace/internal/iast/product.py | 4 +- ddtrace/settings/asm.py | 8 +++ .../fixtures/integration/main_configure.py | 6 +- .../django_tests/test_django_appsec_iast.py | 62 ++++++++-------- .../flask_tests/test_iast_flask.py | 72 +++++++++---------- tests/contrib/dbapi/test_dbapi_appsec.py | 12 ++-- 21 files changed, 135 insertions(+), 149 deletions(-) diff --git a/ddtrace/_monkey.py b/ddtrace/_monkey.py index 03417fe0d0f..fad8c8f4d2b 100644 --- a/ddtrace/_monkey.py +++ b/ddtrace/_monkey.py @@ -7,8 +7,8 @@ from ddtrace.appsec import load_common_appsec_modules from ddtrace.internal.telemetry.constants import TELEMETRY_NAMESPACE +from ddtrace.settings.asm import config as asm_config -from .appsec._iast._utils import _is_iast_enabled from .internal import telemetry from .internal.logger import get_logger from .internal.utils import formats @@ -240,7 +240,7 @@ def patch_all(**patch_modules): modules.update(patch_modules) patch(raise_errors=False, **modules) - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast._patch_modules import patch_iast from ddtrace.appsec.iast import enable_iast_propagation diff --git a/ddtrace/appsec/_asm_request_context.py b/ddtrace/appsec/_asm_request_context.py index 950015b3f80..d8f258d43a7 100644 --- a/ddtrace/appsec/_asm_request_context.py +++ b/ddtrace/appsec/_asm_request_context.py @@ -18,7 +18,6 @@ from ddtrace.appsec._iast._iast_request_context import is_iast_request_enabled from ddtrace.appsec._iast._taint_tracking import OriginType from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject -from ddtrace.appsec._iast._utils import _is_iast_enabled from ddtrace.appsec._utils import add_context_log from ddtrace.appsec._utils import get_triggers from ddtrace.internal import core @@ -493,7 +492,7 @@ def _on_wrapped_view(kwargs): # If IAST is enabled, taint the Flask function kwargs (path parameters) - if _is_iast_enabled() and kwargs: + if asm_config._iast_enabled and kwargs: if not is_iast_request_enabled(): return return_value diff --git a/ddtrace/appsec/_iast/__init__.py b/ddtrace/appsec/_iast/__init__.py index 724819b17df..f609fe0da7a 100644 --- a/ddtrace/appsec/_iast/__init__.py +++ b/ddtrace/appsec/_iast/__init__.py @@ -38,7 +38,6 @@ def wrapped_function(wrapped, instance, args, kwargs): from ddtrace.settings.asm import config as asm_config from ._overhead_control_engine import OverheadControl -from ._utils import _is_iast_enabled log = get_logger(__name__) @@ -54,7 +53,7 @@ def ddtrace_iast_flask_patch(): and must be before the `app.run()` call. It also requires `DD_IAST_ENABLED` to be activated. """ - if not _is_iast_enabled(): + if not asm_config._iast_enabled: return from ._ast.ast_patching import astpatch_module diff --git a/ddtrace/appsec/_iast/_handlers.py b/ddtrace/appsec/_iast/_handlers.py index c3761451e99..cf60fc610be 100644 --- a/ddtrace/appsec/_iast/_handlers.py +++ b/ddtrace/appsec/_iast/_handlers.py @@ -4,7 +4,6 @@ from wrapt import when_imported from wrapt import wrap_function_wrapper as _w -from ddtrace.appsec._iast import _is_iast_enabled from ddtrace.appsec._iast._iast_request_context import get_iast_stacktrace_reported from ddtrace.appsec._iast._iast_request_context import set_iast_stacktrace_reported from ddtrace.appsec._iast._metrics import _set_metric_iast_instrumented_source @@ -18,6 +17,7 @@ from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_utils import taint_structure from ddtrace.internal.logger import get_logger +from ddtrace.settings.asm import config as asm_config from ._iast_request_context import is_iast_request_enabled from ._taint_tracking._taint_objects import taint_pyobject @@ -48,7 +48,7 @@ def _on_set_http_meta_iast( response_headers, response_cookies, ): - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast.taint_sinks.insecure_cookie import asm_check_cookies if response_cookies: @@ -57,7 +57,7 @@ def _on_set_http_meta_iast( def _on_request_init(wrapped, instance, args, kwargs): wrapped(*args, **kwargs) - if _is_iast_enabled() and is_iast_request_enabled(): + if asm_config._iast_enabled and is_iast_request_enabled(): try: instance.query_string = taint_pyobject( pyobject=instance.query_string, @@ -76,7 +76,7 @@ def _on_request_init(wrapped, instance, args, kwargs): def _on_flask_patch(flask_version): - if _is_iast_enabled(): + if asm_config._iast_enabled: try_wrap_function_wrapper( "werkzeug.datastructures", "Headers.items", @@ -137,14 +137,14 @@ def _on_flask_patch(flask_version): def _on_wsgi_environ(wrapped, _instance, args, kwargs): - if _is_iast_enabled() and args and is_iast_request_enabled(): + if asm_config._iast_enabled and args and is_iast_request_enabled(): return wrapped(*((taint_structure(args[0], OriginType.HEADER_NAME, OriginType.HEADER),) + args[1:]), **kwargs) return wrapped(*args, **kwargs) def _on_django_patch(): - if _is_iast_enabled(): + if asm_config._iast_enabled: try: when_imported("django.http.request")( lambda m: try_wrap_function_wrapper( @@ -172,7 +172,7 @@ def _on_django_patch(): def _on_django_func_wrapped(fn_args, fn_kwargs, first_arg_expected_type, *_): # If IAST is enabled, and we're wrapping a Django view call, taint the kwargs (view's # path parameters) - if _is_iast_enabled() and fn_args and isinstance(fn_args[0], first_arg_expected_type): + if asm_config._iast_enabled and fn_args and isinstance(fn_args[0], first_arg_expected_type): if not is_iast_request_enabled(): return @@ -280,13 +280,13 @@ def _patch_protobuf_class(cls): def _on_grpc_response(message): - if _is_iast_enabled(): + if asm_config._iast_enabled: msg_cls = type(message) _patch_protobuf_class(msg_cls) def if_iast_taint_yield_tuple_for(origins, wrapped, instance, args, kwargs): - if _is_iast_enabled() and is_iast_request_enabled(): + if asm_config._iast_enabled and is_iast_request_enabled(): try: for key, value in wrapped(*args, **kwargs): new_key = taint_pyobject(pyobject=key, source_name=key, source_value=key, source_origin=origins[0]) @@ -303,7 +303,7 @@ def if_iast_taint_yield_tuple_for(origins, wrapped, instance, args, kwargs): def if_iast_taint_returned_object_for(origin, wrapped, instance, args, kwargs): value = wrapped(*args, **kwargs) - if _is_iast_enabled() and is_iast_request_enabled(): + if asm_config._iast_enabled and is_iast_request_enabled(): try: if not is_pyobject_tainted(value): name = str(args[0]) if len(args) else "http.request.body" @@ -317,7 +317,7 @@ def if_iast_taint_returned_object_for(origin, wrapped, instance, args, kwargs): def if_iast_taint_starlette_datastructures(origin, wrapped, instance, args, kwargs): value = wrapped(*args, **kwargs) - if _is_iast_enabled() and is_iast_request_enabled(): + if asm_config._iast_enabled and is_iast_request_enabled(): try: res = [] for element in value: @@ -423,7 +423,7 @@ def _on_pre_tracedrequest_iast(ctx): def _on_set_request_tags_iast(request, span, flask_config): - if _is_iast_enabled() and is_iast_request_enabled(): + if asm_config._iast_enabled and is_iast_request_enabled(): request.cookies = taint_structure( request.cookies, OriginType.COOKIE_NAME, @@ -447,7 +447,7 @@ def _on_set_request_tags_iast(request, span, flask_config): def _on_django_finalize_response_pre(ctx, after_request_tags, request, response): - if not response or not _is_iast_enabled() or not is_iast_request_enabled() or get_iast_stacktrace_reported(): + if not response or not asm_config._iast_enabled or not is_iast_request_enabled() or get_iast_stacktrace_reported(): return try: @@ -460,7 +460,7 @@ def _on_django_finalize_response_pre(ctx, after_request_tags, request, response) def _on_django_technical_500_response(request, response, exc_type, exc_value, tb): - if not exc_value or not _is_iast_enabled() or not is_iast_request_enabled(): + if not exc_value or not asm_config._iast_enabled or not is_iast_request_enabled(): return try: @@ -474,7 +474,7 @@ def _on_django_technical_500_response(request, response, exc_type, exc_value, tb def _on_flask_finalize_request_post(response, _): - if not response or not _is_iast_enabled() or not is_iast_request_enabled() or get_iast_stacktrace_reported(): + if not response or not asm_config._iast_enabled or not is_iast_request_enabled() or get_iast_stacktrace_reported(): return try: @@ -487,7 +487,7 @@ def _on_flask_finalize_request_post(response, _): def _on_asgi_finalize_response(body, _): - if not body or not _is_iast_enabled() or not is_iast_request_enabled(): + if not body or not asm_config._iast_enabled or not is_iast_request_enabled(): return try: @@ -500,7 +500,7 @@ def _on_asgi_finalize_response(body, _): def _on_werkzeug_render_debugger_html(html): - if not html or not _is_iast_enabled() or not is_iast_request_enabled(): + if not html or not asm_config._iast_enabled or not is_iast_request_enabled(): return try: diff --git a/ddtrace/appsec/_iast/_iast_request_context.py b/ddtrace/appsec/_iast/_iast_request_context.py index 176dceea4de..30a3471b595 100644 --- a/ddtrace/appsec/_iast/_iast_request_context.py +++ b/ddtrace/appsec/_iast/_iast_request_context.py @@ -5,7 +5,6 @@ from ddtrace.appsec._constants import APPSEC from ddtrace.appsec._constants import IAST -from ddtrace.appsec._iast import _is_iast_enabled from ddtrace.appsec._iast import oce from ddtrace.appsec._iast._metrics import _set_metric_iast_request_tainted from ddtrace.appsec._iast._metrics import _set_span_tag_iast_executed_sink @@ -17,6 +16,7 @@ from ddtrace.internal import core from ddtrace.internal.logger import get_logger from ddtrace.internal.utils.formats import asbool +from ddtrace.settings.asm import config as asm_config from ddtrace.trace import Span @@ -58,7 +58,7 @@ def in_iast_context() -> bool: def start_iast_context(): - if _is_iast_enabled(): + if asm_config._iast_enabled: create_propagation_context() core.set_item(_IAST_CONTEXT, IASTEnvironment()) @@ -164,7 +164,7 @@ def _iast_end_request(ctx=None, span=None, *args, **kwargs): else: req_span = ctx.get_item("req_span") - if _is_iast_enabled(): + if asm_config._iast_enabled: existing_data = req_span.get_tag(IAST.JSON) if existing_data is None: if req_span.get_metric(IAST.ENABLED) is None: @@ -187,7 +187,7 @@ def _iast_end_request(ctx=None, span=None, *args, **kwargs): def _iast_start_request(span=None, *args, **kwargs): try: - if _is_iast_enabled(): + if asm_config._iast_enabled: start_iast_context() request_iast_enabled = False if oce.acquire_request(span): diff --git a/ddtrace/appsec/_iast/_loader.py b/ddtrace/appsec/_iast/_loader.py index 382060e3b7f..7621b5f3449 100644 --- a/ddtrace/appsec/_iast/_loader.py +++ b/ddtrace/appsec/_iast/_loader.py @@ -1,14 +1,14 @@ #!/usr/bin/env python3 from ddtrace.internal.logger import get_logger +from ddtrace.settings.asm import config as asm_config from ._ast.ast_patching import astpatch_module -from ._utils import _is_iast_enabled log = get_logger(__name__) -IS_IAST_ENABLED = _is_iast_enabled() +IS_IAST_ENABLED = asm_config._iast_enabled def _exec_iast_patched_module(module_watchdog, module): diff --git a/ddtrace/appsec/_iast/_pytest_plugin.py b/ddtrace/appsec/_iast/_pytest_plugin.py index 82c23c53174..28a5b9e0e08 100644 --- a/ddtrace/appsec/_iast/_pytest_plugin.py +++ b/ddtrace/appsec/_iast/_pytest_plugin.py @@ -4,9 +4,9 @@ from typing import List from ddtrace.appsec._constants import IAST -from ddtrace.appsec._iast._utils import _is_iast_enabled from ddtrace.appsec._iast.reporter import Vulnerability from ddtrace.internal.logger import get_logger +from ddtrace.settings.asm import config as asm_config log = get_logger(__name__) @@ -20,7 +20,7 @@ class VulnerabilityFoundInTest(Vulnerability): try: import pytest - @pytest.fixture(autouse=_is_iast_enabled()) + @pytest.fixture(autouse=asm_config._iast_enabled) def ddtrace_iast(request, ddspan): """ Extract the vulnerabilities discovered in tests. @@ -72,7 +72,7 @@ def extract_code_snippet(filepath, line_number, context=3): def print_iast_report(terminalreporter): - if not _is_iast_enabled(): + if not asm_config._iast_enabled: return if not vuln_data: diff --git a/ddtrace/appsec/_iast/_utils.py b/ddtrace/appsec/_iast/_utils.py index fda05a8b8e5..e2c2dbec836 100644 --- a/ddtrace/appsec/_iast/_utils.py +++ b/ddtrace/appsec/_iast/_utils.py @@ -1,29 +1,8 @@ -from functools import lru_cache -import sys from typing import List -from ddtrace.internal.logger import get_logger from ddtrace.settings.asm import config as asm_config -@lru_cache(maxsize=1) -def _is_python_version_supported() -> bool: - # IAST supports Python versions 3.6 to 3.13 - return (3, 6, 0) <= sys.version_info < (3, 14, 0) - - -def _is_iast_enabled(): - if not asm_config._iast_enabled: - return False - - if not _is_python_version_supported(): - log = get_logger(__name__) - log.info("IAST is not compatible with the current Python version") - return False - - return True - - def _get_source_index(sources: List, source) -> int: i = 0 for source_ in sources: diff --git a/ddtrace/appsec/_iast/taint_sinks/insecure_cookie.py b/ddtrace/appsec/_iast/taint_sinks/insecure_cookie.py index 3e9c05c451c..8f369e85b9a 100644 --- a/ddtrace/appsec/_iast/taint_sinks/insecure_cookie.py +++ b/ddtrace/appsec/_iast/taint_sinks/insecure_cookie.py @@ -1,8 +1,9 @@ from typing import Dict from typing import Optional +from ddtrace.settings.asm import config as asm_config + from ..._constants import IAST_SPAN_TAGS -from .. import _is_iast_enabled from .. import oce from .._iast_request_context import is_iast_request_enabled from .._metrics import _set_metric_iast_executed_sink @@ -36,7 +37,7 @@ class NoSameSite(VulnerabilityBase): def asm_check_cookies(cookies: Optional[Dict[str, str]]) -> None: if not cookies: return - if _is_iast_enabled() and is_iast_request_enabled(): + if asm_config._iast_enabled and is_iast_request_enabled(): try: for cookie_key, cookie_value in cookies.items(): lvalue = cookie_value.lower().replace(" ", "") diff --git a/ddtrace/contrib/dbapi/__init__.py b/ddtrace/contrib/dbapi/__init__.py index fa733c19a63..0ecbbd804fa 100644 --- a/ddtrace/contrib/dbapi/__init__.py +++ b/ddtrace/contrib/dbapi/__init__.py @@ -4,15 +4,14 @@ import wrapt from ddtrace import config -from ddtrace.appsec._iast._utils import _is_iast_enabled +from ddtrace.appsec._constants import IAST_SPAN_TAGS from ddtrace.internal import core from ddtrace.internal.constants import COMPONENT from ddtrace.internal.logger import get_logger from ddtrace.internal.utils import ArgumentError from ddtrace.internal.utils import get_argument_value +from ddtrace.settings.asm import config as asm_config -from ...appsec._constants import IAST_SPAN_TAGS -from ...appsec._iast._metrics import increment_iast_span_metric from ...constants import _ANALYTICS_SAMPLE_RATE_KEY from ...constants import _SPAN_MEASURED_KEY from ...constants import SPAN_KIND @@ -103,9 +102,10 @@ def _trace_method(self, method, name, resource, extra_tags, dbm_propagator, *arg # set span.kind to the type of request being performed s.set_tag_str(SPAN_KIND, SpanKind.CLIENT) - if _is_iast_enabled(): + if asm_config._iast_enabled: try: from ddtrace.appsec._iast._metrics import _set_metric_iast_executed_sink + from ddtrace.appsec._iast._metrics import increment_iast_span_metric from ddtrace.appsec._iast._taint_utils import check_tainted_dbapi_args from ddtrace.appsec._iast.taint_sinks.sql_injection import SqlInjection diff --git a/ddtrace/contrib/dbapi_async/__init__.py b/ddtrace/contrib/dbapi_async/__init__.py index a6ae676f4bd..153e8a2c33e 100644 --- a/ddtrace/contrib/dbapi_async/__init__.py +++ b/ddtrace/contrib/dbapi_async/__init__.py @@ -1,13 +1,12 @@ from ddtrace import config -from ddtrace.appsec._iast._utils import _is_iast_enabled +from ddtrace.appsec._constants import IAST_SPAN_TAGS from ddtrace.internal import core from ddtrace.internal.constants import COMPONENT from ddtrace.internal.logger import get_logger from ddtrace.internal.utils import ArgumentError from ddtrace.internal.utils import get_argument_value +from ddtrace.settings.asm import config as asm_config -from ...appsec._constants import IAST_SPAN_TAGS -from ...appsec._iast._metrics import increment_iast_span_metric from ...constants import _ANALYTICS_SAMPLE_RATE_KEY from ...constants import _SPAN_MEASURED_KEY from ...constants import SPAN_KIND @@ -78,8 +77,9 @@ async def _trace_method(self, method, name, resource, extra_tags, dbm_propagator # set span.kind to the type of request being performed s.set_tag_str(SPAN_KIND, SpanKind.CLIENT) - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast._metrics import _set_metric_iast_executed_sink + from ddtrace.appsec._iast._metrics import increment_iast_span_metric from ddtrace.appsec._iast._taint_utils import check_tainted_dbapi_args from ddtrace.appsec._iast.taint_sinks.sql_injection import SqlInjection diff --git a/ddtrace/contrib/internal/fastapi/patch.py b/ddtrace/contrib/internal/fastapi/patch.py index c79baefc59d..41473728f03 100644 --- a/ddtrace/contrib/internal/fastapi/patch.py +++ b/ddtrace/contrib/internal/fastapi/patch.py @@ -6,7 +6,6 @@ from wrapt import wrap_function_wrapper as _w from ddtrace import config -from ddtrace.appsec._iast._utils import _is_iast_enabled from ddtrace.contrib.internal.asgi.middleware import TraceMiddleware from ddtrace.contrib.internal.starlette.patch import _trace_background_tasks from ddtrace.contrib.internal.starlette.patch import traced_handler @@ -14,6 +13,7 @@ from ddtrace.internal.logger import get_logger from ddtrace.internal.schema import schematize_service_name from ddtrace.internal.utils.wrappers import unwrap as _u +from ddtrace.settings.asm import config as asm_config from ddtrace.trace import Pin @@ -86,7 +86,7 @@ def patch(): if not isinstance(fastapi.routing.Mount.handle, ObjectProxy): _w("starlette.routing", "Mount.handle", traced_handler) - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast._handlers import _on_iast_fastapi_patch _on_iast_fastapi_patch() diff --git a/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py index 6c7cd2f41e0..9badbf22d87 100644 --- a/ddtrace/contrib/internal/langchain/patch.py +++ b/ddtrace/contrib/internal/langchain/patch.py @@ -26,7 +26,7 @@ except ImportError: langchain_pinecone = None -from ddtrace.appsec._iast import _is_iast_enabled +from ddtrace.settings.asm import config as asm_config try: @@ -1208,7 +1208,7 @@ def patch(): if langchain_community: _patch_embeddings_and_vectorstores() - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast._metrics import _set_iast_error_metric def wrap_output_parser(module, parser): diff --git a/ddtrace/contrib/internal/pytest/plugin.py b/ddtrace/contrib/internal/pytest/plugin.py index 6ca4ad91afe..23bf58d7dcb 100644 --- a/ddtrace/contrib/internal/pytest/plugin.py +++ b/ddtrace/contrib/internal/pytest/plugin.py @@ -18,10 +18,10 @@ from ddtrace import config from ddtrace.appsec._iast._pytest_plugin import ddtrace_iast # noqa:F401 -from ddtrace.appsec._iast._utils import _is_iast_enabled from ddtrace.contrib.internal.pytest._utils import _USE_PLUGIN_V2 from ddtrace.contrib.internal.pytest._utils import _extract_span from ddtrace.contrib.internal.pytest._utils import _pytest_version_supports_itr +from ddtrace.settings.asm import config as asm_config # pytest default settings @@ -93,7 +93,7 @@ def pytest_addoption(parser): parser.addini("no-ddtrace", DDTRACE_HELP_MSG, type="bool") parser.addini("ddtrace-patch-all", PATCH_ALL_HELP_MSG, type="bool") parser.addini("ddtrace-include-class-name", DDTRACE_INCLUDE_CLASS_HELP_MSG, type="bool") - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast import _iast_pytest_activation _iast_pytest_activation() diff --git a/ddtrace/contrib/internal/starlette/patch.py b/ddtrace/contrib/internal/starlette/patch.py index 02d47f8d47c..a48e11cd534 100644 --- a/ddtrace/contrib/internal/starlette/patch.py +++ b/ddtrace/contrib/internal/starlette/patch.py @@ -13,7 +13,6 @@ from wrapt import wrap_function_wrapper as _w from ddtrace import config -from ddtrace.appsec._iast import _is_iast_enabled from ddtrace.contrib import trace_utils from ddtrace.contrib.asgi import TraceMiddleware from ddtrace.contrib.internal.trace_utils import with_traced_module @@ -26,6 +25,7 @@ from ddtrace.internal.utils import get_blocked from ddtrace.internal.utils import set_argument_value from ddtrace.internal.utils.wrappers import unwrap as _u +from ddtrace.settings.asm import config as asm_config from ddtrace.trace import Pin from ddtrace.trace import Span # noqa:F401 from ddtrace.vendor.packaging.version import parse as parse_version @@ -168,7 +168,7 @@ def traced_handler(wrapped, instance, args, kwargs): break if request_spans: - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast._patch import _iast_instrument_starlette_scope _iast_instrument_starlette_scope(scope) diff --git a/ddtrace/internal/iast/product.py b/ddtrace/internal/iast/product.py index ccbc61b2f5a..68ef24ce00e 100644 --- a/ddtrace/internal/iast/product.py +++ b/ddtrace/internal/iast/product.py @@ -3,7 +3,7 @@ too but patch_all depends of DD_TRACE_ENABLED environment variable. This is the reason why we need to call it here and it's not a duplicate call due to `enable_iast_propagation` has a global variable to avoid multiple calls. """ -from ddtrace.appsec._iast._utils import _is_iast_enabled +from ddtrace.settings.asm import config as asm_config def post_preload(): @@ -11,7 +11,7 @@ def post_preload(): def start(): - if _is_iast_enabled(): + if asm_config._iast_enabled: from ddtrace.appsec._iast import enable_iast_propagation enable_iast_propagation() diff --git a/ddtrace/settings/asm.py b/ddtrace/settings/asm.py index 49fc5e6f6c2..4024c13f982 100644 --- a/ddtrace/settings/asm.py +++ b/ddtrace/settings/asm.py @@ -2,6 +2,7 @@ import os.path from platform import machine from platform import system +import sys from typing import List from typing import Optional @@ -216,6 +217,11 @@ class ASMConfig(Env): ) _bypass_instrumentation_for_waf = False + # IAST supported on python 3.6 to 3.13 and never on windows + _iast_supported: bool = ((3, 6, 0) <= sys.version_info < (3, 14, 0)) and not ( + sys.platform.startswith("win") or sys.platform.startswith("cygwin") + ) + def __init__(self): super().__init__() # Is one click available? @@ -225,6 +231,8 @@ def __init__(self): self._asm_can_be_enabled = False self._iast_enabled = False self._api_security_enabled = False + if not self._iast_supported: + self._iast_enabled = False def reset(self): """For testing purposes, reset the configuration to its default values given current environment variables.""" diff --git a/tests/appsec/iast/fixtures/integration/main_configure.py b/tests/appsec/iast/fixtures/integration/main_configure.py index bc9933a7679..2864b45f01e 100644 --- a/tests/appsec/iast/fixtures/integration/main_configure.py +++ b/tests/appsec/iast/fixtures/integration/main_configure.py @@ -4,8 +4,8 @@ import os import sys -from ddtrace.appsec._iast._utils import _is_iast_enabled from ddtrace.ext import SpanTypes +from ddtrace.settings.asm import config as asm_config from ddtrace.trace import tracer @@ -29,11 +29,11 @@ def main(): main() if not iast_enabled: # Disabled by env var but then enabled with ``tracer.configure`` - assert _is_iast_enabled() + assert asm_config._iast_enabled assert "ddtrace.appsec._iast.processor" in sys.modules else: # Enabled by env var but then disabled with ``tracer.configure`` - assert not _is_iast_enabled() + assert not asm_config._iast_enabled # Module was loaded before assert "ddtrace.appsec._iast.processor" in sys.modules # But processor is not used by the tracer diff --git a/tests/appsec/integrations/django_tests/test_django_appsec_iast.py b/tests/appsec/integrations/django_tests/test_django_appsec_iast.py index 8f4768d8a8c..dd400c64df6 100644 --- a/tests/appsec/integrations/django_tests/test_django_appsec_iast.py +++ b/tests/appsec/integrations/django_tests/test_django_appsec_iast.py @@ -7,7 +7,6 @@ from ddtrace.appsec._constants import IAST from ddtrace.appsec._iast import oce from ddtrace.appsec._iast._patch_modules import patch_iast -from ddtrace.appsec._iast._utils import _is_python_version_supported as python_supported_by_iast from ddtrace.appsec._iast.constants import VULN_CMDI from ddtrace.appsec._iast.constants import VULN_HEADER_INJECTION from ddtrace.appsec._iast.constants import VULN_INSECURE_COOKIE @@ -15,6 +14,7 @@ from ddtrace.appsec._iast.constants import VULN_STACKTRACE_LEAK from ddtrace.ext import SpanTypes from ddtrace.internal.compat import urlencode +from ddtrace.settings.asm import config as asm_config from tests.appsec.iast.iast_utils import get_line_and_hash from tests.utils import override_env from tests.utils import override_global_config @@ -83,7 +83,7 @@ def _aux_appsec_get_root_span_with_exception( return False -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_weak_hash(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -96,7 +96,7 @@ def test_django_weak_hash(client, test_spans, tracer): assert vulnerability["evidence"]["value"] == "md5" -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_tainted_user_agent_iast_enabled(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -137,7 +137,7 @@ def test_django_tainted_user_agent_iast_enabled(client, test_spans, tracer): 50.0, ], ) -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_view_with_exception(client, test_spans, tracer, payload, content_type, deduplication, sampling): with override_global_config( dict(_iast_enabled=True, _deduplication_enabled=deduplication, _iast_request_sampling=sampling) @@ -153,7 +153,7 @@ def test_django_view_with_exception(client, test_spans, tracer, payload, content assert response is False -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_tainted_user_agent_iast_disabled(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -175,7 +175,7 @@ def test_django_tainted_user_agent_iast_disabled(client, test_spans, tracer): @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_tainted_user_agent_iast_enabled_sqli_http_request_parameter(client, test_spans, tracer): with override_global_config( dict(_iast_enabled=True, _iast_deduplication_enabled=False, _iast_request_sampling=100.0) @@ -224,7 +224,7 @@ def test_django_tainted_user_agent_iast_enabled_sqli_http_request_parameter(clie @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_parameter_name_get(client, test_spans, tracer): with override_global_config( dict(_iast_enabled=True, _iast_deduplication_enabled=False, _iast_request_sampling=100.0) @@ -275,7 +275,7 @@ def test_django_sqli_http_request_parameter_name_get(client, test_spans, tracer) @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_parameter_name_post(client, test_spans, tracer): with override_global_config( dict(_iast_enabled=True, _iast_deduplication_enabled=False, _iast_request_sampling=100.0) @@ -327,7 +327,7 @@ def test_django_sqli_http_request_parameter_name_post(client, test_spans, tracer @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_header_value(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -365,7 +365,7 @@ def test_django_sqli_http_request_header_value(client, test_spans, tracer): @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_iast_disabled_sqli_http_request_header_value(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -385,7 +385,7 @@ def test_django_iast_disabled_sqli_http_request_header_value(client, test_spans, @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_header_name(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -423,7 +423,7 @@ def test_django_sqli_http_request_header_name(client, test_spans, tracer): @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_iast_disabled_sqli_http_request_header_name(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -443,7 +443,7 @@ def test_django_iast_disabled_sqli_http_request_header_name(client, test_spans, @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_path_parameter(client, test_spans, tracer): root_span, response = _aux_appsec_get_root_span( client, @@ -478,7 +478,7 @@ def test_django_sqli_http_path_parameter(client, test_spans, tracer): @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_iast_disabled_sqli_http_path_parameter(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -496,7 +496,7 @@ def test_django_iast_disabled_sqli_http_path_parameter(client, test_spans, trace @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_cookies_name(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -536,7 +536,7 @@ def test_django_sqli_http_cookies_name(client, test_spans, tracer): @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_iast_disabled_sqli_http_cookies_name(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -554,7 +554,7 @@ def test_django_iast_disabled_sqli_http_cookies_name(client, test_spans, tracer) @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_cookies_value(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -596,7 +596,7 @@ def test_django_sqli_http_cookies_value(client, test_spans, tracer): @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_iast_disabled_sqli_http_cookies_value(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -621,7 +621,7 @@ def test_django_iast_disabled_sqli_http_cookies_value(client, test_spans, tracer ], ) @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_body(client, test_spans, tracer, payload, content_type): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -678,7 +678,7 @@ def test_django_sqli_http_body(client, test_spans, tracer, payload, content_type ], ) @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_tainted_http_body_empty(client, test_spans, tracer, payload, content_type, deduplication, sampling): with override_global_config( dict(_iast_enabled=True, _deduplication_enabled=deduplication, _iast_request_sampling=sampling) @@ -698,7 +698,7 @@ def test_django_tainted_http_body_empty(client, test_spans, tracer, payload, con @pytest.mark.django_db() -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_iast_disabled_sqli_http_body(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False)): root_span, response = _aux_appsec_get_root_span( @@ -716,7 +716,7 @@ def test_django_iast_disabled_sqli_http_body(client, test_spans, tracer): assert response.content == b"master" -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_querydict(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True)): root_span, response = _aux_appsec_get_root_span( @@ -734,7 +734,7 @@ def test_django_querydict(client, test_spans, tracer): ) -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_command_injection(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -767,7 +767,7 @@ def test_django_command_injection(client, test_spans, tracer): assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_header_injection(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -795,7 +795,7 @@ def test_django_header_injection(client, test_spans, tracer): assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -820,7 +820,7 @@ def test_django_insecure_cookie(client, test_spans, tracer): assert vulnerability["hash"] -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_secure(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -836,7 +836,7 @@ def test_django_insecure_cookie_secure(client, test_spans, tracer): assert root_span.get_tag(IAST.JSON) is None -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_empty_cookie(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -852,7 +852,7 @@ def test_django_insecure_cookie_empty_cookie(client, test_spans, tracer): assert root_span.get_tag(IAST.JSON) is None -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_2_insecure_1_secure(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -870,7 +870,7 @@ def test_django_insecure_cookie_2_insecure_1_secure(client, test_spans, tracer): assert len(loaded["vulnerabilities"]) == 2 -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_special_characters(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): oce.reconfigure() @@ -895,7 +895,7 @@ def test_django_insecure_cookie_special_characters(client, test_spans, tracer): assert vulnerability["hash"] -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_stacktrace_leak(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=True, _deduplication_enabled=False)): oce.reconfigure() @@ -931,7 +931,7 @@ def debug_mode(): settings.DEBUG = original_debug -@pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") +@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_stacktrace_from_technical_500_response(client, test_spans, tracer, debug_mode): with override_global_config(dict(_iast_enabled=True, _deduplication_enabled=False)): with tracer.trace("test", span_type=SpanTypes.WEB, service="test") as span: diff --git a/tests/appsec/integrations/flask_tests/test_iast_flask.py b/tests/appsec/integrations/flask_tests/test_iast_flask.py index b50d9a6ad0f..8490fadea19 100644 --- a/tests/appsec/integrations/flask_tests/test_iast_flask.py +++ b/tests/appsec/integrations/flask_tests/test_iast_flask.py @@ -11,7 +11,6 @@ from ddtrace.appsec._iast._iast_request_context import _iast_start_request from ddtrace.appsec._iast._patches.json_tainting import patch as patch_json from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted -from ddtrace.appsec._iast._utils import _is_python_version_supported as python_supported_by_iast from ddtrace.appsec._iast.constants import VULN_HEADER_INJECTION from ddtrace.appsec._iast.constants import VULN_INSECURE_COOKIE from ddtrace.appsec._iast.constants import VULN_NO_HTTPONLY_COOKIE @@ -20,6 +19,7 @@ from ddtrace.appsec._iast.constants import VULN_STACKTRACE_LEAK from ddtrace.appsec._iast.taint_sinks.header_injection import patch as patch_header_injection from ddtrace.contrib.internal.sqlite3.patch import patch as patch_sqlite_sqli +from ddtrace.settings.asm import config as asm_config from tests.appsec.iast.iast_utils import get_line_and_hash from tests.contrib.flask import BaseFlaskTestCase from tests.utils import override_env @@ -54,7 +54,7 @@ def setUp(self): self.tracer._configure(api_version="v0.4", appsec_enabled=True, iast_enabled=True) oce.reconfigure() - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_http_request_path_parameter(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def sqli_1(param_str): @@ -106,7 +106,7 @@ def sqli_1(param_str): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_enabled_http_request_header_getitem(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def sqli_2(param_str): @@ -162,7 +162,7 @@ def sqli_2(param_str): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_enabled_http_request_header_name_keys(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def sqli_3(param_str): @@ -216,7 +216,7 @@ def sqli_3(param_str): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_enabled_http_request_header_values(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def sqli_4(param_str): @@ -320,7 +320,7 @@ def sqli_5(param_str, param_int): root_span = self.pop_spans()[0] assert root_span.get_metric(IAST.ENABLED) == 1.0 - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_simple_iast_path_header_and_querystring_tainted_request_sampling_0(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def sqli_6(param_str): @@ -352,7 +352,7 @@ class MockSpan: assert root_span.get_metric(IAST.ENABLED) == 0.0 - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_enabled_http_request_cookies_value(self): @self.app.route("/sqli/cookies/", methods=["GET", "POST"]) def sqli_7(): @@ -418,7 +418,7 @@ def sqli_7(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_enabled_http_request_cookies_name(self): @self.app.route("/sqli/cookies/", methods=["GET", "POST"]) def sqli_8(): @@ -482,7 +482,7 @@ def sqli_8(): assert {VULN_SQL_INJECTION} == vulnerabilities - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_http_request_parameter(self): @self.app.route("/sqli/parameter/", methods=["GET"]) def sqli_9(): @@ -531,7 +531,7 @@ def sqli_9(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_http_request_parameter_name_post(self): @self.app.route("/sqli/", methods=["POST"]) def sqli_13(): @@ -589,7 +589,7 @@ def sqli_13(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_http_request_parameter_name_get(self): @self.app.route("/sqli/", methods=["GET"]) def sqli_14(): @@ -647,7 +647,7 @@ def sqli_14(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_request_body(self): @self.app.route("/sqli/body/", methods=("POST",)) def sqli_10(): @@ -713,7 +713,7 @@ def sqli_10(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_request_body_complex_3_lvls(self): @self.app.route("/sqli/body/", methods=("POST",)) def sqli_11(): @@ -778,7 +778,7 @@ def sqli_11(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_request_body_complex_3_lvls_and_list(self): @self.app.route("/sqli/body/", methods=("POST",)) def sqli_11(): @@ -843,7 +843,7 @@ def sqli_11(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_request_body_complex_3_lvls_list_dict(self): @self.app.route("/sqli/body/", methods=("POST",)) def sqli_11(): @@ -910,7 +910,7 @@ def sqli_11(): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_request_body_complex_json_all_types_of_values(self): @self.app.route("/sqli/body/", methods=("POST",)) def sqli_11(): @@ -1048,7 +1048,7 @@ def iterate_json(data, parent_key=""): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_request_body_iast_and_appsec(self): """Verify IAST, Appsec and API security work correctly running at the same time""" @@ -1101,7 +1101,7 @@ def sqli_10(): list_metrics_logs = list(self._telemetry_writer._logs) assert len(list_metrics_logs) == 0 - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_enabled_http_request_header_values_scrubbed(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def sqli_12(param_str): @@ -1155,7 +1155,7 @@ def sqli_12(param_str): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_header_injection(self): @self.app.route("/header_injection/", methods=["GET", "POST"]) def header_injection(): @@ -1195,7 +1195,7 @@ def header_injection(): } # TODO: vulnerability path is flaky, it points to "tests/contrib/flask/__init__.py" - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_header_injection_exlusions_location(self): @self.app.route("/header_injection/", methods=["GET", "POST"]) def header_injection(): @@ -1224,7 +1224,7 @@ def header_injection(): assert root_span.get_tag(IAST.JSON) is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_header_injection_exlusions_access_control(self): @self.app.route("/header_injection/", methods=["GET", "POST"]) def header_injection(): @@ -1253,7 +1253,7 @@ def header_injection(): assert root_span.get_tag(IAST.JSON) is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_insecure_cookie(self): @self.app.route("/insecure_cookie/", methods=["GET", "POST"]) def insecure_cookie(): @@ -1291,7 +1291,7 @@ def insecure_cookie(): assert vulnerability["location"]["spanId"] assert vulnerability["hash"] - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_insecure_cookie_empty(self): @self.app.route("/insecure_cookie_empty/", methods=["GET", "POST"]) def insecure_cookie_empty(): @@ -1321,7 +1321,7 @@ def insecure_cookie_empty(): loaded = root_span.get_tag(IAST.JSON) assert loaded is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_no_http_only_cookie(self): @self.app.route("/no_http_only_cookie/", methods=["GET", "POST"]) def no_http_only_cookie(): @@ -1359,7 +1359,7 @@ def no_http_only_cookie(): assert vulnerability["location"]["spanId"] assert vulnerability["hash"] - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_no_http_only_cookie_empty(self): @self.app.route("/no_http_only_cookie_empty/", methods=["GET", "POST"]) def no_http_only_cookie_empty(): @@ -1390,7 +1390,7 @@ def no_http_only_cookie_empty(): loaded = root_span.get_tag(IAST.JSON) assert loaded is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_no_samesite_cookie(self): @self.app.route("/no_samesite_cookie/", methods=["GET", "POST"]) def no_samesite_cookie(): @@ -1428,7 +1428,7 @@ def no_samesite_cookie(): assert vulnerability["location"]["spanId"] assert vulnerability["hash"] - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_no_samesite_cookie_empty(self): @self.app.route("/no_samesite_cookie_empty/", methods=["GET", "POST"]) def no_samesite_cookie_empty(): @@ -1456,7 +1456,7 @@ def no_samesite_cookie_empty(): loaded = root_span.get_tag(IAST.JSON) assert loaded is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_cookie_secure(self): @self.app.route("/cookie_secure/", methods=["GET", "POST"]) def cookie_secure(): @@ -1487,7 +1487,7 @@ def cookie_secure(): loaded = root_span.get_tag(IAST.JSON) assert loaded is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_stacktrace_leak(self): @self.app.route("/stacktrace_leak/") def stacktrace_leak(): @@ -1542,7 +1542,7 @@ def stacktrace_leak(): ] } - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_stacktrace_leak_from_debug_page(self): try: from werkzeug.debug.tbtools import DebugTraceback @@ -1605,7 +1605,7 @@ def setUp(self): super(FlaskAppSecIASTDisabledTestCase, self).setUp() self.tracer._configure(api_version="v0.4") - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_disabled_http_request_cookies_name(self): @self.app.route("/sqli/cookies/", methods=["GET", "POST"]) def test_sqli(): @@ -1636,7 +1636,7 @@ def test_sqli(): assert root_span.get_tag(IAST.JSON) is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_disabled_http_request_header_getitem(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def test_sqli(param_str): @@ -1668,7 +1668,7 @@ def test_sqli(param_str): assert root_span.get_tag(IAST.JSON) is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_disabled_http_request_header_name_keys(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def test_sqli(param_str): @@ -1700,7 +1700,7 @@ def test_sqli(param_str): assert root_span.get_tag(IAST.JSON) is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_disabled_http_request_header_values(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def test_sqli(param_str): @@ -1732,7 +1732,7 @@ def test_sqli(param_str): assert root_span.get_tag(IAST.JSON) is None - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_simple_iast_path_header_and_querystring_not_tainted_if_iast_disabled(self): @self.app.route("/sqli//", methods=["GET", "POST"]) def test_sqli(param_str): @@ -1756,7 +1756,7 @@ def test_sqli(param_str): # not all flask versions have r.text assert resp.text == "select%20from%20table" - @pytest.mark.skipif(not python_supported_by_iast(), reason="Python version not supported by IAST") + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_disabled_http_request_cookies_value(self): @self.app.route("/sqli/cookies/", methods=["GET", "POST"]) def test_sqli(): diff --git a/tests/contrib/dbapi/test_dbapi_appsec.py b/tests/contrib/dbapi/test_dbapi_appsec.py index 085166df575..062a4ca667e 100644 --- a/tests/contrib/dbapi/test_dbapi_appsec.py +++ b/tests/contrib/dbapi/test_dbapi_appsec.py @@ -2,9 +2,9 @@ import pytest from ddtrace.appsec._iast import oce -from ddtrace.appsec._iast._utils import _is_python_version_supported from ddtrace.contrib.dbapi import TracedCursor from ddtrace.settings import Config +from ddtrace.settings.asm import config as asm_config from ddtrace.settings.integration import IntegrationConfig from ddtrace.trace import Pin from tests.appsec.iast.conftest import _end_iast_context_and_oce @@ -33,7 +33,7 @@ def tearDown(self): ): _end_iast_context_and_oce() - @pytest.mark.skipif(not _is_python_version_supported(), reason="IAST compatible versions") + @pytest.mark.skipif(not asm_config._iast_supported, reason="IAST compatible versions") def test_tainted_query(self): from ddtrace.appsec._iast._taint_tracking import OriginType from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject @@ -56,7 +56,7 @@ def test_tainted_query(self): mock_sql_injection_report.assert_called_once_with(evidence_value=query, dialect="sqlite") - @pytest.mark.skipif(not _is_python_version_supported(), reason="IAST compatible versions") + @pytest.mark.skipif(not asm_config._iast_supported, reason="IAST compatible versions") def test_tainted_query_args(self): from ddtrace.appsec._iast._taint_tracking import OriginType from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject @@ -79,7 +79,7 @@ def test_tainted_query_args(self): mock_sql_injection_report.assert_not_called() - @pytest.mark.skipif(not _is_python_version_supported(), reason="IAST compatible versions") + @pytest.mark.skipif(not asm_config._iast_supported, reason="IAST compatible versions") def test_untainted_query(self): with mock.patch( "ddtrace.appsec._iast.taint_sinks.sql_injection.SqlInjection.report" @@ -94,7 +94,7 @@ def test_untainted_query(self): mock_sql_injection_report.assert_not_called() - @pytest.mark.skipif(not _is_python_version_supported(), reason="IAST compatible versions") + @pytest.mark.skipif(not asm_config._iast_supported, reason="IAST compatible versions") def test_untainted_query_and_args(self): with mock.patch( "ddtrace.appsec._iast.taint_sinks.sql_injection.SqlInjection.report" @@ -110,7 +110,7 @@ def test_untainted_query_and_args(self): mock_sql_injection_report.assert_not_called() - @pytest.mark.skipif(not _is_python_version_supported(), reason="IAST compatible versions") + @pytest.mark.skipif(not asm_config._iast_supported, reason="IAST compatible versions") def test_tainted_query_iast_disabled(self): from ddtrace.appsec._iast._taint_tracking import OriginType from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject From 6897792a966a3755cf5ca46893c545513cfa2f68 Mon Sep 17 00:00:00 2001 From: Emmett Butler <723615+emmettbutler@users.noreply.github.com> Date: Mon, 3 Feb 2025 08:21:25 -0800 Subject: [PATCH 37/63] feat: remove code and tests related to python 3.7 (#12175) This change removes code and tests related to Python 3.7. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Taegyun Kim --- .../workflows/generate-package-versions.yml | 5 - .../workflows/generate-supported-versions.yml | 15 +- .github/workflows/requirements-locks.yml | 2 +- .github/workflows/unit_tests.yml | 2 +- .gitlab/package.yml | 2 - .gitlab/testrunner.yml | 2 +- .gitlab/tests.yml | 2 +- .riot/requirements/1001365.txt | 26 -- .riot/requirements/100cc0e.txt | 26 -- .riot/requirements/1012b6a.txt | 31 -- .riot/requirements/1026e4e.txt | 38 -- .riot/requirements/105d554.txt | 25 -- .riot/requirements/10733d8.txt | 26 -- .riot/requirements/10a626b.txt | 32 -- .riot/requirements/10aef09.txt | 25 -- .riot/requirements/10bb9be.txt | 42 -- .riot/requirements/10d168b.txt | 29 -- .riot/requirements/10d33c9.txt | 29 -- .riot/requirements/10ebb4e.txt | 43 -- .riot/requirements/115aba5.txt | 27 -- .riot/requirements/116b0a1.txt | 40 ++ .riot/requirements/1181282.txt | 27 -- .riot/requirements/11bda89.txt | 33 -- .riot/requirements/11c18f0.txt | 29 -- .riot/requirements/11dc3f9.txt | 26 -- .riot/requirements/11dd5c1.txt | 42 -- .riot/requirements/1239a3c.txt | 24 +- .riot/requirements/1250d61.txt | 41 -- .riot/requirements/1250eb4.txt | 29 -- .riot/requirements/129b75c.txt | 28 -- .riot/requirements/130c755.txt | 74 ---- .riot/requirements/135c565.txt | 27 -- .riot/requirements/136fbd2.txt | 25 -- .riot/requirements/137098c.txt | 35 -- .riot/requirements/137d3ed.txt | 40 -- .riot/requirements/1389734.txt | 29 -- .riot/requirements/139b6d7.txt | 25 -- .riot/requirements/13cc5fa.txt | 28 -- .riot/requirements/1425e39.txt | 31 -- .riot/requirements/145f3f5.txt | 42 -- .riot/requirements/14b37e6.txt | 26 -- .riot/requirements/14b883c.txt | 25 -- .riot/requirements/14ccd31.txt | 25 -- .riot/requirements/14f9d89.txt | 29 -- .riot/requirements/1532dd6.txt | 77 ---- .riot/requirements/1538581.txt | 45 -- .riot/requirements/15bf3e3.txt | 25 -- .riot/requirements/1600ae2.txt | 39 -- .riot/requirements/1605571.txt | 27 -- .riot/requirements/160ef98.txt | 37 -- .riot/requirements/1619693.txt | 38 -- .riot/requirements/165b374.txt | 35 -- .riot/requirements/166f9ef.txt | 28 -- .riot/requirements/1683324.txt | 27 -- .riot/requirements/1690be2.txt | 25 -- .riot/requirements/16a9524.txt | 24 -- .riot/requirements/16bfda8.txt | 28 -- .riot/requirements/16cae33.txt | 27 -- .riot/requirements/1727339.txt | 34 -- .riot/requirements/173b99c.txt | 25 -- .riot/requirements/175a85c.txt | 24 -- .riot/requirements/176250f.txt | 27 -- .riot/requirements/178099a.txt | 25 -- .riot/requirements/179337c.txt | 40 -- .riot/requirements/17a138f.txt | 25 -- .riot/requirements/17a7ba8.txt | 25 -- .riot/requirements/17f0015.txt | 45 -- .riot/requirements/1800709.txt | 32 -- .riot/requirements/1832584.txt | 28 -- .riot/requirements/186ece2.txt | 26 -- .riot/requirements/1894fac.txt | 33 -- .riot/requirements/189753f.txt | 25 -- .riot/requirements/189a9da.txt | 54 --- .riot/requirements/18a9ce6.txt | 27 -- .riot/requirements/18b1b66.txt | 30 -- .riot/requirements/18b992e.txt | 34 -- .riot/requirements/18c560e.txt | 44 -- .riot/requirements/18c939b.txt | 25 -- .riot/requirements/19065a8.txt | 50 --- .riot/requirements/192924c.txt | 34 -- .riot/requirements/19b9cf0.txt | 45 -- .riot/requirements/19cce5d.txt | 25 -- .riot/requirements/19e4a89.txt | 29 -- .riot/requirements/19e9356.txt | 25 -- .riot/requirements/1a06ac7.txt | 30 -- .riot/requirements/1a3be97.txt | 27 -- .riot/requirements/1a45d73.txt | 37 -- .riot/requirements/1a48ea2.txt | 32 -- .riot/requirements/1a4f181.txt | 51 --- .riot/requirements/1a508dc.txt | 20 +- .riot/requirements/1aa3fad.txt | 25 -- .riot/requirements/1aa41b2.txt | 77 ---- .riot/requirements/1ac6ae8.txt | 28 -- .riot/requirements/1ad408c.txt | 25 -- .riot/requirements/1b086a5.txt | 24 -- .riot/requirements/1b18826.txt | 25 -- .riot/requirements/1b2734d.txt | 25 -- .riot/requirements/1b73c58.txt | 37 -- .riot/requirements/1b84c4a.txt | 25 -- .riot/requirements/1b99e47.txt | 27 -- .riot/requirements/1ba8c21.txt | 27 -- .riot/requirements/1bb4e1c.txt | 30 -- .riot/requirements/1bb88c9.txt | 25 -- .riot/requirements/1bbc5e0.txt | 35 -- .riot/requirements/1bcefe4.txt | 28 -- .riot/requirements/1be3cb3.txt | 25 -- .riot/requirements/1c277a3.txt | 25 -- .riot/requirements/1c36982.txt | 28 -- .riot/requirements/1c489e9.txt | 41 -- .riot/requirements/1c5df59.txt | 42 -- .riot/requirements/1c6f756.txt | 28 -- .riot/requirements/1cb9194.txt | 35 -- .riot/requirements/1ccd2df.txt | 25 -- .riot/requirements/1cd8f95.txt | 29 -- .riot/requirements/1d6a1a5.txt | 31 -- .riot/requirements/1d73048.txt | 24 -- .riot/requirements/1db4b5f.txt | 25 -- .riot/requirements/1dcd050.txt | 26 -- .riot/requirements/1df4767.txt | 32 -- .riot/requirements/1e2fbcd.txt | 25 -- .riot/requirements/1e37fde.txt | 24 -- .riot/requirements/1e7c940.txt | 25 -- .riot/requirements/1e93f9f.txt | 40 -- .riot/requirements/1e9b9b9.txt | 28 -- .riot/requirements/1ed6ce0.txt | 27 -- .riot/requirements/1f11fb6.txt | 40 -- .riot/requirements/1f30147.txt | 45 -- .riot/requirements/1f66fe3.txt | 35 -- .riot/requirements/1faec17.txt | 26 -- .riot/requirements/1fb546b.txt | 47 -- .riot/requirements/1fb6c68.txt | 30 -- .riot/requirements/1fcbf26.txt | 31 -- .riot/requirements/1fe5227.txt | 25 -- .riot/requirements/1feb806.txt | 27 -- .riot/requirements/20387f9.txt | 31 -- .riot/requirements/210a985.txt | 25 -- .riot/requirements/220bd92.txt | 25 -- .riot/requirements/25c58ca.txt | 27 -- .riot/requirements/2933921.txt | 24 -- .riot/requirements/2b426ba.txt | 38 ++ .riot/requirements/2be57d3.txt | 38 -- .riot/requirements/2cc3d48.txt | 25 -- .riot/requirements/30829b6.txt | 28 -- .riot/requirements/3343686.txt | 26 -- .riot/requirements/3390a6b.txt | 27 -- .riot/requirements/3482d15.txt | 33 -- .riot/requirements/3506e01.txt | 43 -- .riot/requirements/36a2b9a.txt | 26 -- .riot/requirements/3c8d9c0.txt | 25 -- .riot/requirements/3e3e299.txt | 22 +- .riot/requirements/3e8a9d6.txt | 25 -- .../requirements/{11f2bd0.txt => 3f2ebdc.txt} | 28 +- .riot/requirements/40b1a4f.txt | 29 -- .riot/requirements/427c22a.txt | 37 -- .riot/requirements/429d258.txt | 34 -- .riot/requirements/48462b1.txt | 25 -- .riot/requirements/4a3b7fa.txt | 30 -- .riot/requirements/4ad11b1.txt | 74 ---- .riot/requirements/4f8a3a1.txt | 38 -- .riot/requirements/5000f7f.txt | 25 -- .riot/requirements/53e5eed.txt | 30 -- .riot/requirements/54a9b03.txt | 25 -- .riot/requirements/55a0f54.txt | 56 --- .riot/requirements/5a0532b.txt | 28 -- .riot/requirements/5e2238a.txt | 26 -- .riot/requirements/5eed329.txt | 25 -- .riot/requirements/620a309.txt | 36 -- .riot/requirements/640588f.txt | 26 -- .riot/requirements/64dcf93.txt | 31 -- .riot/requirements/681161c.txt | 25 -- .riot/requirements/68d8bc6.txt | 25 -- .riot/requirements/6dbf615.txt | 40 ++ .riot/requirements/6dd3b2a.txt | 27 -- .riot/requirements/6fe81be.txt | 37 -- .riot/requirements/7046fe8.txt | 26 -- .riot/requirements/73109d5.txt | 29 -- .riot/requirements/745db14.txt | 50 --- .riot/requirements/760d56e.txt | 30 -- .riot/requirements/7800b91.txt | 34 -- .riot/requirements/7abacd9.txt | 26 -- .riot/requirements/7f56123.txt | 16 +- .riot/requirements/7fa00cf.txt | 24 +- .riot/requirements/840eb63.txt | 29 -- .riot/requirements/85c8e30.txt | 26 -- .riot/requirements/880a8ad.txt | 28 -- .riot/requirements/8854702.txt | 74 ---- .riot/requirements/89d7a5f.txt | 40 -- .riot/requirements/8ef50f6.txt | 25 -- .riot/requirements/9050f7e.txt | 26 -- .riot/requirements/9091897.txt | 35 -- .riot/requirements/91a3315.txt | 41 -- .riot/requirements/93bc4fa.txt | 31 -- .riot/requirements/957161b.txt | 33 -- .riot/requirements/976376a.txt | 38 -- .riot/requirements/9ba9bfd.txt | 47 -- .riot/requirements/9bc08b4.txt | 25 -- .riot/requirements/9e36105.txt | 27 -- .riot/requirements/a009c45.txt | 29 -- .riot/requirements/a0aa271.txt | 33 -- .riot/requirements/a5efead.txt | 29 -- .riot/requirements/a9dcb3f.txt | 27 -- .riot/requirements/aca97c1.txt | 26 -- .riot/requirements/af3567d.txt | 26 -- .riot/requirements/b0a5cc3.txt | 26 -- .riot/requirements/b1df5a4.txt | 37 -- .riot/requirements/b35a160.txt | 51 +++ .riot/requirements/b7a530f.txt | 22 +- .riot/requirements/bc1efaa.txt | 34 -- .riot/requirements/bceb0bd.txt | 25 -- .riot/requirements/bdefe70.txt | 29 -- .riot/requirements/be3147f.txt | 20 +- .riot/requirements/beea277.txt | 25 -- .riot/requirements/c2a85a5.txt | 45 -- .riot/requirements/c384590.txt | 38 -- .riot/requirements/c4d4455.txt | 14 +- .riot/requirements/cc03823.txt | 26 -- .riot/requirements/cf88166.txt | 47 -- .riot/requirements/d0355c2.txt | 33 -- .riot/requirements/d1dd9c4.txt | 38 -- .riot/requirements/d2b6740.txt | 33 -- .riot/requirements/d2ca94b.txt | 24 +- .riot/requirements/d5d6e2c.txt | 25 -- .riot/requirements/d68f919.txt | 29 -- .riot/requirements/d751a10.txt | 43 -- .riot/requirements/dae821a.txt | 28 +- .riot/requirements/de95112.txt | 31 -- .riot/requirements/df69ea1.txt | 38 -- .riot/requirements/e0b9dc9.txt | 26 -- .riot/requirements/e2ae847.txt | 16 +- .riot/requirements/e2e33be.txt | 27 -- .riot/requirements/e312e0d.txt | 42 -- .riot/requirements/e3a9589.txt | 27 -- .riot/requirements/e6619c9.txt | 38 -- .riot/requirements/e6872f6.txt | 38 ++ .riot/requirements/e771330.txt | 26 -- .riot/requirements/e79a8f5.txt | 42 -- .riot/requirements/ebbfffb.txt | 26 -- .riot/requirements/ee63ae9.txt | 25 -- .riot/requirements/f201f06.txt | 34 -- .riot/requirements/f24db70.txt | 22 +- .riot/requirements/f395edd.txt | 39 -- .riot/requirements/f630df9.txt | 35 -- .riot/requirements/f7ca81b.txt | 26 -- .riot/requirements/f850b22.txt | 38 ++ .riot/requirements/f8e49a4.txt | 26 -- .riot/requirements/faa0584.txt | 26 -- .riot/requirements/fcebf38.txt | 25 -- .riot/requirements/fded0fa.txt | 26 -- .riot/requirements/feaf737.txt | 30 -- ddtrace/appsec/_iast/_ast/ast_patching.py | 4 +- ddtrace/contrib/internal/psycopg/patch.py | 18 +- ddtrace/contrib/internal/sqlite3/patch.py | 16 +- ddtrace/contrib/tornado/__init__.py | 3 - .../ci_visibility/api/_coverage_data.py | 8 +- ddtrace/internal/coverage/instrumentation.py | 4 +- .../coverage/instrumentation_py3_7.py | 400 ------------------ ddtrace/internal/coverage/report.py | 1 - ddtrace/internal/wrapping/context.py | 2 - ddtrace/profiling/__init__.py | 20 - ddtrace/profiling/_build.pyi | 3 - ddtrace/profiling/_build.pyx | 4 - ddtrace/profiling/_threading.pyx | 27 -- ddtrace/profiling/collector/stack.pyx | 14 +- ddtrace/settings/_otel_remapper.py | 22 +- ddtrace/version.py | 10 +- docker/.python-version | 1 - docs/advanced_usage.rst | 17 +- docs/index.rst | 9 +- hatch.toml | 17 +- mypy.ini | 1 - pyproject.toml | 6 +- .../notes/3.7-removal-c5259c3df41f08fe.yaml | 4 + riotfile.py | 311 +++----------- scripts/stubgen.sh | 3 +- setup.py | 16 +- tests/appsec/iast/_ast/test_ast_patching.py | 2 - .../iast/_ast/test_ast_patching_type_hints.py | 2 +- .../flask_tests/test_iast_flask.py | 2 - tests/appsec/suitespec.yml | 1 - tests/ci_visibility/suitespec.yml | 4 +- tests/contrib/botocore/test.py | 16 +- tests/contrib/dramatiq/test_integration.py | 2 +- .../contrib/pytest/test_coverage_per_suite.py | 46 +- tests/contrib/suitespec.yml | 6 +- tests/integration/test_debug.py | 5 +- tests/integration/test_integration.py | 1 - .../test_inferred_base_service.py | 2 +- tests/internal/test_module.py | 29 -- tests/profiling/test_profiler.py | 2 - tests/profiling_v2/collector/test_stack.py | 42 +- .../collector/test_stack_asyncio.py | 3 - tests/profiling_v2/exporter/test_ddup.py | 6 +- tests/profiling_v2/test_accuracy.py | 3 - tests/profiling_v2/test_main.py | 14 - tests/profiling_v2/test_profiler.py | 2 - tests/smoke_test.py | 2 - tests/tracer/test_encoders.py | 2 - 297 files changed, 551 insertions(+), 8258 deletions(-) delete mode 100644 .riot/requirements/1001365.txt delete mode 100644 .riot/requirements/100cc0e.txt delete mode 100644 .riot/requirements/1012b6a.txt delete mode 100644 .riot/requirements/1026e4e.txt delete mode 100644 .riot/requirements/105d554.txt delete mode 100644 .riot/requirements/10733d8.txt delete mode 100644 .riot/requirements/10a626b.txt delete mode 100644 .riot/requirements/10aef09.txt delete mode 100644 .riot/requirements/10bb9be.txt delete mode 100644 .riot/requirements/10d168b.txt delete mode 100644 .riot/requirements/10d33c9.txt delete mode 100644 .riot/requirements/10ebb4e.txt delete mode 100644 .riot/requirements/115aba5.txt create mode 100644 .riot/requirements/116b0a1.txt delete mode 100644 .riot/requirements/1181282.txt delete mode 100644 .riot/requirements/11bda89.txt delete mode 100644 .riot/requirements/11c18f0.txt delete mode 100644 .riot/requirements/11dc3f9.txt delete mode 100644 .riot/requirements/11dd5c1.txt delete mode 100644 .riot/requirements/1250d61.txt delete mode 100644 .riot/requirements/1250eb4.txt delete mode 100644 .riot/requirements/129b75c.txt delete mode 100644 .riot/requirements/130c755.txt delete mode 100644 .riot/requirements/135c565.txt delete mode 100644 .riot/requirements/136fbd2.txt delete mode 100644 .riot/requirements/137098c.txt delete mode 100644 .riot/requirements/137d3ed.txt delete mode 100644 .riot/requirements/1389734.txt delete mode 100644 .riot/requirements/139b6d7.txt delete mode 100644 .riot/requirements/13cc5fa.txt delete mode 100644 .riot/requirements/1425e39.txt delete mode 100644 .riot/requirements/145f3f5.txt delete mode 100644 .riot/requirements/14b37e6.txt delete mode 100644 .riot/requirements/14b883c.txt delete mode 100644 .riot/requirements/14ccd31.txt delete mode 100644 .riot/requirements/14f9d89.txt delete mode 100644 .riot/requirements/1532dd6.txt delete mode 100644 .riot/requirements/1538581.txt delete mode 100644 .riot/requirements/15bf3e3.txt delete mode 100644 .riot/requirements/1600ae2.txt delete mode 100644 .riot/requirements/1605571.txt delete mode 100644 .riot/requirements/160ef98.txt delete mode 100644 .riot/requirements/1619693.txt delete mode 100644 .riot/requirements/165b374.txt delete mode 100644 .riot/requirements/166f9ef.txt delete mode 100644 .riot/requirements/1683324.txt delete mode 100644 .riot/requirements/1690be2.txt delete mode 100644 .riot/requirements/16a9524.txt delete mode 100644 .riot/requirements/16bfda8.txt delete mode 100644 .riot/requirements/16cae33.txt delete mode 100644 .riot/requirements/1727339.txt delete mode 100644 .riot/requirements/173b99c.txt delete mode 100644 .riot/requirements/175a85c.txt delete mode 100644 .riot/requirements/176250f.txt delete mode 100644 .riot/requirements/178099a.txt delete mode 100644 .riot/requirements/179337c.txt delete mode 100644 .riot/requirements/17a138f.txt delete mode 100644 .riot/requirements/17a7ba8.txt delete mode 100644 .riot/requirements/17f0015.txt delete mode 100644 .riot/requirements/1800709.txt delete mode 100644 .riot/requirements/1832584.txt delete mode 100644 .riot/requirements/186ece2.txt delete mode 100644 .riot/requirements/1894fac.txt delete mode 100644 .riot/requirements/189753f.txt delete mode 100644 .riot/requirements/189a9da.txt delete mode 100644 .riot/requirements/18a9ce6.txt delete mode 100644 .riot/requirements/18b1b66.txt delete mode 100644 .riot/requirements/18b992e.txt delete mode 100644 .riot/requirements/18c560e.txt delete mode 100644 .riot/requirements/18c939b.txt delete mode 100644 .riot/requirements/19065a8.txt delete mode 100644 .riot/requirements/192924c.txt delete mode 100644 .riot/requirements/19b9cf0.txt delete mode 100644 .riot/requirements/19cce5d.txt delete mode 100644 .riot/requirements/19e4a89.txt delete mode 100644 .riot/requirements/19e9356.txt delete mode 100644 .riot/requirements/1a06ac7.txt delete mode 100644 .riot/requirements/1a3be97.txt delete mode 100644 .riot/requirements/1a45d73.txt delete mode 100644 .riot/requirements/1a48ea2.txt delete mode 100644 .riot/requirements/1a4f181.txt delete mode 100644 .riot/requirements/1aa3fad.txt delete mode 100644 .riot/requirements/1aa41b2.txt delete mode 100644 .riot/requirements/1ac6ae8.txt delete mode 100644 .riot/requirements/1ad408c.txt delete mode 100644 .riot/requirements/1b086a5.txt delete mode 100644 .riot/requirements/1b18826.txt delete mode 100644 .riot/requirements/1b2734d.txt delete mode 100644 .riot/requirements/1b73c58.txt delete mode 100644 .riot/requirements/1b84c4a.txt delete mode 100644 .riot/requirements/1b99e47.txt delete mode 100644 .riot/requirements/1ba8c21.txt delete mode 100644 .riot/requirements/1bb4e1c.txt delete mode 100644 .riot/requirements/1bb88c9.txt delete mode 100644 .riot/requirements/1bbc5e0.txt delete mode 100644 .riot/requirements/1bcefe4.txt delete mode 100644 .riot/requirements/1be3cb3.txt delete mode 100644 .riot/requirements/1c277a3.txt delete mode 100644 .riot/requirements/1c36982.txt delete mode 100644 .riot/requirements/1c489e9.txt delete mode 100644 .riot/requirements/1c5df59.txt delete mode 100644 .riot/requirements/1c6f756.txt delete mode 100644 .riot/requirements/1cb9194.txt delete mode 100644 .riot/requirements/1ccd2df.txt delete mode 100644 .riot/requirements/1cd8f95.txt delete mode 100644 .riot/requirements/1d6a1a5.txt delete mode 100644 .riot/requirements/1d73048.txt delete mode 100644 .riot/requirements/1db4b5f.txt delete mode 100644 .riot/requirements/1dcd050.txt delete mode 100644 .riot/requirements/1df4767.txt delete mode 100644 .riot/requirements/1e2fbcd.txt delete mode 100644 .riot/requirements/1e37fde.txt delete mode 100644 .riot/requirements/1e7c940.txt delete mode 100644 .riot/requirements/1e93f9f.txt delete mode 100644 .riot/requirements/1e9b9b9.txt delete mode 100644 .riot/requirements/1ed6ce0.txt delete mode 100644 .riot/requirements/1f11fb6.txt delete mode 100644 .riot/requirements/1f30147.txt delete mode 100644 .riot/requirements/1f66fe3.txt delete mode 100644 .riot/requirements/1faec17.txt delete mode 100644 .riot/requirements/1fb546b.txt delete mode 100644 .riot/requirements/1fb6c68.txt delete mode 100644 .riot/requirements/1fcbf26.txt delete mode 100644 .riot/requirements/1fe5227.txt delete mode 100644 .riot/requirements/1feb806.txt delete mode 100644 .riot/requirements/20387f9.txt delete mode 100644 .riot/requirements/210a985.txt delete mode 100644 .riot/requirements/220bd92.txt delete mode 100644 .riot/requirements/25c58ca.txt delete mode 100644 .riot/requirements/2933921.txt create mode 100644 .riot/requirements/2b426ba.txt delete mode 100644 .riot/requirements/2be57d3.txt delete mode 100644 .riot/requirements/2cc3d48.txt delete mode 100644 .riot/requirements/30829b6.txt delete mode 100644 .riot/requirements/3343686.txt delete mode 100644 .riot/requirements/3390a6b.txt delete mode 100644 .riot/requirements/3482d15.txt delete mode 100644 .riot/requirements/3506e01.txt delete mode 100644 .riot/requirements/36a2b9a.txt delete mode 100644 .riot/requirements/3c8d9c0.txt delete mode 100644 .riot/requirements/3e8a9d6.txt rename .riot/requirements/{11f2bd0.txt => 3f2ebdc.txt} (54%) delete mode 100644 .riot/requirements/40b1a4f.txt delete mode 100644 .riot/requirements/427c22a.txt delete mode 100644 .riot/requirements/429d258.txt delete mode 100644 .riot/requirements/48462b1.txt delete mode 100644 .riot/requirements/4a3b7fa.txt delete mode 100644 .riot/requirements/4ad11b1.txt delete mode 100644 .riot/requirements/4f8a3a1.txt delete mode 100644 .riot/requirements/5000f7f.txt delete mode 100644 .riot/requirements/53e5eed.txt delete mode 100644 .riot/requirements/54a9b03.txt delete mode 100644 .riot/requirements/55a0f54.txt delete mode 100644 .riot/requirements/5a0532b.txt delete mode 100644 .riot/requirements/5e2238a.txt delete mode 100644 .riot/requirements/5eed329.txt delete mode 100644 .riot/requirements/620a309.txt delete mode 100644 .riot/requirements/640588f.txt delete mode 100644 .riot/requirements/64dcf93.txt delete mode 100644 .riot/requirements/681161c.txt delete mode 100644 .riot/requirements/68d8bc6.txt create mode 100644 .riot/requirements/6dbf615.txt delete mode 100644 .riot/requirements/6dd3b2a.txt delete mode 100644 .riot/requirements/6fe81be.txt delete mode 100644 .riot/requirements/7046fe8.txt delete mode 100644 .riot/requirements/73109d5.txt delete mode 100644 .riot/requirements/745db14.txt delete mode 100644 .riot/requirements/760d56e.txt delete mode 100644 .riot/requirements/7800b91.txt delete mode 100644 .riot/requirements/7abacd9.txt delete mode 100644 .riot/requirements/840eb63.txt delete mode 100644 .riot/requirements/85c8e30.txt delete mode 100644 .riot/requirements/880a8ad.txt delete mode 100644 .riot/requirements/8854702.txt delete mode 100644 .riot/requirements/89d7a5f.txt delete mode 100644 .riot/requirements/8ef50f6.txt delete mode 100644 .riot/requirements/9050f7e.txt delete mode 100644 .riot/requirements/9091897.txt delete mode 100644 .riot/requirements/91a3315.txt delete mode 100644 .riot/requirements/93bc4fa.txt delete mode 100644 .riot/requirements/957161b.txt delete mode 100644 .riot/requirements/976376a.txt delete mode 100644 .riot/requirements/9ba9bfd.txt delete mode 100644 .riot/requirements/9bc08b4.txt delete mode 100644 .riot/requirements/9e36105.txt delete mode 100644 .riot/requirements/a009c45.txt delete mode 100644 .riot/requirements/a0aa271.txt delete mode 100644 .riot/requirements/a5efead.txt delete mode 100644 .riot/requirements/a9dcb3f.txt delete mode 100644 .riot/requirements/aca97c1.txt delete mode 100644 .riot/requirements/af3567d.txt delete mode 100644 .riot/requirements/b0a5cc3.txt delete mode 100644 .riot/requirements/b1df5a4.txt create mode 100644 .riot/requirements/b35a160.txt delete mode 100644 .riot/requirements/bc1efaa.txt delete mode 100644 .riot/requirements/bceb0bd.txt delete mode 100644 .riot/requirements/bdefe70.txt delete mode 100644 .riot/requirements/beea277.txt delete mode 100644 .riot/requirements/c2a85a5.txt delete mode 100644 .riot/requirements/c384590.txt delete mode 100644 .riot/requirements/cc03823.txt delete mode 100644 .riot/requirements/cf88166.txt delete mode 100644 .riot/requirements/d0355c2.txt delete mode 100644 .riot/requirements/d1dd9c4.txt delete mode 100644 .riot/requirements/d2b6740.txt delete mode 100644 .riot/requirements/d5d6e2c.txt delete mode 100644 .riot/requirements/d68f919.txt delete mode 100644 .riot/requirements/d751a10.txt delete mode 100644 .riot/requirements/de95112.txt delete mode 100644 .riot/requirements/df69ea1.txt delete mode 100644 .riot/requirements/e0b9dc9.txt delete mode 100644 .riot/requirements/e2e33be.txt delete mode 100644 .riot/requirements/e312e0d.txt delete mode 100644 .riot/requirements/e3a9589.txt delete mode 100644 .riot/requirements/e6619c9.txt create mode 100644 .riot/requirements/e6872f6.txt delete mode 100644 .riot/requirements/e771330.txt delete mode 100644 .riot/requirements/e79a8f5.txt delete mode 100644 .riot/requirements/ebbfffb.txt delete mode 100644 .riot/requirements/ee63ae9.txt delete mode 100644 .riot/requirements/f201f06.txt delete mode 100644 .riot/requirements/f395edd.txt delete mode 100644 .riot/requirements/f630df9.txt delete mode 100644 .riot/requirements/f7ca81b.txt create mode 100644 .riot/requirements/f850b22.txt delete mode 100644 .riot/requirements/f8e49a4.txt delete mode 100644 .riot/requirements/faa0584.txt delete mode 100644 .riot/requirements/fcebf38.txt delete mode 100644 .riot/requirements/fded0fa.txt delete mode 100644 .riot/requirements/feaf737.txt delete mode 100644 ddtrace/internal/coverage/instrumentation_py3_7.py delete mode 100644 ddtrace/profiling/_build.pyi delete mode 100644 ddtrace/profiling/_build.pyx create mode 100644 releasenotes/notes/3.7-removal-c5259c3df41f08fe.yaml diff --git a/.github/workflows/generate-package-versions.yml b/.github/workflows/generate-package-versions.yml index 5bb5f7a2f89..1a32c072352 100644 --- a/.github/workflows/generate-package-versions.yml +++ b/.github/workflows/generate-package-versions.yml @@ -19,11 +19,6 @@ jobs: with: persist-credentials: false - - name: Setup Python 3.7 - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 - with: - python-version: "3.7" - - name: Setup Python 3.8 uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: diff --git a/.github/workflows/generate-supported-versions.yml b/.github/workflows/generate-supported-versions.yml index ed2a0c44308..f2f54348516 100644 --- a/.github/workflows/generate-supported-versions.yml +++ b/.github/workflows/generate-supported-versions.yml @@ -17,11 +17,6 @@ jobs: with: persist-credentials: false - - name: Setup Python 3.7 - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 - with: - python-version: "3.7" - - name: Setup Python 3.8 uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: @@ -46,7 +41,7 @@ jobs: uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: python-version: "3.12" - + - name: Setup Python 3.13 uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: @@ -70,18 +65,18 @@ jobs: pip install requests pip install riot==0.20.1 pip install wrapt==1.16.0 - + - name: Install ddtrace run: | pip install -e . - run: python scripts/freshvenvs.py generate - + - name: Generate table run: python scripts/generate_table.py - run: git diff - + - name: Create Pull Request id: pr uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0 @@ -96,7 +91,7 @@ jobs: body: | Generates / updates the supported versions table for integrations. This should be tied to releases, or triggered manually. - Workflow runs: [Generate Supported Integration Versions](https://github.com/DataDog/dd-trace-py/actions/workflows/generate-supported-versions.yml) + Workflow runs: [Generate Supported Integration Versions](https://github.com/DataDog/dd-trace-py/actions/workflows/generate-supported-versions.yml) ## Checklist - [x] PR author has checked that all the criteria below are met diff --git a/.github/workflows/requirements-locks.yml b/.github/workflows/requirements-locks.yml index a61506dddf0..bde6467f926 100644 --- a/.github/workflows/requirements-locks.yml +++ b/.github/workflows/requirements-locks.yml @@ -23,7 +23,7 @@ jobs: run: git config --global --add safe.directory "$GITHUB_WORKSPACE" - name: Set python interpreters - run: pyenv global 3.10 3.7 3.8 3.9 3.11 3.12 3.13 + run: pyenv global 3.10 3.8 3.9 3.11 3.12 3.13 - name: Install Dependencies run: pip install --upgrade pip && pip install riot==0.20.1 diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index f3d867796fd..4f9f7e1a4a1 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -16,7 +16,7 @@ jobs: matrix: os: [ubuntu-latest, windows-latest, macos-latest] # Keep this in sync with hatch.toml - python-version: ["3.7", "3.10", "3.12"] + python-version: ["3.10", "3.12"] steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 diff --git a/.gitlab/package.yml b/.gitlab/package.yml index 973e2d55d3f..9ae49253205 100644 --- a/.gitlab/package.yml +++ b/.gitlab/package.yml @@ -19,8 +19,6 @@ download_dependency_wheels: needs: [ download_ddtrace_artifacts ] parallel: matrix: # The image tags that are mirrored are in: https://github.com/DataDog/images/blob/master/mirror.yaml - - PYTHON_IMAGE_TAG: "3.7" - PYTHON_VERSION: "3.7" - PYTHON_IMAGE_TAG: "3.8" PYTHON_VERSION: "3.8" - PYTHON_IMAGE_TAG: "3.9.13" diff --git a/.gitlab/testrunner.yml b/.gitlab/testrunner.yml index fe9fb34bec6..e0013db22ac 100644 --- a/.gitlab/testrunner.yml +++ b/.gitlab/testrunner.yml @@ -5,5 +5,5 @@ timeout: 20m before_script: - ulimit -c unlimited - - pyenv global 3.12 3.7 3.8 3.9 3.10 3.11 3.13 + - pyenv global 3.12 3.8 3.9 3.10 3.11 3.13 - export _CI_DD_AGENT_URL=http://${HOST_IP}:8126/ diff --git a/.gitlab/tests.yml b/.gitlab/tests.yml index 80c08f543d9..3092532ac22 100644 --- a/.gitlab/tests.yml +++ b/.gitlab/tests.yml @@ -56,7 +56,7 @@ build_base_venvs: stage: riot parallel: matrix: - - PYTHON_VERSION: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + - PYTHON_VERSION: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] variables: CMAKE_BUILD_PARALLEL_LEVEL: 12 PIP_VERBOSE: 1 diff --git a/.riot/requirements/1001365.txt b/.riot/requirements/1001365.txt deleted file mode 100644 index 4c93e023297..00000000000 --- a/.riot/requirements/1001365.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1001365.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==2.10.3 -markupsafe==1.1.1 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/100cc0e.txt b/.riot/requirements/100cc0e.txt deleted file mode 100644 index 04ddd7f13ac..00000000000 --- a/.riot/requirements/100cc0e.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/100cc0e.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -elasticsearch6==6.8.2 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1012b6a.txt b/.riot/requirements/1012b6a.txt deleted file mode 100644 index 19fcc2baf77..00000000000 --- a/.riot/requirements/1012b6a.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1012b6a.in -# -attrs==23.2.0 -certifi==2024.2.2 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -requests-mock==1.11.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/1026e4e.txt b/.riot/requirements/1026e4e.txt deleted file mode 100644 index 60de6cc0939..00000000000 --- a/.riot/requirements/1026e4e.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1026e4e.in -# -aiohttp==3.8.6 -aiohttp-jinja2==1.5.1 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==23.2.0 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-aiohttp==1.0.5 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/105d554.txt b/.riot/requirements/105d554.txt deleted file mode 100644 index 3305a94f703..00000000000 --- a/.riot/requirements/105d554.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/105d554.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -logbook==1.6.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/10733d8.txt b/.riot/requirements/10733d8.txt deleted file mode 100644 index 5c956f3c9fe..00000000000 --- a/.riot/requirements/10733d8.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/10733d8.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -decorator==5.1.1 -dogpile-cache==0.9.2 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/10a626b.txt b/.riot/requirements/10a626b.txt deleted file mode 100644 index 93dab7894b6..00000000000 --- a/.riot/requirements/10a626b.txt +++ /dev/null @@ -1,32 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/10a626b.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.12.3 -httpx==0.17.1 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -rfc3986[idna2008]==1.5.0 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/10aef09.txt b/.riot/requirements/10aef09.txt deleted file mode 100644 index ba661b56b54..00000000000 --- a/.riot/requirements/10aef09.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/10aef09.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mariadb==1.1.6 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/10bb9be.txt b/.riot/requirements/10bb9be.txt deleted file mode 100644 index 9d9274b19c9..00000000000 --- a/.riot/requirements/10bb9be.txt +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/10bb9be.in -# -asn1crypto==1.5.1 -attrs==23.1.0 -certifi==2023.11.17 -cffi==1.15.1 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -cryptography==38.0.4 -exceptiongroup==1.2.0 -filelock==3.12.2 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -oscrypto==1.3.0 -packaging==23.2 -pluggy==1.2.0 -pycparser==2.21 -pycryptodomex==3.19.0 -pyjwt==2.8.0 -pyopenssl==23.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2023.3.post1 -requests==2.31.0 -responses==0.16.0 -six==1.16.0 -snowflake-connector-python==3.0.4 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/10d168b.txt b/.riot/requirements/10d168b.txt deleted file mode 100644 index 993b66ceb44..00000000000 --- a/.riot/requirements/10d168b.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/10d168b.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -future==0.18.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.8.2 -pytz==2023.3.post1 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vertica-python==0.6.14 -zipp==3.15.0 diff --git a/.riot/requirements/10d33c9.txt b/.riot/requirements/10d33c9.txt deleted file mode 100644 index ee52b275764..00000000000 --- a/.riot/requirements/10d33c9.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/10d33c9.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -graphene==3.0 -graphql-core==3.1.7 -graphql-relay==3.1.5 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/10ebb4e.txt b/.riot/requirements/10ebb4e.txt deleted file mode 100644 index 055e112214f..00000000000 --- a/.riot/requirements/10ebb4e.txt +++ /dev/null @@ -1,43 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/10ebb4e.in -# -aiobotocore==1.4.2 -aiohttp==3.8.6 -aioitertools==0.11.0 -aiosignal==1.3.1 -async-generator==1.10 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==24.2.0 -botocore==1.20.106 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.8 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jmespath==0.10.0 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -wrapt==1.16.0 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/115aba5.txt b/.riot/requirements/115aba5.txt deleted file mode 100644 index 0d4bef52edd..00000000000 --- a/.riot/requirements/115aba5.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/115aba5.in -# -async-timeout==4.0.3 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==4.6.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/116b0a1.txt b/.riot/requirements/116b0a1.txt new file mode 100644 index 00000000000..3584ec0a943 --- /dev/null +++ b/.riot/requirements/116b0a1.txt @@ -0,0 +1,40 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/116b0a1.in +# +annotated-types==0.7.0 +attrs==25.1.0 +blinker==1.9.0 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.8 +coverage[toml]==7.6.10 +exceptiongroup==1.2.2 +flask==2.3.3 +flask-openapi3==4.0.3 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.0.0 +itsdangerous==2.2.0 +jinja2==3.1.5 +markupsafe==3.0.2 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.12.2 +urllib3==1.26.20 +werkzeug==3.1.3 +zipp==3.21.0 diff --git a/.riot/requirements/1181282.txt b/.riot/requirements/1181282.txt deleted file mode 100644 index 0dc9a376d68..00000000000 --- a/.riot/requirements/1181282.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1181282.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elasticsearch7==7.17.9 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/11bda89.txt b/.riot/requirements/11bda89.txt deleted file mode 100644 index d33a99885ff..00000000000 --- a/.riot/requirements/11bda89.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/11bda89.in -# -anyio==3.7.1 -attrs==23.2.0 -certifi==2024.2.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==2.12.0 -pytest-mock==2.0.0 -pytest-randomly==3.12.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/11c18f0.txt b/.riot/requirements/11c18f0.txt deleted file mode 100644 index 4a0bff48db9..00000000000 --- a/.riot/requirements/11c18f0.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/11c18f0.in -# -aniso8601==9.0.1 -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -graphene==3.3 -graphql-core==3.2.3 -graphql-relay==3.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/11dc3f9.txt b/.riot/requirements/11dc3f9.txt deleted file mode 100644 index 278eef7947a..00000000000 --- a/.riot/requirements/11dc3f9.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/11dc3f9.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -elasticsearch5==5.5.6 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/11dd5c1.txt b/.riot/requirements/11dd5c1.txt deleted file mode 100644 index a6bb6719a08..00000000000 --- a/.riot/requirements/11dd5c1.txt +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/11dd5c1.in -# -amqp==5.2.0 -attrs==23.2.0 -billiard==3.6.4.0 -cached-property==1.5.2 -celery==5.1.2 -click==7.1.2 -click-didyoumean==0.3.1 -click-plugins==1.1.1 -click-repl==0.3.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==4.13.0 -iniconfig==2.0.0 -kombu==5.2.4 -mock==5.1.0 -more-itertools==8.10.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -prompt-toolkit==3.0.47 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -redis==3.5.3 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vine==5.1.0 -wcwidth==0.2.13 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1239a3c.txt b/.riot/requirements/1239a3c.txt index 90f3db623c8..1d7ec8b0a38 100644 --- a/.riot/requirements/1239a3c.txt +++ b/.riot/requirements/1239a3c.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1239a3c.in +# pip-compile --no-annotate .riot/requirements/1239a3c.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.1.0 +coverage[toml]==7.6.10 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 @@ -15,19 +15,19 @@ hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.4 +pytest-cov==6.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2024.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 +sqlparse==0.5.3 +tomli==2.2.1 typing-extensions==4.12.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +# setuptools diff --git a/.riot/requirements/1250d61.txt b/.riot/requirements/1250d61.txt deleted file mode 100644 index 90fc52cde99..00000000000 --- a/.riot/requirements/1250d61.txt +++ /dev/null @@ -1,41 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1250d61.in -# -aiofiles==23.2.1 -aiosqlite==0.19.0 -anyio==3.7.1 -attrs==24.2.0 -certifi==2024.8.30 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -databases==0.8.0 -exceptiongroup==1.2.2 -greenlet==3.0.3 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -sqlalchemy==1.4.54 -starlette==0.20.4 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1250eb4.txt b/.riot/requirements/1250eb4.txt deleted file mode 100644 index 6d6a7b41914..00000000000 --- a/.riot/requirements/1250eb4.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1250eb4.in -# -aiopg==1.4.0 -async-timeout==4.0.3 -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -greenlet==3.0.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -psycopg2-binary==2.9.9 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.28 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/129b75c.txt b/.riot/requirements/129b75c.txt deleted file mode 100644 index 49626725a75..00000000000 --- a/.riot/requirements/129b75c.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/129b75c.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elastic-transport==8.11.0 -elasticsearch8==8.0.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/130c755.txt b/.riot/requirements/130c755.txt deleted file mode 100644 index 4ff3f89fa5e..00000000000 --- a/.riot/requirements/130c755.txt +++ /dev/null @@ -1,74 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/130c755.in -# -annotated-types==0.5.0 -attrs==24.2.0 -aws-sam-translator==1.82.0 -aws-xray-sdk==2.14.0 -boto==2.49.0 -boto3==1.33.13 -botocore==1.33.13 -certifi==2024.8.30 -cffi==1.15.1 -cfn-lint==0.53.1 -charset-normalizer==3.4.0 -coverage[toml]==7.2.7 -cryptography==43.0.3 -docker==6.1.3 -ecdsa==0.14.1 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -idna==2.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==2.10.3 -jmespath==1.0.1 -jsondiff==2.0.0 -jsonpatch==1.33 -jsonpointer==3.0.0 -jsonschema==3.2.0 -junit-xml==1.9 -markupsafe==1.1.1 -mock==5.1.0 -more-itertools==9.1.0 -moto==1.3.16 -networkx==2.6.3 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pyasn1==0.5.1 -pycparser==2.21 -pydantic==2.5.3 -pydantic-core==2.14.6 -pynamodb==5.5.1 -pyrsistent==0.19.3 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -python-jose[cryptography]==3.3.0 -pytz==2024.2 -pyyaml==6.0.1 -requests==2.31.0 -responses==0.23.3 -rsa==4.9 -s3transfer==0.8.2 -six==1.16.0 -sortedcontainers==2.4.0 -sshpubkeys==3.3.1 -tomli==2.0.1 -types-pyyaml==6.0.12.12 -typing-extensions==4.7.1 -urllib3==1.26.20 -websocket-client==1.6.1 -werkzeug==2.1.2 -wrapt==1.16.0 -xmltodict==0.14.2 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/.riot/requirements/135c565.txt b/.riot/requirements/135c565.txt deleted file mode 100644 index caf60f987cf..00000000000 --- a/.riot/requirements/135c565.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/135c565.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -py-cpuinfo==9.0.0 -pytest==7.4.4 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/136fbd2.txt b/.riot/requirements/136fbd2.txt deleted file mode 100644 index a2a894e5902..00000000000 --- a/.riot/requirements/136fbd2.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/136fbd2.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/137098c.txt b/.riot/requirements/137098c.txt deleted file mode 100644 index 24a61c00a85..00000000000 --- a/.riot/requirements/137098c.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/137098c.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -httpretty==1.1.4 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pyfakefs==5.7.3 -pytest==7.4.4 -pytest-asyncio==0.21.2 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-json-logger==2.0.7 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/137d3ed.txt b/.riot/requirements/137d3ed.txt deleted file mode 100644 index 72b5cba9c65..00000000000 --- a/.riot/requirements/137d3ed.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/137d3ed.in -# -aiofiles==23.2.1 -anyio==3.7.1 -attrs==24.2.0 -certifi==2024.12.14 -charset-normalizer==3.4.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -fastapi==0.64.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==1.10.19 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-multipart==0.0.8 -requests==2.31.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -starlette==0.13.6 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1389734.txt b/.riot/requirements/1389734.txt deleted file mode 100644 index 2b10749d53e..00000000000 --- a/.riot/requirements/1389734.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1389734.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elastic-transport==8.11.0 -elasticsearch==8.11.1 -elasticsearch7==7.17.9 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/139b6d7.txt b/.riot/requirements/139b6d7.txt deleted file mode 100644 index bf73de0c382..00000000000 --- a/.riot/requirements/139b6d7.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/139b6d7.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -logbook==1.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/13cc5fa.txt b/.riot/requirements/13cc5fa.txt deleted file mode 100644 index a9ffcea28bc..00000000000 --- a/.riot/requirements/13cc5fa.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/13cc5fa.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -decorator==5.1.1 -dogpile-cache==1.2.2 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pbr==6.0.0 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -stevedore==3.5.2 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1425e39.txt b/.riot/requirements/1425e39.txt deleted file mode 100644 index b47a37009e5..00000000000 --- a/.riot/requirements/1425e39.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1425e39.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -django==2.2.28 -django-configurations==2.3.2 -djangorestframework==3.12.4 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.4.4 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/145f3f5.txt b/.riot/requirements/145f3f5.txt deleted file mode 100644 index 79300a5a18b..00000000000 --- a/.riot/requirements/145f3f5.txt +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/145f3f5.in -# -attrs==23.2.0 -autocommand==2.2.2 -cheroot==10.0.1 -cherrypy==18.10.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -importlib-resources==5.12.0 -inflect==6.0.5 -iniconfig==2.0.0 -jaraco-collections==4.2.0 -jaraco-context==4.3.0 -jaraco-functools==3.7.0 -jaraco-text==3.11.1 -mock==5.1.0 -more-itertools==8.10.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -portend==3.1.0 -pydantic==1.10.17 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -sortedcontainers==2.4.0 -tempora==5.3.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zc-lockfile==3.0.post1 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/14b37e6.txt b/.riot/requirements/14b37e6.txt deleted file mode 100644 index 2a4e0451f06..00000000000 --- a/.riot/requirements/14b37e6.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/14b37e6.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mongoengine==0.29.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymongo==3.9.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/14b883c.txt b/.riot/requirements/14b883c.txt deleted file mode 100644 index fc5fce6885f..00000000000 --- a/.riot/requirements/14b883c.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/14b883c.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -falcon==3.1.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/14ccd31.txt b/.riot/requirements/14ccd31.txt deleted file mode 100644 index 78e13efd61f..00000000000 --- a/.riot/requirements/14ccd31.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/14ccd31.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/14f9d89.txt b/.riot/requirements/14f9d89.txt deleted file mode 100644 index 2e418a835de..00000000000 --- a/.riot/requirements/14f9d89.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/14f9d89.in -# -async-timeout==4.0.3 -attrs==23.1.0 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==5.0.1 -rq==1.10.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1532dd6.txt b/.riot/requirements/1532dd6.txt deleted file mode 100644 index bb2d4670425..00000000000 --- a/.riot/requirements/1532dd6.txt +++ /dev/null @@ -1,77 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/1532dd6.in -# -arrow==1.2.3 -asgiref==3.7.2 -attrs==24.2.0 -autobahn==23.1.2 -automat==22.10.0 -bcrypt==4.2.1 -blessed==1.20.0 -cached-property==1.5.2 -certifi==2024.12.14 -cffi==1.15.1 -channels==3.0.5 -charset-normalizer==3.4.0 -constantly==15.1.0 -coverage[toml]==7.2.7 -cryptography==44.0.0 -daphne==3.0.2 -django==3.2.25 -django-configurations==2.4.2 -django-picklefield==3.2 -django-pylibmc==0.6.1 -django-q==1.3.6 -django-redis==4.5.0 -exceptiongroup==1.2.2 -hyperlink==21.0.0 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -incremental==22.10.0 -iniconfig==2.0.0 -isodate==0.7.2 -lxml==5.3.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -platformdirs==4.0.0 -pluggy==1.2.0 -psycopg2-binary==2.9.9 -pyasn1==0.5.1 -pyasn1-modules==0.3.0 -pycparser==2.21 -pylibmc==1.6.3 -pyopenssl==24.3.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -python-memcached==1.62 -pytz==2024.2 -redis==2.10.6 -requests==2.31.0 -requests-file==2.1.0 -requests-toolbelt==1.0.0 -service-identity==21.1.0 -six==1.17.0 -sortedcontainers==2.4.0 -spyne==2.14.0 -sqlparse==0.4.4 -tomli==2.0.1 -twisted[tls]==23.8.0 -txaio==23.1.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -wcwidth==0.2.13 -zeep==4.2.1 -zipp==3.15.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1538581.txt b/.riot/requirements/1538581.txt deleted file mode 100644 index 17a287f4cec..00000000000 --- a/.riot/requirements/1538581.txt +++ /dev/null @@ -1,45 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1538581.in -# -aiofiles==23.2.1 -anyio==3.7.1 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.16.3 -httptools==0.6.0 -httpx==0.23.3 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -rfc3986[idna2008]==1.5.0 -sanic==22.12.0 -sanic-routing==23.6.0 -sanic-testing==22.3.1 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -ujson==5.7.0 -urllib3==2.0.7 -uvloop==0.18.0 -websockets==10.4 -zipp==3.15.0 diff --git a/.riot/requirements/15bf3e3.txt b/.riot/requirements/15bf3e3.txt deleted file mode 100644 index 9b69550f0e2..00000000000 --- a/.riot/requirements/15bf3e3.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/15bf3e3.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pymemcache==4.0.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1600ae2.txt b/.riot/requirements/1600ae2.txt deleted file mode 100644 index 8510d225c91..00000000000 --- a/.riot/requirements/1600ae2.txt +++ /dev/null @@ -1,39 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1600ae2.in -# -attrs==24.2.0 -colorama==0.4.6 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -gunicorn[gevent]==23.0.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -lz4==4.3.2 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -py-cpuinfo==8.0.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-cpp==2.5.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -uwsgi==2.0.28 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1605571.txt b/.riot/requirements/1605571.txt deleted file mode 100644 index 3a2c7bb0af4..00000000000 --- a/.riot/requirements/1605571.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1605571.in -# -attrs==23.2.0 -backports-zoneinfo==0.2.1 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -psycopg==3.1.20 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/160ef98.txt b/.riot/requirements/160ef98.txt deleted file mode 100644 index daea0acc6d0..00000000000 --- a/.riot/requirements/160ef98.txt +++ /dev/null @@ -1,37 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/160ef98.in -# -atomicwrites==1.4.1 -attrs==24.2.0 -blinker==1.6.3 -click==8.1.7 -coverage[toml]==7.2.7 -flask==0.12.5 -flask-cache==0.13.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -itsdangerous==1.1.0 -jinja2==2.10.3 -markupsafe==1.1.1 -mock==5.1.0 -more-itertools==8.10.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==0.13.1 -py==1.11.0 -pytest==4.6.11 -pytest-cov==3.0.0 -pytest-mock==2.0.0 -pytest-randomly==3.12.0 -python-memcached==1.62 -redis==2.10.6 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -wcwidth==0.2.13 -werkzeug==0.16.1 -zipp==3.15.0 diff --git a/.riot/requirements/1619693.txt b/.riot/requirements/1619693.txt deleted file mode 100644 index 1069309457b..00000000000 --- a/.riot/requirements/1619693.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1619693.in -# -aiohttp==3.8.6 -aiohttp-jinja2==1.5.1 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==23.2.0 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-aiohttp==1.0.5 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/165b374.txt b/.riot/requirements/165b374.txt deleted file mode 100644 index 19d5a6ef952..00000000000 --- a/.riot/requirements/165b374.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/165b374.in -# -aiohttp==3.8.6 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==24.2.0 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.8 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-aiohttp==1.0.5 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/166f9ef.txt b/.riot/requirements/166f9ef.txt deleted file mode 100644 index 34dccc44a2c..00000000000 --- a/.riot/requirements/166f9ef.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/166f9ef.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -decorator==5.1.1 -dogpile-cache==1.2.2 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pbr==6.0.0 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -stevedore==3.5.2 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1683324.txt b/.riot/requirements/1683324.txt deleted file mode 100644 index ffd915a20db..00000000000 --- a/.riot/requirements/1683324.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1683324.in -# -async-timeout==4.0.3 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==5.0.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1690be2.txt b/.riot/requirements/1690be2.txt deleted file mode 100644 index 5bc80ccc1ca..00000000000 --- a/.riot/requirements/1690be2.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1690be2.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -tornado==6.2 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/16a9524.txt b/.riot/requirements/16a9524.txt deleted file mode 100644 index 988d6162a98..00000000000 --- a/.riot/requirements/16a9524.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/16a9524.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/16bfda8.txt b/.riot/requirements/16bfda8.txt deleted file mode 100644 index c72c2c40985..00000000000 --- a/.riot/requirements/16bfda8.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/16bfda8.in -# -attrs==23.1.0 -cassandra-driver==3.24.0 -click==8.1.7 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -geomet==0.2.1.post1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/16cae33.txt b/.riot/requirements/16cae33.txt deleted file mode 100644 index 0df83f49b08..00000000000 --- a/.riot/requirements/16cae33.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/16cae33.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -dnspython==2.3.0 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mongoengine==0.29.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymongo==4.7.3 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1727339.txt b/.riot/requirements/1727339.txt deleted file mode 100644 index 4934c8cbc73..00000000000 --- a/.riot/requirements/1727339.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1727339.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -glob2==0.7 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mako==1.2.4 -markupsafe==2.1.5 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -parse==1.20.1 -parse-type==0.6.2 -pluggy==1.2.0 -py==1.11.0 -pytest==7.4.4 -pytest-bdd==6.0.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/173b99c.txt b/.riot/requirements/173b99c.txt deleted file mode 100644 index 80d3f10ffb8..00000000000 --- a/.riot/requirements/173b99c.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/173b99c.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymysql==1.1.1 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/175a85c.txt b/.riot/requirements/175a85c.txt deleted file mode 100644 index 30ac0574719..00000000000 --- a/.riot/requirements/175a85c.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/175a85c.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/176250f.txt b/.riot/requirements/176250f.txt deleted file mode 100644 index 9d62cfd2bed..00000000000 --- a/.riot/requirements/176250f.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/176250f.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elasticsearch==7.17.9 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/178099a.txt b/.riot/requirements/178099a.txt deleted file mode 100644 index 5cf0e55f6f4..00000000000 --- a/.riot/requirements/178099a.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/178099a.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/179337c.txt b/.riot/requirements/179337c.txt deleted file mode 100644 index f4b44745053..00000000000 --- a/.riot/requirements/179337c.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/179337c.in -# -annotated-types==0.7.0 -attrs==23.2.0 -blinker==1.8.2 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==8.1.7 -coverage[toml]==7.5.4 -exceptiongroup==1.2.1 -flask==2.3.3 -flask-openapi3==3.1.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -itsdangerous==2.2.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pydantic==2.8.0 -pydantic-core==2.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -requests==2.32.3 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.12.2 -urllib3==1.26.19 -werkzeug==2.3.8 -zipp==3.19.2 diff --git a/.riot/requirements/17a138f.txt b/.riot/requirements/17a138f.txt deleted file mode 100644 index d1cb51e0887..00000000000 --- a/.riot/requirements/17a138f.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/17a138f.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymysql==1.1.1 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/17a7ba8.txt b/.riot/requirements/17a7ba8.txt deleted file mode 100644 index 7984fff1ed6..00000000000 --- a/.riot/requirements/17a7ba8.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/17a7ba8.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -falcon==3.1.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/17f0015.txt b/.riot/requirements/17f0015.txt deleted file mode 100644 index 9bfec9c3f80..00000000000 --- a/.riot/requirements/17f0015.txt +++ /dev/null @@ -1,45 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/17f0015.in -# -aiofiles==23.2.1 -anyio==3.7.1 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.16.3 -httptools==0.6.0 -httpx==0.23.3 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==5.2.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -rfc3986[idna2008]==1.5.0 -sanic==21.12.2 -sanic-routing==0.7.2 -sanic-testing==0.8.3 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -ujson==5.7.0 -urllib3==2.0.7 -uvloop==0.18.0 -websockets==10.4 -zipp==3.15.0 diff --git a/.riot/requirements/1800709.txt b/.riot/requirements/1800709.txt deleted file mode 100644 index 9b8c05328b7..00000000000 --- a/.riot/requirements/1800709.txt +++ /dev/null @@ -1,32 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1800709.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1832584.txt b/.riot/requirements/1832584.txt deleted file mode 100644 index 7547f789297..00000000000 --- a/.riot/requirements/1832584.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1832584.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elastic-transport==8.11.0 -elasticsearch8==8.11.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/186ece2.txt b/.riot/requirements/186ece2.txt deleted file mode 100644 index 79af56e0359..00000000000 --- a/.riot/requirements/186ece2.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/186ece2.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==3.5.3 -redis-py-cluster==2.1.3 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1894fac.txt b/.riot/requirements/1894fac.txt deleted file mode 100644 index 7565d0dd040..00000000000 --- a/.riot/requirements/1894fac.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1894fac.in -# -anyio==3.7.1 -attrs==23.2.0 -certifi==2024.6.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -h11==0.14.0 -httpcore==0.16.3 -httpx==0.23.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -rfc3986[idna2008]==1.5.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/189753f.txt b/.riot/requirements/189753f.txt deleted file mode 100644 index 883bb29ec16..00000000000 --- a/.riot/requirements/189753f.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/189753f.in -# -attrs==23.1.0 -confluent-kafka==2.3.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/189a9da.txt b/.riot/requirements/189a9da.txt deleted file mode 100644 index 2d4ab01b347..00000000000 --- a/.riot/requirements/189a9da.txt +++ /dev/null @@ -1,54 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/189a9da.in -# -aiobotocore==2.3.1 -aiohttp==3.8.6 -aioitertools==0.11.0 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==24.2.0 -botocore==1.24.21 -certifi==2024.12.14 -charset-normalizer==3.4.1 -coverage[toml]==7.2.7 -elastic-transport==8.13.1 -elasticsearch==8.14.0 -exceptiongroup==1.2.2 -frozenlist==1.3.3 -gevent==20.12.1 -greenlet==1.0.0 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -multidict==6.0.5 -opensearch-py==2.5.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pynamodb==5.5.1 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -requests==2.31.0 -six==1.17.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.20 -wrapt==1.16.0 -yarl==1.9.4 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/18a9ce6.txt b/.riot/requirements/18a9ce6.txt deleted file mode 100644 index ead422ea6e6..00000000000 --- a/.riot/requirements/18a9ce6.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/18a9ce6.in -# -amqp==5.2.0 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==4.13.0 -iniconfig==2.0.0 -kombu==5.0.2 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vine==5.1.0 -zipp==3.15.0 diff --git a/.riot/requirements/18b1b66.txt b/.riot/requirements/18b1b66.txt deleted file mode 100644 index 606ca2c57c8..00000000000 --- a/.riot/requirements/18b1b66.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/18b1b66.in -# -attrs==24.2.0 -beautifulsoup4==4.12.3 -bottle==0.12.25 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -soupsieve==2.4.1 -tomli==2.0.1 -typing-extensions==4.7.1 -waitress==2.1.2 -webob==1.8.9 -webtest==3.0.1 -zipp==3.15.0 diff --git a/.riot/requirements/18b992e.txt b/.riot/requirements/18b992e.txt deleted file mode 100644 index b174912a77e..00000000000 --- a/.riot/requirements/18b992e.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/18b992e.in -# -attrs==23.2.0 -blinker==1.6.3 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -flask==1.1.4 -flask-caching==1.10.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==1.1.0 -jinja2==2.11.3 -markupsafe==1.1.1 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-memcached==1.62 -redis==2.10.6 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -werkzeug==1.0.1 -zipp==3.15.0 diff --git a/.riot/requirements/18c560e.txt b/.riot/requirements/18c560e.txt deleted file mode 100644 index b34b418c367..00000000000 --- a/.riot/requirements/18c560e.txt +++ /dev/null @@ -1,44 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/18c560e.in -# -astunparse==1.6.3 -attrs==24.2.0 -certifi==2024.12.14 -cffi==1.15.1 -charset-normalizer==3.4.1 -coverage[toml]==7.2.7 -cryptography==44.0.0 -exceptiongroup==1.2.2 -googleapis-common-protos==1.66.0 -greenlet==3.1.1 -grpcio==1.62.3 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysqlclient==2.1.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -psycopg2-binary==2.9.9 -pycparser==2.21 -pycryptodome==3.21.0 -pymysql==1.1.1 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -requests==2.31.0 -simplejson==3.19.3 -six==1.17.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.22 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -wheel==0.42.0 -zipp==3.15.0 diff --git a/.riot/requirements/18c939b.txt b/.riot/requirements/18c939b.txt deleted file mode 100644 index c25e6b38593..00000000000 --- a/.riot/requirements/18c939b.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/18c939b.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysql-connector-python==8.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/19065a8.txt b/.riot/requirements/19065a8.txt deleted file mode 100644 index c029f9be123..00000000000 --- a/.riot/requirements/19065a8.txt +++ /dev/null @@ -1,50 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/19065a8.in -# -annotated-types==0.5.0 -anyio==3.7.1 -attrs==24.2.0 -boto3==1.33.13 -botocore==1.33.13 -certifi==2024.8.30 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -fastapi==0.103.2 -h11==0.14.0 -httpcore==0.17.3 -httpretty==1.1.4 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==2.5.3 -pydantic-core==2.14.6 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -s3transfer==0.8.2 -six==1.16.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -starlette==0.27.0 -structlog==23.1.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.20 -wheel==0.42.0 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/192924c.txt b/.riot/requirements/192924c.txt deleted file mode 100644 index 9e1acf283a2..00000000000 --- a/.riot/requirements/192924c.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/192924c.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gunicorn==22.0.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==3.8.0 -py-cpuinfo==8.0.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -uwsgi==2.0.26 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/19b9cf0.txt b/.riot/requirements/19b9cf0.txt deleted file mode 100644 index 032dea00937..00000000000 --- a/.riot/requirements/19b9cf0.txt +++ /dev/null @@ -1,45 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/19b9cf0.in -# -aiofiles==23.2.1 -anyio==3.7.1 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.16.3 -httptools==0.6.0 -httpx==0.23.3 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==5.2.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -rfc3986[idna2008]==1.5.0 -sanic==21.12.2 -sanic-routing==0.7.2 -sanic-testing==0.8.3 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -ujson==5.7.0 -urllib3==2.0.7 -uvloop==0.18.0 -websockets==10.4 -zipp==3.15.0 diff --git a/.riot/requirements/19cce5d.txt b/.riot/requirements/19cce5d.txt deleted file mode 100644 index b0b031c57b4..00000000000 --- a/.riot/requirements/19cce5d.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/19cce5d.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -tornado==4.5.3 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/19e4a89.txt b/.riot/requirements/19e4a89.txt deleted file mode 100644 index a43fb84b853..00000000000 --- a/.riot/requirements/19e4a89.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/19e4a89.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -greenlet==3.0.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysql-connector-python==8.0.33 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==3.20.3 -psycopg2-binary==2.9.9 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -sqlalchemy==1.3.24 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/19e9356.txt b/.riot/requirements/19e9356.txt deleted file mode 100644 index 1893291ee15..00000000000 --- a/.riot/requirements/19e9356.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/19e9356.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysqlclient==2.1.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1a06ac7.txt b/.riot/requirements/1a06ac7.txt deleted file mode 100644 index 010713c7820..00000000000 --- a/.riot/requirements/1a06ac7.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1a06ac7.in -# -algoliasearch==2.6.3 -attrs==24.2.0 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -idna==3.8 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -zipp==3.15.0 diff --git a/.riot/requirements/1a3be97.txt b/.riot/requirements/1a3be97.txt deleted file mode 100644 index 548a87dcdfc..00000000000 --- a/.riot/requirements/1a3be97.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1a3be97.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elasticsearch==7.13.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/1a45d73.txt b/.riot/requirements/1a45d73.txt deleted file mode 100644 index f4a421190c0..00000000000 --- a/.riot/requirements/1a45d73.txt +++ /dev/null @@ -1,37 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1a45d73.in -# -attrs==23.2.0 -cheroot==10.0.1 -cherrypy==17.4.2 -contextlib2==21.6.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jaraco-functools==3.7.0 -mock==5.1.0 -more-itertools==8.10.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -portend==3.1.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -six==1.16.0 -sortedcontainers==2.4.0 -tempora==5.3.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zc-lockfile==3.0.post1 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1a48ea2.txt b/.riot/requirements/1a48ea2.txt deleted file mode 100644 index 8b34722dea6..00000000000 --- a/.riot/requirements/1a48ea2.txt +++ /dev/null @@ -1,32 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1a48ea2.in -# -asgiref==3.7.2 -attrs==23.2.0 -coverage[toml]==7.2.7 -django==3.2.25 -django-configurations==2.4.2 -djangorestframework==3.11.2 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.4.4 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1a4f181.txt b/.riot/requirements/1a4f181.txt deleted file mode 100644 index f01b5c2b169..00000000000 --- a/.riot/requirements/1a4f181.txt +++ /dev/null @@ -1,51 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1a4f181.in -# -annotated-types==0.5.0 -anyio==3.7.1 -attrs==22.1.0 -boto3==1.33.13 -botocore==1.33.13 -cattrs==23.1.2 -certifi==2024.8.30 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -fastapi==0.103.2 -h11==0.14.0 -httpcore==0.17.3 -httpretty==1.1.4 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==2.5.3 -pydantic-core==2.14.6 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -s3transfer==0.8.2 -six==1.16.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -starlette==0.27.0 -structlog==23.1.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.20 -wheel==0.42.0 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1a508dc.txt b/.riot/requirements/1a508dc.txt index 6e2dfecef5e..3011d06795c 100644 --- a/.riot/requirements/1a508dc.txt +++ b/.riot/requirements/1a508dc.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/1a508dc.in +# pip-compile --no-annotate .riot/requirements/1a508dc.in # asgiref==3.8.1 -attrs==24.2.0 -coverage[toml]==7.6.1 +attrs==25.1.0 +coverage[toml]==7.6.10 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 @@ -14,17 +14,17 @@ hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 -pytest-cov==5.0.0 +pytest==8.3.4 +pytest-cov==6.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 pytz==2024.2 -six==1.16.0 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==75.1.0 +setuptools diff --git a/.riot/requirements/1aa3fad.txt b/.riot/requirements/1aa3fad.txt deleted file mode 100644 index f23d1c43824..00000000000 --- a/.riot/requirements/1aa3fad.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1aa3fad.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -tornado==6.2 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1aa41b2.txt b/.riot/requirements/1aa41b2.txt deleted file mode 100644 index 79322e51fe1..00000000000 --- a/.riot/requirements/1aa41b2.txt +++ /dev/null @@ -1,77 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/1aa41b2.in -# -arrow==1.2.3 -asgiref==3.7.2 -attrs==24.2.0 -autobahn==23.1.2 -automat==22.10.0 -bcrypt==4.2.1 -blessed==1.20.0 -cached-property==1.5.2 -certifi==2024.12.14 -cffi==1.15.1 -channels==4.0.0 -charset-normalizer==3.4.0 -constantly==15.1.0 -coverage[toml]==7.2.7 -cryptography==44.0.0 -daphne==4.0.0 -django==3.2.25 -django-configurations==2.4.2 -django-picklefield==3.2 -django-pylibmc==0.6.1 -django-q==1.3.6 -django-redis==4.5.0 -exceptiongroup==1.2.2 -hyperlink==21.0.0 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -incremental==22.10.0 -iniconfig==2.0.0 -isodate==0.7.2 -lxml==5.3.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -platformdirs==4.0.0 -pluggy==1.2.0 -psycopg2-binary==2.9.9 -pyasn1==0.5.1 -pyasn1-modules==0.3.0 -pycparser==2.21 -pylibmc==1.6.3 -pyopenssl==24.3.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -python-memcached==1.62 -pytz==2024.2 -redis==2.10.6 -requests==2.31.0 -requests-file==2.1.0 -requests-toolbelt==1.0.0 -service-identity==21.1.0 -six==1.17.0 -sortedcontainers==2.4.0 -spyne==2.14.0 -sqlparse==0.4.4 -tomli==2.0.1 -twisted[tls]==23.8.0 -txaio==23.1.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -wcwidth==0.2.13 -zeep==4.2.1 -zipp==3.15.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1ac6ae8.txt b/.riot/requirements/1ac6ae8.txt deleted file mode 100644 index ec835d3a574..00000000000 --- a/.riot/requirements/1ac6ae8.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1ac6ae8.in -# -attrs==23.1.0 -cattrs==22.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -molten==1.0.2 -mypy-extensions==1.0.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==3.10.0.2 -typing-inspect==0.6.0 -zipp==3.15.0 diff --git a/.riot/requirements/1ad408c.txt b/.riot/requirements/1ad408c.txt deleted file mode 100644 index 363772cbdb7..00000000000 --- a/.riot/requirements/1ad408c.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1ad408c.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1b086a5.txt b/.riot/requirements/1b086a5.txt deleted file mode 100644 index ff9e9fd4b4a..00000000000 --- a/.riot/requirements/1b086a5.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1b086a5.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1b18826.txt b/.riot/requirements/1b18826.txt deleted file mode 100644 index 22a65cb550c..00000000000 --- a/.riot/requirements/1b18826.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1b18826.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/1b2734d.txt b/.riot/requirements/1b2734d.txt deleted file mode 100644 index 8f15374e0f6..00000000000 --- a/.riot/requirements/1b2734d.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1b2734d.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1b73c58.txt b/.riot/requirements/1b73c58.txt deleted file mode 100644 index 19a201fee30..00000000000 --- a/.riot/requirements/1b73c58.txt +++ /dev/null @@ -1,37 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1b73c58.in -# -attrs==24.2.0 -certifi==2024.12.14 -charset-normalizer==3.4.1 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -gunicorn==20.0.4 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1b84c4a.txt b/.riot/requirements/1b84c4a.txt deleted file mode 100644 index 3e9d0bf584e..00000000000 --- a/.riot/requirements/1b84c4a.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1b84c4a.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1b99e47.txt b/.riot/requirements/1b99e47.txt deleted file mode 100644 index db56e0823c3..00000000000 --- a/.riot/requirements/1b99e47.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1b99e47.in -# -amqp==2.6.1 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==4.13.0 -iniconfig==2.0.0 -kombu==4.6.11 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vine==1.3.0 -zipp==3.15.0 diff --git a/.riot/requirements/1ba8c21.txt b/.riot/requirements/1ba8c21.txt deleted file mode 100644 index e1c95dcb703..00000000000 --- a/.riot/requirements/1ba8c21.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1ba8c21.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -dnspython==2.3.0 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mongoengine==0.29.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymongo==4.7.3 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1bb4e1c.txt b/.riot/requirements/1bb4e1c.txt deleted file mode 100644 index d9dd443d6f2..00000000000 --- a/.riot/requirements/1bb4e1c.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1bb4e1c.in -# -attrs==23.2.0 -certifi==2024.2.2 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -docker==6.1.3 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -websocket-client==1.6.1 -zipp==3.15.0 diff --git a/.riot/requirements/1bb88c9.txt b/.riot/requirements/1bb88c9.txt deleted file mode 100644 index 589c1ce6c25..00000000000 --- a/.riot/requirements/1bb88c9.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1bb88c9.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -tornado==5.1.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1bbc5e0.txt b/.riot/requirements/1bbc5e0.txt deleted file mode 100644 index 117147b24ac..00000000000 --- a/.riot/requirements/1bbc5e0.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1bbc5e0.in -# -attrs==23.2.0 -blinker==1.6.3 -cachelib==0.9.0 -click==8.1.7 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -flask==2.2.5 -flask-caching==2.1.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==2.1.2 -jinja2==3.1.3 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-memcached==1.62 -redis==2.10.6 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -werkzeug==2.2.3 -zipp==3.15.0 diff --git a/.riot/requirements/1bcefe4.txt b/.riot/requirements/1bcefe4.txt deleted file mode 100644 index 360df91aa5e..00000000000 --- a/.riot/requirements/1bcefe4.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1bcefe4.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.59.5 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1be3cb3.txt b/.riot/requirements/1be3cb3.txt deleted file mode 100644 index de6a7df8ae4..00000000000 --- a/.riot/requirements/1be3cb3.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1be3cb3.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -structlog==20.2.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1c277a3.txt b/.riot/requirements/1c277a3.txt deleted file mode 100644 index ca17e4016f3..00000000000 --- a/.riot/requirements/1c277a3.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1c277a3.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysqlclient==2.1.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1c36982.txt b/.riot/requirements/1c36982.txt deleted file mode 100644 index ab91743352a..00000000000 --- a/.riot/requirements/1c36982.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1c36982.in -# -amqp==5.2.0 -attrs==24.2.0 -cached-property==1.5.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==4.13.0 -iniconfig==2.0.0 -kombu==5.2.4 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vine==5.1.0 -zipp==3.15.0 diff --git a/.riot/requirements/1c489e9.txt b/.riot/requirements/1c489e9.txt deleted file mode 100644 index 92254158db9..00000000000 --- a/.riot/requirements/1c489e9.txt +++ /dev/null @@ -1,41 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1c489e9.in -# -aiofiles==23.2.1 -aiosqlite==0.19.0 -anyio==3.7.1 -attrs==24.2.0 -certifi==2024.8.30 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -databases==0.8.0 -exceptiongroup==1.2.2 -greenlet==3.0.3 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -sqlalchemy==1.4.54 -starlette==0.29.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1c5df59.txt b/.riot/requirements/1c5df59.txt deleted file mode 100644 index e913f737172..00000000000 --- a/.riot/requirements/1c5df59.txt +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1c5df59.in -# -aiohttp==3.8.6 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -elastic-transport==8.11.0 -elasticsearch[async]==8.11.1 -elasticsearch7[async]==7.17.9 -exceptiongroup==1.2.0 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opensearch-py[async]==2.4.2 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.8.2 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/1c6f756.txt b/.riot/requirements/1c6f756.txt deleted file mode 100644 index a7d6f97293a..00000000000 --- a/.riot/requirements/1c6f756.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1c6f756.in -# -attrs==23.1.0 -cattrs==22.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -molten==1.0.2 -mypy-extensions==1.0.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==3.10.0.2 -typing-inspect==0.6.0 -zipp==3.15.0 diff --git a/.riot/requirements/1cb9194.txt b/.riot/requirements/1cb9194.txt deleted file mode 100644 index 8a5e9be047f..00000000000 --- a/.riot/requirements/1cb9194.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1cb9194.in -# -amqp==2.6.1 -atomicwrites==1.4.1 -attrs==23.2.0 -billiard==3.6.4.0 -celery==4.4.7 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -importlib-metadata==4.13.0 -kombu==4.6.11 -mock==5.1.0 -more-itertools==8.10.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==0.13.1 -py==1.11.0 -pytest==4.6.11 -pytest-cov==3.0.0 -pytest-mock==2.0.0 -pytest-randomly==3.12.0 -pytz==2024.1 -redis==3.5.3 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vine==1.3.0 -wcwidth==0.2.13 -zipp==3.15.0 diff --git a/.riot/requirements/1ccd2df.txt b/.riot/requirements/1ccd2df.txt deleted file mode 100644 index 978f386e4c6..00000000000 --- a/.riot/requirements/1ccd2df.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1ccd2df.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1cd8f95.txt b/.riot/requirements/1cd8f95.txt deleted file mode 100644 index fbad1d4f0ec..00000000000 --- a/.riot/requirements/1cd8f95.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1cd8f95.in -# -aiopg==1.4.0 -async-timeout==4.0.3 -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -greenlet==3.0.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -psycopg2-binary==2.9.9 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.29 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1d6a1a5.txt b/.riot/requirements/1d6a1a5.txt deleted file mode 100644 index 8c33bbe9819..00000000000 --- a/.riot/requirements/1d6a1a5.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1d6a1a5.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1d73048.txt b/.riot/requirements/1d73048.txt deleted file mode 100644 index 0d8a063b5d1..00000000000 --- a/.riot/requirements/1d73048.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1d73048.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1db4b5f.txt b/.riot/requirements/1db4b5f.txt deleted file mode 100644 index fdb88ccbd84..00000000000 --- a/.riot/requirements/1db4b5f.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1db4b5f.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1dcd050.txt b/.riot/requirements/1dcd050.txt deleted file mode 100644 index 97f73b4f139..00000000000 --- a/.riot/requirements/1dcd050.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1dcd050.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yaaredis==2.0.4 -zipp==3.15.0 diff --git a/.riot/requirements/1df4767.txt b/.riot/requirements/1df4767.txt deleted file mode 100644 index f9cab2ccfd7..00000000000 --- a/.riot/requirements/1df4767.txt +++ /dev/null @@ -1,32 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1df4767.in -# -anyio==3.7.1 -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1e2fbcd.txt b/.riot/requirements/1e2fbcd.txt deleted file mode 100644 index feaa8e3a345..00000000000 --- a/.riot/requirements/1e2fbcd.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1e2fbcd.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mariadb==1.0.11 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1e37fde.txt b/.riot/requirements/1e37fde.txt deleted file mode 100644 index a739864c0a5..00000000000 --- a/.riot/requirements/1e37fde.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1e37fde.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1e7c940.txt b/.riot/requirements/1e7c940.txt deleted file mode 100644 index 282fc6dfa04..00000000000 --- a/.riot/requirements/1e7c940.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1e7c940.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.25 -zipp==3.15.0 diff --git a/.riot/requirements/1e93f9f.txt b/.riot/requirements/1e93f9f.txt deleted file mode 100644 index 8924a260c22..00000000000 --- a/.riot/requirements/1e93f9f.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/1e93f9f.in -# -annotated-types==0.7.0 -attrs==23.2.0 -blinker==1.8.2 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==8.1.7 -coverage[toml]==7.5.4 -exceptiongroup==1.2.1 -flask==2.3.3 -flask-openapi3==3.1.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -itsdangerous==2.2.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pydantic==2.8.0 -pydantic-core==2.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -requests==2.32.3 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.12.2 -urllib3==1.26.19 -werkzeug==2.3.8 -zipp==3.19.2 diff --git a/.riot/requirements/1e9b9b9.txt b/.riot/requirements/1e9b9b9.txt deleted file mode 100644 index 7f71692a48c..00000000000 --- a/.riot/requirements/1e9b9b9.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1e9b9b9.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elastic-transport==8.11.0 -elasticsearch==8.0.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1ed6ce0.txt b/.riot/requirements/1ed6ce0.txt deleted file mode 100644 index a51ab00415d..00000000000 --- a/.riot/requirements/1ed6ce0.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1ed6ce0.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -dnspython==2.3.0 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mongoengine==0.29.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymongo==4.7.3 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1f11fb6.txt b/.riot/requirements/1f11fb6.txt deleted file mode 100644 index 3dd008ccf49..00000000000 --- a/.riot/requirements/1f11fb6.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1f11fb6.in -# -aiofiles==23.2.1 -anyio==3.7.1 -attrs==24.2.0 -certifi==2024.12.14 -charset-normalizer==3.4.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -fastapi==0.90.1 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==1.10.19 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-multipart==0.0.8 -requests==2.31.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -starlette==0.23.1 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1f30147.txt b/.riot/requirements/1f30147.txt deleted file mode 100644 index ad1d53dbfb0..00000000000 --- a/.riot/requirements/1f30147.txt +++ /dev/null @@ -1,45 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1f30147.in -# -asn1crypto==1.5.1 -attrs==23.2.0 -certifi==2024.7.4 -cffi==1.15.1 -charset-normalizer==2.1.1 -coverage[toml]==7.2.7 -cryptography==38.0.4 -exceptiongroup==1.2.2 -filelock==3.12.2 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -oscrypto==1.3.0 -packaging==24.0 -pluggy==1.2.0 -pycparser==2.21 -pycryptodomex==3.20.0 -pyjwt==2.8.0 -pyopenssl==22.1.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -requests==2.31.0 -responses==0.16.0 -six==1.16.0 -snowflake-connector-python==2.9.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1f66fe3.txt b/.riot/requirements/1f66fe3.txt deleted file mode 100644 index 2c77a9f587a..00000000000 --- a/.riot/requirements/1f66fe3.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1f66fe3.in -# -attrs==23.2.0 -blinker==1.6.3 -cachelib==0.9.0 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -flask==1.1.4 -flask-caching==2.1.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==1.1.0 -jinja2==2.11.3 -markupsafe==1.1.1 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-memcached==1.62 -redis==2.10.6 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -werkzeug==1.0.1 -zipp==3.15.0 diff --git a/.riot/requirements/1faec17.txt b/.riot/requirements/1faec17.txt deleted file mode 100644 index 3140244a57e..00000000000 --- a/.riot/requirements/1faec17.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1faec17.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yaaredis==3.0.0 -zipp==3.15.0 diff --git a/.riot/requirements/1fb546b.txt b/.riot/requirements/1fb546b.txt deleted file mode 100644 index db8cfaa698a..00000000000 --- a/.riot/requirements/1fb546b.txt +++ /dev/null @@ -1,47 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1fb546b.in -# -attrs==23.2.0 -beautifulsoup4==4.12.3 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hupper==1.12.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pastedeploy==3.1.0 -plaster==1.1.2 -plaster-pastedeploy==1.0.1 -pluggy==1.2.0 -pserve-test-app @ file:///root/project/tests/contrib/pyramid/pserve_app -pyramid==2.0.2 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -soupsieve==2.4.1 -tomli==2.0.1 -translationstring==1.4 -typing-extensions==4.7.1 -urllib3==2.0.7 -venusian==3.1.0 -waitress==2.1.2 -webob==1.8.7 -webtest==3.0.0 -zipp==3.15.0 -zope-deprecation==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/1fb6c68.txt b/.riot/requirements/1fb6c68.txt deleted file mode 100644 index 30a4b347ca3..00000000000 --- a/.riot/requirements/1fb6c68.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1fb6c68.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==2.0.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/1fcbf26.txt b/.riot/requirements/1fcbf26.txt deleted file mode 100644 index 8ea4f8525ab..00000000000 --- a/.riot/requirements/1fcbf26.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/1fcbf26.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-consul==1.1.0 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/1fe5227.txt b/.riot/requirements/1fe5227.txt deleted file mode 100644 index bbed5f3cb5c..00000000000 --- a/.riot/requirements/1fe5227.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --no-annotate --resolver=backtracking .riot/requirements/1fe5227.in -# -attrs==24.2.0 -avro==1.12.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/1feb806.txt b/.riot/requirements/1feb806.txt deleted file mode 100644 index 05db104bca1..00000000000 --- a/.riot/requirements/1feb806.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/1feb806.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.62.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/20387f9.txt b/.riot/requirements/20387f9.txt deleted file mode 100644 index 91945b36420..00000000000 --- a/.riot/requirements/20387f9.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/20387f9.in -# -attrs==23.2.0 -certifi==2024.2.2 -chardet==3.0.4 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==2.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.20.1 -requests-mock==1.11.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.24.3 -zipp==3.15.0 diff --git a/.riot/requirements/210a985.txt b/.riot/requirements/210a985.txt deleted file mode 100644 index 6b6c21301b4..00000000000 --- a/.riot/requirements/210a985.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/210a985.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -psycopg2-binary==2.9.9 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/220bd92.txt b/.riot/requirements/220bd92.txt deleted file mode 100644 index 37424083092..00000000000 --- a/.riot/requirements/220bd92.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/220bd92.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysqlclient==2.1.1 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/25c58ca.txt b/.riot/requirements/25c58ca.txt deleted file mode 100644 index 01b80cc6b13..00000000000 --- a/.riot/requirements/25c58ca.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/25c58ca.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/2933921.txt b/.riot/requirements/2933921.txt deleted file mode 100644 index 9dad744881f..00000000000 --- a/.riot/requirements/2933921.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/2933921.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/2b426ba.txt b/.riot/requirements/2b426ba.txt new file mode 100644 index 00000000000..73fef57104e --- /dev/null +++ b/.riot/requirements/2b426ba.txt @@ -0,0 +1,38 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/2b426ba.in +# +annotated-types==0.7.0 +attrs==25.1.0 +blinker==1.9.0 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.8 +coverage[toml]==7.6.10 +flask==2.3.3 +flask-openapi3==4.0.3 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.0.0 +itsdangerous==2.2.0 +jinja2==3.1.5 +markupsafe==3.0.2 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +urllib3==1.26.20 +werkzeug==3.1.3 +zipp==3.21.0 diff --git a/.riot/requirements/2be57d3.txt b/.riot/requirements/2be57d3.txt deleted file mode 100644 index e8d0e987d00..00000000000 --- a/.riot/requirements/2be57d3.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/2be57d3.in -# -annotated-types==0.7.0 -attrs==23.2.0 -blinker==1.8.2 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==8.1.7 -coverage[toml]==7.5.4 -flask==2.3.3 -flask-openapi3==3.1.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -itsdangerous==2.2.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pydantic==2.8.0 -pydantic-core==2.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -requests==2.32.3 -sortedcontainers==2.4.0 -typing-extensions==4.12.2 -urllib3==1.26.19 -werkzeug==2.3.8 -zipp==3.19.2 diff --git a/.riot/requirements/2cc3d48.txt b/.riot/requirements/2cc3d48.txt deleted file mode 100644 index a64f5d6ced3..00000000000 --- a/.riot/requirements/2cc3d48.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/2cc3d48.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -psycopg2-binary==2.8.6 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/30829b6.txt b/.riot/requirements/30829b6.txt deleted file mode 100644 index 47d5c0c9577..00000000000 --- a/.riot/requirements/30829b6.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/30829b6.in -# -attrs==23.1.0 -cassandra-driver==3.28.0 -click==8.1.7 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -geomet==0.2.1.post1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/3343686.txt b/.riot/requirements/3343686.txt deleted file mode 100644 index d0a566655e6..00000000000 --- a/.riot/requirements/3343686.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/3343686.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mongoengine==0.29.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymongo==3.8.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/3390a6b.txt b/.riot/requirements/3390a6b.txt deleted file mode 100644 index d617d22b8bd..00000000000 --- a/.riot/requirements/3390a6b.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/3390a6b.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -dnspython==2.3.0 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mongoengine==0.29.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymongo==4.7.3 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/3482d15.txt b/.riot/requirements/3482d15.txt deleted file mode 100644 index 433195d1962..00000000000 --- a/.riot/requirements/3482d15.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/3482d15.in -# -anyio==3.7.1 -asgiref==3.7.2 -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/3506e01.txt b/.riot/requirements/3506e01.txt deleted file mode 100644 index 0a8af6a2555..00000000000 --- a/.riot/requirements/3506e01.txt +++ /dev/null @@ -1,43 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/3506e01.in -# -aiobotocore==2.6.0 -aiohttp==3.8.6 -aioitertools==0.11.0 -aiosignal==1.3.1 -async-generator==1.10 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==24.2.0 -botocore==1.31.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.8 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jmespath==1.0.1 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -wrapt==1.16.0 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/36a2b9a.txt b/.riot/requirements/36a2b9a.txt deleted file mode 100644 index 66e1b6b8a53..00000000000 --- a/.riot/requirements/36a2b9a.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/36a2b9a.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mako==1.1.6 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/3c8d9c0.txt b/.riot/requirements/3c8d9c0.txt deleted file mode 100644 index c26d5cc37aa..00000000000 --- a/.riot/requirements/3c8d9c0.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/3c8d9c0.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -structlog==23.1.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/3e3e299.txt b/.riot/requirements/3e3e299.txt index a1142c27258..caa71a23f45 100644 --- a/.riot/requirements/3e3e299.txt +++ b/.riot/requirements/3e3e299.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/3e3e299.in +# pip-compile --no-annotate .riot/requirements/3e3e299.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.1.0 +coverage[toml]==7.6.10 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 @@ -14,17 +14,17 @@ hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.4 +pytest-cov==6.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2024.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +setuptools diff --git a/.riot/requirements/3e8a9d6.txt b/.riot/requirements/3e8a9d6.txt deleted file mode 100644 index 36ab8c0bdfe..00000000000 --- a/.riot/requirements/3e8a9d6.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/3e8a9d6.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pylibmc==1.6.3 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/11f2bd0.txt b/.riot/requirements/3f2ebdc.txt similarity index 54% rename from .riot/requirements/11f2bd0.txt rename to .riot/requirements/3f2ebdc.txt index fdab5d63d33..f87639be124 100644 --- a/.riot/requirements/11f2bd0.txt +++ b/.riot/requirements/3f2ebdc.txt @@ -1,38 +1,40 @@ # -# This file is autogenerated by pip-compile with Python 3.13 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/11f2bd0.in +# pip-compile --no-annotate .riot/requirements/3f2ebdc.in # annotated-types==0.7.0 -attrs==24.2.0 +attrs==25.1.0 blinker==1.8.2 -certifi==2024.8.30 -charset-normalizer==3.3.2 -click==8.1.7 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.8 coverage[toml]==7.6.1 +exceptiongroup==1.2.2 flask==2.3.3 -flask-openapi3==4.0.1 +flask-openapi3==4.0.3 hypothesis==6.45.0 idna==3.10 importlib-metadata==8.5.0 iniconfig==2.0.0 itsdangerous==2.2.0 -jinja2==3.1.4 +jinja2==3.1.5 markupsafe==2.1.5 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pydantic==2.9.2 -pydantic-core==2.23.4 -pytest==8.3.3 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 pytest-cov==5.0.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 requests==2.32.3 sortedcontainers==2.4.0 +tomli==2.2.1 typing-extensions==4.12.2 urllib3==1.26.20 -werkzeug==2.3.8 +werkzeug==3.0.6 zipp==3.20.2 diff --git a/.riot/requirements/40b1a4f.txt b/.riot/requirements/40b1a4f.txt deleted file mode 100644 index 24cdaee0a5c..00000000000 --- a/.riot/requirements/40b1a4f.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/40b1a4f.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -future==0.18.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.8.2 -pytz==2023.3.post1 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vertica-python==0.7.4 -zipp==3.15.0 diff --git a/.riot/requirements/427c22a.txt b/.riot/requirements/427c22a.txt deleted file mode 100644 index bd9057bd849..00000000000 --- a/.riot/requirements/427c22a.txt +++ /dev/null @@ -1,37 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/427c22a.in -# -attrs==23.2.0 -certifi==2024.7.4 -charset-normalizer==3.3.2 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -flask==1.1.4 -gunicorn==22.0.0 -httpretty==1.0.5 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==1.1.0 -jinja2==2.11.3 -markupsafe==1.1.1 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -werkzeug==1.0.1 -zipp==3.15.0 diff --git a/.riot/requirements/429d258.txt b/.riot/requirements/429d258.txt deleted file mode 100644 index 232f6791850..00000000000 --- a/.riot/requirements/429d258.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/429d258.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -glob2==0.7 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mako==1.2.4 -markupsafe==2.1.5 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -parse==1.20.1 -parse-type==0.6.2 -pluggy==1.2.0 -py==1.11.0 -pytest==7.4.4 -pytest-bdd==4.1.0 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/48462b1.txt b/.riot/requirements/48462b1.txt deleted file mode 100644 index f200fc89650..00000000000 --- a/.riot/requirements/48462b1.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/48462b1.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mariadb==1.1.6 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/4a3b7fa.txt b/.riot/requirements/4a3b7fa.txt deleted file mode 100644 index 67d89e6b4f9..00000000000 --- a/.riot/requirements/4a3b7fa.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/4a3b7fa.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opensearch-py[requests]==1.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/4ad11b1.txt b/.riot/requirements/4ad11b1.txt deleted file mode 100644 index ee4502f597b..00000000000 --- a/.riot/requirements/4ad11b1.txt +++ /dev/null @@ -1,74 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/4ad11b1.in -# -annotated-types==0.5.0 -attrs==24.2.0 -aws-sam-translator==1.82.0 -aws-xray-sdk==2.14.0 -boto==2.49.0 -boto3==1.33.13 -botocore==1.33.13 -certifi==2024.8.30 -cffi==1.15.1 -cfn-lint==0.53.1 -charset-normalizer==3.4.0 -coverage[toml]==7.2.7 -cryptography==43.0.3 -docker==6.1.3 -ecdsa==0.14.1 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -idna==2.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==2.10.3 -jmespath==1.0.1 -jsondiff==2.0.0 -jsonpatch==1.33 -jsonpointer==3.0.0 -jsonschema==3.2.0 -junit-xml==1.9 -markupsafe==1.1.1 -mock==5.1.0 -more-itertools==9.1.0 -moto==1.3.16 -networkx==2.6.3 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pyasn1==0.5.1 -pycparser==2.21 -pydantic==2.5.3 -pydantic-core==2.14.6 -pynamodb==5.5.1 -pyrsistent==0.19.3 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -python-jose[cryptography]==3.3.0 -pytz==2024.2 -pyyaml==6.0.1 -requests==2.31.0 -responses==0.23.3 -rsa==4.9 -s3transfer==0.8.2 -six==1.16.0 -sortedcontainers==2.4.0 -sshpubkeys==3.3.1 -tomli==2.0.1 -types-pyyaml==6.0.12.12 -typing-extensions==4.7.1 -urllib3==1.26.20 -websocket-client==1.6.1 -werkzeug==2.1.2 -wrapt==1.16.0 -xmltodict==0.14.2 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/.riot/requirements/4f8a3a1.txt b/.riot/requirements/4f8a3a1.txt deleted file mode 100644 index 95ec5b6f2c7..00000000000 --- a/.riot/requirements/4f8a3a1.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/4f8a3a1.in -# -aiohttp==3.8.6 -aiohttp-jinja2==1.5.1 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==23.2.0 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-aiohttp==1.0.5 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/5000f7f.txt b/.riot/requirements/5000f7f.txt deleted file mode 100644 index 6f3fff875f1..00000000000 --- a/.riot/requirements/5000f7f.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/5000f7f.in -# -attrs==23.1.0 -confluent-kafka==1.9.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/53e5eed.txt b/.riot/requirements/53e5eed.txt deleted file mode 100644 index 7f485650abe..00000000000 --- a/.riot/requirements/53e5eed.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/53e5eed.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -gunicorn==21.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -protobuf==4.24.4 -py-cpuinfo==8.0.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -uwsgi==2.0.23 -zipp==3.15.0 diff --git a/.riot/requirements/54a9b03.txt b/.riot/requirements/54a9b03.txt deleted file mode 100644 index 835628ea31e..00000000000 --- a/.riot/requirements/54a9b03.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/54a9b03.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pylibmc==1.6.3 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/55a0f54.txt b/.riot/requirements/55a0f54.txt deleted file mode 100644 index b120d771ee9..00000000000 --- a/.riot/requirements/55a0f54.txt +++ /dev/null @@ -1,56 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/55a0f54.in -# -anyio==3.7.1 -asn1crypto==1.5.1 -attrs==23.1.0 -azure-common==1.1.28 -azure-core==1.29.6 -azure-storage-blob==12.19.0 -boto3==1.33.13 -botocore==1.33.13 -certifi==2020.12.5 -cffi==1.15.1 -chardet==3.0.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -cryptography==3.4.8 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==2.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -isodate==0.6.1 -jmespath==1.0.1 -mock==5.1.0 -opentracing==2.4.0 -oscrypto==1.3.0 -packaging==23.2 -pluggy==1.2.0 -pycparser==2.21 -pycryptodomex==3.19.0 -pyjwt==2.8.0 -pyopenssl==19.1.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.8.2 -pytz==2020.5 -requests==2.31.0 -responses==0.16.0 -s3transfer==0.8.2 -six==1.16.0 -sniffio==1.3.0 -snowflake-connector-python==2.3.10 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/5a0532b.txt b/.riot/requirements/5a0532b.txt deleted file mode 100644 index a8fd5c99bbf..00000000000 --- a/.riot/requirements/5a0532b.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/5a0532b.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.34.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/5e2238a.txt b/.riot/requirements/5e2238a.txt deleted file mode 100644 index 23fb04f1eeb..00000000000 --- a/.riot/requirements/5e2238a.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/5e2238a.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -elasticsearch1==1.10.0 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/5eed329.txt b/.riot/requirements/5eed329.txt deleted file mode 100644 index 5b5ebb9bd52..00000000000 --- a/.riot/requirements/5eed329.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/5eed329.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/620a309.txt b/.riot/requirements/620a309.txt deleted file mode 100644 index b0ada3ca20b..00000000000 --- a/.riot/requirements/620a309.txt +++ /dev/null @@ -1,36 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/620a309.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -gunicorn[gevent]==23.0.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -py-cpuinfo==8.0.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -uwsgi==2.0.28 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/640588f.txt b/.riot/requirements/640588f.txt deleted file mode 100644 index 35f92dd0b21..00000000000 --- a/.riot/requirements/640588f.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/640588f.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -graphql-core==3.2.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/64dcf93.txt b/.riot/requirements/64dcf93.txt deleted file mode 100644 index cb51fe8aef5..00000000000 --- a/.riot/requirements/64dcf93.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/64dcf93.in -# -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-consul==1.1.0 -requests==2.31.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/681161c.txt b/.riot/requirements/681161c.txt deleted file mode 100644 index d03be0fa511..00000000000 --- a/.riot/requirements/681161c.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/681161c.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/68d8bc6.txt b/.riot/requirements/68d8bc6.txt deleted file mode 100644 index 81e0457d686..00000000000 --- a/.riot/requirements/68d8bc6.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/68d8bc6.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/6dbf615.txt b/.riot/requirements/6dbf615.txt new file mode 100644 index 00000000000..09c2ba59e61 --- /dev/null +++ b/.riot/requirements/6dbf615.txt @@ -0,0 +1,40 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/6dbf615.in +# +annotated-types==0.7.0 +attrs==25.1.0 +blinker==1.9.0 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.8 +coverage[toml]==7.6.10 +exceptiongroup==1.2.2 +flask==2.3.3 +flask-openapi3==4.0.3 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.0.0 +itsdangerous==2.2.0 +jinja2==3.1.5 +markupsafe==3.0.2 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +tomli==2.2.1 +typing-extensions==4.12.2 +urllib3==1.26.20 +werkzeug==3.1.3 +zipp==3.21.0 diff --git a/.riot/requirements/6dd3b2a.txt b/.riot/requirements/6dd3b2a.txt deleted file mode 100644 index fc68edb2a24..00000000000 --- a/.riot/requirements/6dd3b2a.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/6dd3b2a.in -# -aiomysql==0.1.1 -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pymysql==1.1.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/6fe81be.txt b/.riot/requirements/6fe81be.txt deleted file mode 100644 index f49865ef3bd..00000000000 --- a/.riot/requirements/6fe81be.txt +++ /dev/null @@ -1,37 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/6fe81be.in -# -attrs==24.2.0 -colorama==0.4.6 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gunicorn==23.0.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -lz4==4.3.2 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==3.8.0 -py-cpuinfo==8.0.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-cpp==2.5.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -uwsgi==2.0.27 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/7046fe8.txt b/.riot/requirements/7046fe8.txt deleted file mode 100644 index 312cad44e13..00000000000 --- a/.riot/requirements/7046fe8.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/7046fe8.in -# -aredis==1.1.8 -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/73109d5.txt b/.riot/requirements/73109d5.txt deleted file mode 100644 index 42b5dd0e30c..00000000000 --- a/.riot/requirements/73109d5.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/73109d5.in -# -attrs==24.2.0 -azure-functions==1.21.3 -certifi==2024.8.30 -charset-normalizer==3.4.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/745db14.txt b/.riot/requirements/745db14.txt deleted file mode 100644 index bb64273409d..00000000000 --- a/.riot/requirements/745db14.txt +++ /dev/null @@ -1,50 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/745db14.in -# -aiofiles==23.2.1 -aiohttp==3.8.6 -aiosignal==1.3.1 -async-generator==1.10 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -frozenlist==1.3.3 -h11==0.9.0 -httpcore==0.11.1 -httptools==0.6.0 -httpx==0.15.4 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==5.2.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytest-sanic==1.6.2 -requests==2.31.0 -rfc3986[idna2008]==1.5.0 -sanic==20.12.7 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -ujson==5.7.0 -urllib3==2.0.7 -uvloop==0.18.0 -websockets==9.1 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/760d56e.txt b/.riot/requirements/760d56e.txt deleted file mode 100644 index 7daa0bd0e98..00000000000 --- a/.riot/requirements/760d56e.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/760d56e.in -# -attrs==24.2.0 -beautifulsoup4==4.12.3 -bottle==0.13.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -soupsieve==2.4.1 -tomli==2.0.1 -typing-extensions==4.7.1 -waitress==2.1.2 -webob==1.8.9 -webtest==3.0.1 -zipp==3.15.0 diff --git a/.riot/requirements/7800b91.txt b/.riot/requirements/7800b91.txt deleted file mode 100644 index b64794723bc..00000000000 --- a/.riot/requirements/7800b91.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/7800b91.in -# -anyio==3.7.1 -attrs==23.2.0 -certifi==2024.2.2 -coverage==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -py==1.11.0 -pytest==6.2.5 -pytest-cov==2.9.0 -pytest-mock==2.0.0 -pytest-randomly==3.12.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -toml==0.10.2 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/7abacd9.txt b/.riot/requirements/7abacd9.txt deleted file mode 100644 index 34cda00d06b..00000000000 --- a/.riot/requirements/7abacd9.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/7abacd9.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==3.1.2 -markupsafe==2.1.3 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/7f56123.txt b/.riot/requirements/7f56123.txt index 887c9742746..d2809141f6b 100644 --- a/.riot/requirements/7f56123.txt +++ b/.riot/requirements/7f56123.txt @@ -4,17 +4,17 @@ # # pip-compile --no-annotate .riot/requirements/7f56123.in # -attrs==23.1.0 -coverage[toml]==7.3.4 +attrs==25.1.0 +coverage[toml]==7.6.10 hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/7fa00cf.txt b/.riot/requirements/7fa00cf.txt index de6d1dffe04..8fbfefc927a 100644 --- a/.riot/requirements/7fa00cf.txt +++ b/.riot/requirements/7fa00cf.txt @@ -4,21 +4,21 @@ # # pip-compile --no-annotate .riot/requirements/7fa00cf.in # -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 +attrs==25.1.0 +coverage[toml]==7.6.10 +exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==7.0.0 +importlib-metadata==8.6.1 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 +tomli==2.2.1 +zipp==3.21.0 diff --git a/.riot/requirements/840eb63.txt b/.riot/requirements/840eb63.txt deleted file mode 100644 index 431128fcb61..00000000000 --- a/.riot/requirements/840eb63.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/840eb63.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -greenlet==3.0.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysql-connector-python==8.0.33 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==3.20.3 -psycopg2-binary==2.9.9 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.36 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/85c8e30.txt b/.riot/requirements/85c8e30.txt deleted file mode 100644 index 4d03cfcf992..00000000000 --- a/.riot/requirements/85c8e30.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/85c8e30.in -# -asyncpg==0.28.0 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.2 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/880a8ad.txt b/.riot/requirements/880a8ad.txt deleted file mode 100644 index 150ee660de8..00000000000 --- a/.riot/requirements/880a8ad.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/880a8ad.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elastic-transport==8.11.0 -elasticsearch==8.11.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/8854702.txt b/.riot/requirements/8854702.txt deleted file mode 100644 index dfbd9884664..00000000000 --- a/.riot/requirements/8854702.txt +++ /dev/null @@ -1,74 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/8854702.in -# -annotated-types==0.5.0 -attrs==24.2.0 -aws-sam-translator==1.82.0 -aws-xray-sdk==2.14.0 -boto==2.49.0 -boto3==1.33.13 -botocore==1.33.13 -certifi==2024.8.30 -cffi==1.15.1 -cfn-lint==0.53.1 -charset-normalizer==3.4.0 -coverage[toml]==7.2.7 -cryptography==43.0.3 -docker==6.1.3 -ecdsa==0.14.1 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -idna==2.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==2.10.3 -jmespath==1.0.1 -jsondiff==2.0.0 -jsonpatch==1.33 -jsonpointer==3.0.0 -jsonschema==3.2.0 -junit-xml==1.9 -markupsafe==1.1.1 -mock==5.1.0 -more-itertools==9.1.0 -moto==1.3.16 -networkx==2.6.3 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pyasn1==0.5.1 -pycparser==2.21 -pydantic==2.5.3 -pydantic-core==2.14.6 -pynamodb==5.5.1 -pyrsistent==0.19.3 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -python-jose[cryptography]==3.3.0 -pytz==2024.2 -pyyaml==6.0.1 -requests==2.31.0 -responses==0.23.3 -rsa==4.9 -s3transfer==0.8.2 -six==1.16.0 -sortedcontainers==2.4.0 -sshpubkeys==3.3.1 -tomli==2.0.1 -types-pyyaml==6.0.12.12 -typing-extensions==4.7.1 -urllib3==1.26.20 -websocket-client==1.6.1 -werkzeug==2.1.2 -wrapt==1.16.0 -xmltodict==0.14.2 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/.riot/requirements/89d7a5f.txt b/.riot/requirements/89d7a5f.txt deleted file mode 100644 index 6e2134e4a17..00000000000 --- a/.riot/requirements/89d7a5f.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/89d7a5f.in -# -annotated-types==0.7.0 -attrs==23.2.0 -blinker==1.8.2 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==8.1.7 -coverage[toml]==7.5.4 -exceptiongroup==1.2.1 -flask==2.3.3 -flask-openapi3==3.1.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -itsdangerous==2.2.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pydantic==2.8.0 -pydantic-core==2.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -requests==2.32.3 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.12.2 -urllib3==1.26.19 -werkzeug==2.3.8 -zipp==3.19.2 diff --git a/.riot/requirements/8ef50f6.txt b/.riot/requirements/8ef50f6.txt deleted file mode 100644 index f3a48228267..00000000000 --- a/.riot/requirements/8ef50f6.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/8ef50f6.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -falcon==3.0.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/9050f7e.txt b/.riot/requirements/9050f7e.txt deleted file mode 100644 index 35b5c11a05d..00000000000 --- a/.riot/requirements/9050f7e.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/9050f7e.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==3.0.1 -redis-py-cluster==2.0.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/9091897.txt b/.riot/requirements/9091897.txt deleted file mode 100644 index 9817bc80f0d..00000000000 --- a/.riot/requirements/9091897.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/9091897.in -# -asgiref==3.7.2 -attrs==23.2.0 -coverage[toml]==7.2.7 -django==3.2.25 -django-configurations==2.4.2 -django-hosts==4.0 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.4.4 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/91a3315.txt b/.riot/requirements/91a3315.txt deleted file mode 100644 index 59c24169550..00000000000 --- a/.riot/requirements/91a3315.txt +++ /dev/null @@ -1,41 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/91a3315.in -# -aiofiles==23.2.1 -aiosqlite==0.19.0 -anyio==3.7.1 -attrs==24.2.0 -certifi==2024.8.30 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -databases==0.8.0 -exceptiongroup==1.2.2 -greenlet==3.0.3 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -sqlalchemy==1.4.54 -starlette==0.14.2 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/93bc4fa.txt b/.riot/requirements/93bc4fa.txt deleted file mode 100644 index ca1e410d4ab..00000000000 --- a/.riot/requirements/93bc4fa.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/93bc4fa.in -# -attrs==23.2.0 -coverage[toml]==7.2.7 -django==2.2.28 -django-configurations==2.3.2 -djangorestframework==3.13.1 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-django[testing]==3.10.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -six==1.16.0 -sortedcontainers==2.4.0 -sqlparse==0.4.4 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/957161b.txt b/.riot/requirements/957161b.txt deleted file mode 100644 index 8c10e88a72b..00000000000 --- a/.riot/requirements/957161b.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/957161b.in -# -anyio==3.7.1 -asgiref==3.7.2 -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/976376a.txt b/.riot/requirements/976376a.txt deleted file mode 100644 index 0d3b8e160f6..00000000000 --- a/.riot/requirements/976376a.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/976376a.in -# -attrs==23.2.0 -blinker==1.6.3 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==8.1.7 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -flask==2.2.5 -flask-openapi3==2.5.5 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==2.1.2 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==1.10.17 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -werkzeug==2.2.3 -zipp==3.15.0 diff --git a/.riot/requirements/9ba9bfd.txt b/.riot/requirements/9ba9bfd.txt deleted file mode 100644 index ab635eb0366..00000000000 --- a/.riot/requirements/9ba9bfd.txt +++ /dev/null @@ -1,47 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/9ba9bfd.in -# -attrs==23.2.0 -beautifulsoup4==4.12.3 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hupper==1.12.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pastedeploy==3.1.0 -plaster==1.1.2 -plaster-pastedeploy==1.0.1 -pluggy==1.2.0 -pserve-test-app @ file:///root/project/tests/contrib/pyramid/pserve_app -pyramid==2.0.2 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -soupsieve==2.4.1 -tomli==2.0.1 -translationstring==1.4 -typing-extensions==4.7.1 -urllib3==2.0.7 -venusian==3.1.0 -waitress==2.1.2 -webob==1.8.7 -webtest==3.0.0 -zipp==3.15.0 -zope-deprecation==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/9bc08b4.txt b/.riot/requirements/9bc08b4.txt deleted file mode 100644 index 36c8b082f91..00000000000 --- a/.riot/requirements/9bc08b4.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/9bc08b4.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -loguru==0.7.2 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/9e36105.txt b/.riot/requirements/9e36105.txt deleted file mode 100644 index 9849b908049..00000000000 --- a/.riot/requirements/9e36105.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/9e36105.in -# -async-timeout==4.0.3 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==4.6.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/a009c45.txt b/.riot/requirements/a009c45.txt deleted file mode 100644 index f76d7d5ab36..00000000000 --- a/.riot/requirements/a009c45.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/a009c45.in -# -async-timeout==4.0.3 -attrs==23.1.0 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==5.0.1 -rq==1.8.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/a0aa271.txt b/.riot/requirements/a0aa271.txt deleted file mode 100644 index c88c04d4be7..00000000000 --- a/.riot/requirements/a0aa271.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/a0aa271.in -# -anyio==3.7.1 -attrs==23.2.0 -certifi==2024.2.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -more-itertools==8.10.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==2.12.0 -pytest-mock==2.0.0 -pytest-randomly==3.12.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/a5efead.txt b/.riot/requirements/a5efead.txt deleted file mode 100644 index 109810d43b5..00000000000 --- a/.riot/requirements/a5efead.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/a5efead.in -# -async-timeout==4.0.3 -attrs==23.1.0 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==5.0.1 -rq==1.15.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/a9dcb3f.txt b/.riot/requirements/a9dcb3f.txt deleted file mode 100644 index 2f9faacb296..00000000000 --- a/.riot/requirements/a9dcb3f.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/a9dcb3f.in -# -async-timeout==4.0.3 -attrs==24.2.0 -coverage[toml]==7.2.7 -dramatiq==1.16.0 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -prometheus-client==0.17.1 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -redis==5.0.8 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/aca97c1.txt b/.riot/requirements/aca97c1.txt deleted file mode 100644 index 140b732f018..00000000000 --- a/.riot/requirements/aca97c1.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/aca97c1.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pymemcache==3.5.2 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/af3567d.txt b/.riot/requirements/af3567d.txt deleted file mode 100644 index e6c2256704a..00000000000 --- a/.riot/requirements/af3567d.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/af3567d.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.1.3 -httpretty==1.1.4 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.1 -pluggy==1.2.0 -pytest==7.4.0 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/b0a5cc3.txt b/.riot/requirements/b0a5cc3.txt deleted file mode 100644 index ddc22947308..00000000000 --- a/.riot/requirements/b0a5cc3.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/b0a5cc3.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mongoengine==0.29.1 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pymongo==3.13.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/b1df5a4.txt b/.riot/requirements/b1df5a4.txt deleted file mode 100644 index 3d202e5eeba..00000000000 --- a/.riot/requirements/b1df5a4.txt +++ /dev/null @@ -1,37 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/b1df5a4.in -# -attrs==24.2.0 -certifi==2024.12.14 -charset-normalizer==3.4.1 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -gunicorn==23.0.0 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/b35a160.txt b/.riot/requirements/b35a160.txt new file mode 100644 index 00000000000..d0202d9b774 --- /dev/null +++ b/.riot/requirements/b35a160.txt @@ -0,0 +1,51 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/b35a160.in +# +annotated-types==0.7.0 +anyio==4.5.2 +attrs==22.1.0 +boto3==1.36.9 +botocore==1.36.9 +cattrs==23.1.2 +certifi==2024.12.14 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +fastapi==0.115.8 +h11==0.14.0 +httpcore==1.0.7 +httpretty==1.1.4 +httpx==0.28.1 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +jmespath==1.0.1 +mock==5.1.0 +msgpack==1.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +python-dateutil==2.9.0.post0 +s3transfer==0.11.2 +six==1.17.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +starlette==0.44.0 +structlog==25.1.0 +tomli==2.2.1 +typing-extensions==4.12.2 +urllib3==1.26.20 +wheel==0.45.1 +zipp==3.20.2 + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/.riot/requirements/b7a530f.txt b/.riot/requirements/b7a530f.txt index 95de3cea117..802d6e0593e 100644 --- a/.riot/requirements/b7a530f.txt +++ b/.riot/requirements/b7a530f.txt @@ -4,21 +4,21 @@ # # pip-compile --no-annotate .riot/requirements/b7a530f.in # -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 +attrs==25.1.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==7.0.0 +importlib-metadata==8.5.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.12.0 +pytest-cov==5.0.0 +pytest-mock==3.14.0 pytest-randomly==3.15.0 sortedcontainers==2.4.0 -tomli==2.0.1 -zipp==3.17.0 +tomli==2.2.1 +zipp==3.20.2 diff --git a/.riot/requirements/bc1efaa.txt b/.riot/requirements/bc1efaa.txt deleted file mode 100644 index 9149eb8b0f4..00000000000 --- a/.riot/requirements/bc1efaa.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/bc1efaa.in -# -attrs==23.2.0 -blinker==1.6.3 -click==8.1.7 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -flask==2.2.5 -flask-caching==1.10.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==2.1.2 -jinja2==3.1.3 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-memcached==1.62 -redis==2.10.6 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -werkzeug==2.2.3 -zipp==3.15.0 diff --git a/.riot/requirements/bceb0bd.txt b/.riot/requirements/bceb0bd.txt deleted file mode 100644 index c732753dcc3..00000000000 --- a/.riot/requirements/bceb0bd.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/bceb0bd.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/bdefe70.txt b/.riot/requirements/bdefe70.txt deleted file mode 100644 index 6161c33b64e..00000000000 --- a/.riot/requirements/bdefe70.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/bdefe70.in -# -attrs==23.1.0 -beautifulsoup4==4.12.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -soupsieve==2.4.1 -tomli==2.0.1 -typing-extensions==4.7.1 -waitress==2.1.2 -webob==1.8.7 -webtest==3.0.0 -zipp==3.15.0 diff --git a/.riot/requirements/be3147f.txt b/.riot/requirements/be3147f.txt index a3f06e8e867..8fd91002bf4 100644 --- a/.riot/requirements/be3147f.txt +++ b/.riot/requirements/be3147f.txt @@ -4,19 +4,19 @@ # # pip-compile --no-annotate .riot/requirements/be3147f.in # -attrs==23.1.0 -coverage[toml]==7.3.4 -exceptiongroup==1.2.0 +attrs==25.1.0 +coverage[toml]==7.6.10 +exceptiongroup==1.2.2 hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 -tomli==2.0.1 +tomli==2.2.1 diff --git a/.riot/requirements/beea277.txt b/.riot/requirements/beea277.txt deleted file mode 100644 index f9fe9a0405a..00000000000 --- a/.riot/requirements/beea277.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/beea277.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -msgpack==1.0.5 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/c2a85a5.txt b/.riot/requirements/c2a85a5.txt deleted file mode 100644 index bc7cbcea847..00000000000 --- a/.riot/requirements/c2a85a5.txt +++ /dev/null @@ -1,45 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/c2a85a5.in -# -aiofiles==23.2.1 -anyio==3.7.1 -attrs==23.1.0 -certifi==2023.11.17 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.16.3 -httptools==0.6.0 -httpx==0.23.3 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.4 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -rfc3986[idna2008]==1.5.0 -sanic==22.12.0 -sanic-routing==23.6.0 -sanic-testing==22.3.1 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -ujson==5.7.0 -urllib3==2.0.7 -uvloop==0.18.0 -websockets==10.4 -zipp==3.15.0 diff --git a/.riot/requirements/c384590.txt b/.riot/requirements/c384590.txt deleted file mode 100644 index c32b2e04262..00000000000 --- a/.riot/requirements/c384590.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --no-annotate .riot/requirements/c384590.in -# -annotated-types==0.7.0 -attrs==23.2.0 -blinker==1.8.2 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==8.1.7 -coverage[toml]==7.5.4 -flask==2.3.3 -flask-openapi3==3.1.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==8.0.0 -iniconfig==2.0.0 -itsdangerous==2.2.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.1 -pluggy==1.5.0 -pydantic==2.8.0 -pydantic-core==2.20.0 -pytest==8.2.2 -pytest-cov==5.0.0 -pytest-mock==3.14.0 -pytest-randomly==3.15.0 -requests==2.32.3 -sortedcontainers==2.4.0 -typing-extensions==4.12.2 -urllib3==1.26.19 -werkzeug==2.3.8 -zipp==3.19.2 diff --git a/.riot/requirements/c4d4455.txt b/.riot/requirements/c4d4455.txt index 1a8b9f970ef..f6d50daf086 100644 --- a/.riot/requirements/c4d4455.txt +++ b/.riot/requirements/c4d4455.txt @@ -2,19 +2,19 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/c4d4455.in +# pip-compile --no-annotate .riot/requirements/c4d4455.in # -attrs==24.2.0 -coverage[toml]==7.6.1 +attrs==25.1.0 +coverage[toml]==7.6.10 hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.3 +pytest==8.3.4 pytest-asyncio==0.21.1 -pytest-cov==5.0.0 +pytest-cov==6.0.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/cc03823.txt b/.riot/requirements/cc03823.txt deleted file mode 100644 index f9d025443cc..00000000000 --- a/.riot/requirements/cc03823.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/cc03823.in -# -asynctest==0.13.0 -attrs==23.1.0 -coverage[toml]==7.2.7 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -py==1.11.0 -pytest==6.2.5 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -toml==0.10.2 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/cf88166.txt b/.riot/requirements/cf88166.txt deleted file mode 100644 index fb1db2b1da0..00000000000 --- a/.riot/requirements/cf88166.txt +++ /dev/null @@ -1,47 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/cf88166.in -# -attrs==23.2.0 -beautifulsoup4==4.12.3 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hupper==1.12.1 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pastedeploy==3.1.0 -plaster==1.1.2 -plaster-pastedeploy==1.0.1 -pluggy==1.2.0 -pserve-test-app @ file:///root/project/tests/contrib/pyramid/pserve_app -pyramid==1.10.8 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -soupsieve==2.4.1 -tomli==2.0.1 -translationstring==1.4 -typing-extensions==4.7.1 -urllib3==2.0.7 -venusian==3.1.0 -waitress==2.1.2 -webob==1.8.7 -webtest==3.0.0 -zipp==3.15.0 -zope-deprecation==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/d0355c2.txt b/.riot/requirements/d0355c2.txt deleted file mode 100644 index 087e858b6e1..00000000000 --- a/.riot/requirements/d0355c2.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/d0355c2.in -# -async-timeout==4.0.3 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -redis==5.0.8 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/d1dd9c4.txt b/.riot/requirements/d1dd9c4.txt deleted file mode 100644 index 5fc6fc374c7..00000000000 --- a/.riot/requirements/d1dd9c4.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/d1dd9c4.in -# -attrs==23.2.0 -blinker==1.6.3 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -flask==1.1.4 -flask-openapi3==1.1.5 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==1.1.0 -jinja2==2.11.3 -markupsafe==1.1.1 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==1.10.17 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -werkzeug==1.0.1 -zipp==3.15.0 diff --git a/.riot/requirements/d2b6740.txt b/.riot/requirements/d2b6740.txt deleted file mode 100644 index 83fed7d33d5..00000000000 --- a/.riot/requirements/d2b6740.txt +++ /dev/null @@ -1,33 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/d2b6740.in -# -attrs==24.2.0 -colorama==0.4.6 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gunicorn==23.0.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -lz4==4.3.2 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -py-cpuinfo==8.0.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-benchmark==4.0.0 -pytest-cov==4.1.0 -pytest-cpp==2.5.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -uwsgi==2.0.27 -zipp==3.15.0 diff --git a/.riot/requirements/d2ca94b.txt b/.riot/requirements/d2ca94b.txt index 2de1205f47a..2e7e08f8ccd 100644 --- a/.riot/requirements/d2ca94b.txt +++ b/.riot/requirements/d2ca94b.txt @@ -2,34 +2,34 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/d2ca94b.in +# pip-compile --no-annotate .riot/requirements/d2ca94b.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.1.0 +coverage[toml]==7.6.1 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.2.0 +importlib-metadata==8.5.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 +pytest==8.3.4 pytest-cov==5.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytz==2024.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 +sqlparse==0.5.3 +tomli==2.2.1 typing-extensions==4.12.2 -zipp==3.19.2 +zipp==3.20.2 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +# setuptools diff --git a/.riot/requirements/d5d6e2c.txt b/.riot/requirements/d5d6e2c.txt deleted file mode 100644 index a4f7024b452..00000000000 --- a/.riot/requirements/d5d6e2c.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/d5d6e2c.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -loguru==0.4.1 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/d68f919.txt b/.riot/requirements/d68f919.txt deleted file mode 100644 index 709c607ad19..00000000000 --- a/.riot/requirements/d68f919.txt +++ /dev/null @@ -1,29 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --no-annotate --resolver=backtracking .riot/requirements/d68f919.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -googleapis-common-protos==1.65.0 -grpcio==1.34.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -protobuf==4.24.4 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/d751a10.txt b/.riot/requirements/d751a10.txt deleted file mode 100644 index 3169a9ed793..00000000000 --- a/.riot/requirements/d751a10.txt +++ /dev/null @@ -1,43 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/d751a10.in -# -aiobotocore==2.0.1 -aiohttp==3.8.6 -aioitertools==0.11.0 -aiosignal==1.3.1 -async-generator==1.10 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==24.2.0 -botocore==1.22.8 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.8 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jmespath==0.10.0 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-dateutil==2.9.0.post0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -wrapt==1.16.0 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/dae821a.txt b/.riot/requirements/dae821a.txt index a61fc983f3f..0bb3a53e1d9 100644 --- a/.riot/requirements/dae821a.txt +++ b/.riot/requirements/dae821a.txt @@ -2,34 +2,34 @@ # This file is autogenerated by pip-compile with Python 3.9 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/dae821a.in +# pip-compile --no-annotate .riot/requirements/dae821a.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.1.0 +coverage[toml]==7.6.10 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 exceptiongroup==1.2.2 hypothesis==6.45.0 -importlib-metadata==8.2.0 +importlib-metadata==8.6.1 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.4 +pytest-cov==6.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2024.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 -tomli==2.0.1 +sqlparse==0.5.3 +tomli==2.2.1 typing-extensions==4.12.2 -zipp==3.19.2 +zipp==3.21.0 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +# setuptools diff --git a/.riot/requirements/de95112.txt b/.riot/requirements/de95112.txt deleted file mode 100644 index 127a4b50d75..00000000000 --- a/.riot/requirements/de95112.txt +++ /dev/null @@ -1,31 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/de95112.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -gevent==22.10.2 -greenlet==3.1.1 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 -zope-event==5.0 -zope-interface==6.4.post2 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/df69ea1.txt b/.riot/requirements/df69ea1.txt deleted file mode 100644 index 88f73eb6976..00000000000 --- a/.riot/requirements/df69ea1.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/df69ea1.in -# -attrs==23.2.0 -blinker==1.6.3 -certifi==2024.6.2 -charset-normalizer==3.3.2 -click==7.1.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -flask==1.1.4 -flask-openapi3==1.1.5 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -itsdangerous==1.1.0 -jinja2==2.11.3 -markupsafe==1.1.1 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==1.10.17 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -werkzeug==1.0.1 -zipp==3.15.0 diff --git a/.riot/requirements/e0b9dc9.txt b/.riot/requirements/e0b9dc9.txt deleted file mode 100644 index a6f10680dbb..00000000000 --- a/.riot/requirements/e0b9dc9.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/e0b9dc9.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -graphql-core==3.2.3 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/e2ae847.txt b/.riot/requirements/e2ae847.txt index e5dd6404195..ff8159cab4d 100644 --- a/.riot/requirements/e2ae847.txt +++ b/.riot/requirements/e2ae847.txt @@ -4,17 +4,17 @@ # # pip-compile --no-annotate .riot/requirements/e2ae847.in # -attrs==23.1.0 -coverage[toml]==7.3.4 +attrs==25.1.0 +coverage[toml]==7.6.10 hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==23.2 -pluggy==1.3.0 -pytest==7.4.3 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.12.0 -pytest-randomly==3.15.0 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 sortedcontainers==2.4.0 diff --git a/.riot/requirements/e2e33be.txt b/.riot/requirements/e2e33be.txt deleted file mode 100644 index a69d0bbfdd7..00000000000 --- a/.riot/requirements/e2e33be.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/e2e33be.in -# -aiomysql==0.2.0 -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pymysql==1.1.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/e312e0d.txt b/.riot/requirements/e312e0d.txt deleted file mode 100644 index 08cba09f0c4..00000000000 --- a/.riot/requirements/e312e0d.txt +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/e312e0d.in -# -aiofiles==23.2.1 -annotated-types==0.5.0 -anyio==3.7.1 -attrs==24.2.0 -certifi==2024.12.14 -charset-normalizer==3.4.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -fastapi==0.103.2 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.10 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pydantic==2.5.3 -pydantic-core==2.14.6 -pytest==7.4.4 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -python-multipart==0.0.8 -requests==2.31.0 -sniffio==1.3.1 -sortedcontainers==2.4.0 -starlette==0.27.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==2.0.7 -zipp==3.15.0 diff --git a/.riot/requirements/e3a9589.txt b/.riot/requirements/e3a9589.txt deleted file mode 100644 index 25dd12efa84..00000000000 --- a/.riot/requirements/e3a9589.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/e3a9589.in -# -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -elasticsearch7==7.13.4 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/e6619c9.txt b/.riot/requirements/e6619c9.txt deleted file mode 100644 index d6eb30c32e2..00000000000 --- a/.riot/requirements/e6619c9.txt +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/e6619c9.in -# -aiohttp==3.8.6 -aiohttp-jinja2==1.5.1 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==23.2.0 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.1 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.7 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==3.1.4 -markupsafe==2.1.5 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-aiohttp==1.0.5 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/e6872f6.txt b/.riot/requirements/e6872f6.txt new file mode 100644 index 00000000000..0f8cf265bf0 --- /dev/null +++ b/.riot/requirements/e6872f6.txt @@ -0,0 +1,38 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/e6872f6.in +# +annotated-types==0.7.0 +attrs==25.1.0 +blinker==1.9.0 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.8 +coverage[toml]==7.6.10 +flask==2.3.3 +flask-openapi3==4.0.3 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.0.0 +itsdangerous==2.2.0 +jinja2==3.1.5 +markupsafe==3.0.2 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +urllib3==1.26.20 +werkzeug==3.1.3 +zipp==3.21.0 diff --git a/.riot/requirements/e771330.txt b/.riot/requirements/e771330.txt deleted file mode 100644 index 5179cf22d9d..00000000000 --- a/.riot/requirements/e771330.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/e771330.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mako==1.2.4 -markupsafe==2.1.5 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/e79a8f5.txt b/.riot/requirements/e79a8f5.txt deleted file mode 100644 index 153563f68c4..00000000000 --- a/.riot/requirements/e79a8f5.txt +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/e79a8f5.in -# -attrs==23.2.0 -autocommand==2.2.2 -cheroot==10.0.1 -cherrypy==18.10.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -importlib-resources==5.12.0 -inflect==6.0.5 -iniconfig==2.0.0 -jaraco-collections==4.2.0 -jaraco-context==4.3.0 -jaraco-functools==3.7.0 -jaraco-text==3.11.1 -mock==5.1.0 -more-itertools==8.10.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -portend==3.1.0 -pydantic==1.10.17 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2024.1 -sortedcontainers==2.4.0 -tempora==5.3.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zc-lockfile==3.0.post1 -zipp==3.15.0 - -# The following packages are considered to be unsafe in a requirements file: -setuptools==68.0.0 diff --git a/.riot/requirements/ebbfffb.txt b/.riot/requirements/ebbfffb.txt deleted file mode 100644 index 355fb28a70c..00000000000 --- a/.riot/requirements/ebbfffb.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/ebbfffb.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -jinja2==3.0.3 -markupsafe==2.1.3 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/ee63ae9.txt b/.riot/requirements/ee63ae9.txt deleted file mode 100644 index 42fb587d525..00000000000 --- a/.riot/requirements/ee63ae9.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/ee63ae9.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pyodbc==4.0.39 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/f201f06.txt b/.riot/requirements/f201f06.txt deleted file mode 100644 index 3a85f181c39..00000000000 --- a/.riot/requirements/f201f06.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/f201f06.in -# -anyio==3.7.1 -asgiref==3.0.0 -async-timeout==3.0.1 -attrs==23.1.0 -certifi==2023.11.17 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -hypothesis==6.45.0 -idna==3.6 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sniffio==1.3.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/f24db70.txt b/.riot/requirements/f24db70.txt index 03855cc49b1..51c04922304 100644 --- a/.riot/requirements/f24db70.txt +++ b/.riot/requirements/f24db70.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --allow-unsafe --no-annotate .riot/requirements/f24db70.in +# pip-compile --no-annotate .riot/requirements/f24db70.in # asgiref==3.8.1 -attrs==23.2.0 -coverage[toml]==7.6.0 +attrs==25.1.0 +coverage[toml]==7.6.10 django==3.2.25 django-configurations==2.5.1 django-hosts==4.0 @@ -14,17 +14,17 @@ hypothesis==6.45.0 iniconfig==2.0.0 mock==5.1.0 opentracing==2.4.0 -packaging==24.1 +packaging==24.2 pluggy==1.5.0 -pytest==8.3.1 -pytest-cov==5.0.0 +pytest==8.3.4 +pytest-cov==6.0.0 pytest-django[testing]==3.10.0 pytest-mock==3.14.0 -pytest-randomly==3.15.0 -pytz==2024.1 -six==1.16.0 +pytest-randomly==3.16.0 +pytz==2024.2 +six==1.17.0 sortedcontainers==2.4.0 -sqlparse==0.5.1 +sqlparse==0.5.3 # The following packages are considered to be unsafe in a requirements file: -setuptools==71.1.0 +# setuptools diff --git a/.riot/requirements/f395edd.txt b/.riot/requirements/f395edd.txt deleted file mode 100644 index e91021253c9..00000000000 --- a/.riot/requirements/f395edd.txt +++ /dev/null @@ -1,39 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/f395edd.in -# -amqp==5.2.0 -attrs==23.1.0 -billiard==3.6.4.0 -cached-property==1.5.2 -celery==5.2.7 -click==8.1.7 -click-didyoumean==0.3.0 -click-plugins==1.1.1 -click-repl==0.3.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==4.13.0 -iniconfig==2.0.0 -kombu==5.2.4 -mock==5.1.0 -more-itertools==8.10.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -prompt-toolkit==3.0.43 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -pytz==2023.3.post1 -redis==3.5.3 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -vine==5.1.0 -wcwidth==0.2.12 -zipp==3.15.0 diff --git a/.riot/requirements/f630df9.txt b/.riot/requirements/f630df9.txt deleted file mode 100644 index f35660b5c27..00000000000 --- a/.riot/requirements/f630df9.txt +++ /dev/null @@ -1,35 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/f630df9.in -# -aiohttp==3.8.6 -aiosignal==1.3.1 -async-timeout==4.0.3 -asynctest==0.13.0 -attrs==24.2.0 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -frozenlist==1.3.3 -hypothesis==6.45.0 -idna==3.8 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -multidict==6.0.5 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-aiohttp==1.0.5 -pytest-asyncio==0.21.1 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -yarl==1.9.4 -zipp==3.15.0 diff --git a/.riot/requirements/f7ca81b.txt b/.riot/requirements/f7ca81b.txt deleted file mode 100644 index 14de8077cae..00000000000 --- a/.riot/requirements/f7ca81b.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/f7ca81b.in -# -asyncpg==0.28.0 -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-asyncio==0.21.2 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/f850b22.txt b/.riot/requirements/f850b22.txt new file mode 100644 index 00000000000..3bbb8a93c6c --- /dev/null +++ b/.riot/requirements/f850b22.txt @@ -0,0 +1,38 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --no-annotate .riot/requirements/f850b22.in +# +annotated-types==0.7.0 +attrs==25.1.0 +blinker==1.9.0 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.8 +coverage[toml]==7.6.10 +flask==2.3.3 +flask-openapi3==4.0.3 +hypothesis==6.45.0 +idna==3.10 +importlib-metadata==8.6.1 +iniconfig==2.0.0 +itsdangerous==2.2.0 +jinja2==3.1.5 +markupsafe==3.0.2 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pydantic==2.10.6 +pydantic-core==2.27.2 +pytest==8.3.4 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +requests==2.32.3 +sortedcontainers==2.4.0 +typing-extensions==4.12.2 +urllib3==1.26.20 +werkzeug==3.1.3 +zipp==3.21.0 diff --git a/.riot/requirements/f8e49a4.txt b/.riot/requirements/f8e49a4.txt deleted file mode 100644 index cd20aeddda5..00000000000 --- a/.riot/requirements/f8e49a4.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/f8e49a4.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -elasticsearch2==2.5.1 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.18 -zipp==3.15.0 diff --git a/.riot/requirements/faa0584.txt b/.riot/requirements/faa0584.txt deleted file mode 100644 index 196bbb033cd..00000000000 --- a/.riot/requirements/faa0584.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/faa0584.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -mysql-connector-python==8.0.33 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -protobuf==3.20.3 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/fcebf38.txt b/.riot/requirements/fcebf38.txt deleted file mode 100644 index bb073b98e07..00000000000 --- a/.riot/requirements/fcebf38.txt +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/fcebf38.in -# -attrs==24.2.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pyodbc==4.0.39 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/fded0fa.txt b/.riot/requirements/fded0fa.txt deleted file mode 100644 index d39a64d30af..00000000000 --- a/.riot/requirements/fded0fa.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/fded0fa.in -# -attrs==23.1.0 -coverage[toml]==7.2.7 -exceptiongroup==1.2.0 -hypothesis==6.45.0 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==23.2 -pluggy==1.2.0 -pymemcache==3.4.4 -pytest==7.4.3 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -six==1.16.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -zipp==3.15.0 diff --git a/.riot/requirements/feaf737.txt b/.riot/requirements/feaf737.txt deleted file mode 100644 index 9aaa6e5ca6d..00000000000 --- a/.riot/requirements/feaf737.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --allow-unsafe --config=pyproject.toml --no-annotate --resolver=backtracking .riot/requirements/feaf737.in -# -algoliasearch==2.6.3 -attrs==24.2.0 -certifi==2024.7.4 -charset-normalizer==3.3.2 -coverage[toml]==7.2.7 -exceptiongroup==1.2.2 -hypothesis==6.45.0 -idna==3.8 -importlib-metadata==6.7.0 -iniconfig==2.0.0 -mock==5.1.0 -opentracing==2.4.0 -packaging==24.0 -pluggy==1.2.0 -pytest==7.4.4 -pytest-cov==4.1.0 -pytest-mock==3.11.1 -pytest-randomly==3.12.0 -requests==2.31.0 -sortedcontainers==2.4.0 -tomli==2.0.1 -typing-extensions==4.7.1 -urllib3==1.26.19 -zipp==3.15.0 diff --git a/ddtrace/appsec/_iast/_ast/ast_patching.py b/ddtrace/appsec/_iast/_ast/ast_patching.py index bb954970df0..748ae297e27 100644 --- a/ddtrace/appsec/_iast/_ast/ast_patching.py +++ b/ddtrace/appsec/_iast/_ast/ast_patching.py @@ -4,7 +4,6 @@ import codecs import os from sys import builtin_module_names -from sys import version_info import textwrap from types import ModuleType from typing import Iterable @@ -593,9 +592,8 @@ def astpatch_module(module: ModuleType) -> Tuple[str, Optional[ast.Module]]: log.debug("empty file: %s", module_path) return "", None - if not asbool(os.environ.get(IAST.ENV_NO_DIR_PATCH, "false")) and version_info > (3, 7): + if not asbool(os.environ.get(IAST.ENV_NO_DIR_PATCH, "false")): # Add the dir filter so __ddtrace stuff is not returned by dir(module) - # does not work in 3.7 because it enters into infinite recursion source_text += _DIR_WRAPPER new_ast = visit_ast( diff --git a/ddtrace/contrib/internal/psycopg/patch.py b/ddtrace/contrib/internal/psycopg/patch.py index 9e24cee6696..b827a697ea2 100644 --- a/ddtrace/contrib/internal/psycopg/patch.py +++ b/ddtrace/contrib/internal/psycopg/patch.py @@ -3,20 +3,13 @@ import os from typing import List # noqa:F401 -from ddtrace import config -from ddtrace.contrib import dbapi -from ddtrace.trace import Pin - - -try: - from ddtrace.contrib.internal.psycopg.async_connection import patched_connect_async_factory - from ddtrace.contrib.internal.psycopg.async_cursor import Psycopg3FetchTracedAsyncCursor - from ddtrace.contrib.internal.psycopg.async_cursor import Psycopg3TracedAsyncCursor -# catch async function syntax errors when using Python<3.7 with no async support -except SyntaxError: - pass from wrapt import wrap_function_wrapper as _w +from ddtrace import config +from ddtrace.contrib import dbapi +from ddtrace.contrib.internal.psycopg.async_connection import patched_connect_async_factory +from ddtrace.contrib.internal.psycopg.async_cursor import Psycopg3FetchTracedAsyncCursor +from ddtrace.contrib.internal.psycopg.async_cursor import Psycopg3TracedAsyncCursor from ddtrace.contrib.internal.psycopg.connection import patched_connect_factory from ddtrace.contrib.internal.psycopg.cursor import Psycopg3FetchTracedCursor from ddtrace.contrib.internal.psycopg.cursor import Psycopg3TracedCursor @@ -29,6 +22,7 @@ from ddtrace.internal.utils.wrappers import unwrap as _u from ddtrace.propagation._database_monitoring import _DBM_Propagator from ddtrace.propagation._database_monitoring import default_sql_injector as _default_sql_injector +from ddtrace.trace import Pin try: diff --git a/ddtrace/contrib/internal/sqlite3/patch.py b/ddtrace/contrib/internal/sqlite3/patch.py index f47906146bc..03c79789661 100644 --- a/ddtrace/contrib/internal/sqlite3/patch.py +++ b/ddtrace/contrib/internal/sqlite3/patch.py @@ -1,7 +1,6 @@ import os import sqlite3 import sqlite3.dbapi2 -import sys import wrapt @@ -97,12 +96,9 @@ def execute(self, *args, **kwargs): # sqlite has a few extra sugar functions return self.cursor().execute(*args, **kwargs) - # backup was added in Python 3.7 - if sys.version_info >= (3, 7, 0): - - def backup(self, target, *args, **kwargs): - # sqlite3 checks the type of `target`, it cannot be a wrapped connection - # https://github.com/python/cpython/blob/4652093e1b816b78e9a585d671a807ce66427417/Modules/_sqlite/connection.c#L1897-L1899 - if isinstance(target, TracedConnection): - target = target.__wrapped__ - return self.__wrapped__.backup(target, *args, **kwargs) + def backup(self, target, *args, **kwargs): + # sqlite3 checks the type of `target`, it cannot be a wrapped connection + # https://github.com/python/cpython/blob/4652093e1b816b78e9a585d671a807ce66427417/Modules/_sqlite/connection.c#L1897-L1899 + if isinstance(target, TracedConnection): + target = target.__wrapped__ + return self.__wrapped__.backup(target, *args, **kwargs) diff --git a/ddtrace/contrib/tornado/__init__.py b/ddtrace/contrib/tornado/__init__.py index 98a3cec1fa6..1c0caf3366d 100644 --- a/ddtrace/contrib/tornado/__init__.py +++ b/ddtrace/contrib/tornado/__init__.py @@ -3,8 +3,6 @@ Auto instrumentation is available using the ``patch`` function that **must be called before** importing the tornado library. -**Note:** This integration requires Python 3.7 and above for Tornado 5 and 6. - The following is an example:: # patch before importing tornado and concurrent.futures @@ -100,7 +98,6 @@ def log_exception(self, typ, value, tb): * ``settings`` (default: ``{}``): Tracer extra settings used to change, for instance, the filtering behavior. """ - # Required to allow users to import from `ddtrace.contrib.tornado.patch` directly import warnings as _w diff --git a/ddtrace/internal/ci_visibility/api/_coverage_data.py b/ddtrace/internal/ci_visibility/api/_coverage_data.py index 9c7a5411521..5ccb6a19830 100644 --- a/ddtrace/internal/ci_visibility/api/_coverage_data.py +++ b/ddtrace/internal/ci_visibility/api/_coverage_data.py @@ -2,17 +2,11 @@ from pathlib import Path from typing import Dict from typing import List +from typing import TypedDict # noqa:F401 from ddtrace.internal.test_visibility.coverage_lines import CoverageLines -try: - from typing import TypedDict # noqa:F401 -except ImportError: - # Compatibility with Python 3.7 - from typing_extensions import TypedDict - - class CoverageFilePayload(TypedDict): filename: str bitmap: bytes diff --git a/ddtrace/internal/coverage/instrumentation.py b/ddtrace/internal/coverage/instrumentation.py index 19bc61238ff..3e24f66239d 100644 --- a/ddtrace/internal/coverage/instrumentation.py +++ b/ddtrace/internal/coverage/instrumentation.py @@ -10,8 +10,6 @@ from ddtrace.internal.coverage.instrumentation_py3_11 import instrument_all_lines # noqa elif sys.version_info >= (3, 10): from ddtrace.internal.coverage.instrumentation_py3_10 import instrument_all_lines # noqa -elif sys.version_info >= (3, 8): +else: # Python 3.8 and 3.9 use the same instrumentation from ddtrace.internal.coverage.instrumentation_py3_8 import instrument_all_lines # noqa -else: - from ddtrace.internal.coverage.instrumentation_py3_7 import instrument_all_lines # noqa diff --git a/ddtrace/internal/coverage/instrumentation_py3_7.py b/ddtrace/internal/coverage/instrumentation_py3_7.py deleted file mode 100644 index ecb49c54ed7..00000000000 --- a/ddtrace/internal/coverage/instrumentation_py3_7.py +++ /dev/null @@ -1,400 +0,0 @@ -from abc import ABC -import dis -from enum import Enum -import sys -from types import CodeType -import typing as t - -from ddtrace.internal.injection import HookType -from ddtrace.internal.test_visibility.coverage_lines import CoverageLines - - -# This is primarily to make mypy happy without having to nest the rest of this module behind a version check -# NOTE: the "prettier" one-liner version (eg: assert (3,11) <= sys.version_info < (3,12)) does not work for mypy -assert sys.version_info >= (3, 7) and sys.version_info < (3, 8) # nosec - - -class JumpDirection(int, Enum): - FORWARD = 1 - BACKWARD = -1 - - @classmethod - def from_opcode(cls, opcode: int) -> "JumpDirection": - return cls.BACKWARD if "BACKWARD" in dis.opname[opcode] else cls.FORWARD - - -class Jump(ABC): - # NOTE: in Python 3.9, jump arguments are offsets, vs instruction numbers (ie offsets/2) in Python 3.10 - def __init__(self, start: int, arg: int) -> None: - self.start = start - self.end: int - self.arg = arg - - -class AJump(Jump): - __opcodes__ = set(dis.hasjabs) - - def __init__(self, start: int, arg: int) -> None: - super().__init__(start, arg) - self.end = self.arg - - -class RJump(Jump): - __opcodes__ = set(dis.hasjrel) - - def __init__(self, start: int, arg: int, direction: JumpDirection) -> None: - super().__init__(start, arg) - self.direction = direction - self.end = start + (self.arg) * self.direction + 2 - - -class Instruction: - __slots__ = ("offset", "opcode", "arg", "targets") - - def __init__(self, offset: int, opcode: int, arg: int) -> None: - self.offset = offset - self.opcode = opcode - self.arg = arg - self.targets: t.List["Branch"] = [] - - -class Branch(ABC): - def __init__(self, start: Instruction, end: Instruction) -> None: - self.start = start - self.end = end - - @property - def arg(self) -> int: - raise NotImplementedError - - -class RBranch(Branch): - @property - def arg(self) -> int: - return abs(self.end.offset - self.start.offset - 2) >> 1 - - -class ABranch(Branch): - @property - def arg(self) -> int: - return self.end.offset >> 1 - - -EXTENDED_ARG = dis.EXTENDED_ARG -NO_OFFSET = -1 - - -def instr_with_arg(opcode: int, arg: int) -> t.List[Instruction]: - instructions = [Instruction(-1, opcode, arg & 0xFF)] - arg >>= 8 - while arg: - instructions.insert(0, Instruction(NO_OFFSET, EXTENDED_ARG, arg & 0xFF)) - arg >>= 8 - return instructions - - -def update_location_data( - code: CodeType, trap_map: t.Dict[int, int], ext_arg_offsets: t.List[t.Tuple[int, int]] -) -> bytes: - # Some code objects do not have co_lnotab data (eg: certain lambdas) - if code.co_lnotab == b"": - return code.co_lnotab - - # DEV: We expect the original offsets in the trap_map - new_data = bytearray() - data = code.co_lnotab - - ext_arg_offset_iter = iter(sorted(ext_arg_offsets)) - ext_arg_offset, ext_arg_size = next(ext_arg_offset_iter, (None, None)) - - current_orig_offset = 0 # Cumulative offset used to compare against trap offsets - - # All instructions have to have line numbers, so the first instructions of the trap call must mark the - # beginning of the line. The subsequent offsets need to be incremented by the size of the trap call instructions - # plus any extended args. - - # Set the first trap size: - current_new_offset = accumulated_new_offset = trap_map[0] << 1 - - for i in range(0, len(data), 2): - orig_offset_delta = data[i] - line_delta = data[i + 1] - - # For each original offset, we compute how many offsets have been added in the new code, this includes: - # - the size of the trap at the previous offset - # - the amount of extended args added since the previous offset - - current_new_offset += orig_offset_delta - current_orig_offset += orig_offset_delta - accumulated_new_offset += orig_offset_delta - - # If the current offset is 255, just increment: - if orig_offset_delta == 255: - continue - - # If the current offset is 0, it means we are only incrementing the amount of lines jumped by the previous - # non-zero offset - if orig_offset_delta == 0: - new_data.append(0) - new_data.append(line_delta) - continue - - while ext_arg_offset is not None and ext_arg_size is not None and current_new_offset > ext_arg_offset: - accumulated_new_offset += ext_arg_size << 1 - current_new_offset += ext_arg_size << 1 - ext_arg_offset, ext_arg_size = next(ext_arg_offset_iter, (None, None)) - - # If the current line delta changes, flush accumulated data: - if line_delta != 0: - while accumulated_new_offset > 255: - new_data.append(255) - new_data.append(0) - accumulated_new_offset -= 255 - - new_data.append(accumulated_new_offset) - new_data.append(line_delta) - - # Also add the current trap size to the accumulated offset - accumulated_new_offset = trap_map[current_orig_offset] << 1 - current_new_offset += accumulated_new_offset - - return bytes(new_data) - - -LOAD_CONST = dis.opmap["LOAD_CONST"] -CALL = dis.opmap["CALL_FUNCTION"] -POP_TOP = dis.opmap["POP_TOP"] -IMPORT_NAME = dis.opmap["IMPORT_NAME"] -IMPORT_FROM = dis.opmap["IMPORT_FROM"] - - -def trap_call(trap_index: int, arg_index: int) -> t.Tuple[Instruction, ...]: - return ( - *instr_with_arg(LOAD_CONST, trap_index), - *instr_with_arg(LOAD_CONST, arg_index), - Instruction(NO_OFFSET, CALL, 1), - Instruction(NO_OFFSET, POP_TOP, 0), - ) - - -def instrument_all_lines(code: CodeType, hook: HookType, path: str, package: str) -> t.Tuple[CodeType, CoverageLines]: - # TODO[perf]: Check if we really need to << and >> everywhere - trap_func, trap_arg = hook, path - - instructions: t.List[Instruction] = [] - - new_consts = list(code.co_consts) - trap_index = len(new_consts) - new_consts.append(trap_func) - - seen_lines = CoverageLines() - - offset_map = {} - - # Collect all the original jumps - jumps: t.Dict[int, Jump] = {} - traps: t.Dict[int, int] = {} # DEV: This uses the original offsets - line_map = {} - line_starts = dict(dis.findlinestarts(code)) - - # The previous two arguments are kept in order to track the depth of the IMPORT_NAME - # For example, from ...package import module - current_arg: int = 0 - previous_arg: int = 0 - previous_previous_arg: int = 0 - current_import_name: t.Optional[str] = None - current_import_package: t.Optional[str] = None - - try: - code_iter = iter(enumerate(code.co_code)) - ext: list[int] = [] - while True: - original_offset, opcode = next(code_iter) - - if original_offset in line_starts: - # Inject trap call at the beginning of the line. Keep track - # of location and size of the trap call instructions. We - # need this to adjust the location table. - line = line_starts[original_offset] - trap_instructions = trap_call(trap_index, len(new_consts)) - traps[original_offset] = len(trap_instructions) - instructions.extend(trap_instructions) - - # Make sure that the current module is marked as depending on its own package by instrumenting the - # first executable line - package_dep = None - if code.co_name == "" and len(new_consts) == len(code.co_consts) + 1: - package_dep = (package, ("",)) - - new_consts.append((line, trap_arg, package_dep)) - - line_map[original_offset] = trap_instructions[0] - - seen_lines.add(line) - - _, arg = next(code_iter) - - offset = len(instructions) << 1 - - # Propagate code - instructions.append(Instruction(original_offset, opcode, arg)) - - if opcode is EXTENDED_ARG: - ext.append(arg) - continue - else: - previous_previous_arg = previous_arg - previous_arg = current_arg - current_arg = int.from_bytes([*ext, arg], "big", signed=False) - ext.clear() - - # Track imports names - if opcode == IMPORT_NAME: - import_depth = code.co_consts[previous_previous_arg] - current_import_name = code.co_names[current_arg] - # Adjust package name if the import is relative and a parent (ie: if depth is more than 1) - current_import_package = ( - ".".join(package.split(".")[: -import_depth + 1]) if import_depth > 1 else package - ) - new_consts[-1] = ( - new_consts[-1][0], - new_consts[-1][1], - (current_import_package, (current_import_name,)), - ) - - # Also track import from statements since it's possible that the "from" target is a module, eg: - # from my_package import my_module - # Since the package has not changed, we simply extend the previous import names with the new value - if opcode == IMPORT_FROM: - import_from_name = f"{current_import_name}.{code.co_names[current_arg]}" - new_consts[-1] = ( - new_consts[-1][0], - new_consts[-1][1], - (new_consts[-1][2][0], tuple(list(new_consts[-1][2][1]) + [import_from_name])), - ) - - # Collect branching instructions for processing - if opcode in AJump.__opcodes__: - jumps[offset] = AJump(original_offset, current_arg) - elif opcode in RJump.__opcodes__: - jumps[offset] = RJump(original_offset, current_arg, JumpDirection.from_opcode(opcode)) - - if opcode is EXTENDED_ARG: - ext.append(arg) - else: - ext.clear() - except StopIteration: - pass - - # Collect all the old jump start and end offsets - jump_targets = {_ for j in jumps.values() for _ in (j.start, j.end)} - - # Adjust all the offsets and map the old offsets to the new ones for the - # jumps - for index, instr in enumerate(instructions): - new_offset = index << 1 - if instr.offset in jump_targets: - offset_map[instr.offset] = new_offset - instr.offset = new_offset - - # Adjust all the jumps, neglecting any EXTENDED_ARGs for now - branches: t.List[Branch] = [] - for jump in jumps.values(): - new_start = offset_map[jump.start] - new_end = offset_map[jump.end] - - # If we are jumping at the beginning of a line, jump to the - # beginning of the trap call instead - target_instr = line_map.get(jump.end, instructions[new_end >> 1]) - branch: Branch = ( - RBranch(instructions[new_start >> 1], target_instr) - if isinstance(jump, RJump) - else ABranch(instructions[new_start >> 1], target_instr) - ) - target_instr.targets.append(branch) - - branches.append(branch) - - # Process all the branching instructions to adjust the arguments. We - # need to add EXTENDED_ARGs if the argument is too large. - process_branches = True - exts: t.List[t.Tuple[Instruction, int]] = [] - while process_branches: - process_branches = False - for branch in branches: - jump_instr = branch.start - new_arg = branch.arg << 1 # 3.9 uses offsets, not instruction numbers - jump_instr.arg = new_arg & 0xFF - new_arg >>= 8 - c = 0 - index = jump_instr.offset >> 1 - - # Update the argument of the branching instruction, adding - # EXTENDED_ARGs if needed - while new_arg: - if index and instructions[index - 1].opcode is EXTENDED_ARG: - index -= 1 - instructions[index].arg = new_arg & 0xFF - else: - ext_instr = Instruction(index << 1, EXTENDED_ARG, new_arg & 0xFF) - instructions.insert(index, ext_instr) - c += 1 - # If the jump instruction was a target of another jump, - # make the latest EXTENDED_ARG instruction the target - # of that jump. - if jump_instr.targets: - for target in jump_instr.targets: - if target.end is not jump_instr: - raise ValueError("Invalid target") - target.end = ext_instr - ext_instr.targets.extend(jump_instr.targets) - jump_instr.targets.clear() - new_arg >>= 8 - - # Check if we added any EXTENDED_ARGs because we would have to - # reprocess the branches. - # TODO[perf]: only reprocess the branches that are affected. - # However, this branch is not expected to be taken often. - if c: - exts.append((ext_instr, c)) - # Update the instruction offset from the point of insertion - # of the EXTENDED_ARGs - for instr_index, instr in enumerate(instructions[index + 1 :], index + 1): - instr.offset = instr_index << 1 - - process_branches = True - - # Create the new code object - new_code = bytearray() - for instr in instructions: - new_code.append(instr.opcode) - new_code.append(instr.arg) - - # Instrument nested code objects recursively - for original_offset, nested_code in enumerate(code.co_consts): - if isinstance(nested_code, CodeType): - new_consts[original_offset], nested_lines = instrument_all_lines(nested_code, trap_func, trap_arg, package) - seen_lines.update(nested_lines) - - ext_arg_offsets = [(instr.offset, s) for instr, s in exts] - - return ( - CodeType( - code.co_argcount, - code.co_kwonlyargcount, - code.co_nlocals, - code.co_stacksize + 4, - code.co_flags, - bytes(new_code), - tuple(new_consts), - code.co_names, - code.co_varnames, - code.co_filename, - code.co_name, - code.co_firstlineno, - update_location_data(code, traps, ext_arg_offsets), - code.co_freevars, - code.co_cellvars, - ), - seen_lines, - ) diff --git a/ddtrace/internal/coverage/report.py b/ddtrace/internal/coverage/report.py index 9198b0fde97..cb1ce3170aa 100644 --- a/ddtrace/internal/coverage/report.py +++ b/ddtrace/internal/coverage/report.py @@ -45,7 +45,6 @@ def find_statement_for_line(node, line): if found_node is not None: return found_node - # TODO: support nocover in Python 3.7 if not hasattr(node, "end_lineno"): return None diff --git a/ddtrace/internal/wrapping/context.py b/ddtrace/internal/wrapping/context.py index c6b4ee896e2..cf36a93011b 100644 --- a/ddtrace/internal/wrapping/context.py +++ b/ddtrace/internal/wrapping/context.py @@ -462,8 +462,6 @@ def _exit(self) -> None: def __exit__(self, *exc) -> None: if exc == (None, None, None): - # In Python 3.7 this gets called when the context manager is exited - # normally return for context in self._contexts[::-1]: diff --git a/ddtrace/profiling/__init__.py b/ddtrace/profiling/__init__.py index 3361b574dd2..3e96d7a6685 100644 --- a/ddtrace/profiling/__init__.py +++ b/ddtrace/profiling/__init__.py @@ -1,21 +1 @@ -import sys - -from ddtrace.profiling import _build - from .profiler import Profiler # noqa:F401 - - -def _not_compatible_abi(): - raise ImportError( - "Python ABI is not compatible, you need to recompile this module.\n" - "Reinstall it with the following command:\n" - " pip install --no-binary ddtrace ddtrace" - ) - - -if (3, 7) < _build.compiled_with <= (3, 7, 3): - if sys.version_info[:3] > (3, 7, 3): - _not_compatible_abi() -elif (3, 7, 3) < _build.compiled_with < (3, 8): - if (3, 7) < sys.version_info[:3] <= (3, 7, 3): - _not_compatible_abi() diff --git a/ddtrace/profiling/_build.pyi b/ddtrace/profiling/_build.pyi deleted file mode 100644 index 88f43fc7d9c..00000000000 --- a/ddtrace/profiling/_build.pyi +++ /dev/null @@ -1,3 +0,0 @@ -import typing - -compiled_with: typing.Tuple[int, int, int] diff --git a/ddtrace/profiling/_build.pyx b/ddtrace/profiling/_build.pyx deleted file mode 100644 index bb4ec38738b..00000000000 --- a/ddtrace/profiling/_build.pyx +++ /dev/null @@ -1,4 +0,0 @@ -import typing - - -compiled_with: typing.Tuple[int, int, int] = (PY_MAJOR_VERSION, PY_MINOR_VERSION, PY_MICRO_VERSION) # type: ignore[name-defined] diff --git a/ddtrace/profiling/_threading.pyx b/ddtrace/profiling/_threading.pyx index b1267f1d6df..2a20b29b678 100644 --- a/ddtrace/profiling/_threading.pyx +++ b/ddtrace/profiling/_threading.pyx @@ -4,8 +4,6 @@ import sys import typing import weakref -import _thread - from ddtrace.internal._threads import periodic_threads from ddtrace.internal._unpatched import _threading as ddtrace_threading @@ -23,31 +21,6 @@ cdef extern from "": PyThreadState* PyThreadState_Get() -IF UNAME_SYSNAME == "Linux": - from ddtrace.internal.module import ModuleWatchdog - - cdef extern from "" nogil: - int __NR_gettid - long syscall(long number, ...) - - IF PY_VERSION_HEX < 0x03080000: - # The native_id attribute is available in Python >= 3.8. - @ModuleWatchdog.after_module_imported("threading") - def native_id_hook(threading): - def bootstrap_wrapper(f, args, kwargs): - try: - return f(*args, **kwargs) - finally: - # DEV: args[0] == self - args[0].native_id = PyLong_FromLong(syscall(__NR_gettid)) - - from ddtrace.internal.wrapping import wrap - wrap(threading.Thread._bootstrap, bootstrap_wrapper) - - # Assign the native thread ID to the main thread as well - threading.current_thread().native_id = PyLong_FromLong(syscall(__NR_gettid)) - - cpdef get_thread_by_id(thread_id): # Do not force-load the threading module if it's not already loaded threading = sys.modules.get("threading", ddtrace_threading) diff --git a/ddtrace/profiling/collector/stack.pyx b/ddtrace/profiling/collector/stack.pyx index ba44257197c..6fb34ca91c6 100644 --- a/ddtrace/profiling/collector/stack.pyx +++ b/ddtrace/profiling/collector/stack.pyx @@ -194,19 +194,7 @@ ELIF UNAME_SYSNAME != "Windows": PyObject* PyException_GetTraceback(PyObject* exc) PyObject* Py_TYPE(PyObject* ob) - IF PY_VERSION_HEX < 0x03080000: - # Python 3.7 - cdef extern from "": - - cdef struct pyinterpreters: - PyThread_type_lock mutex - - ctypedef struct _PyRuntimeState: - pyinterpreters interpreters - - cdef extern _PyRuntimeState _PyRuntime - - ELIF PY_VERSION_HEX >= 0x03080000: + IF PY_VERSION_HEX >= 0x03080000: # Python 3.8 cdef extern from "": diff --git a/ddtrace/settings/_otel_remapper.py b/ddtrace/settings/_otel_remapper.py index d3501c2e3fa..ec238e8a3cb 100644 --- a/ddtrace/settings/_otel_remapper.py +++ b/ddtrace/settings/_otel_remapper.py @@ -1,29 +1,11 @@ import os -import sys from typing import Callable from typing import Dict from typing import List +from typing import Literal +from typing import Optional from typing import Tuple - -if sys.version_info < (3, 8): - from typing_extensions import Literal - - try: - from typing_extensions import Optional - except ImportError: - # hack to support the Optional type for python3.7 + typing_extensions<4.0 (ex: molton) - from typing import Union - - class Optional: - def __class_getitem__(self, item): - return Union[item, type(None)] - -else: - from typing import Literal - from typing import Optional - - from ..constants import ENV_KEY from ..constants import VERSION_KEY from ..internal.logger import get_logger diff --git a/ddtrace/version.py b/ddtrace/version.py index f721678170a..016f71773e4 100644 --- a/ddtrace/version.py +++ b/ddtrace/version.py @@ -1,15 +1,11 @@ -def get_version(): - # type: () -> str +def get_version() -> str: try: from ._version import version return version except ImportError: - try: - from importlib.metadata import version as ilm_version - except ImportError: - # required for python3.7 - from importlib_metadata import version as ilm_version # type: ignore[no-redef] + from importlib.metadata import version as ilm_version + try: return ilm_version("ddtrace") except ModuleNotFoundError: diff --git a/docker/.python-version b/docker/.python-version index 9924540f9a4..b4145d94a36 100644 --- a/docker/.python-version +++ b/docker/.python-version @@ -1,5 +1,4 @@ 3.12 -3.7 3.8 3.9 3.10 diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst index 6c30c6b5310..ca55d55e4ca 100644 --- a/docs/advanced_usage.rst +++ b/docs/advanced_usage.rst @@ -81,11 +81,11 @@ context:: Span objects are owned by the execution in which they are created and must be finished in the same execution. The span context can be used to continue a trace in a different execution by passing it and activating it on the other - end. Note that in all instances of crossing into another - execution, sampling should be run manually before entering the new execution + end. Note that in all instances of crossing into another + execution, sampling should be run manually before entering the new execution to ensure that the sampling decision is the same across the trace. This can be done using `tracer.sample(tracer.current_root_span())` - + See the sections below for how to propagate traces across task, thread or process boundaries. @@ -201,7 +201,6 @@ desirable then ``None`` can be activated in the new task:: tracer.context_provider.activate(None) -.. note:: For Python < 3.7 the asyncio integration must be used: :ref:`asyncio` Manual Management ^^^^^^^^^^^^^^^^^ @@ -467,7 +466,7 @@ structure like in the following example:: Custom Error Codes ^^^^^^^^^^^^^^^^^^ It is possible to have a custom mapping of which HTTP status codes are considered errors. -By default, 500-599 status codes are considered errors. The default value can be overridden +By default, 500-599 status codes are considered errors. The default value can be overridden by setting the ``DD_TRACE_HTTP_SERVER_ERROR_STATUSES`` environment variable. @@ -743,8 +742,8 @@ The requirements for using this feature are: - must be using the `torch.profiler` module which was introduced in PyTorch version `1.8.1`. - must set the environment variable `DD_PROFILING_PYTORCH_ENABLED=true`. -It is important to note that we offer no different performance guarantees than the PyTorch profiler itself, which is not recommended to run in production continuously due to memory and CPU overhead. This -is an experimental feature which should be run with caution as it can add significant overhead. Additionally, please note that running this feature in certain +It is important to note that we offer no different performance guarantees than the PyTorch profiler itself, which is not recommended to run in production continuously due to memory and CPU overhead. This +is an experimental feature which should be run with caution as it can add significant overhead. Additionally, please note that running this feature in certain configurations can conflict with other features. For instance, running the NSight Systems or NSight Compute profiler alongside the PyTorch profiler on the same machine at the same time will likely lead to errors as CUPTI generally does not support multiple concurrent readers. @@ -757,7 +756,7 @@ This can be run through the command line (assuming that a Datadog agent is runni DD_SERVICE=test-pytorch-service DD_PROFILING_PYTORCH_ENABLED=true DD_PROFILING_ENABLED=true ddtrace-run python cifar10.py .. code-block:: python - + import torch import torch.nn import torch.optim @@ -810,4 +809,4 @@ for an application serving inference with an LLM through PyTorch: .. image:: pytorch_metric.png :width: 600 - :alt: Alternative text \ No newline at end of file + :alt: Alternative text diff --git a/docs/index.rst b/docs/index.rst index f51c8df1af1..dbe0d61bb7d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,7 +25,7 @@ documentation`_. Supported Libraries ------------------- -We officially support Python 3.7 and above. +dd-trace-py works with Python 3.8 and above. The versions listed are the versions that we have tested, but ``ddtrace`` can still be compatible with other versions of these libraries. If a version of a @@ -58,7 +58,7 @@ contacting support. +--------------------------------------------------+---------------+----------------+ | :ref:`asgi` | >= 3.0 | No | +--------------------------------------------------+---------------+----------------+ -| :ref:`asyncio` | \* | Yes [4]_ | +| :ref:`asyncio` | \* | Yes | +--------------------------------------------------+---------------+----------------+ | :ref:`asyncpg` | >= 0.22.0 | Yes | +--------------------------------------------------+---------------+----------------+ @@ -191,10 +191,7 @@ contacting support. .. [2] only the synchronous client -.. [3] only in Python 3.7 and above. - -.. [4] Activating the legacy context provider is required in Python < 3.7. See - :ref:`asyncio` for more details. +.. [3] only in Python 3.8 and above. .. [5] ``grpc.aio`` is automatically instrumented starting with ``grpcio>=1.32.0``. diff --git a/hatch.toml b/hatch.toml index 554db588865..6dcd32e6794 100644 --- a/hatch.toml +++ b/hatch.toml @@ -175,7 +175,7 @@ extra-dependencies = [ ] [[envs.integration_test.matrix]] -python = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +python = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] [envs.integration_test.env-vars] _DD_CIVISIBILITY_USE_CI_CONTEXT_PROVIDER = "1" @@ -297,7 +297,7 @@ test = [ ] [[envs.appsec_iast_native.matrix]] -python = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] +python = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] ## ASM appsec_iast_packages @@ -525,7 +525,7 @@ test = [ ] [[envs.ddtrace_unit_tests.matrix]] -python = ["3.12", "3.10", "3.7"] +python = ["3.12", "3.10"] # Internal coverage (dd_coverage to distinguish from regular coverage) has version-specific code so tests are run # across all supported versions @@ -544,7 +544,7 @@ test = [ ] [[envs.dd_coverage.matrix]] -python = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] +python = ["3.8", "3.9", "3.10", "3.11", "3.12"] [envs.pytest_plugin_v2] template = "pytest_plugin_v2" @@ -567,11 +567,6 @@ test = [ "pytest -c /dev/null --no-ddtrace --no-cov tests/contrib/pytest {args:}", ] -[[envs.pytest_plugin_v2.matrix]] -python = ["3.7"] -pytest = ["~=6.0", "~=7.0"] - - [[envs.pytest_plugin_v2.matrix]] python = ["3.9", "3.10", "3.12"] pytest = ["~=6.0", "~=7.0", "~=8.0"] @@ -604,7 +599,7 @@ test = [ ] [[envs.freezegun.matrix]] -python = ["3.7", "3.10", "3.12"] +python = ["3.10", "3.12"] freezegun = ["~=1.3.0", "~=1.5.0"] [envs.selenium] @@ -628,7 +623,7 @@ test = [ ] [[envs.selenium.matrix]] -python = ["3.7", "3.10", "3.12"] +python = ["3.10", "3.12"] tested_pytest_plugin_version = ["v1", "v2"] [envs.selenium.overrides] diff --git a/mypy.ini b/mypy.ini index 65e48e220e0..76d17d2c1e7 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,6 +1,5 @@ [mypy] files = ddtrace, - ddtrace/profiling/_build.pyx, docs exclude = ddtrace/appsec/_iast/_taint_tracking/cmake-build-debug/|ddtrace/appsec/_iast/_taint_tracking/_vendor/|ddtrace/internal/datadog/profiling/build # mypy thinks .pyx files are scripts and errors out if it finds multiple scripts diff --git a/pyproject.toml b/pyproject.toml index 0f2523d5fea..ec9aa061aed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools_scm[toml]>=4", "cython", "cmake>=3.24.2,<3.28; python_version>='3.7'", "setuptools-rust<2"] +requires = ["setuptools_scm[toml]>=4", "cython", "cmake>=3.24.2,<3.28; python_version>='3.8'", "setuptools-rust<2"] build-backend = "setuptools.build_meta" [project] @@ -8,7 +8,7 @@ dynamic = ["version"] description = "Datadog APM client library" readme = "README.md" license = { text = "LICENSE.BSD3" } -requires-python = ">=3.7" +requires-python = ">=3.8" authors = [ { name = "Datadog, Inc.", email = "dev@datadoghq.com" }, ] @@ -17,7 +17,6 @@ classifiers = [ "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -172,7 +171,6 @@ exclude-modules = ''' | ddtrace.internal.datadog.profiling.ddup._ddup | ddtrace.internal.datadog.profiling.stack_v2._stack_v2 # coverage has version-specific checks that prevent import - | ddtrace.internal.coverage.instrumentation_py3_7 | ddtrace.internal.coverage.instrumentation_py3_8 | ddtrace.internal.coverage.instrumentation_py3_10 | ddtrace.internal.coverage.instrumentation_py3_11 diff --git a/releasenotes/notes/3.7-removal-c5259c3df41f08fe.yaml b/releasenotes/notes/3.7-removal-c5259c3df41f08fe.yaml new file mode 100644 index 00000000000..db942b2c392 --- /dev/null +++ b/releasenotes/notes/3.7-removal-c5259c3df41f08fe.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Removes code and tests related to Python 3.7, breaking the library's compatibility with this Python version. diff --git a/riotfile.py b/riotfile.py index 4aa662f14dc..f70b53532ff 100644 --- a/riotfile.py +++ b/riotfile.py @@ -11,7 +11,6 @@ SUPPORTED_PYTHON_VERSIONS: List[Tuple[int, int]] = [ - (3, 7), (3, 8), (3, 9), (3, 10), @@ -24,8 +23,6 @@ def version_to_str(version: Tuple[int, int]) -> str: """Convert a Python version tuple to a string - >>> version_to_str((3, 7)) - '3.7' >>> version_to_str((3, 8)) '3.8' >>> version_to_str((3, 9)) @@ -45,8 +42,6 @@ def version_to_str(version: Tuple[int, int]) -> str: def str_to_version(version: str) -> Tuple[int, int]: """Convert a Python version string to a tuple - >>> str_to_version("3.7") - (3, 7) >>> str_to_version("3.8") (3, 8) >>> str_to_version("3.9") @@ -71,13 +66,13 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT """Helper to select python versions from the list of versions we support >>> select_pys() - ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] >>> select_pys(min_version='3') - ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] >>> select_pys(max_version='3') [] - >>> select_pys(min_version='3.7', max_version='3.9') - ['3.7', '3.8', '3.9'] + >>> select_pys(min_version='3.8', max_version='3.9') + ['3.8', '3.9'] """ min_version = str_to_version(min_version) max_version = str_to_version(max_version) @@ -386,12 +381,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "pyfakefs": latest, }, venvs=[ - Venv( - pys="3.7", - pkgs={ - "pytest-asyncio": "~=0.21.1", - }, - ), Venv( pys=select_pys(min_version="3.8", max_version="3.11"), pkgs={ @@ -426,7 +415,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={ "gevent": "~=20.12.0", # greenlet v1.0.0 adds support for contextvars @@ -523,7 +512,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT # FIXME: tests fail on vertica 1.x # Venv( # # vertica-python added support for Python 3.9/3.10 in 1.0 - # pys=select_pys(min_version="3.7", max_version="3.10"), + # pys=select_pys(min_version="3.8", max_version="3.10"), # pkgs={"vertica-python": ["~=1.0", latest]}, # ), # Venv( @@ -574,7 +563,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.12"), + pys=select_pys(min_version="3.8", max_version="3.12"), pkgs={ "falcon": [ "~=3.0.0", @@ -632,25 +621,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ # Celery 4.3 wants Kombu >= 4.4 and Redis >= 3.2 # Split into <3.8 and >=3.8 to pin importlib_metadata dependency for kombu - Venv( - # celery dropped support for Python 2.7/3.5 in 5.0 - pkgs={ - "pytest": "~=4.0", - "celery": [ - latest, # most recent 4.x - ], - "redis": "~=3.5", - "kombu": "~=4.4", - "importlib_metadata": "<5.0", # kombu using deprecated shims removed in importlib_metadata 5.0 - "pytest-cov": "~=3.0", - "pytest-mock": "==2.0.0", - }, - venvs=[ - # exceptiongroup latest specified to avoid riot bug: https://github.com/DataDog/riot/issues/211 - Venv(pys="3.7", pkgs={"exceptiongroup": latest}), - ], - ), - # Venv( # # celery added support for Python 3.9 in 4.x # pys=select_pys(min_version="3.8", max_version="3.9"), # pkgs={ @@ -664,21 +634,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT # ), # Celery 5.x wants Python 3.6+ # Split into <3.8 and >=3.8 to pin importlib_metadata dependency for kombu - Venv( - pys="3.7", - env={ - # https://docs.celeryproject.org/en/v5.0.5/userguide/testing.html#enabling - "PYTEST_PLUGINS": "celery.contrib.pytest", - }, - pkgs={ - "celery": [ - "~=5.1.0", - latest, - ], - "redis": "~=3.5", - "importlib_metadata": "<5.0", # kombu using deprecated shims removed in importlib_metadata 5.0 - }, - ), Venv( pys=select_pys(min_version="3.8", max_version="3.9"), env={ @@ -726,7 +681,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ), Venv( # cherrypy added support for Python 3.11 in 18.7 - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), pkgs={ "cherrypy": [">=18.0,<19", latest], "more_itertools": "<8.11.0", @@ -746,7 +701,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT # pymmongo<3.9, 3.9<=pymongo<3.12, 3.12<=pymongo<4.5, pymongo>=4.5 # To get full test coverage we must test all these version ranges Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={"pymongo": ["~=3.8.0", "~=3.9.0", "~=3.11", "~=4.0", latest]}, ), Venv( @@ -789,14 +744,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "DD_IAST_REQUEST_SAMPLING": "100", # Override default 30% to analyze all IAST requests }, venvs=[ - Venv( - # django dropped support for Python 3.6/3.7 in 4.0 - pys=select_pys(max_version="3.7"), - pkgs={ - "django": "~=3.2", - "channels": ["~=3.0", latest], - }, - ), Venv( # django dropped support for Python 3.8/3.9 in 5.0 pys=select_pys(min_version="3.8", max_version="3.9"), @@ -828,7 +775,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), pkgs={ "django_hosts": "~=4.0", "django": "~=3.2", @@ -853,14 +800,14 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( # djangorestframework dropped support for Django 2.x in 3.14 - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "django": ">=2.2,<2.3", "djangorestframework": ["==3.12.4", "==3.13.1"], }, ), Venv( - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), pkgs={ "django": "~=3.2", "djangorestframework": ">=3.11,<3.12", @@ -869,7 +816,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( pys=select_pys(min_version="3.8"), pkgs={ - "django": "~=4.0", + "django": ["~=4.0"], "djangorestframework": ["~=3.13", latest], }, ), @@ -1029,26 +976,11 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "werkzeug": "<2.0", }, ), - # Flask 2.x.x - Venv( - pys=select_pys(min_version="3.7"), - pkgs={"flask": "~=2.0"}, - ), - Venv( - pys=select_pys(max_version="3.7"), - command="python tests/ddtrace_run.py pytest {cmdargs} tests/contrib/flask_autopatch", - env={ - "DD_SERVICE": "test.flask.service", - "DD_PATCH_MODULES": "jinja2:false", - }, - pkgs={"flask": "~=2.0"}, - ), - # Flask 3.x.x Venv( - # Flask 3.x.x dropped support for Python 3.7 pys=select_pys(min_version="3.8"), pkgs={ "flask": [ + "~=2.0", "~=3.0.0", latest, ], @@ -1103,7 +1035,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "markupsafe": "<2.0", }, venvs=[ - Venv(pys=select_pys(max_version="3.7")), Venv(pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={"exceptiongroup": latest}), ], ), @@ -1120,7 +1051,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.11"), + pys=select_pys(min_version="3.8", max_version="3.11"), ), Venv(pys=select_pys(min_version="3.12"), pkgs={"redis": latest}), ], @@ -1132,7 +1063,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.11"), + pys=select_pys(min_version="3.8", max_version="3.11"), ), Venv(pys=select_pys(min_version="3.12"), pkgs={"redis": latest}), ], @@ -1156,7 +1087,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={"mysql-connector-python": ["==8.0.5", latest]}, ), Venv( @@ -1183,11 +1114,11 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={"psycopg2-binary": "~=2.8.0"}, ), Venv( - pys=select_pys(min_version="3.7", max_version="3.12"), + pys=select_pys(min_version="3.8", max_version="3.12"), # psycopg2-binary added support for Python 3.9/3.10 in 2.9.1 # psycopg2-binary added support for Python 3.11 in 2.9.2 pkgs={"psycopg2-binary": ["~=2.9.2", latest]}, @@ -1205,7 +1136,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT pkgs={"psycopg": [latest]}, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.11"), + pys=select_pys(min_version="3.8", max_version="3.11"), pkgs={ "pytest-asyncio": "==0.21.1", }, @@ -1242,7 +1173,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT # TODO: Py312 requires changes to test code venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.11"), + pys=select_pys(min_version="3.8", max_version="3.11"), pkgs={ "pynamodb": ["~=5.0", "~=5.3", "<6.0"], "moto": ">=1.0,<2.0", @@ -1271,10 +1202,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ # starlette added new TestClient after v0.20 # starlette added new root_path/path definitions after v0.33 - Venv( - pys="3.7", - pkgs={"starlette": ["~=0.14.0", "~=0.20.0", latest]}, - ), Venv( # starlette added support for Python 3.9 in 0.14 pys=select_pys(min_version="3.8", max_version="3.9"), @@ -1316,7 +1243,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.12"), + pys=select_pys(min_version="3.8", max_version="3.12"), pkgs={ "greenlet": "==3.0.3", "sqlalchemy": ["~=1.3.0", latest], @@ -1339,16 +1266,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "requests-mock": ">=1.4", }, venvs=[ - # requests added support for Python 3.7 in 2.20 - Venv( - pys="3.7", - pkgs={ - "requests": [ - "~=2.20.0", - latest, - ], - }, - ), Venv( # requests added support for Python 3.8 in 2.23 pys="3.8", @@ -1437,7 +1354,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={"mongoengine": ["~=0.23", latest]}, ), Venv( @@ -1455,7 +1372,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "asgiref": ["~=3.0.0", "~=3.0", latest], "pytest-randomly": latest, }, - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), command="pytest {cmdargs} tests/contrib/asgi", ), Venv( @@ -1466,7 +1383,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.10"), + pys=select_pys(min_version="3.8", max_version="3.10"), pkgs={ "mariadb": [ "~=1.0.0", @@ -1491,7 +1408,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT pkgs={"pymysql": "~=0.10"}, ), Venv( - pys=select_pys(min_version="3.7", max_version="3.12"), + pys=select_pys(min_version="3.8", max_version="3.12"), pkgs={ "pymysql": [ "~=1.0", @@ -1512,7 +1429,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "pyramid": [ "~=1.10", @@ -1541,7 +1458,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.11"), + pys=select_pys(min_version="3.8", max_version="3.11"), pkgs={ "aiobotocore": ["~=1.4.2", "~=2.0.0", latest], }, @@ -1565,7 +1482,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.10"), + pys=select_pys(min_version="3.8", max_version="3.10"), pkgs={"fastapi": ["~=0.64.0", "~=0.90.0", latest]}, ), Venv( @@ -1580,7 +1497,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT command="pytest {cmdargs} tests/contrib/aiomysql", venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.12"), + pys=select_pys(min_version="3.8", max_version="3.12"), pkgs={ "pytest-randomly": latest, "pytest-asyncio": "==0.21.1", @@ -1608,7 +1525,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "pytest": [ ">=6.0,<7.0", @@ -1698,7 +1615,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "pytest": [ ">=6.0,<7.0", @@ -1723,7 +1640,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "pytest-bdd": [ ">=4.0,<5.0", @@ -1769,7 +1686,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ), Venv( name="pytest-benchmark", - pys=select_pys(min_version="3.7", max_version="3.12"), + pys=select_pys(min_version="3.8", max_version="3.12"), command="pytest {cmdargs} --no-ddtrace --no-cov tests/contrib/pytest_benchmark/", pkgs={ "msgpack": latest, @@ -1809,7 +1726,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT # Versions between 1.14 and 1.20 have known threading issues # See https://github.com/grpc/grpc/issues/18994 Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={"grpcio": ["~=1.34.0", latest]}, ), Venv( @@ -1850,13 +1767,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT # grpc.aio support is broken and disabled by default env={"_DD_TRACE_GRPC_AIO_ENABLED": "true"}, venvs=[ - Venv( - pys="3.7", - pkgs={ - "grpcio": ["~=1.34.0", "~=1.59.0"], - "pytest-asyncio": "==0.21.1", - }, - ), Venv( pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ @@ -1886,7 +1796,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( name="graphene", command="pytest {cmdargs} tests/contrib/graphene", - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), pkgs={ "graphene": ["~=3.0.0", latest], "pytest-asyncio": "==0.21.1", @@ -1897,7 +1807,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( name="graphql", command="pytest {cmdargs} tests/contrib/graphql", - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), pkgs={ "pytest-asyncio": "==0.21.1", "graphql-core": ["~=3.2.0", latest], @@ -1913,7 +1823,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={ "rq": [ "~=1.8.0", @@ -1946,7 +1856,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ), Venv( name="httpx", - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), command="pytest {cmdargs} tests/contrib/httpx", pkgs={ "pytest-asyncio": "==0.21.1", @@ -1965,12 +1875,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "pytest-randomly": latest, }, venvs=[ - Venv( - # Support added for Python 3.7 in 1.25.0 - # Support removed for Python 3.7 after 1.26.0 - pys="3.7", - pkgs={"urllib3": ["==1.25.0", "~=1.26.0"]}, - ), Venv( # Support added for Python 3.8 in 1.25.0 pys="3.8", @@ -1999,11 +1903,8 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], ), Venv( - # cassandra-driver does not officially support 3.9, 3.10 - # releases 3.7 and 3.8 are broken on Python >= 3.7 - # (see https://github.com/r4fek/django-cassandra-engine/issues/104) name="cassandra", - pys=select_pys(max_version="3.8"), + pys="3.8", # see https://github.com/r4fek/django-cassandra-engine/issues/104 pkgs={"cassandra-driver": ["~=3.24.0", latest], "pytest-randomly": latest}, command="pytest {cmdargs} tests/contrib/cassandra", ), @@ -2013,7 +1914,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT pkgs={"urllib3": "~=1.26.15", "pytest-randomly": latest}, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={"algoliasearch": ["~=2.5", "~=2.6"]}, ), Venv( @@ -2026,7 +1927,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( name="aiopg", command="pytest {cmdargs} tests/contrib/aiopg", - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "sqlalchemy": latest, "aiopg": "~=0.16.0", @@ -2034,7 +1935,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), pkgs={ "aiopg": ["~=1.0", "~=1.4.0"], }, @@ -2054,12 +1955,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "yarl": "~=1.0", }, venvs=[ - Venv( - pys=select_pys(min_version="3.7", max_version="3.7"), - pkgs={ - "pytest-asyncio": ["==0.21.1"], - }, - ), Venv( pys=select_pys(min_version="3.8"), pkgs={ @@ -2085,12 +1980,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "jinja2": latest, }, venvs=[ - Venv( - pys=select_pys(min_version="3.7", max_version="3.7"), - pkgs={ - "pytest-asyncio": ["==0.21.1"], - }, - ), Venv( pys=select_pys(min_version="3.8"), pkgs={ @@ -2115,7 +2004,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, ), Venv( - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), pkgs={ "jinja2": ["~=3.0.0", latest], }, @@ -2147,12 +2036,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ], }, venvs=[ - Venv( - pys="3.7", - pkgs={ - "pytest-asyncio": "==0.21.1", - }, - ), Venv( pys=select_pys(min_version="3.8", max_version="3.10"), pkgs={ @@ -2182,7 +2065,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ), Venv( name="aredis", - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), command="pytest {cmdargs} tests/contrib/aredis", pkgs={ "pytest-asyncio": "==0.21.1", @@ -2192,7 +2075,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ), Venv( name="avro", - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), command="pytest {cmdargs} tests/contrib/avro", pkgs={ "avro": latest, @@ -2217,7 +2100,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={"yaaredis": ["~=2.0.0", latest]}, ), Venv( @@ -2239,14 +2122,14 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( # sanic added support for Python 3.9 in 20.12 - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "sanic": "~=20.12", "pytest-sanic": "~=1.6.2", }, ), Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ "sanic": [ "~=21.3", @@ -2264,7 +2147,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, ), Venv( - pys=select_pys(min_version="3.7", max_version="3.10"), + pys=select_pys(min_version="3.8", max_version="3.10"), pkgs={ "sanic": ["~=22.3", "~=22.12"], "sanic-testing": "~=22.3.0", @@ -2297,7 +2180,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={"snowflake-connector-python": ["~=2.3.0", "~=2.9.0", latest]}, ), Venv( @@ -2335,7 +2218,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ # our test_asyncpg.py uses `yield` in an async function and is not compatible with Python 3.5 Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={"asyncpg": ["~=0.23", latest]}, ), Venv( @@ -2359,15 +2242,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT ), ], ), - Venv( - name="asyncio", - command="pytest {cmdargs} tests/contrib/asyncio", - pys=select_pys(), - pkgs={ - "pytest-randomly": latest, - "pytest-asyncio": "==0.21.1", - }, - ), Venv( name="futures", command="pytest {cmdargs} tests/contrib/futures", @@ -2415,7 +2289,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "pytest-randomly": latest, }, venvs=[ - Venv(pys=["3.7"]), Venv(pys=select_pys(min_version="3.8", max_version="3.10")), Venv(pys=select_pys(min_version="3.11"), pkgs={"attrs": latest}), ], @@ -2428,7 +2301,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.10"), + pys=select_pys(min_version="3.8", max_version="3.10"), pkgs={ "dogpile.cache": [ "~=0.9", @@ -2482,6 +2355,15 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "requests": "==2.28.1", # specific version expected by tests }, ), + Venv( + name="asyncio", + command="pytest {cmdargs} tests/contrib/asyncio", + pys=select_pys(), + pkgs={ + "pytest-randomly": latest, + "pytest-asyncio": "==0.21.1", + }, + ), Venv( name="openai", command="pytest {cmdargs} tests/contrib/openai", @@ -2520,12 +2402,12 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT command="pytest {cmdargs} tests/opentracer/core", ), Venv( - pys=select_pys(min_version="3.7"), + pys=select_pys(min_version="3.8"), command="pytest {cmdargs} tests/opentracer/test_tracer_asyncio.py", pkgs={"pytest-asyncio": "==0.21.1"}, ), Venv( - pys=select_pys(min_version="3.7", max_version="3.11"), + pys=select_pys(min_version="3.8", max_version="3.11"), command="pytest {cmdargs} tests/opentracer/test_tracer_tornado.py", # TODO: update opentracing tests to be compatible with Tornado v6. # https://github.com/opentracing/opentracing-python/issues/136 @@ -2537,7 +2419,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT command="pytest {cmdargs} tests/opentracer/test_tracer_gevent.py", venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.8"), + pys="3.8", pkgs={ "gevent": latest, "greenlet": latest, @@ -2591,7 +2473,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( # pylibmc added support for Python 3.8/3.9/3.10 in 1.6.2 - pys=select_pys(min_version="3.7", max_version="3.10"), + pys=select_pys(min_version="3.8", max_version="3.10"), pkgs={ "pylibmc": ["~=1.6.2", latest], }, @@ -2609,15 +2491,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT command="pytest {cmdargs} tests/contrib/kombu", pkgs={"pytest-randomly": latest}, venvs=[ - # Kombu>=4.2 only supports Python 3.7+ - Venv( - pys="3.7", - pkgs={ - "kombu": [">=4.6,<4.7", ">=5.0,<5.1", latest], - # kombu using deprecated shims removed in importlib-metadata 5.0 pre-Python 3.8 - "importlib_metadata": "<5.0", - }, - ), Venv( pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={ @@ -2641,7 +2514,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT venvs=[ Venv( # tornado added support for Python 3.8/3.9 in 6.1 - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={"tornado": ["~=6.1", "~=6.2"]}, ), Venv( @@ -2662,7 +2535,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT pkgs={"pytest-randomly": latest}, venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.9"), + pys=select_pys(min_version="3.8", max_version="3.9"), pkgs={"mysqlclient": ["~=2.0", "~=2.1", latest]}, ), Venv( @@ -2845,7 +2718,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT command="pytest {cmdargs} -vv tests/contrib/kafka", venvs=[ Venv( - pys=select_pys(min_version="3.7", max_version="3.10"), + pys=select_pys(min_version="3.8", max_version="3.10"), pkgs={"confluent-kafka": ["~=1.9.2", latest]}, ), # confluent-kafka added support for Python 3.11 in 2.0.2 @@ -2869,7 +2742,7 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT Venv( name="azure_functions", command="pytest {cmdargs} tests/contrib/azure_functions", - pys=select_pys(min_version="3.7", max_version="3.11"), + pys=select_pys(min_version="3.8", max_version="3.11"), pkgs={ "azure.functions": latest, "requests": latest, @@ -2949,28 +2822,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "pytest-randomly": latest, }, venvs=[ - # Python 3.7 - Venv( - pys="3.7", - pkgs={"uwsgi": latest}, - venvs=[ - Venv( - pkgs={ - "protobuf": ["==3.8.0", latest], - }, - ), - # Gevent - Venv( - env={ - "DD_PROFILE_TEST_GEVENT": "1", - }, - pkgs={ - "gunicorn[gevent]": latest, - "gevent": latest, - }, - ), - ], - ), # Python 3.8 + 3.9 Venv( pys=["3.8", "3.9"], @@ -3087,28 +2938,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT "pytest-randomly": latest, }, venvs=[ - # Python 3.7 - Venv( - pys="3.7", - pkgs={"uwsgi": latest}, - venvs=[ - Venv( - pkgs={ - "protobuf": ["==3.8.0", latest], - }, - ), - # Gevent - Venv( - env={ - "DD_PROFILE_TEST_GEVENT": "1", - }, - pkgs={ - "gunicorn[gevent]": latest, - "gevent": latest, - }, - ), - ], - ), # Python 3.8 + 3.9 Venv( pys=["3.8", "3.9"], diff --git a/scripts/stubgen.sh b/scripts/stubgen.sh index 2afafe92bb2..5471288156f 100755 --- a/scripts/stubgen.sh +++ b/scripts/stubgen.sh @@ -1,6 +1,5 @@ #!/bin/bash -e -for file in ddtrace/profiling/_build.pyx \ - ddtrace/profiling/exporter/pprof.pyx +for file in ddtrace/profiling/exporter/pprof.pyx do stubgen "$file" mv out/__main__.pyi $(dirname "$file")/$(basename "$file" .pyx).pyi diff --git a/setup.py b/setup.py index 89adf166b74..e65f1ca3b0e 100644 --- a/setup.py +++ b/setup.py @@ -512,9 +512,11 @@ def get_exts_for(name): "ddtrace/profiling/collector/_memalloc_heap.c", "ddtrace/profiling/collector/_memalloc_reentrant.c", ], - extra_compile_args=debug_compile_args + ["-D_POSIX_C_SOURCE=200809L", "-std=c11"] - if CURRENT_OS != "Windows" - else ["/std:c11"], + extra_compile_args=( + debug_compile_args + ["-D_POSIX_C_SOURCE=200809L", "-std=c11"] + if CURRENT_OS != "Windows" + else ["/std:c11"] + ), ), Extension( "ddtrace.internal._threads", @@ -555,8 +557,7 @@ def get_exts_for(name): ) ) - # Echion doesn't build on 3.7, so just skip it outright for now - if sys.version_info >= (3, 8) and sys.version_info < (3, 13): + if sys.version_info < (3, 13): ext_modules.append( CMakeExtension( "ddtrace.internal.datadog.profiling.stack_v2._stack_v2", @@ -641,11 +642,6 @@ def get_exts_for(name): sources=["ddtrace/profiling/exporter/pprof.pyx"], language="c", ), - Cython.Distutils.Extension( - "ddtrace.profiling._build", - sources=["ddtrace/profiling/_build.pyx"], - language="c", - ), ], compile_time_env={ "PY_MAJOR_VERSION": sys.version_info.major, diff --git a/tests/appsec/iast/_ast/test_ast_patching.py b/tests/appsec/iast/_ast/test_ast_patching.py index 213737ecbce..f4742ecf560 100644 --- a/tests/appsec/iast/_ast/test_ast_patching.py +++ b/tests/appsec/iast/_ast/test_ast_patching.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import logging import os -import sys import astunparse import mock @@ -307,7 +306,6 @@ def test_astpatch_dir_patched_with_env_var(module_name, env_var): ), ], ) -@pytest.mark.skipif(sys.version_info < (3, 8), reason="the dir wrappers enters and infinite loop in 3.7") def test_astpatch_dir_patched_with_or_without_custom_dir(module_name, expected_names): """ Check that the patched dir doesn't have any __ddtrace symbols and match the original diff --git a/tests/appsec/iast/_ast/test_ast_patching_type_hints.py b/tests/appsec/iast/_ast/test_ast_patching_type_hints.py index 19a1ddca73d..e5ef78fc6ea 100644 --- a/tests/appsec/iast/_ast/test_ast_patching_type_hints.py +++ b/tests/appsec/iast/_ast/test_ast_patching_type_hints.py @@ -32,7 +32,7 @@ def _get_patched_code(module_path: Text, module_name: Text) -> str: return new_code -@pytest.mark.skipif(sys.version_info <= (3, 8, 0), reason="Sample code not compatible with Python 3.7") +@pytest.mark.skipif(sys.version_info == (3, 8, 0), reason="Sample code not compatible with Python 3.8") def test_no_index_aspects_py38plus(): """ Methods should not be replaced by the aspect since it's not the builtin method diff --git a/tests/appsec/integrations/flask_tests/test_iast_flask.py b/tests/appsec/integrations/flask_tests/test_iast_flask.py index 8490fadea19..be45e6bb82f 100644 --- a/tests/appsec/integrations/flask_tests/test_iast_flask.py +++ b/tests/appsec/integrations/flask_tests/test_iast_flask.py @@ -1,5 +1,4 @@ import json -import sys import traceback from flask import request @@ -268,7 +267,6 @@ def sqli_4(param_str): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value - @pytest.mark.skipif(sys.version_info < (3, 8), reason="some requests params fail in Python 3.7 or lower") def test_flask_simple_iast_path_header_and_querystring_tainted(self): @self.app.route("/sqli///", methods=["GET", "POST"]) def sqli_5(param_str, param_int): diff --git a/tests/appsec/suitespec.yml b/tests/appsec/suitespec.yml index e2e3e331cec..8f10e3ddee7 100644 --- a/tests/appsec/suitespec.yml +++ b/tests/appsec/suitespec.yml @@ -30,7 +30,6 @@ suites: env: TEST_POSTGRES_HOST: postgres TEST_MYSQL_HOST: mysql - parallelism: 6 paths: - '@bootstrap' - '@core' diff --git a/tests/ci_visibility/suitespec.yml b/tests/ci_visibility/suitespec.yml index 29317ba3294..9012ced61d8 100644 --- a/tests/ci_visibility/suitespec.yml +++ b/tests/ci_visibility/suitespec.yml @@ -29,7 +29,7 @@ suites: runner: riot snapshot: true dd_coverage: - parallelism: 6 + parallelism: 5 paths: - '@bootstrap' - '@core' @@ -56,7 +56,7 @@ suites: runner: riot snapshot: true pytest_v2: - parallelism: 10 + parallelism: 7 paths: - '@bootstrap' - '@core' diff --git a/tests/contrib/botocore/test.py b/tests/contrib/botocore/test.py index 9e4f91cb61f..67eaaf55fc3 100644 --- a/tests/contrib/botocore/test.py +++ b/tests/contrib/botocore/test.py @@ -1680,7 +1680,7 @@ def test_lambda_invoke_distributed_tracing_off(self): lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") lamb.create_function( FunctionName="ironmaiden", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ @@ -1720,7 +1720,7 @@ def test_lambda_invoke_bad_context_client(self): lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") lamb.create_function( FunctionName="black-sabbath", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ @@ -1760,7 +1760,7 @@ def test_schematized_lambda_client_default(self): Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) lamb.create_function( FunctionName="guns-and-roses", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ @@ -1795,7 +1795,7 @@ def test_schematized_lambda_client_v0(self): lamb.create_function( FunctionName="guns-and-roses", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ @@ -1826,7 +1826,7 @@ def test_schematized_lambda_client_v1(self): lamb.create_function( FunctionName="guns-and-roses", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ @@ -1857,7 +1857,7 @@ def test_schematized_unspecified_service_lambda_client_default(self): lamb.create_function( FunctionName="guns-and-roses", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ @@ -1888,7 +1888,7 @@ def test_schematized_unspecified_service_lambda_client_v0(self): lamb.create_function( FunctionName="guns-and-roses", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ @@ -1919,7 +1919,7 @@ def test_schematized_unspecified_service_lambda_client_v1(self): lamb.create_function( FunctionName="guns-and-roses", - Runtime="python3.7", + Runtime="python3.8", Role="test-iam-role", Handler="lambda_function.lambda_handler", Code={ diff --git a/tests/contrib/dramatiq/test_integration.py b/tests/contrib/dramatiq/test_integration.py index ba8d836181c..526aadc3861 100644 --- a/tests/contrib/dramatiq/test_integration.py +++ b/tests/contrib/dramatiq/test_integration.py @@ -92,7 +92,7 @@ def fn_task(): fn_task.send() # Ignoring these two values due to variance in method name - # Python 3.7 - 3.9 -> send_with_options + # Python 3.8 - 3.9 -> send_with_options # Python 3.10+ -> Actor.send_with_options @snapshot(ignores=["meta.error.message", "meta.error.stack"], wait_for_num_traces=1) def test_send_exception(self): diff --git a/tests/contrib/pytest/test_coverage_per_suite.py b/tests/contrib/pytest/test_coverage_per_suite.py index adb2a710c76..6527f56803b 100644 --- a/tests/contrib/pytest/test_coverage_per_suite.py +++ b/tests/contrib/pytest/test_coverage_per_suite.py @@ -10,7 +10,6 @@ from ddtrace.internal.ci_visibility._api_client import ITRData from ddtrace.internal.ci_visibility._api_client import TestVisibilityAPISettings from ddtrace.internal.ci_visibility.constants import COVERAGE_TAG_NAME -from ddtrace.internal.compat import PYTHON_VERSION_INFO from ddtrace.internal.coverage.util import collapse_ranges from ddtrace.internal.test_visibility.coverage_lines import CoverageLines from tests.ci_visibility.api_client._util import _make_fqdn_suite_ids @@ -22,9 +21,6 @@ pytestmark = pytest.mark.skipif(not _pytest_version_supports_itr(), reason="pytest version does not support coverage") -# TODO: investigate why pytest 3.7 does not mark the decorated function line when skipped as covered -_DONT_COVER_SKIPPED_FUNC_LINE = PYTHON_VERSION_INFO <= (3, 8, 0) - def _get_tuples_from_bytearray(bitmap): coverage_lines = CoverageLines() @@ -146,35 +142,19 @@ def test_second(): first_suite_coverage = _get_span_coverage_data(first_suite_span, _USE_PLUGIN_V2) assert len(first_suite_coverage) == 3 if _USE_PLUGIN_V2: - if _DONT_COVER_SKIPPED_FUNC_LINE: - assert first_suite_coverage["/test_cov.py"] == [ - (1, 2), - (4, 5), - (7, 9), - (11, 13), - (16, 16), - (20, 22), - (24, 24), - (28, 31), - (33, 33), - (35, 36), - (39, 42), - (44, 44), - ] - else: - assert first_suite_coverage["/test_cov.py"] == [ - (1, 2), - (4, 5), - (7, 9), - (11, 13), - (16, 17), - (20, 22), - (24, 25), - (28, 31), - (33, 36), - (39, 42), - (44, 45), - ] + assert first_suite_coverage["/test_cov.py"] == [ + (1, 2), + (4, 5), + (7, 9), + (11, 13), + (16, 17), + (20, 22), + (24, 25), + (28, 31), + (33, 36), + (39, 42), + (44, 45), + ] assert first_suite_coverage["/lib_fn.py"] == [(1, 2)] assert first_suite_coverage["/ret_false.py"] == [(1, 2)] diff --git a/tests/contrib/suitespec.yml b/tests/contrib/suitespec.yml index 8c5fbc72da2..40a677109fc 100644 --- a/tests/contrib/suitespec.yml +++ b/tests/contrib/suitespec.yml @@ -307,7 +307,7 @@ suites: runner: riot snapshot: true aredis: - parallelism: 3 + parallelism: 2 paths: - '@bootstrap' - '@core' @@ -347,7 +347,7 @@ suites: runner: riot snapshot: true asynctest: - parallelism: 3 + parallelism: 2 paths: - '@bootstrap' - '@core' @@ -605,7 +605,7 @@ suites: env: TEST_MEMCACHED_HOST: memcached TEST_REDIS_HOST: redis - parallelism: 14 + parallelism: 11 paths: - '@bootstrap' - '@core' diff --git a/tests/integration/test_debug.py b/tests/integration/test_debug.py index e87014c28b9..f5453f353fe 100644 --- a/tests/integration/test_debug.py +++ b/tests/integration/test_debug.py @@ -46,10 +46,7 @@ def test_standard_tags(): date = f.get("date") assert isinstance(date, str) - if sys.version_info >= (3, 7, 0): - # Try to parse the date-time, only built-in way to parse - # available in Python 3.7+ - date = datetime.fromisoformat(date) + date = datetime.fromisoformat(date) os_name = f.get("os_name") assert isinstance(os_name, str) diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index 4354f3acdf9..70cc84cdbfa 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -807,7 +807,6 @@ def test_logging_during_tracer_init_succeeds_when_debug_logging_and_logs_injecti ), "stderr should not contain any exception logs" -@pytest.mark.skipif(sys.version_info < (3, 8), reason="Python 3.7 deprecation warning") def test_no_warnings_when_Wall(): env = os.environ.copy() # Have to disable sqlite3 as coverage uses it on process shutdown diff --git a/tests/internal/service_name/test_inferred_base_service.py b/tests/internal/service_name/test_inferred_base_service.py index c9f43d6c6cd..bf981dc164b 100644 --- a/tests/internal/service_name/test_inferred_base_service.py +++ b/tests/internal/service_name/test_inferred_base_service.py @@ -80,7 +80,7 @@ def mock_file_system(): ("python apps/app2/cmd/run.py", "app2"), ("python apps/app2/setup.py", "app2"), ("DD_ENV=prod OTHER_ENV_VAR=hi python apps/app2/setup.py", "app2"), - ("python3.7 apps/app2/setup.py", "app2"), + ("python3.8 apps/app2/setup.py", "app2"), ("/usr/bin/python3.11 apps/app2/setup.py", "app2"), # Additional Python test cases ("venv/bin/python3.11/ddtrace-run venv/bin/python3.11 apps/app2/setup.py", "app2"), diff --git a/tests/internal/test_module.py b/tests/internal/test_module.py index e62440325fe..668dcb3d175 100644 --- a/tests/internal/test_module.py +++ b/tests/internal/test_module.py @@ -2,13 +2,11 @@ import os from pathlib import Path import sys -import warnings from warnings import warn import mock import pytest -from ddtrace import check_supported_python_version from ddtrace.internal.coverage.code import ModuleCodeCollector from ddtrace.internal.module import ModuleWatchdog from ddtrace.internal.module import origin @@ -423,7 +421,6 @@ def ns_hook(module): ModuleWatchdog.uninstall() -@pytest.mark.skipif(sys.version_info < (3, 8), reason="Python 3.7 deprecation warning") @pytest.mark.subprocess( ddtrace_run=True, env=dict( @@ -579,29 +576,3 @@ def __getattr__(name): "ddtrace.contrib.trace_utils_redis", ] ) - - -@pytest.mark.skipif(sys.version_info >= (3, 8), reason="Python >= 3.8 is supported") -def test_deprecated_python_version(): - # Test that the deprecation warning for Python 3.7 and below is printed in unsupported Python versions. - with warnings.catch_warnings(record=True) as w: - # Cause all warnings to always be triggered. - warnings.simplefilter("always") - # Trigger a warning. - check_supported_python_version() - # Verify some things - assert len(w) == 1 - assert issubclass(w[-1].category, DeprecationWarning) - assert "Support for ddtrace with Python version" in str(w[-1].message) - - -@pytest.mark.skipif(sys.version_info < (3, 8), reason="Python < 3.8 is unsupported") -def test_non_deprecated_python_version(): - # Test that the deprecation warning for Python 3.7 and below is not printed in supported Python versions. - with warnings.catch_warnings(record=True) as w: - # Cause all warnings to always be triggered. - warnings.simplefilter("always") - # Trigger a warning. - check_supported_python_version() - # Verify some things - assert len(w) == 0 diff --git a/tests/profiling/test_profiler.py b/tests/profiling/test_profiler.py index 0aba1240b7d..5772766e184 100644 --- a/tests/profiling/test_profiler.py +++ b/tests/profiling/test_profiler.py @@ -1,6 +1,5 @@ import logging import os -import sys import time import mock @@ -435,7 +434,6 @@ def test_profiler_serverless(monkeypatch): assert p.tags["functionname"] == "foobar" -@pytest.mark.skipif(sys.version_info < (3, 8), reason="Python 3.7 deprecation warning") @pytest.mark.subprocess() def test_profiler_ddtrace_deprecation(): """ diff --git a/tests/profiling_v2/collector/test_stack.py b/tests/profiling_v2/collector/test_stack.py index 03d5b1e7eff..cafa9f043cf 100644 --- a/tests/profiling_v2/collector/test_stack.py +++ b/tests/profiling_v2/collector/test_stack.py @@ -31,7 +31,6 @@ DD_PROFILING_OUTPUT_PPROF="/tmp/test_collect_truncate", ) ) -@pytest.mark.skipif(sys.version_info[:2] == (3, 7), reason="stack_v2 is not supported on Python 3.7") def test_collect_truncate(): import os @@ -61,9 +60,6 @@ def test_collect_truncate(): def test_stack_locations(tmp_path): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - test_name = "test_stack_locations" pprof_prefix = str(tmp_path / test_name) output_filename = pprof_prefix + "." + str(os.getpid()) @@ -116,9 +112,6 @@ def foo(): def test_push_span(tmp_path, tracer): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - test_name = "test_push_span" pprof_prefix = str(tmp_path / test_name) output_filename = pprof_prefix + "." + str(os.getpid()) @@ -163,9 +156,6 @@ def test_push_span(tmp_path, tracer): def test_push_span_unregister_thread(tmp_path, monkeypatch, tracer): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - with patch("ddtrace.internal.datadog.profiling.stack_v2.unregister_thread") as unregister_thread: tracer._endpoint_call_counter_span_processor.enable() @@ -219,9 +209,6 @@ def target_fun(): def test_push_non_web_span(tmp_path, tracer): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - tracer._endpoint_call_counter_span_processor.enable() test_name = "test_push_non_web_span" @@ -267,9 +254,6 @@ def test_push_non_web_span(tmp_path, tracer): def test_push_span_none_span_type(tmp_path, tracer): # Test for https://github.com/DataDog/dd-trace-py/issues/11141 - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - test_name = "test_push_span_none_span_type" pprof_prefix = str(tmp_path / test_name) output_filename = pprof_prefix + "." + str(os.getpid()) @@ -317,9 +301,6 @@ def test_push_span_none_span_type(tmp_path, tracer): @pytest.mark.skipif(not stack.FEATURES["stack-exceptions"], reason="Stack exceptions are not supported") @pytest.mark.parametrize("stack_v2_enabled", [True, False]) def test_exception_collection(stack_v2_enabled, tmp_path): - if sys.version_info[:2] == (3, 7) and stack_v2_enabled: - pytest.skip("stack_v2 is not supported on Python 3.7") - test_name = "test_exception_collection" pprof_prefix = str(tmp_path / test_name) output_filename = pprof_prefix + "." + str(os.getpid()) @@ -357,7 +338,7 @@ def test_exception_collection(stack_v2_enabled, tmp_path): pprof_utils.StackLocation( filename="test_stack.py", function_name="test_exception_collection", - line_no=test_exception_collection.__code__.co_firstlineno + 18, + line_no=test_exception_collection.__code__.co_firstlineno + 15, ), ], ), @@ -367,9 +348,6 @@ def test_exception_collection(stack_v2_enabled, tmp_path): @pytest.mark.skipif(not stack.FEATURES["stack-exceptions"], reason="Stack exceptions are not supported") @pytest.mark.parametrize("stack_v2_enabled", [True, False]) def test_exception_collection_threads(stack_v2_enabled, tmp_path): - if sys.version_info[:2] == (3, 7) and stack_v2_enabled: - pytest.skip("stack_v2 is not supported on Python 3.7") - test_name = "test_exception_collection_threads" pprof_prefix = str(tmp_path / test_name) output_filename = pprof_prefix + "." + str(os.getpid()) @@ -429,9 +407,6 @@ def target_fun(): @pytest.mark.skipif(not stack.FEATURES["stack-exceptions"], reason="Stack exceptions are not supported") @pytest.mark.parametrize("stack_v2_enabled", [True, False]) def test_exception_collection_trace(stack_v2_enabled, tmp_path, tracer): - if sys.version_info[:2] == (3, 7) and stack_v2_enabled: - pytest.skip("stack_v2 is not supported on Python 3.7") - test_name = "test_exception_collection_trace" pprof_prefix = str(tmp_path / test_name) output_filename = pprof_prefix + "." + str(os.getpid()) @@ -472,7 +447,7 @@ def test_exception_collection_trace(stack_v2_enabled, tmp_path, tracer): pprof_utils.StackLocation( filename="test_stack.py", function_name="test_exception_collection_trace", - line_no=test_exception_collection_trace.__code__.co_firstlineno + 21, + line_no=test_exception_collection_trace.__code__.co_firstlineno + 18, ), ], ), @@ -480,9 +455,6 @@ def test_exception_collection_trace(stack_v2_enabled, tmp_path, tracer): def test_collect_once_with_class(tmp_path): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - class SomeClass(object): @classmethod def sleep_class(cls): @@ -529,7 +501,7 @@ def sleep_instance(self): pprof_utils.StackLocation( function_name="test_collect_once_with_class", filename="test_stack.py", - line_no=test_collect_once_with_class.__code__.co_firstlineno + 22, + line_no=test_collect_once_with_class.__code__.co_firstlineno + 19, ), ], ), @@ -537,9 +509,6 @@ def sleep_instance(self): def test_collect_once_with_class_not_right_type(tmp_path): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - class SomeClass(object): @classmethod def sleep_class(foobar, cls): @@ -586,7 +555,7 @@ def sleep_instance(foobar, self): pprof_utils.StackLocation( function_name="test_collect_once_with_class_not_right_type", filename="test_stack.py", - line_no=test_collect_once_with_class_not_right_type.__code__.co_firstlineno + 22, + line_no=test_collect_once_with_class_not_right_type.__code__.co_firstlineno + 19, ), ], ), @@ -695,9 +664,6 @@ def test_max_time_usage_over(): [True, False], ) def test_ignore_profiler(stack_v2_enabled, ignore_profiler, tmp_path): - if sys.version_info[:2] == (3, 7) and stack_v2_enabled: - pytest.skip("stack_v2 is not supported on Python 3.7") - test_name = "test_ignore_profiler" pprof_prefix = str(tmp_path / test_name) output_filename = pprof_prefix + "." + str(os.getpid()) diff --git a/tests/profiling_v2/collector/test_stack_asyncio.py b/tests/profiling_v2/collector/test_stack_asyncio.py index d70278e767c..ccb857b258e 100644 --- a/tests/profiling_v2/collector/test_stack_asyncio.py +++ b/tests/profiling_v2/collector/test_stack_asyncio.py @@ -1,9 +1,6 @@ -import sys - import pytest -@pytest.mark.skipif(sys.version_info < (3, 8), reason="stack v2 is available only on 3.8+ as echion does") @pytest.mark.subprocess( env=dict( DD_PROFILING_OUTPUT_PPROF="/tmp/test_stack_asyncio", diff --git a/tests/profiling_v2/exporter/test_ddup.py b/tests/profiling_v2/exporter/test_ddup.py index 9fca404c65f..83fa4e23045 100644 --- a/tests/profiling_v2/exporter/test_ddup.py +++ b/tests/profiling_v2/exporter/test_ddup.py @@ -57,11 +57,7 @@ def test_tags_propagated_when_libdd_enabled(): ddup.config.assert_called() - if sys.version_info >= (3, 8): - tags = ddup.config.call_args.kwargs["tags"] - else: - # Until Python 3.7, call_args didn't have kwargs attribute - tags = ddup.config.call_args[1]["tags"] + tags = ddup.config.call_args.kwargs["tags"] # Profiler could add tags, so check that tags is a superset of config.tags for k, v in config.tags.items(): diff --git a/tests/profiling_v2/test_accuracy.py b/tests/profiling_v2/test_accuracy.py index a9239c19010..c34e55d835e 100644 --- a/tests/profiling_v2/test_accuracy.py +++ b/tests/profiling_v2/test_accuracy.py @@ -1,11 +1,8 @@ # -*- encoding: utf-8 -*- -import sys - import pytest @pytest.mark.subprocess(env=dict(DD_PROFILING_OUTPUT_PPROF="/tmp/test_accuracy_stack_v2.pprof")) -@pytest.mark.skipif(sys.version_info[:2] == (3, 7), reason="stack_v2 is not supported on Python 3.7") def test_accuracy_stack_v2(): import collections import os diff --git a/tests/profiling_v2/test_main.py b/tests/profiling_v2/test_main.py index 132fc8aa502..bb75b50d4d8 100644 --- a/tests/profiling_v2/test_main.py +++ b/tests/profiling_v2/test_main.py @@ -12,8 +12,6 @@ def test_call_script(): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") env = os.environ.copy() env["DD_PROFILING_ENABLED"] = "1" stdout, stderr, exitcode, _ = call_program( @@ -31,8 +29,6 @@ def test_call_script(): @pytest.mark.skipif(not os.getenv("DD_PROFILE_TEST_GEVENT", False), reason="Not testing gevent") def test_call_script_gevent(): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") if sys.version_info[:2] == (3, 8): pytest.skip("this test is flaky on 3.8 with stack v2") env = os.environ.copy() @@ -44,9 +40,6 @@ def test_call_script_gevent(): def test_call_script_pprof_output(tmp_path): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - """This checks if the pprof output and atexit register work correctly. The script does not run for one minute, so if the `stop_on_exit` flag is broken, this test will fail. @@ -74,9 +67,6 @@ def test_call_script_pprof_output(tmp_path): @pytest.mark.skipif(sys.platform == "win32", reason="fork only available on Unix") def test_fork(tmp_path): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") - filename = str(tmp_path / "pprof") env = os.environ.copy() env["DD_PROFILING_OUTPUT_PPROF"] = filename @@ -139,8 +129,6 @@ def test_fork(tmp_path): @pytest.mark.skipif(sys.platform == "win32", reason="fork only available on Unix") @pytest.mark.skipif(not os.getenv("DD_PROFILE_TEST_GEVENT", False), reason="Not testing gevent") def test_fork_gevent(): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") env = os.environ.copy() stdout, stderr, exitcode, pid = call_program( "python", os.path.join(os.path.dirname(__file__), "../profiling", "gevent_fork.py"), env=env @@ -156,8 +144,6 @@ def test_fork_gevent(): set(methods) - {"forkserver", "fork"}, ) def test_multiprocessing(method, tmp_path): - if sys.version_info[:2] == (3, 7): - pytest.skip("stack_v2 is not supported on Python 3.7") filename = str(tmp_path / "pprof") env = os.environ.copy() env["DD_PROFILING_OUTPUT_PPROF"] = filename diff --git a/tests/profiling_v2/test_profiler.py b/tests/profiling_v2/test_profiler.py index b5a2bb4bae8..51f2bfe822d 100644 --- a/tests/profiling_v2/test_profiler.py +++ b/tests/profiling_v2/test_profiler.py @@ -1,5 +1,4 @@ import logging -import sys import time import mock @@ -180,7 +179,6 @@ def test_profiler_serverless(monkeypatch): assert p.tags["functionname"] == "foobar" -@pytest.mark.skipif(sys.version_info < (3, 8), reason="Python 3.7 deprecation warning") @pytest.mark.subprocess() def test_profiler_ddtrace_deprecation(): """ diff --git a/tests/smoke_test.py b/tests/smoke_test.py index 56a2ab3a9c0..f940d1ac9d2 100644 --- a/tests/smoke_test.py +++ b/tests/smoke_test.py @@ -91,8 +91,6 @@ def emit(self, record): platform.system() == "Windows" # libdatadog x86_64-apple-darwin has not yet been integrated to dd-trace-py or (platform.system() == "Darwin" and platform.machine() == "x86_64") - # echion only works with 3.8+ - or sys.version_info < (3, 8, 0) # echion crashes on musl linux with Python 3.12 for both x86_64 and # aarch64 or (platform.system() == "Linux" and sys.version_info[:2] == (3, 12) and platform.libc_ver()[0] != "glibc") diff --git a/tests/tracer/test_encoders.py b/tests/tracer/test_encoders.py index fa625cc6edb..7006bc6b95d 100644 --- a/tests/tracer/test_encoders.py +++ b/tests/tracer/test_encoders.py @@ -3,7 +3,6 @@ import json import random import string -import sys import threading from unittest import TestCase @@ -872,7 +871,6 @@ def test_json_encoder_traces_bytes(): assert "\x80span.b" == span_c["name"] -@pytest.mark.skipif(sys.version_info < (3, 8), reason="Python 3.7 deprecation warning") @pytest.mark.subprocess(env={"DD_TRACE_API_VERSION": "v0.3"}) def test_v03_trace_api_deprecation(): import warnings From 1419b2f40599c2cf34ecae4965cc796e4c072bb4 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 3 Feb 2025 11:22:40 -0500 Subject: [PATCH 38/63] chore(propagation): remove b3 single header (#12167) Blocked by: https://github.com/DataDog/system-tests/pull/3943 ## Checklist - [ ] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [ ] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/propagation/http.py | 2 +- ddtrace/settings/_config.py | 10 ---------- docs/configuration.rst | 6 +++--- .../notes/remove-b3-single--4c16c32466c69709.yaml | 4 ++++ tests/tracer/test_global_config.py | 9 --------- tests/tracer/test_propagation.py | 6 +++--- 6 files changed, 11 insertions(+), 26 deletions(-) create mode 100644 releasenotes/notes/remove-b3-single--4c16c32466c69709.yaml diff --git a/ddtrace/propagation/http.py b/ddtrace/propagation/http.py index e80b7e97d36..65d3595ba3a 100644 --- a/ddtrace/propagation/http.py +++ b/ddtrace/propagation/http.py @@ -510,7 +510,7 @@ def _extract(headers): class _B3SingleHeader: - """Helper class to inject/extract B3 Single Header + """Helper class to inject/extract B3 https://github.com/openzipkin/b3-propagation/blob/3e54cda11620a773d53c7f64d2ebb10d3a01794c/README.md#single-header diff --git a/ddtrace/settings/_config.py b/ddtrace/settings/_config.py index 2052f939457..35d2849884d 100644 --- a/ddtrace/settings/_config.py +++ b/ddtrace/settings/_config.py @@ -32,7 +32,6 @@ from ..internal.constants import DEFAULT_SAMPLING_RATE_LIMIT from ..internal.constants import DEFAULT_TIMEOUT from ..internal.constants import PROPAGATION_STYLE_ALL -from ..internal.constants import PROPAGATION_STYLE_B3_SINGLE from ..internal.logger import get_logger from ..internal.schema import DEFAULT_SPAN_SERVICE_NAME from ..internal.serverless import in_aws_lambda @@ -116,7 +115,6 @@ def _parse_propagation_styles(styles_str): - "datadog" - "b3multi" - "b3" (formerly 'b3 single header') - - "b3 single header (deprecated for 'b3')" - "tracecontext" - "baggage" - "none" @@ -142,14 +140,6 @@ def _parse_propagation_styles(styles_str): styles = [] for style in styles_str.split(","): style = style.strip().lower() - if style == "b3 single header": - deprecate( - 'Using DD_TRACE_PROPAGATION_STYLE="b3 single header" is deprecated', - message="Please use 'DD_TRACE_PROPAGATION_STYLE=\"b3\"' instead", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - style = PROPAGATION_STYLE_B3_SINGLE # None has no propagator so we pull it out if not style or style == _PROPAGATION_STYLE_NONE: continue diff --git a/docs/configuration.rst b/docs/configuration.rst index 276656cc1d6..f45ac992582 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -278,7 +278,7 @@ Traces Overridden by ``DD_TRACE_PROPAGATION_STYLE_INJECT`` for injection. - The supported values are ``datadog``, ``b3multi``, and ``b3 single header``, ``tracecontext``, and ``none``. + The supported values are ``datadog``, ``b3multi``, ``tracecontext``, and ``none``. When checking inbound request headers we will take the first valid trace context in the order provided. When ``none`` is the only propagator listed, propagation is disabled. @@ -357,7 +357,7 @@ Trace Context propagation Overrides ``DD_TRACE_PROPAGATION_STYLE`` for extraction propagation style. - The supported values are ``datadog``, ``b3multi``, and ``b3 single header``, ``tracecontext``, and ``none``. + The supported values are ``datadog``, ``b3multi``, ``b3``, ``tracecontext``, and ``none``. When checking inbound request headers we will take the first valid trace context in the order provided. When ``none`` is the only propagator listed, extraction is disabled. @@ -397,7 +397,7 @@ Trace Context propagation Overrides ``DD_TRACE_PROPAGATION_STYLE`` for injection propagation style. - The supported values are ``datadog``, ``b3multi``, and ``b3 single header``, ``tracecontext``, and ``none``. + The supported values are ``datadog``, ``b3multi``,``b3``, ``tracecontext``, and ``none``. All provided styles are injected into the headers of outbound requests. When ``none`` is the only propagator listed, injection is disabled. diff --git a/releasenotes/notes/remove-b3-single--4c16c32466c69709.yaml b/releasenotes/notes/remove-b3-single--4c16c32466c69709.yaml new file mode 100644 index 00000000000..c36ebf6c483 --- /dev/null +++ b/releasenotes/notes/remove-b3-single--4c16c32466c69709.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + propagation: Setting ``DD_TRACE_PROPAGATION_STYLE`` to ``b3 single header`` is no longer supported. Use ``b3`` instead. diff --git a/tests/tracer/test_global_config.py b/tests/tracer/test_global_config.py index 6c557bc8de6..4d1519c581f 100644 --- a/tests/tracer/test_global_config.py +++ b/tests/tracer/test_global_config.py @@ -1,4 +1,3 @@ -import os from unittest import TestCase import mock @@ -6,7 +5,6 @@ from ddtrace import config as global_config from ddtrace.settings import Config -from ddtrace.settings._config import _parse_propagation_styles from ..utils import DummyTracer from ..utils import override_env @@ -282,10 +280,3 @@ def test_dd_service_mapping(self): with override_env(dict(DD_SERVICE_MAPPING="foobar:bar,snafu:foo")): c = Config() assert c.service_mapping == {"foobar": "bar", "snafu": "foo"} - - def test_parse_propagation_styles_b3_deprecation(capsys): - with pytest.warns( - DeprecationWarning, match='Using DD_TRACE_PROPAGATION_STYLE="b3 single header" is deprecated' - ), override_env(dict(DD_TRACE_PROPAGATION_STYLE="b3 single header")): - style = _parse_propagation_styles(os.environ["DD_TRACE_PROPAGATION_STYLE"]) - assert style == ["b3"] diff --git a/tests/tracer/test_propagation.py b/tests/tracer/test_propagation.py index c4074c16840..e34167ce04f 100644 --- a/tests/tracer/test_propagation.py +++ b/tests/tracer/test_propagation.py @@ -1821,7 +1821,7 @@ def test_extract_tracecontext(headers, expected_context): "dd_origin": None, }, ), - # B3 single header + # B3 ( "valid_b3_single_header_simple", [PROPAGATION_STYLE_B3_SINGLE], @@ -2639,7 +2639,7 @@ def test_DD_TRACE_PROPAGATION_STYLE_EXTRACT_overrides_DD_TRACE_PROPAGATION_STYLE ), ), # The trace_id from Datadog context will not align with the tracecontext primary context - # therefore we get a span link. B3 single headers are invalid so we won't see a trace of them. + # therefore we get a span link. B3 is invalid so we won't see a trace of them. # The b3 multi headers are missing a span_id, so we will skip creating a span link for it. ( "all_headers_all_styles_do_not_create_span_link_for_context_w_out_span_id", @@ -2994,7 +2994,7 @@ def test_span_links_set_on_root_span_not_child(fastapi_client, tracer, fastapi_t _HTTP_HEADER_B3_SPAN_ID: "7197677932a62370", }, ), - # B3 Single Header + # B3 ( "valid_b3_single_style", [PROPAGATION_STYLE_B3_SINGLE], From 362fa22be2f7f6b61b023adb2aa56949aa163210 Mon Sep 17 00:00:00 2001 From: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> Date: Mon, 3 Feb 2025 18:34:39 +0100 Subject: [PATCH 39/63] fix(asm): make sure iast is not loaded by exploit prevention if disabled (#12198) Make sure, if iast is disabled, that we don't load any iast modules in the common module mechanism used both by iast and exploit prevention. APPSEC-56659 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Ramy Elkest <4thkest@gmail.com> --- ddtrace/appsec/_common_module_patches.py | 27 +++++++++++++++---- ddtrace/appsec/_iast/_iast_request_context.py | 2 +- ...ommon_module_patches-123cf6d3f8844823.yaml | 5 ++++ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/no_IAST_unguarded_loading_in_common_module_patches-123cf6d3f8844823.yaml diff --git a/ddtrace/appsec/_common_module_patches.py b/ddtrace/appsec/_common_module_patches.py index 0b455dbba6b..8c834b80e6f 100644 --- a/ddtrace/appsec/_common_module_patches.py +++ b/ddtrace/appsec/_common_module_patches.py @@ -1,5 +1,4 @@ -# This module must not import other modules inconditionnaly that -# require iast, ddwaf or any native optional module. +# This module must not import other modules unconditionally that require iast import ctypes import os @@ -17,9 +16,6 @@ from ddtrace.appsec._asm_request_context import get_blocked from ddtrace.appsec._constants import EXPLOIT_PREVENTION from ddtrace.appsec._constants import WAF_ACTIONS -from ddtrace.appsec._iast._iast_request_context import is_iast_request_enabled -from ddtrace.appsec._iast._metrics import _set_metric_iast_instrumented_sink -from ddtrace.appsec._iast.constants import VULN_PATH_TRAVERSAL import ddtrace.contrib.internal.subprocess.patch as subprocess_patch from ddtrace.internal import core from ddtrace.internal._exceptions import BlockingException @@ -29,6 +25,14 @@ from ddtrace.settings.asm import config as asm_config +if asm_config._iast_enabled: + from ddtrace.appsec._iast._iast_request_context import is_iast_request_enabled +else: + + def is_iast_request_enabled() -> bool: + return False + + log = get_logger(__name__) _DD_ORIGINAL_ATTRIBUTES: Dict[Any, Any] = {} @@ -42,6 +46,16 @@ def patch_common_modules(): global _is_patched if _is_patched: return + # for testing purposes, we need to update is_iast_request_enabled + if asm_config._iast_enabled: + global is_iast_request_enabled + from ddtrace.appsec._iast._iast_request_context import is_iast_request_enabled + else: + global is_iast_request_enabled + + def is_iast_request_enabled() -> bool: + return False + try_wrap_function_wrapper("builtins", "open", wrapped_open_CFDDB7ABBA9081B6) try_wrap_function_wrapper("urllib.request", "OpenerDirector.open", wrapped_open_ED4CF71136E15EBF) try_wrap_function_wrapper("_io", "BytesIO.read", wrapped_read_F3E51D71B4EC16EF) @@ -52,6 +66,9 @@ def patch_common_modules(): subprocess_patch.add_lst_callback(_RASP_POPEN, popen_FD233052260D8B4D) core.on("asm.block.dbapi.execute", execute_4C9BAC8E228EB347) if asm_config._iast_enabled: + from ddtrace.appsec._iast._metrics import _set_metric_iast_instrumented_sink + from ddtrace.appsec._iast.constants import VULN_PATH_TRAVERSAL + _set_metric_iast_instrumented_sink(VULN_PATH_TRAVERSAL) _is_patched = True diff --git a/ddtrace/appsec/_iast/_iast_request_context.py b/ddtrace/appsec/_iast/_iast_request_context.py index 30a3471b595..ce3417d9594 100644 --- a/ddtrace/appsec/_iast/_iast_request_context.py +++ b/ddtrace/appsec/_iast/_iast_request_context.py @@ -118,7 +118,7 @@ def set_iast_request_enabled(request_enabled) -> None: log.debug("[IAST] Trying to set IAST reporter but no context is present") -def is_iast_request_enabled(): +def is_iast_request_enabled() -> bool: env = _get_iast_context() if env: return env.request_enabled diff --git a/releasenotes/notes/no_IAST_unguarded_loading_in_common_module_patches-123cf6d3f8844823.yaml b/releasenotes/notes/no_IAST_unguarded_loading_in_common_module_patches-123cf6d3f8844823.yaml new file mode 100644 index 00000000000..c88f0e042e5 --- /dev/null +++ b/releasenotes/notes/no_IAST_unguarded_loading_in_common_module_patches-123cf6d3f8844823.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + ASM: This fix resolves an issue where IAST modules could be loaded, even if disabled, + which could create an ImportError exception on Windows. \ No newline at end of file From 7ecddbeb486821e9b06c9b7d9e4dfedeecad07f1 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 3 Feb 2025 12:59:50 -0500 Subject: [PATCH 40/63] chore(integrations): remove deprecated code [3.0] (#12105) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation Ensures the implementation details for all integrations are internal. ## Changes - Removes all deprecated modules and packages from ddtrace/contrib - For integrations that no not expose public attributes: - Removes `ddtrace.contrib.integration_name` package - Moves the integration docs from `ddtrace.contrib.integration_name.__init__` to `ddtrace.contrib._integration_name.py`. - For integrations that expose public attributes: - Removes `ddtrace.contrib.integration_name` package - Removes deprecated attributes from `ddtrace.contrib.integration_name.__init__` to `ddtrace.contrib.integration_name` - Renames `ddtrace.contrib.integration_name.__init__` to `ddtrace.contrib.integration_name`. Blocked by: https://github.com/DataDog/dd-trace-py/pull/12107 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Vítor De Araújo --- ddtrace/contrib/__init__.py | 76 +------- .../__init__.py => _aiobotocore.py} | 13 -- ddtrace/contrib/_aiohttp_jinja2.py | 15 ++ .../{aiomysql/__init__.py => _aiomysql.py} | 13 -- .../contrib/{aiopg/__init__.py => _aiopg.py} | 12 -- .../{aioredis/__init__.py => _aioredis.py} | 11 -- .../__init__.py => _algoliasearch.py} | 13 -- .../{anthropic/__init__.py => _anthropic.py} | 13 -- .../{aredis/__init__.py => _aredis.py} | 12 -- ddtrace/contrib/_asyncio.py | 4 + .../{asyncpg/__init__.py => _asyncpg.py} | 13 -- .../contrib/{avro/__init__.py => _avro.py} | 3 - .../__init__.py => _aws_lambda.py} | 4 - ddtrace/contrib/_azure_functions.py | 25 +++ .../contrib/{boto/__init__.py => _boto.py} | 12 -- .../{botocore/__init__.py => _botocore.py} | 13 -- .../{cassandra/__init__.py => _cassandra.py} | 13 -- .../{consul/__init__.py => _consul.py} | 14 -- ddtrace/contrib/_coverage.py | 17 ++ .../{django/__init__.py => _django.py} | 15 -- .../__init__.py => _dogpile_cache.py} | 14 -- .../{dramatiq/__init__.py => _dramatiq.py} | 14 -- .../__init__.py => _elasticsearch.py} | 3 - .../{fastapi/__init__.py => _fastapi.py} | 14 -- .../contrib/{flask/__init__.py => _flask.py} | 12 -- .../{freezegun/__init__.py => _freezegun.py} | 5 - .../{futures/__init__.py => _futures.py} | 14 -- .../{gevent/__init__.py => _gevent.py} | 20 --- .../__init__.py => _google_generativeai.py} | 4 - .../{graphql/__init__.py => _graphql.py} | 14 -- .../contrib/{grpc/__init__.py => _grpc.py} | 14 -- .../{gunicorn/__init__.py => _gunicorn.py} | 13 -- .../{httplib/__init__.py => _httplib.py} | 12 -- .../contrib/{httpx/__init__.py => _httpx.py} | 14 -- .../{jinja2/__init__.py => _jinja2.py} | 13 -- .../contrib/{kafka/__init__.py => _kafka.py} | 14 -- .../contrib/{kombu/__init__.py => _kombu.py} | 16 -- .../{langchain/__init__.py => _langchain.py} | 13 -- ddtrace/contrib/_langgraph.py | 4 + .../{logbook/__init__.py => _logbook.py} | 14 -- .../{logging/__init__.py => _logging.py} | 14 -- .../{loguru/__init__.py => _loguru.py} | 14 -- .../contrib/{mako/__init__.py => _mako.py} | 9 - .../{mariadb/__init__.py => _mariadb.py} | 14 -- .../{molten/__init__.py => _molten.py} | 14 -- .../__init__.py => _mongoengine.py} | 13 -- .../contrib/{mysql/__init__.py => _mysql.py} | 16 -- .../{mysqldb/__init__.py => _mysqldb.py} | 12 -- .../{openai/__init__.py => _openai.py} | 13 -- .../{protobuf/__init__.py => _protobuf.py} | 3 - .../{psycopg/__init__.py => _psycopg.py} | 11 -- .../__init__.py => _pymemcache.py} | 13 -- .../{pymongo/__init__.py => _pymongo.py} | 13 -- .../{pymysql/__init__.py => _pymysql.py} | 13 -- .../{pynamodb/__init__.py => _pynamodb.py} | 13 -- .../{pyodbc/__init__.py => _pyodbc.py} | 13 -- .../{pytest/__init__.py => _pytest.py} | 1 - .../__init__.py => _pytest_bdd.py} | 1 - ddtrace/contrib/_pytest_benchmark.py | 3 + .../contrib/{redis/__init__.py => _redis.py} | 13 -- .../__init__.py => _rediscluster.py} | 13 -- ddtrace/contrib/{rq/__init__.py => _rq.py} | 1 - .../contrib/{sanic/__init__.py => _sanic.py} | 14 -- .../{selenium/__init__.py => _selenium.py} | 4 - .../{snowflake/__init__.py => _snowflake.py} | 14 -- .../{sqlite3/__init__.py => _sqlite3.py} | 13 -- .../{starlette/__init__.py => _starlette.py} | 14 -- .../{structlog/__init__.py => _structlog.py} | 14 -- .../__init__.py => _subprocess.py} | 14 -- .../{unittest/__init__.py => _unittest.py} | 3 - ddtrace/contrib/_urllib.py | 6 + .../{urllib3/__init__.py => _urllib3.py} | 14 -- .../{vertexai/__init__.py => _vertexai.py} | 5 - .../{vertica/__init__.py => _vertica.py} | 14 -- ddtrace/contrib/_webbrowser.py | 6 + .../{yaaredis/__init__.py => _yaaredis.py} | 13 -- ddtrace/contrib/aiobotocore/patch.py | 14 -- .../{aiohttp/__init__.py => aiohttp.py} | 28 --- ddtrace/contrib/aiohttp/middlewares.py | 14 -- ddtrace/contrib/aiohttp/patch.py | 14 -- ddtrace/contrib/aiohttp_jinja2/__init__.py | 28 --- ddtrace/contrib/aiohttp_jinja2/patch.py | 14 -- ddtrace/contrib/aiomysql/patch.py | 14 -- ddtrace/contrib/aiopg/connection.py | 14 -- ddtrace/contrib/aiopg/patch.py | 14 -- ddtrace/contrib/aioredis/patch.py | 14 -- ddtrace/contrib/algoliasearch/patch.py | 14 -- ddtrace/contrib/anthropic/_streaming.py | 14 -- ddtrace/contrib/anthropic/patch.py | 14 -- ddtrace/contrib/anthropic/utils.py | 14 -- ddtrace/contrib/aredis/patch.py | 14 -- ddtrace/contrib/{asgi/__init__.py => asgi.py} | 17 -- ddtrace/contrib/asgi/middleware.py | 14 -- ddtrace/contrib/asgi/utils.py | 14 -- ddtrace/contrib/asyncio/__init__.py | 22 --- ddtrace/contrib/asyncio/compat.py | 14 -- ddtrace/contrib/asyncio/helpers.py | 14 -- ddtrace/contrib/asyncio/patch.py | 14 -- ddtrace/contrib/asyncio/provider.py | 14 -- ddtrace/contrib/asyncio/wrappers.py | 14 -- ddtrace/contrib/asyncpg/patch.py | 14 -- ddtrace/contrib/aws_lambda/_cold_start.py | 14 -- ddtrace/contrib/aws_lambda/patch.py | 14 -- ddtrace/contrib/azure_functions/__init__.py | 42 ----- ddtrace/contrib/azure_functions/patch.py | 14 -- ddtrace/contrib/boto/patch.py | 14 -- ddtrace/contrib/botocore/patch.py | 14 -- ddtrace/contrib/botocore/services/__init__.py | 0 ddtrace/contrib/botocore/services/bedrock.py | 14 -- ddtrace/contrib/botocore/services/kinesis.py | 14 -- ddtrace/contrib/botocore/services/sqs.py | 14 -- .../botocore/services/stepfunctions.py | 14 -- ddtrace/contrib/botocore/utils.py | 14 -- ddtrace/contrib/bottle.py | 38 ++++ ddtrace/contrib/bottle/__init__.py | 66 ------- ddtrace/contrib/bottle/patch.py | 14 -- ddtrace/contrib/bottle/trace.py | 14 -- ddtrace/contrib/cassandra/patch.py | 14 -- ddtrace/contrib/cassandra/session.py | 14 -- .../contrib/{celery/__init__.py => celery.py} | 30 ---- ddtrace/contrib/celery/app.py | 14 -- ddtrace/contrib/celery/constants.py | 14 -- ddtrace/contrib/celery/patch.py | 14 -- ddtrace/contrib/celery/signals.py | 14 -- ddtrace/contrib/celery/utils.py | 14 -- .../{cherrypy/__init__.py => cherrypy.py} | 19 -- ddtrace/contrib/cherrypy/middleware.py | 14 -- ddtrace/contrib/consul/patch.py | 14 -- ddtrace/contrib/coverage/__init__.py | 33 ---- ddtrace/contrib/coverage/constants.py | 14 -- ddtrace/contrib/coverage/data.py | 14 -- ddtrace/contrib/coverage/patch.py | 14 -- ddtrace/contrib/coverage/utils.py | 14 -- .../contrib/{dbapi/__init__.py => dbapi.py} | 20 +-- .../__init__.py => dbapi_async.py} | 20 +-- ddtrace/contrib/django/_asgi.py | 14 -- ddtrace/contrib/django/compat.py | 14 -- ddtrace/contrib/django/patch.py | 14 -- ddtrace/contrib/django/restframework.py | 14 -- ddtrace/contrib/django/utils.py | 14 -- ddtrace/contrib/dogpile_cache/lock.py | 14 -- ddtrace/contrib/dogpile_cache/patch.py | 14 -- ddtrace/contrib/dogpile_cache/region.py | 14 -- ddtrace/contrib/dramatiq/patch.py | 14 -- ddtrace/contrib/elasticsearch/patch.py | 14 -- ddtrace/contrib/elasticsearch/quantize.py | 14 -- .../contrib/{falcon/__init__.py => falcon.py} | 27 --- ddtrace/contrib/falcon/middleware.py | 14 -- ddtrace/contrib/falcon/patch.py | 14 -- ddtrace/contrib/fastapi/patch.py | 14 -- ddtrace/contrib/flask/patch.py | 14 -- ddtrace/contrib/flask/wrappers.py | 14 -- .../__init__.py => flask_cache.py} | 19 -- ddtrace/contrib/flask_cache/tracers.py | 14 -- ddtrace/contrib/flask_cache/utils.py | 14 -- ddtrace/contrib/flask_login/__init__.py | 10 -- ddtrace/contrib/futures/patch.py | 14 -- ddtrace/contrib/futures/threading.py | 14 -- ddtrace/contrib/gevent/greenlet.py | 14 -- ddtrace/contrib/gevent/patch.py | 14 -- ddtrace/contrib/gevent/provider.py | 14 -- ddtrace/contrib/graphql/patch.py | 14 -- .../contrib/grpc/aio_client_interceptor.py | 14 -- .../contrib/grpc/aio_server_interceptor.py | 14 -- ddtrace/contrib/grpc/client_interceptor.py | 14 -- ddtrace/contrib/grpc/constants.py | 14 -- ddtrace/contrib/grpc/patch.py | 14 -- ddtrace/contrib/grpc/server_interceptor.py | 14 -- ddtrace/contrib/grpc/utils.py | 14 -- ddtrace/contrib/httplib/patch.py | 14 -- ddtrace/contrib/httpx/patch.py | 14 -- .../contrib/internal/aiohttp/middlewares.py | 4 - ddtrace/contrib/internal/requests/patch.py | 5 + ddtrace/contrib/internal/requests/session.py | 11 -- ddtrace/contrib/jinja2/constants.py | 14 -- ddtrace/contrib/jinja2/patch.py | 14 -- ddtrace/contrib/kafka/patch.py | 14 -- ddtrace/contrib/kombu/constants.py | 14 -- ddtrace/contrib/kombu/patch.py | 14 -- ddtrace/contrib/kombu/utils.py | 14 -- ddtrace/contrib/langchain/constants.py | 14 -- ddtrace/contrib/langchain/patch.py | 14 -- ddtrace/contrib/langgraph/__init__.py | 12 -- ddtrace/contrib/logbook/patch.py | 14 -- ddtrace/contrib/logging/constants.py | 14 -- ddtrace/contrib/logging/patch.py | 14 -- ddtrace/contrib/loguru/patch.py | 14 -- ddtrace/contrib/mako/constants.py | 14 -- ddtrace/contrib/mako/patch.py | 14 -- ddtrace/contrib/mariadb/patch.py | 14 -- ddtrace/contrib/molten/patch.py | 14 -- ddtrace/contrib/molten/wrappers.py | 14 -- ddtrace/contrib/mongoengine/patch.py | 14 -- ddtrace/contrib/mongoengine/trace.py | 14 -- ddtrace/contrib/mysql/patch.py | 14 -- ddtrace/contrib/mysqldb/patch.py | 14 -- ddtrace/contrib/openai/_endpoint_hooks.py | 14 -- ddtrace/contrib/openai/patch.py | 14 -- ddtrace/contrib/openai/utils.py | 14 -- ddtrace/contrib/psycopg/async_connection.py | 14 -- ddtrace/contrib/psycopg/async_cursor.py | 14 -- ddtrace/contrib/psycopg/connection.py | 14 -- ddtrace/contrib/psycopg/cursor.py | 14 -- ddtrace/contrib/psycopg/extensions.py | 14 -- ddtrace/contrib/psycopg/patch.py | 14 -- ddtrace/contrib/pylibmc.py | 26 +++ ddtrace/contrib/pylibmc/__init__.py | 53 ------ ddtrace/contrib/pylibmc/addrs.py | 14 -- ddtrace/contrib/pylibmc/client.py | 14 -- ddtrace/contrib/pylibmc/patch.py | 14 -- ddtrace/contrib/pymemcache/client.py | 14 -- ddtrace/contrib/pymemcache/patch.py | 14 -- ddtrace/contrib/pymongo/client.py | 14 -- ddtrace/contrib/pymongo/parse.py | 14 -- ddtrace/contrib/pymongo/patch.py | 14 -- ddtrace/contrib/pymysql/patch.py | 14 -- ddtrace/contrib/pynamodb/patch.py | 14 -- ddtrace/contrib/pyodbc/patch.py | 14 -- .../{pyramid/__init__.py => pyramid.py} | 29 --- ddtrace/contrib/pyramid/constants.py | 14 -- ddtrace/contrib/pyramid/patch.py | 14 -- ddtrace/contrib/pyramid/trace.py | 14 -- ddtrace/contrib/pytest/constants.py | 14 -- ddtrace/contrib/pytest/newhooks.py | 14 -- ddtrace/contrib/pytest/plugin.py | 14 -- ddtrace/contrib/pytest_bdd/constants.py | 14 -- ddtrace/contrib/pytest_bdd/plugin.py | 14 -- ddtrace/contrib/pytest_benchmark/__init__.py | 0 ddtrace/contrib/pytest_benchmark/constants.py | 14 -- ddtrace/contrib/pytest_benchmark/plugin.py | 14 -- ddtrace/contrib/redis/asyncio_patch.py | 14 -- ddtrace/contrib/redis/patch.py | 14 -- ddtrace/contrib/redis_utils.py | 1 - ddtrace/contrib/rediscluster/patch.py | 14 -- .../{requests/__init__.py => requests.py} | 32 +--- ddtrace/contrib/requests/connection.py | 14 -- ddtrace/contrib/requests/constants.py | 14 -- ddtrace/contrib/requests/patch.py | 14 -- ddtrace/contrib/requests/session.py | 14 -- ddtrace/contrib/sanic/patch.py | 14 -- ddtrace/contrib/snowflake/patch.py | 14 -- ddtrace/contrib/sqlalchemy.py | 26 +++ ddtrace/contrib/sqlalchemy/__init__.py | 58 ------ ddtrace/contrib/sqlalchemy/engine.py | 14 -- ddtrace/contrib/sqlalchemy/patch.py | 14 -- ddtrace/contrib/sqlite3/patch.py | 14 -- ddtrace/contrib/starlette/patch.py | 14 -- ddtrace/contrib/structlog/patch.py | 14 -- ddtrace/contrib/subprocess/constants.py | 14 -- ddtrace/contrib/subprocess/patch.py | 14 -- .../{tornado/__init__.py => tornado.py} | 13 -- ddtrace/contrib/tornado/application.py | 14 -- ddtrace/contrib/tornado/constants.py | 14 -- ddtrace/contrib/tornado/decorators.py | 14 -- ddtrace/contrib/tornado/handlers.py | 14 -- ddtrace/contrib/tornado/patch.py | 14 -- ddtrace/contrib/tornado/stack_context.py | 14 -- ddtrace/contrib/tornado/template.py | 14 -- ddtrace/contrib/trace_utils_async.py | 1 - ddtrace/contrib/trace_utils_redis.py | 9 - ddtrace/contrib/unittest/constants.py | 14 -- ddtrace/contrib/unittest/patch.py | 14 -- ddtrace/contrib/urllib/__init__.py | 20 --- ddtrace/contrib/urllib/patch.py | 14 -- ddtrace/contrib/urllib3/patch.py | 14 -- ddtrace/contrib/vertica/patch.py | 14 -- ddtrace/contrib/webbrowser/__init__.py | 20 --- ddtrace/contrib/webbrowser/patch.py | 14 -- ddtrace/contrib/{wsgi/__init__.py => wsgi.py} | 17 -- ddtrace/contrib/wsgi/wsgi.py | 14 -- ddtrace/contrib/yaaredis/patch.py | 14 -- docs/advanced_usage.rst | 2 +- docs/integrations.rst | 122 ++++++------- ...ed-code-integrations-ae6970bbf9b10047.yaml | 4 + .../django_tests/django_app/settings.py | 7 +- tests/appsec/suitespec.yml | 4 +- tests/ci_visibility/suitespec.yml | 10 +- tests/contrib/suitespec.yml | 165 +++++++++--------- tests/internal/test_module.py | 68 ++++---- tests/llmobs/suitespec.yml | 12 +- tests/opentracer/test_tracer_asyncio.py | 3 - tests/opentracer/test_tracer_gevent.py | 3 +- 282 files changed, 392 insertions(+), 3948 deletions(-) rename ddtrace/contrib/{aiobotocore/__init__.py => _aiobotocore.py} (64%) create mode 100644 ddtrace/contrib/_aiohttp_jinja2.py rename ddtrace/contrib/{aiomysql/__init__.py => _aiomysql.py} (68%) rename ddtrace/contrib/{aiopg/__init__.py => _aiopg.py} (59%) rename ddtrace/contrib/{aioredis/__init__.py => _aioredis.py} (76%) rename ddtrace/contrib/{algoliasearch/__init__.py => _algoliasearch.py} (55%) rename ddtrace/contrib/{anthropic/__init__.py => _anthropic.py} (85%) rename ddtrace/contrib/{aredis/__init__.py => _aredis.py} (82%) create mode 100644 ddtrace/contrib/_asyncio.py rename ddtrace/contrib/{asyncpg/__init__.py => _asyncpg.py} (68%) rename ddtrace/contrib/{avro/__init__.py => _avro.py} (75%) rename ddtrace/contrib/{aws_lambda/__init__.py => _aws_lambda.py} (84%) create mode 100644 ddtrace/contrib/_azure_functions.py rename ddtrace/contrib/{boto/__init__.py => _boto.py} (65%) rename ddtrace/contrib/{botocore/__init__.py => _botocore.py} (91%) rename ddtrace/contrib/{cassandra/__init__.py => _cassandra.py} (69%) rename ddtrace/contrib/{consul/__init__.py => _consul.py} (56%) create mode 100644 ddtrace/contrib/_coverage.py rename ddtrace/contrib/{django/__init__.py => _django.py} (91%) rename ddtrace/contrib/{dogpile_cache/__init__.py => _dogpile_cache.py} (73%) rename ddtrace/contrib/{dramatiq/__init__.py => _dramatiq.py} (61%) rename ddtrace/contrib/{elasticsearch/__init__.py => _elasticsearch.py} (85%) rename ddtrace/contrib/{fastapi/__init__.py => _fastapi.py} (74%) rename ddtrace/contrib/{flask/__init__.py => _flask.py} (83%) rename ddtrace/contrib/{freezegun/__init__.py => _freezegun.py} (69%) rename ddtrace/contrib/{futures/__init__.py => _futures.py} (56%) rename ddtrace/contrib/{gevent/__init__.py => _gevent.py} (63%) rename ddtrace/contrib/{google_generativeai/__init__.py => _google_generativeai.py} (92%) rename ddtrace/contrib/{graphql/__init__.py => _graphql.py} (71%) rename ddtrace/contrib/{grpc/__init__.py => _grpc.py} (80%) rename ddtrace/contrib/{gunicorn/__init__.py => _gunicorn.py} (74%) rename ddtrace/contrib/{httplib/__init__.py => _httplib.py} (76%) rename ddtrace/contrib/{httpx/__init__.py => _httpx.py} (83%) rename ddtrace/contrib/{jinja2/__init__.py => _jinja2.py} (67%) rename ddtrace/contrib/{kafka/__init__.py => _kafka.py} (69%) rename ddtrace/contrib/{kombu/__init__.py => _kombu.py} (68%) rename ddtrace/contrib/{langchain/__init__.py => _langchain.py} (93%) create mode 100644 ddtrace/contrib/_langgraph.py rename ddtrace/contrib/{logbook/__init__.py => _logbook.py} (83%) rename ddtrace/contrib/{logging/__init__.py => _logging.py} (79%) rename ddtrace/contrib/{loguru/__init__.py => _loguru.py} (83%) rename ddtrace/contrib/{mako/__init__.py => _mako.py} (53%) rename ddtrace/contrib/{mariadb/__init__.py => _mariadb.py} (75%) rename ddtrace/contrib/{molten/__init__.py => _molten.py} (66%) rename ddtrace/contrib/{mongoengine/__init__.py => _mongoengine.py} (61%) rename ddtrace/contrib/{mysql/__init__.py => _mysql.py} (80%) rename ddtrace/contrib/{mysqldb/__init__.py => _mysqldb.py} (84%) rename ddtrace/contrib/{openai/__init__.py => _openai.py} (94%) rename ddtrace/contrib/{protobuf/__init__.py => _protobuf.py} (67%) rename ddtrace/contrib/{psycopg/__init__.py => _psycopg.py} (79%) rename ddtrace/contrib/{pymemcache/__init__.py => _pymemcache.py} (70%) rename ddtrace/contrib/{pymongo/__init__.py => _pymongo.py} (76%) rename ddtrace/contrib/{pymysql/__init__.py => _pymysql.py} (78%) rename ddtrace/contrib/{pynamodb/__init__.py => _pynamodb.py} (64%) rename ddtrace/contrib/{pyodbc/__init__.py => _pyodbc.py} (77%) rename ddtrace/contrib/{pytest/__init__.py => _pytest.py} (95%) rename ddtrace/contrib/{pytest_bdd/__init__.py => _pytest_bdd.py} (89%) create mode 100644 ddtrace/contrib/_pytest_benchmark.py rename ddtrace/contrib/{redis/__init__.py => _redis.py} (81%) rename ddtrace/contrib/{rediscluster/__init__.py => _rediscluster.py} (79%) rename ddtrace/contrib/{rq/__init__.py => _rq.py} (96%) rename ddtrace/contrib/{sanic/__init__.py => _sanic.py} (72%) rename ddtrace/contrib/{selenium/__init__.py => _selenium.py} (78%) rename ddtrace/contrib/{snowflake/__init__.py => _snowflake.py} (78%) rename ddtrace/contrib/{sqlite3/__init__.py => _sqlite3.py} (77%) rename ddtrace/contrib/{starlette/__init__.py => _starlette.py} (75%) rename ddtrace/contrib/{structlog/__init__.py => _structlog.py} (74%) rename ddtrace/contrib/{subprocess/__init__.py => _subprocess.py} (58%) rename ddtrace/contrib/{unittest/__init__.py => _unittest.py} (83%) create mode 100644 ddtrace/contrib/_urllib.py rename ddtrace/contrib/{urllib3/__init__.py => _urllib3.py} (73%) rename ddtrace/contrib/{vertexai/__init__.py => _vertexai.py} (92%) rename ddtrace/contrib/{vertica/__init__.py => _vertica.py} (69%) create mode 100644 ddtrace/contrib/_webbrowser.py rename ddtrace/contrib/{yaaredis/__init__.py => _yaaredis.py} (81%) delete mode 100644 ddtrace/contrib/aiobotocore/patch.py rename ddtrace/contrib/{aiohttp/__init__.py => aiohttp.py} (72%) delete mode 100644 ddtrace/contrib/aiohttp/middlewares.py delete mode 100644 ddtrace/contrib/aiohttp/patch.py delete mode 100644 ddtrace/contrib/aiohttp_jinja2/__init__.py delete mode 100644 ddtrace/contrib/aiohttp_jinja2/patch.py delete mode 100644 ddtrace/contrib/aiomysql/patch.py delete mode 100644 ddtrace/contrib/aiopg/connection.py delete mode 100644 ddtrace/contrib/aiopg/patch.py delete mode 100644 ddtrace/contrib/aioredis/patch.py delete mode 100644 ddtrace/contrib/algoliasearch/patch.py delete mode 100644 ddtrace/contrib/anthropic/_streaming.py delete mode 100644 ddtrace/contrib/anthropic/patch.py delete mode 100644 ddtrace/contrib/anthropic/utils.py delete mode 100644 ddtrace/contrib/aredis/patch.py rename ddtrace/contrib/{asgi/__init__.py => asgi.py} (70%) delete mode 100644 ddtrace/contrib/asgi/middleware.py delete mode 100644 ddtrace/contrib/asgi/utils.py delete mode 100644 ddtrace/contrib/asyncio/__init__.py delete mode 100644 ddtrace/contrib/asyncio/compat.py delete mode 100644 ddtrace/contrib/asyncio/helpers.py delete mode 100644 ddtrace/contrib/asyncio/patch.py delete mode 100644 ddtrace/contrib/asyncio/provider.py delete mode 100644 ddtrace/contrib/asyncio/wrappers.py delete mode 100644 ddtrace/contrib/asyncpg/patch.py delete mode 100644 ddtrace/contrib/aws_lambda/_cold_start.py delete mode 100644 ddtrace/contrib/aws_lambda/patch.py delete mode 100644 ddtrace/contrib/azure_functions/__init__.py delete mode 100644 ddtrace/contrib/azure_functions/patch.py delete mode 100644 ddtrace/contrib/boto/patch.py delete mode 100644 ddtrace/contrib/botocore/patch.py delete mode 100644 ddtrace/contrib/botocore/services/__init__.py delete mode 100644 ddtrace/contrib/botocore/services/bedrock.py delete mode 100644 ddtrace/contrib/botocore/services/kinesis.py delete mode 100644 ddtrace/contrib/botocore/services/sqs.py delete mode 100644 ddtrace/contrib/botocore/services/stepfunctions.py delete mode 100644 ddtrace/contrib/botocore/utils.py create mode 100644 ddtrace/contrib/bottle.py delete mode 100644 ddtrace/contrib/bottle/__init__.py delete mode 100644 ddtrace/contrib/bottle/patch.py delete mode 100644 ddtrace/contrib/bottle/trace.py delete mode 100644 ddtrace/contrib/cassandra/patch.py delete mode 100644 ddtrace/contrib/cassandra/session.py rename ddtrace/contrib/{celery/__init__.py => celery.py} (62%) delete mode 100644 ddtrace/contrib/celery/app.py delete mode 100644 ddtrace/contrib/celery/constants.py delete mode 100644 ddtrace/contrib/celery/patch.py delete mode 100644 ddtrace/contrib/celery/signals.py delete mode 100644 ddtrace/contrib/celery/utils.py rename ddtrace/contrib/{cherrypy/__init__.py => cherrypy.py} (68%) delete mode 100644 ddtrace/contrib/cherrypy/middleware.py delete mode 100644 ddtrace/contrib/consul/patch.py delete mode 100644 ddtrace/contrib/coverage/__init__.py delete mode 100644 ddtrace/contrib/coverage/constants.py delete mode 100644 ddtrace/contrib/coverage/data.py delete mode 100644 ddtrace/contrib/coverage/patch.py delete mode 100644 ddtrace/contrib/coverage/utils.py rename ddtrace/contrib/{dbapi/__init__.py => dbapi.py} (97%) rename ddtrace/contrib/{dbapi_async/__init__.py => dbapi_async.py} (96%) delete mode 100644 ddtrace/contrib/django/_asgi.py delete mode 100644 ddtrace/contrib/django/compat.py delete mode 100644 ddtrace/contrib/django/patch.py delete mode 100644 ddtrace/contrib/django/restframework.py delete mode 100644 ddtrace/contrib/django/utils.py delete mode 100644 ddtrace/contrib/dogpile_cache/lock.py delete mode 100644 ddtrace/contrib/dogpile_cache/patch.py delete mode 100644 ddtrace/contrib/dogpile_cache/region.py delete mode 100644 ddtrace/contrib/dramatiq/patch.py delete mode 100644 ddtrace/contrib/elasticsearch/patch.py delete mode 100644 ddtrace/contrib/elasticsearch/quantize.py rename ddtrace/contrib/{falcon/__init__.py => falcon.py} (56%) delete mode 100644 ddtrace/contrib/falcon/middleware.py delete mode 100644 ddtrace/contrib/falcon/patch.py delete mode 100644 ddtrace/contrib/fastapi/patch.py delete mode 100644 ddtrace/contrib/flask/patch.py delete mode 100644 ddtrace/contrib/flask/wrappers.py rename ddtrace/contrib/{flask_cache/__init__.py => flask_cache.py} (68%) delete mode 100644 ddtrace/contrib/flask_cache/tracers.py delete mode 100644 ddtrace/contrib/flask_cache/utils.py delete mode 100644 ddtrace/contrib/flask_login/__init__.py delete mode 100644 ddtrace/contrib/futures/patch.py delete mode 100644 ddtrace/contrib/futures/threading.py delete mode 100644 ddtrace/contrib/gevent/greenlet.py delete mode 100644 ddtrace/contrib/gevent/patch.py delete mode 100644 ddtrace/contrib/gevent/provider.py delete mode 100644 ddtrace/contrib/graphql/patch.py delete mode 100644 ddtrace/contrib/grpc/aio_client_interceptor.py delete mode 100644 ddtrace/contrib/grpc/aio_server_interceptor.py delete mode 100644 ddtrace/contrib/grpc/client_interceptor.py delete mode 100644 ddtrace/contrib/grpc/constants.py delete mode 100644 ddtrace/contrib/grpc/patch.py delete mode 100644 ddtrace/contrib/grpc/server_interceptor.py delete mode 100644 ddtrace/contrib/grpc/utils.py delete mode 100644 ddtrace/contrib/httplib/patch.py delete mode 100644 ddtrace/contrib/httpx/patch.py delete mode 100644 ddtrace/contrib/jinja2/constants.py delete mode 100644 ddtrace/contrib/jinja2/patch.py delete mode 100644 ddtrace/contrib/kafka/patch.py delete mode 100644 ddtrace/contrib/kombu/constants.py delete mode 100644 ddtrace/contrib/kombu/patch.py delete mode 100644 ddtrace/contrib/kombu/utils.py delete mode 100644 ddtrace/contrib/langchain/constants.py delete mode 100644 ddtrace/contrib/langchain/patch.py delete mode 100644 ddtrace/contrib/langgraph/__init__.py delete mode 100644 ddtrace/contrib/logbook/patch.py delete mode 100644 ddtrace/contrib/logging/constants.py delete mode 100644 ddtrace/contrib/logging/patch.py delete mode 100644 ddtrace/contrib/loguru/patch.py delete mode 100644 ddtrace/contrib/mako/constants.py delete mode 100644 ddtrace/contrib/mako/patch.py delete mode 100644 ddtrace/contrib/mariadb/patch.py delete mode 100644 ddtrace/contrib/molten/patch.py delete mode 100644 ddtrace/contrib/molten/wrappers.py delete mode 100644 ddtrace/contrib/mongoengine/patch.py delete mode 100644 ddtrace/contrib/mongoengine/trace.py delete mode 100644 ddtrace/contrib/mysql/patch.py delete mode 100644 ddtrace/contrib/mysqldb/patch.py delete mode 100644 ddtrace/contrib/openai/_endpoint_hooks.py delete mode 100644 ddtrace/contrib/openai/patch.py delete mode 100644 ddtrace/contrib/openai/utils.py delete mode 100644 ddtrace/contrib/psycopg/async_connection.py delete mode 100644 ddtrace/contrib/psycopg/async_cursor.py delete mode 100644 ddtrace/contrib/psycopg/connection.py delete mode 100644 ddtrace/contrib/psycopg/cursor.py delete mode 100644 ddtrace/contrib/psycopg/extensions.py delete mode 100644 ddtrace/contrib/psycopg/patch.py create mode 100644 ddtrace/contrib/pylibmc.py delete mode 100644 ddtrace/contrib/pylibmc/__init__.py delete mode 100644 ddtrace/contrib/pylibmc/addrs.py delete mode 100644 ddtrace/contrib/pylibmc/client.py delete mode 100644 ddtrace/contrib/pylibmc/patch.py delete mode 100644 ddtrace/contrib/pymemcache/client.py delete mode 100644 ddtrace/contrib/pymemcache/patch.py delete mode 100644 ddtrace/contrib/pymongo/client.py delete mode 100644 ddtrace/contrib/pymongo/parse.py delete mode 100644 ddtrace/contrib/pymongo/patch.py delete mode 100644 ddtrace/contrib/pymysql/patch.py delete mode 100644 ddtrace/contrib/pynamodb/patch.py delete mode 100644 ddtrace/contrib/pyodbc/patch.py rename ddtrace/contrib/{pyramid/__init__.py => pyramid.py} (60%) delete mode 100644 ddtrace/contrib/pyramid/constants.py delete mode 100644 ddtrace/contrib/pyramid/patch.py delete mode 100644 ddtrace/contrib/pyramid/trace.py delete mode 100644 ddtrace/contrib/pytest/constants.py delete mode 100644 ddtrace/contrib/pytest/newhooks.py delete mode 100644 ddtrace/contrib/pytest/plugin.py delete mode 100644 ddtrace/contrib/pytest_bdd/constants.py delete mode 100644 ddtrace/contrib/pytest_bdd/plugin.py delete mode 100644 ddtrace/contrib/pytest_benchmark/__init__.py delete mode 100644 ddtrace/contrib/pytest_benchmark/constants.py delete mode 100644 ddtrace/contrib/pytest_benchmark/plugin.py delete mode 100644 ddtrace/contrib/redis/asyncio_patch.py delete mode 100644 ddtrace/contrib/redis/patch.py delete mode 100644 ddtrace/contrib/redis_utils.py delete mode 100644 ddtrace/contrib/rediscluster/patch.py rename ddtrace/contrib/{requests/__init__.py => requests.py} (62%) delete mode 100644 ddtrace/contrib/requests/connection.py delete mode 100644 ddtrace/contrib/requests/constants.py delete mode 100644 ddtrace/contrib/requests/patch.py delete mode 100644 ddtrace/contrib/requests/session.py delete mode 100644 ddtrace/contrib/sanic/patch.py delete mode 100644 ddtrace/contrib/snowflake/patch.py create mode 100644 ddtrace/contrib/sqlalchemy.py delete mode 100644 ddtrace/contrib/sqlalchemy/__init__.py delete mode 100644 ddtrace/contrib/sqlalchemy/engine.py delete mode 100644 ddtrace/contrib/sqlalchemy/patch.py delete mode 100644 ddtrace/contrib/sqlite3/patch.py delete mode 100644 ddtrace/contrib/starlette/patch.py delete mode 100644 ddtrace/contrib/structlog/patch.py delete mode 100644 ddtrace/contrib/subprocess/constants.py delete mode 100644 ddtrace/contrib/subprocess/patch.py rename ddtrace/contrib/{tornado/__init__.py => tornado.py} (89%) delete mode 100644 ddtrace/contrib/tornado/application.py delete mode 100644 ddtrace/contrib/tornado/constants.py delete mode 100644 ddtrace/contrib/tornado/decorators.py delete mode 100644 ddtrace/contrib/tornado/handlers.py delete mode 100644 ddtrace/contrib/tornado/patch.py delete mode 100644 ddtrace/contrib/tornado/stack_context.py delete mode 100644 ddtrace/contrib/tornado/template.py delete mode 100644 ddtrace/contrib/trace_utils_async.py delete mode 100644 ddtrace/contrib/trace_utils_redis.py delete mode 100644 ddtrace/contrib/unittest/constants.py delete mode 100644 ddtrace/contrib/unittest/patch.py delete mode 100644 ddtrace/contrib/urllib/__init__.py delete mode 100644 ddtrace/contrib/urllib/patch.py delete mode 100644 ddtrace/contrib/urllib3/patch.py delete mode 100644 ddtrace/contrib/vertica/patch.py delete mode 100644 ddtrace/contrib/webbrowser/__init__.py delete mode 100644 ddtrace/contrib/webbrowser/patch.py rename ddtrace/contrib/{wsgi/__init__.py => wsgi.py} (56%) delete mode 100644 ddtrace/contrib/wsgi/wsgi.py delete mode 100644 ddtrace/contrib/yaaredis/patch.py create mode 100644 releasenotes/notes/remove-deprecated-code-integrations-ae6970bbf9b10047.yaml diff --git a/ddtrace/contrib/__init__.py b/ddtrace/contrib/__init__.py index cb5b2c1de09..668b87214c6 100644 --- a/ddtrace/contrib/__init__.py +++ b/ddtrace/contrib/__init__.py @@ -1,73 +1,3 @@ -from ddtrace._trace import trace_handlers # noqa:F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.internal.utils.importlib import func_name # noqa:F401 -from ddtrace.internal.utils.importlib import module_name # noqa:F401 -from ddtrace.internal.utils.importlib import require_modules # noqa:F401 -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ( - "aiohttp", - "asgi", - "bottle", - "celery", - "cherrypy", - "falcon", - "flask_cache", - "pylibmc", - "pyramid", - "requests", - "sqlalchemy", - "wsgi", - "trace_utils", - "internal", - ): - # following packages/modules are not deprecated and will not be removed in 3.0 - pass - elif name in ("trace_handlers", "func_name", "module_name", "require_modules"): - # the following attributes are exposed in ddtrace.contrib.__init__ and should be - # removed in v3.0 - deprecate( - ("ddtrace.contrib.%s is deprecated" % name), - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - elif name in ("aiobotocore", "httplib", "kombu", "snowflake", "sqlalchemy", "tornado", "urllib3"): - # following integrations are not enabled by default and require a unique deprecation message - deprecate( - f"ddtrace.contrib.{name} is deprecated", - message="Avoid using this package directly. " - f"Set DD_TRACE_{name.upper()}_ENABLED=true and use ``ddtrace.auto`` or the " - "``ddtrace-run`` command to enable and configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - elif name in ("redis_utils", "trace_utils_redis", "trace_utils_async"): - deprecate( - f"The ddtrace.contrib.{name} module is deprecated", - message="Import from ``ddtrace.contrib.trace_utils`` instead.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - elif name == "flask_login": - deprecate( - """The flask_login integration is deprecated and will be deleted. - We recommend customers to switch to manual instrumentation. - https://docs.datadoghq.com/security/application_security/threats/add-user-info/?tab=loginsuccess&code-lang=python#adding-business-logic-information-login-success-login-failure-any-business-logic-to-traces - """, - message="", - category=DDTraceDeprecationWarning, - ) - else: - deprecate( - f"ddtrace.contrib.{name} is deprecated", - message="Avoid using this package directly. " - f"Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to enable and configure {name}.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) +# Importing trace handlers has the side effect of registering integration level +# handlers. This is necessary to use the Core API in integrations. +from ddtrace._trace import trace_handlers as _ # noqa: F401 diff --git a/ddtrace/contrib/aiobotocore/__init__.py b/ddtrace/contrib/_aiobotocore.py similarity index 64% rename from ddtrace/contrib/aiobotocore/__init__.py rename to ddtrace/contrib/_aiobotocore.py index 5c4527d11f3..7439a24e443 100644 --- a/ddtrace/contrib/aiobotocore/__init__.py +++ b/ddtrace/contrib/_aiobotocore.py @@ -25,16 +25,3 @@ Default: ``False`` """ - - -# Required to allow users to import from `ddtrace.contrib.aiobotocore.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.aiobotocore.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aiobotocore.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/_aiohttp_jinja2.py b/ddtrace/contrib/_aiohttp_jinja2.py new file mode 100644 index 00000000000..6d6db50674e --- /dev/null +++ b/ddtrace/contrib/_aiohttp_jinja2.py @@ -0,0 +1,15 @@ +""" +The ``aiohttp_jinja2`` integration adds tracing of template rendering. + + +Enabling +~~~~~~~~ + +The integration is enabled automatically when using +:ref:`ddtrace-run` or :ref:`import ddtrace.auto`. + +Or use :func:`patch()` to manually enable the integration:: + + from ddtrace import patch + patch(aiohttp_jinja2=True) +""" diff --git a/ddtrace/contrib/aiomysql/__init__.py b/ddtrace/contrib/_aiomysql.py similarity index 68% rename from ddtrace/contrib/aiomysql/__init__.py rename to ddtrace/contrib/_aiomysql.py index 49926545da7..5b060571309 100644 --- a/ddtrace/contrib/aiomysql/__init__.py +++ b/ddtrace/contrib/_aiomysql.py @@ -35,16 +35,3 @@ cur = await conn.cursor() await cur.execute("SELECT 6*7 AS the_answer;") """ - - -# Required to allow users to import from `ddtrace.contrib.aiohttp.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.aiomysql.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aiomysql.patch import patch # noqa: F401 -from ddtrace.contrib.internal.aiomysql.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/aiopg/__init__.py b/ddtrace/contrib/_aiopg.py similarity index 59% rename from ddtrace/contrib/aiopg/__init__.py rename to ddtrace/contrib/_aiopg.py index de5dcf490e2..a419df5dbbf 100644 --- a/ddtrace/contrib/aiopg/__init__.py +++ b/ddtrace/contrib/_aiopg.py @@ -16,15 +16,3 @@ # Use a pin to specify metadata related to this connection Pin.override(db, service='postgres-users') """ - - -# Required to allow users to import from `ddtrace.contrib.aiohttp.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.aiopg.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aiopg.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/aioredis/__init__.py b/ddtrace/contrib/_aioredis.py similarity index 76% rename from ddtrace/contrib/aioredis/__init__.py rename to ddtrace/contrib/_aioredis.py index 3dd70747723..7abbd826a3c 100644 --- a/ddtrace/contrib/aioredis/__init__.py +++ b/ddtrace/contrib/_aioredis.py @@ -60,14 +60,3 @@ myaioredis = aioredis.Aioredis() Pin.override(myaioredis, service="myaioredis") """ -import warnings as _w # noqa: E402 - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - # Required to allow users to import from `ddtrace.contrib.aioredis.patch` directly - from . import patch as _ # noqa: I001,F401 - -from ddtrace.contrib.internal.aioredis.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aioredis.patch import patch # noqa: F401 -from ddtrace.contrib.internal.aioredis.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/algoliasearch/__init__.py b/ddtrace/contrib/_algoliasearch.py similarity index 55% rename from ddtrace/contrib/algoliasearch/__init__.py rename to ddtrace/contrib/_algoliasearch.py index 8c1034951e8..ebb95a7e504 100644 --- a/ddtrace/contrib/algoliasearch/__init__.py +++ b/ddtrace/contrib/_algoliasearch.py @@ -21,16 +21,3 @@ .. __: https://www.algolia.com """ - - -# Required to allow users to import from `ddtrace.contrib.algoliasearch.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.algoliasearch.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.algoliasearch.patch import patch # noqa: F401 -from ddtrace.contrib.internal.algoliasearch.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/anthropic/__init__.py b/ddtrace/contrib/_anthropic.py similarity index 85% rename from ddtrace/contrib/anthropic/__init__.py rename to ddtrace/contrib/_anthropic.py index 333123c2ac8..81e62a6083b 100644 --- a/ddtrace/contrib/anthropic/__init__.py +++ b/ddtrace/contrib/_anthropic.py @@ -81,16 +81,3 @@ Pin.override(anthropic, service="my-anthropic-service") """ # noqa: E501 - - -# Required to allow users to import from `ddtrace.contrib.anthropic.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.anthropic.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.anthropic.patch import patch # noqa: F401 -from ddtrace.contrib.internal.anthropic.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/aredis/__init__.py b/ddtrace/contrib/_aredis.py similarity index 82% rename from ddtrace/contrib/aredis/__init__.py rename to ddtrace/contrib/_aredis.py index 460734a13f9..1ffac72fa36 100644 --- a/ddtrace/contrib/aredis/__init__.py +++ b/ddtrace/contrib/_aredis.py @@ -65,15 +65,3 @@ async def example(): await client.get("my-key") """ - - -# Required to allow users to import from `ddtrace.contrib.aredis.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.aredis.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aredis.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/_asyncio.py b/ddtrace/contrib/_asyncio.py new file mode 100644 index 00000000000..ae2b608dc67 --- /dev/null +++ b/ddtrace/contrib/_asyncio.py @@ -0,0 +1,4 @@ +""" +This integration provides context management for tracing the execution flow +of concurrent execution of ``asyncio.Task``. +""" diff --git a/ddtrace/contrib/asyncpg/__init__.py b/ddtrace/contrib/_asyncpg.py similarity index 68% rename from ddtrace/contrib/asyncpg/__init__.py rename to ddtrace/contrib/_asyncpg.py index 9cd624678e8..233cde9f51c 100644 --- a/ddtrace/contrib/asyncpg/__init__.py +++ b/ddtrace/contrib/_asyncpg.py @@ -43,16 +43,3 @@ conn = asyncpg.connect("postgres://localhost:5432") Pin.override(conn, service="custom-service") """ - - -# Required to allow users to import from `ddtrace.contrib.asyncpg.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.asyncpg.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.asyncpg.patch import patch # noqa: F401 -from ddtrace.contrib.internal.asyncpg.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/avro/__init__.py b/ddtrace/contrib/_avro.py similarity index 75% rename from ddtrace/contrib/avro/__init__.py rename to ddtrace/contrib/_avro.py index 5e84b184f77..6c4927e8aaf 100644 --- a/ddtrace/contrib/avro/__init__.py +++ b/ddtrace/contrib/_avro.py @@ -15,6 +15,3 @@ ~~~~~~~~~~~~~ """ - -from ..internal.avro.patch import get_version # noqa: F401 -from ..internal.avro.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/aws_lambda/__init__.py b/ddtrace/contrib/_aws_lambda.py similarity index 84% rename from ddtrace/contrib/aws_lambda/__init__.py rename to ddtrace/contrib/_aws_lambda.py index 6cd9b97da39..76ade43c1a9 100644 --- a/ddtrace/contrib/aws_lambda/__init__.py +++ b/ddtrace/contrib/_aws_lambda.py @@ -38,7 +38,3 @@ For additional configuration refer to `Instrumenting Python Serverless Applications by Datadog `_. """ - -from ddtrace.contrib.internal.aws_lambda.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aws_lambda.patch import patch # noqa: F401 -from ddtrace.contrib.internal.aws_lambda.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/_azure_functions.py b/ddtrace/contrib/_azure_functions.py new file mode 100644 index 00000000000..8a8e5df796e --- /dev/null +++ b/ddtrace/contrib/_azure_functions.py @@ -0,0 +1,25 @@ +""" +The azure_functions integration traces all http requests to your Azure Function app. + +Enabling +~~~~~~~~ + +Use :func:`patch()` to manually enable the integration:: + + from ddtrace import patch + patch(azure_functions=True) + + +Global Configuration +~~~~~~~~~~~~~~~~~~~~ + +.. py:data:: ddtrace.config.azure_functions["service"] + + The service name reported by default for azure_functions instances. + + This option can also be set with the ``DD_SERVICE`` environment + variable. + + Default: ``"azure_functions"`` + +""" diff --git a/ddtrace/contrib/boto/__init__.py b/ddtrace/contrib/_boto.py similarity index 65% rename from ddtrace/contrib/boto/__init__.py rename to ddtrace/contrib/_boto.py index 955c1bd0f2a..21965c2e161 100644 --- a/ddtrace/contrib/boto/__init__.py +++ b/ddtrace/contrib/_boto.py @@ -27,15 +27,3 @@ Default: ``False`` """ - - -# Required to allow users to import from `ddtrace.contrib.boto.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.boto.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.boto.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/botocore/__init__.py b/ddtrace/contrib/_botocore.py similarity index 91% rename from ddtrace/contrib/botocore/__init__.py rename to ddtrace/contrib/_botocore.py index 6662b43e599..2c1afc2c47a 100644 --- a/ddtrace/contrib/botocore/__init__.py +++ b/ddtrace/contrib/_botocore.py @@ -151,16 +151,3 @@ Default: ``True`` """ - - -# Required to allow users to import from `ddtrace.contrib.botocore.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.botocore.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.botocore.patch import patch # noqa: F401 -from ddtrace.contrib.internal.botocore.patch import patch_submodules # noqa: F401 diff --git a/ddtrace/contrib/cassandra/__init__.py b/ddtrace/contrib/_cassandra.py similarity index 69% rename from ddtrace/contrib/cassandra/__init__.py rename to ddtrace/contrib/_cassandra.py index 5b2247156d6..d0de07f8f16 100644 --- a/ddtrace/contrib/cassandra/__init__.py +++ b/ddtrace/contrib/_cassandra.py @@ -22,16 +22,3 @@ session = cluster.connect("my_keyspace") session.execute("select id from my_table limit 10;") """ - - -# Required to allow users to import from `ddtrace.contrib.cassandra.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.cassandra.patch import patch # noqa: F401 -from ddtrace.contrib.internal.cassandra.session import get_version # noqa: F401 diff --git a/ddtrace/contrib/consul/__init__.py b/ddtrace/contrib/_consul.py similarity index 56% rename from ddtrace/contrib/consul/__init__.py rename to ddtrace/contrib/_consul.py index d0a6a064683..fa159309411 100644 --- a/ddtrace/contrib/consul/__init__.py +++ b/ddtrace/contrib/_consul.py @@ -19,17 +19,3 @@ # Use a pin to specify metadata related to this client Pin.override(client, service='consul-kv') """ - - -# Required to allow users to import from `ddtrace.contrib.consul.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.consul.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.consul.patch import patch # noqa: F401 -from ddtrace.contrib.internal.consul.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/_coverage.py b/ddtrace/contrib/_coverage.py new file mode 100644 index 00000000000..c597acab1da --- /dev/null +++ b/ddtrace/contrib/_coverage.py @@ -0,0 +1,17 @@ +""" +The Coverage.py integration traces test code coverage when using `pytest` or `unittest`. + + +Enabling +~~~~~~~~ + +The Coverage.py integration is enabled automatically when using +:ref:`ddtrace-run` or :ref:`import ddtrace.auto`. + +Alternately, use :func:`patch()` to manually enable the integration:: + + from ddtrace import patch + patch(coverage=True) + +Note: Coverage.py instrumentation is only enabled if `pytest` or `unittest` instrumentation is enabled. +""" diff --git a/ddtrace/contrib/django/__init__.py b/ddtrace/contrib/_django.py similarity index 91% rename from ddtrace/contrib/django/__init__.py rename to ddtrace/contrib/_django.py index c1ab65d494d..afde135c47c 100644 --- a/ddtrace/contrib/django/__init__.py +++ b/ddtrace/contrib/_django.py @@ -200,18 +200,3 @@ .. __: https://www.djangoproject.com/ """ # noqa: E501 - - -# Required to allow users to import from `ddtrace.contrib.django.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.django.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.django.patch import patch # noqa: F401 -from ddtrace.contrib.internal.django.patch import patch as _patch # noqa: F401 -from ddtrace.contrib.internal.django.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/dogpile_cache/__init__.py b/ddtrace/contrib/_dogpile_cache.py similarity index 73% rename from ddtrace/contrib/dogpile_cache/__init__.py rename to ddtrace/contrib/_dogpile_cache.py index c1b4f1b58ed..166a00a4aef 100644 --- a/ddtrace/contrib/dogpile_cache/__init__.py +++ b/ddtrace/contrib/_dogpile_cache.py @@ -36,17 +36,3 @@ def hello(name): .. __: https://dogpilecache.sqlalchemy.org/ """ - - -# Required to allow users to import from `ddtrace.contrib.dogpile_cache.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.dogpile_cache.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.dogpile_cache.patch import patch # noqa: F401 -from ddtrace.contrib.internal.dogpile_cache.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/dramatiq/__init__.py b/ddtrace/contrib/_dramatiq.py similarity index 61% rename from ddtrace/contrib/dramatiq/__init__.py rename to ddtrace/contrib/_dramatiq.py index 2d135ba2966..e6a0f82e5b3 100644 --- a/ddtrace/contrib/dramatiq/__init__.py +++ b/ddtrace/contrib/_dramatiq.py @@ -28,17 +28,3 @@ def my_other_task(content): ddtrace-run python app.py """ - - -# Required to allow users to import from `ddtrace.contrib.dramatiq.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.dramatiq.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.dramatiq.patch import patch # noqa: F401 -from ddtrace.contrib.internal.dramatiq.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/elasticsearch/__init__.py b/ddtrace/contrib/_elasticsearch.py similarity index 85% rename from ddtrace/contrib/elasticsearch/__init__.py rename to ddtrace/contrib/_elasticsearch.py index b0be91a11da..8462195af81 100644 --- a/ddtrace/contrib/elasticsearch/__init__.py +++ b/ddtrace/contrib/_elasticsearch.py @@ -49,6 +49,3 @@ # Override service name config.elasticsearch['service'] = 'custom-service-name' """ -from ddtrace.contrib.internal.elasticsearch.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.elasticsearch.patch import get_versions # noqa: F401 -from ddtrace.contrib.internal.elasticsearch.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/fastapi/__init__.py b/ddtrace/contrib/_fastapi.py similarity index 74% rename from ddtrace/contrib/fastapi/__init__.py rename to ddtrace/contrib/_fastapi.py index 726a308f14d..4af18192044 100644 --- a/ddtrace/contrib/fastapi/__init__.py +++ b/ddtrace/contrib/_fastapi.py @@ -50,17 +50,3 @@ config.fastapi['request_span_name'] = 'custom-request-span-name' """ - - -# Required to allow users to import from `ddtrace.contrib.fastapi.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.fastapi.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.fastapi.patch import patch # noqa: F401 -from ddtrace.contrib.internal.fastapi.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/flask/__init__.py b/ddtrace/contrib/_flask.py similarity index 83% rename from ddtrace/contrib/flask/__init__.py rename to ddtrace/contrib/_flask.py index 4b3c1afbf16..85233fbba08 100644 --- a/ddtrace/contrib/flask/__init__.py +++ b/ddtrace/contrib/_flask.py @@ -92,15 +92,3 @@ def index(): :ref:`All HTTP tags ` are supported for this integration. """ - - -# DEV: We do this so we can `@mock.patch('ddtrace.contrib.flask._patch.')` in tests -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 -from ddtrace.contrib.internal.flask.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.flask.patch import patch # noqa: F401 -from ddtrace.contrib.internal.flask.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/freezegun/__init__.py b/ddtrace/contrib/_freezegun.py similarity index 69% rename from ddtrace/contrib/freezegun/__init__.py rename to ddtrace/contrib/_freezegun.py index 2b643662c1d..d9f48ded072 100644 --- a/ddtrace/contrib/freezegun/__init__.py +++ b/ddtrace/contrib/_freezegun.py @@ -12,8 +12,3 @@ ~~~~~~~~~~~~~ The freezegun integration is not configurable, but may be disabled using DD_PATCH_MODULES=freezegun:false . """ - - -from ..internal.freezegun.patch import get_version # noqa: F401 -from ..internal.freezegun.patch import patch # noqa: F401 -from ..internal.freezegun.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/futures/__init__.py b/ddtrace/contrib/_futures.py similarity index 56% rename from ddtrace/contrib/futures/__init__.py rename to ddtrace/contrib/_futures.py index 3ac420b2263..1005423acad 100644 --- a/ddtrace/contrib/futures/__init__.py +++ b/ddtrace/contrib/_futures.py @@ -16,17 +16,3 @@ from ddtrace import patch patch(futures=True) """ - - -# Required to allow users to import from `ddtrace.contrib.futures.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.futures.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.futures.patch import patch # noqa: F401 -from ddtrace.contrib.internal.futures.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/gevent/__init__.py b/ddtrace/contrib/_gevent.py similarity index 63% rename from ddtrace/contrib/gevent/__init__.py rename to ddtrace/contrib/_gevent.py index d02588efad9..9fa3ed4add1 100644 --- a/ddtrace/contrib/gevent/__init__.py +++ b/ddtrace/contrib/_gevent.py @@ -36,23 +36,3 @@ def worker_function(): with tracer.trace("greenlet.child_call") as child: ... """ - -# Required to allow users to import from `ddtrace.contrib.gevent.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace._trace.provider import DefaultContextProvider as _DefaultContextProvider -from ddtrace.contrib.internal.gevent.patch import get_version #noqa: F401 -from ddtrace.contrib.internal.gevent.patch import patch #noqa: F401 -from ddtrace.contrib.internal.gevent.patch import unpatch #noqa: F401 - - -context_provider = _DefaultContextProvider() - - - diff --git a/ddtrace/contrib/google_generativeai/__init__.py b/ddtrace/contrib/_google_generativeai.py similarity index 92% rename from ddtrace/contrib/google_generativeai/__init__.py rename to ddtrace/contrib/_google_generativeai.py index 45333c58173..963b80e7494 100644 --- a/ddtrace/contrib/google_generativeai/__init__.py +++ b/ddtrace/contrib/_google_generativeai.py @@ -78,7 +78,3 @@ Pin.override(genai, service="my-gemini-service") """ # noqa: E501 - -from ..internal.google_generativeai.patch import get_version # noqa: F401 -from ..internal.google_generativeai.patch import patch # noqa: F401 -from ..internal.google_generativeai.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/graphql/__init__.py b/ddtrace/contrib/_graphql.py similarity index 71% rename from ddtrace/contrib/graphql/__init__.py rename to ddtrace/contrib/_graphql.py index f12880efda1..d4d8d769d61 100644 --- a/ddtrace/contrib/graphql/__init__.py +++ b/ddtrace/contrib/_graphql.py @@ -44,17 +44,3 @@ Pin.override(graphql, service="mygraphql") """ - - -# Required to allow users to import from `ddtrace.contrib.graphql.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.graphql.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.graphql.patch import patch # noqa: F401 -from ddtrace.contrib.internal.graphql.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/grpc/__init__.py b/ddtrace/contrib/_grpc.py similarity index 80% rename from ddtrace/contrib/grpc/__init__.py rename to ddtrace/contrib/_grpc.py index ea2db0b4ac3..5713b6779ad 100644 --- a/ddtrace/contrib/grpc/__init__.py +++ b/ddtrace/contrib/_grpc.py @@ -74,17 +74,3 @@ add_MyServicer_to_server(MyServicer(), server) server.start() """ - - -# Required to allow users to import from `ddtrace.contrib.grpc.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.grpc.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.grpc.patch import patch # noqa: F401 -from ddtrace.contrib.internal.grpc.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/gunicorn/__init__.py b/ddtrace/contrib/_gunicorn.py similarity index 74% rename from ddtrace/contrib/gunicorn/__init__.py rename to ddtrace/contrib/_gunicorn.py index d098a3fe1bc..7fd31fd296f 100644 --- a/ddtrace/contrib/gunicorn/__init__.py +++ b/ddtrace/contrib/_gunicorn.py @@ -7,16 +7,3 @@ possible in your application's lifecycle. Do not use ``ddtrace-run`` with ``import ddtrace.auto``. """ - - -def get_version(): - # type: () -> str - return "" - - -def patch(): - pass - - -def unpatch(): - pass diff --git a/ddtrace/contrib/httplib/__init__.py b/ddtrace/contrib/_httplib.py similarity index 76% rename from ddtrace/contrib/httplib/__init__.py rename to ddtrace/contrib/_httplib.py index 7c5247422a1..30b170000e2 100644 --- a/ddtrace/contrib/httplib/__init__.py +++ b/ddtrace/contrib/_httplib.py @@ -46,15 +46,3 @@ :ref:`Headers tracing ` is supported for this integration. """ - - -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: I001,F401 - -from ddtrace.contrib.internal.httplib.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.httplib.patch import patch # noqa: F401 -from ddtrace.contrib.internal.httplib.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/httpx/__init__.py b/ddtrace/contrib/_httpx.py similarity index 83% rename from ddtrace/contrib/httpx/__init__.py rename to ddtrace/contrib/_httpx.py index 39b191ad139..3d8087fbba1 100644 --- a/ddtrace/contrib/httpx/__init__.py +++ b/ddtrace/contrib/_httpx.py @@ -77,17 +77,3 @@ .. __: https://www.python-httpx.org/ """ - - -# Required to allow users to import from `ddtrace.contrib.httpx.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.httpx.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.httpx.patch import patch # noqa: F401 -from ddtrace.contrib.internal.httpx.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/jinja2/__init__.py b/ddtrace/contrib/_jinja2.py similarity index 67% rename from ddtrace/contrib/jinja2/__init__.py rename to ddtrace/contrib/_jinja2.py index 8437a51d9de..94683ebe5c3 100644 --- a/ddtrace/contrib/jinja2/__init__.py +++ b/ddtrace/contrib/_jinja2.py @@ -27,16 +27,3 @@ By default, the service name is set to None, so it is inherited from the parent span. If there is no parent span and the service name is not overridden the agent will drop the traces. """ - -# Required to allow users to import from `ddtrace.contrib.jinja2.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.jinja2.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.jinja2.patch import patch # noqa: F401 -from ddtrace.contrib.internal.jinja2.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/kafka/__init__.py b/ddtrace/contrib/_kafka.py similarity index 69% rename from ddtrace/contrib/kafka/__init__.py rename to ddtrace/contrib/_kafka.py index de857bcb040..fa7d280ea6c 100644 --- a/ddtrace/contrib/kafka/__init__.py +++ b/ddtrace/contrib/_kafka.py @@ -41,17 +41,3 @@ Pin.override(confluent_kafka, service="custom-service-name") """ - - -# Required to allow users to import from `ddtrace.contrib.kafka.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.kafka.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.kafka.patch import patch # noqa: F401 -from ddtrace.contrib.internal.kafka.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/kombu/__init__.py b/ddtrace/contrib/_kombu.py similarity index 68% rename from ddtrace/contrib/kombu/__init__.py rename to ddtrace/contrib/_kombu.py index 1c853adbd3f..85afbe827e4 100644 --- a/ddtrace/contrib/kombu/__init__.py +++ b/ddtrace/contrib/_kombu.py @@ -32,19 +32,3 @@ # Use a pin to specify metadata related to this client Pin.override(producer, service='kombu-consumer') """ -from ddtrace.internal.utils.importlib import require_modules - - -required_modules = ["kombu", "kombu.messaging"] - -with require_modules(required_modules) as missing_modules: - if not missing_modules: - # Required to allow users to import from `ddtrace.contrib.kombu.patch` directly - import warnings as _w - - with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - from ddtrace.contrib.internal.kombu.patch import get_version # noqa: F401 - from ddtrace.contrib.internal.kombu.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/langchain/__init__.py b/ddtrace/contrib/_langchain.py similarity index 93% rename from ddtrace/contrib/langchain/__init__.py rename to ddtrace/contrib/_langchain.py index 1aa04d7a516..d36cd76f3f1 100644 --- a/ddtrace/contrib/langchain/__init__.py +++ b/ddtrace/contrib/_langchain.py @@ -206,16 +206,3 @@ Default: ``0.1`` """ # noqa: E501 - -# Required to allow users to import from `ddtrace.contrib.langchain.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.langchain.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.langchain.patch import patch # noqa: F401 -from ddtrace.contrib.internal.langchain.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/_langgraph.py b/ddtrace/contrib/_langgraph.py new file mode 100644 index 00000000000..d5e62d952ce --- /dev/null +++ b/ddtrace/contrib/_langgraph.py @@ -0,0 +1,4 @@ +""" +The LangGraph integration instruments the LangGraph Python library to emit metrics, +traces, and logs. +""" diff --git a/ddtrace/contrib/logbook/__init__.py b/ddtrace/contrib/_logbook.py similarity index 83% rename from ddtrace/contrib/logbook/__init__.py rename to ddtrace/contrib/_logbook.py index e2a8f244820..dafe8873372 100644 --- a/ddtrace/contrib/logbook/__init__.py +++ b/ddtrace/contrib/_logbook.py @@ -47,17 +47,3 @@ For more information, please see the attached guide for the Datadog Logging Product: https://docs.datadoghq.com/logs/log_collection/python/ """ - - -# Required to allow users to import from `ddtrace.contrib.logbook.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.logbook.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.logbook.patch import patch # noqa: F401 -from ddtrace.contrib.internal.logbook.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/logging/__init__.py b/ddtrace/contrib/_logging.py similarity index 79% rename from ddtrace/contrib/logging/__init__.py rename to ddtrace/contrib/_logging.py index 9dcb3befe8c..f2997f362f7 100644 --- a/ddtrace/contrib/logging/__init__.py +++ b/ddtrace/contrib/_logging.py @@ -60,17 +60,3 @@ def hello(): For more information, please see the attached guide on common timestamp issues: https://docs.datadoghq.com/logs/guide/logs-not-showing-expected-timestamp/ """ - - -# Required to allow users to import from `ddtrace.contrib.logging.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.logging.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.logging.patch import patch # noqa: F401 -from ddtrace.contrib.internal.logging.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/loguru/__init__.py b/ddtrace/contrib/_loguru.py similarity index 83% rename from ddtrace/contrib/loguru/__init__.py rename to ddtrace/contrib/_loguru.py index 9501fadd703..f0ad96f77fc 100644 --- a/ddtrace/contrib/loguru/__init__.py +++ b/ddtrace/contrib/_loguru.py @@ -62,17 +62,3 @@ def log_format(record): For more information, please see the attached guide for the Datadog Logging Product: https://docs.datadoghq.com/logs/log_collection/python/ """ - - -# Required to allow users to import from `ddtrace.contrib.loguru.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.loguru.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.loguru.patch import patch # noqa: F401 -from ddtrace.contrib.internal.loguru.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/mako/__init__.py b/ddtrace/contrib/_mako.py similarity index 53% rename from ddtrace/contrib/mako/__init__.py rename to ddtrace/contrib/_mako.py index 5de3f87f6c5..d16b74c4d66 100644 --- a/ddtrace/contrib/mako/__init__.py +++ b/ddtrace/contrib/_mako.py @@ -9,12 +9,3 @@ t = Template(filename="index.html") """ - - -# Required to allow users to import from `ddtrace.contrib.mako.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 diff --git a/ddtrace/contrib/mariadb/__init__.py b/ddtrace/contrib/_mariadb.py similarity index 75% rename from ddtrace/contrib/mariadb/__init__.py rename to ddtrace/contrib/_mariadb.py index 8329fca2b63..1ef08422a00 100644 --- a/ddtrace/contrib/mariadb/__init__.py +++ b/ddtrace/contrib/_mariadb.py @@ -52,17 +52,3 @@ cursor.execute("SELECT 6*7 AS the_answer;") """ - - -# Required to allow users to import from `ddtrace.contrib.mariadb.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.mariadb.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.mariadb.patch import patch # noqa: F401 -from ddtrace.contrib.internal.mariadb.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/molten/__init__.py b/ddtrace/contrib/_molten.py similarity index 66% rename from ddtrace/contrib/molten/__init__.py rename to ddtrace/contrib/_molten.py index 44ef08de9bb..67a616142b8 100644 --- a/ddtrace/contrib/molten/__init__.py +++ b/ddtrace/contrib/_molten.py @@ -34,17 +34,3 @@ def hello(name: str, age: int) -> str: :ref:`All HTTP tags ` are supported for this integration. """ - - -# Required to allow users to import from `ddtrace.contrib.molten.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.molten.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.molten.patch import patch # noqa: F401 -from ddtrace.contrib.internal.molten.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/mongoengine/__init__.py b/ddtrace/contrib/_mongoengine.py similarity index 61% rename from ddtrace/contrib/mongoengine/__init__.py rename to ddtrace/contrib/_mongoengine.py index 793d9cf4322..a72c861f4b7 100644 --- a/ddtrace/contrib/mongoengine/__init__.py +++ b/ddtrace/contrib/_mongoengine.py @@ -17,16 +17,3 @@ client = mongoengine.connect('db', alias='master') Pin.override(client, service="mongo-master") """ - - -# Required to allow users to import from `ddtrace.contrib.mongoengine.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.mongoengine.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.mongoengine.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/mysql/__init__.py b/ddtrace/contrib/_mysql.py similarity index 80% rename from ddtrace/contrib/mysql/__init__.py rename to ddtrace/contrib/_mysql.py index 60a4d638f78..3336839bcf5 100644 --- a/ddtrace/contrib/mysql/__init__.py +++ b/ddtrace/contrib/_mysql.py @@ -62,19 +62,3 @@ Help on mysql.connector can be found on: https://dev.mysql.com/doc/connector-python/en/ """ - - -# check `mysql-connector` availability - - -# Required to allow users to import from `ddtrace.contrib.mysql.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.mysql.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.mysql.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/mysqldb/__init__.py b/ddtrace/contrib/_mysqldb.py similarity index 84% rename from ddtrace/contrib/mysqldb/__init__.py rename to ddtrace/contrib/_mysqldb.py index 7649807e623..46a5e27de7b 100644 --- a/ddtrace/contrib/mysqldb/__init__.py +++ b/ddtrace/contrib/_mysqldb.py @@ -75,15 +75,3 @@ https://mysqlclient.readthedocs.io/ """ - - -# Required to allow users to import from `ddtrace.contrib.mysqldb.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.mysqldb.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.mysqldb.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/openai/__init__.py b/ddtrace/contrib/_openai.py similarity index 94% rename from ddtrace/contrib/openai/__init__.py rename to ddtrace/contrib/_openai.py index da94047c2e8..8e2eb87aeb5 100644 --- a/ddtrace/contrib/openai/__init__.py +++ b/ddtrace/contrib/_openai.py @@ -247,16 +247,3 @@ Pin.override(openai, service="my-openai-service") """ # noqa: E501 - -# Required to allow users to import from `ddtrace.contrib.openai.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.openai.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.openai.patch import patch # noqa: F401 -from ddtrace.contrib.internal.openai.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/protobuf/__init__.py b/ddtrace/contrib/_protobuf.py similarity index 67% rename from ddtrace/contrib/protobuf/__init__.py rename to ddtrace/contrib/_protobuf.py index 41f0c76d101..8dfe99461d2 100644 --- a/ddtrace/contrib/protobuf/__init__.py +++ b/ddtrace/contrib/_protobuf.py @@ -15,6 +15,3 @@ ~~~~~~~~~~~~~ """ -from ..internal.protobuf.patch import get_version # noqa: F401 -from ..internal.protobuf.patch import patch # noqa: F401 -from ..internal.protobuf.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/psycopg/__init__.py b/ddtrace/contrib/_psycopg.py similarity index 79% rename from ddtrace/contrib/psycopg/__init__.py rename to ddtrace/contrib/_psycopg.py index 22baf6ef522..0c1e134bb15 100644 --- a/ddtrace/contrib/psycopg/__init__.py +++ b/ddtrace/contrib/_psycopg.py @@ -60,14 +60,3 @@ cursor = db.cursor() cursor.execute("select * from users where id = 1") """ -# Required to allow users to import from `ddtrace.contrib.psycopg.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.psycopg.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.psycopg.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/pymemcache/__init__.py b/ddtrace/contrib/_pymemcache.py similarity index 70% rename from ddtrace/contrib/pymemcache/__init__.py rename to ddtrace/contrib/_pymemcache.py index ef2e7b3ee82..066bb5653e6 100644 --- a/ddtrace/contrib/pymemcache/__init__.py +++ b/ddtrace/contrib/_pymemcache.py @@ -31,16 +31,3 @@ Pymemcache ``HashClient`` will also be indirectly patched as it uses ``Client`` under the hood. """ - - -# Required to allow users to import from `ddtrace.contrib.pymemcache.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.pymemcache.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.pymemcache.patch import patch # noqa: F401 -from ddtrace.contrib.internal.pymemcache.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/pymongo/__init__.py b/ddtrace/contrib/_pymongo.py similarity index 76% rename from ddtrace/contrib/pymongo/__init__.py rename to ddtrace/contrib/_pymongo.py index 9f030de942b..f1210f0047d 100644 --- a/ddtrace/contrib/pymongo/__init__.py +++ b/ddtrace/contrib/_pymongo.py @@ -36,16 +36,3 @@ Default: ``"pymongo"`` """ - - -# Required to allow users to import from `ddtrace.contrib.pymongo.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.pymongo.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.pymongo.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/pymysql/__init__.py b/ddtrace/contrib/_pymysql.py similarity index 78% rename from ddtrace/contrib/pymysql/__init__.py rename to ddtrace/contrib/_pymysql.py index b999934f285..d219e46eccd 100644 --- a/ddtrace/contrib/pymysql/__init__.py +++ b/ddtrace/contrib/_pymysql.py @@ -54,16 +54,3 @@ cursor = conn.cursor() cursor.execute("SELECT 6*7 AS the_answer;") """ - - -# Required to allow users to import from `ddtrace.contrib.pymysql.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.pymysql.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.pymysql.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/pynamodb/__init__.py b/ddtrace/contrib/_pynamodb.py similarity index 64% rename from ddtrace/contrib/pynamodb/__init__.py rename to ddtrace/contrib/_pynamodb.py index 1362429219f..9ac94a291b6 100644 --- a/ddtrace/contrib/pynamodb/__init__.py +++ b/ddtrace/contrib/_pynamodb.py @@ -27,16 +27,3 @@ Default: ``"pynamodb"`` """ - - -# Required to allow users to import from `ddtrace.contrib.pynamodb.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.pynamodb.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.pynamodb.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/pyodbc/__init__.py b/ddtrace/contrib/_pyodbc.py similarity index 77% rename from ddtrace/contrib/pyodbc/__init__.py rename to ddtrace/contrib/_pyodbc.py index 0a9bfa60fab..0a2d46d5e70 100644 --- a/ddtrace/contrib/pyodbc/__init__.py +++ b/ddtrace/contrib/_pyodbc.py @@ -53,16 +53,3 @@ cursor = db.cursor() cursor.execute("select * from users where id = 1") """ - - -# Required to allow users to import from `ddtrace.contrib.pyodbc.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.pyodbc.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.pyodbc.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/pytest/__init__.py b/ddtrace/contrib/_pytest.py similarity index 95% rename from ddtrace/contrib/pytest/__init__.py rename to ddtrace/contrib/_pytest.py index 31533b05e2b..322685b0a6e 100644 --- a/ddtrace/contrib/pytest/__init__.py +++ b/ddtrace/contrib/_pytest.py @@ -60,4 +60,3 @@ Default: ``"pytest.test"`` """ -from ddtrace.contrib.internal.pytest.patch import get_version # noqa: F401 diff --git a/ddtrace/contrib/pytest_bdd/__init__.py b/ddtrace/contrib/_pytest_bdd.py similarity index 89% rename from ddtrace/contrib/pytest_bdd/__init__.py rename to ddtrace/contrib/_pytest_bdd.py index 62846aea395..5c1ff0be9ae 100644 --- a/ddtrace/contrib/pytest_bdd/__init__.py +++ b/ddtrace/contrib/_pytest_bdd.py @@ -21,4 +21,3 @@ for more details. """ -from ddtrace.contrib.internal.pytest_bdd.patch import get_version # noqa: F401 diff --git a/ddtrace/contrib/_pytest_benchmark.py b/ddtrace/contrib/_pytest_benchmark.py new file mode 100644 index 00000000000..6f7df090942 --- /dev/null +++ b/ddtrace/contrib/_pytest_benchmark.py @@ -0,0 +1,3 @@ +""" +The pytest-benchmark integration traces executions of pytest benchmarks. +""" diff --git a/ddtrace/contrib/redis/__init__.py b/ddtrace/contrib/_redis.py similarity index 81% rename from ddtrace/contrib/redis/__init__.py rename to ddtrace/contrib/_redis.py index 28280510b0c..3204fade8df 100644 --- a/ddtrace/contrib/redis/__init__.py +++ b/ddtrace/contrib/_redis.py @@ -66,16 +66,3 @@ # as the service name. client.get("my-key") """ - - -# Required to allow users to import from `ddtrace.contrib.redis.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.redis.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.redis.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/rediscluster/__init__.py b/ddtrace/contrib/_rediscluster.py similarity index 79% rename from ddtrace/contrib/rediscluster/__init__.py rename to ddtrace/contrib/_rediscluster.py index d7b0e320fac..05975277291 100644 --- a/ddtrace/contrib/rediscluster/__init__.py +++ b/ddtrace/contrib/_rediscluster.py @@ -48,16 +48,3 @@ Default: ``True`` """ - - -# Required to allow users to import from `ddtrace.contrib.rediscluster.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.rediscluster.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.rediscluster.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/rq/__init__.py b/ddtrace/contrib/_rq.py similarity index 96% rename from ddtrace/contrib/rq/__init__.py rename to ddtrace/contrib/_rq.py index 0a4d83983eb..596c0c420f6 100644 --- a/ddtrace/contrib/rq/__init__.py +++ b/ddtrace/contrib/_rq.py @@ -76,4 +76,3 @@ .. __: https://python-rq.org/ """ -from ddtrace.contrib.internal.rq.patch import * # noqa: F403 diff --git a/ddtrace/contrib/sanic/__init__.py b/ddtrace/contrib/_sanic.py similarity index 72% rename from ddtrace/contrib/sanic/__init__.py rename to ddtrace/contrib/_sanic.py index 7fab620b8fd..ad97e5af6f3 100644 --- a/ddtrace/contrib/sanic/__init__.py +++ b/ddtrace/contrib/_sanic.py @@ -55,17 +55,3 @@ def index(request): .. __: https://sanic.readthedocs.io/en/latest/ """ - - -# Required to allow users to import from `ddtrace.contrib.sanic.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.sanic.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.sanic.patch import patch # noqa: F401 -from ddtrace.contrib.internal.sanic.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/selenium/__init__.py b/ddtrace/contrib/_selenium.py similarity index 78% rename from ddtrace/contrib/selenium/__init__.py rename to ddtrace/contrib/_selenium.py index 411fd47f7ee..83252ef39fa 100644 --- a/ddtrace/contrib/selenium/__init__.py +++ b/ddtrace/contrib/_selenium.py @@ -22,7 +22,3 @@ DD_CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS: The time in milliseconds to wait after flushing the RUM session. """ - -from ..internal.selenium.patch import get_version # noqa: F401 -from ..internal.selenium.patch import patch # noqa: F401 -from ..internal.selenium.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/snowflake/__init__.py b/ddtrace/contrib/_snowflake.py similarity index 78% rename from ddtrace/contrib/snowflake/__init__.py rename to ddtrace/contrib/_snowflake.py index 3bf4e42d5a5..ea582b9208f 100644 --- a/ddtrace/contrib/snowflake/__init__.py +++ b/ddtrace/contrib/_snowflake.py @@ -64,17 +64,3 @@ cursor = conn.cursor() cursor.execute("SELECT current_version()") """ - - -# Required to allow users to import from `ddtrace.contrib.snowflake.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.snowflake.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.snowflake.patch import patch # noqa: F401 -from ddtrace.contrib.internal.snowflake.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/sqlite3/__init__.py b/ddtrace/contrib/_sqlite3.py similarity index 77% rename from ddtrace/contrib/sqlite3/__init__.py rename to ddtrace/contrib/_sqlite3.py index 3be49e96642..351d639b182 100644 --- a/ddtrace/contrib/sqlite3/__init__.py +++ b/ddtrace/contrib/_sqlite3.py @@ -53,16 +53,3 @@ cursor = db.cursor() cursor.execute("select * from users where id = 1") """ - - -# Required to allow users to import from `ddtrace.contrib.sqlite3.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.sqlite3.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.sqlite3.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/starlette/__init__.py b/ddtrace/contrib/_starlette.py similarity index 75% rename from ddtrace/contrib/starlette/__init__.py rename to ddtrace/contrib/_starlette.py index 2fe121ef976..a99997698e7 100644 --- a/ddtrace/contrib/starlette/__init__.py +++ b/ddtrace/contrib/_starlette.py @@ -57,17 +57,3 @@ config.starlette['request_span_name'] = 'custom-request-span-name' """ - - -# Required to allow users to import from `ddtrace.contrib.starlette.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.starlette.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.starlette.patch import patch # noqa: F401 -from ddtrace.contrib.internal.starlette.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/structlog/__init__.py b/ddtrace/contrib/_structlog.py similarity index 74% rename from ddtrace/contrib/structlog/__init__.py rename to ddtrace/contrib/_structlog.py index 77770bb3da5..362052eae3f 100644 --- a/ddtrace/contrib/structlog/__init__.py +++ b/ddtrace/contrib/_structlog.py @@ -37,17 +37,3 @@ For more information, please see the attached guide for the Datadog Logging Product: https://docs.datadoghq.com/logs/log_collection/python/ """ - - -# Required to allow users to import from `ddtrace.contrib.structlog.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.structlog.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.structlog.patch import patch # noqa: F401 -from ddtrace.contrib.internal.structlog.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/subprocess/__init__.py b/ddtrace/contrib/_subprocess.py similarity index 58% rename from ddtrace/contrib/subprocess/__init__.py rename to ddtrace/contrib/_subprocess.py index 8e95b25b646..b73c72167bf 100644 --- a/ddtrace/contrib/subprocess/__init__.py +++ b/ddtrace/contrib/_subprocess.py @@ -18,17 +18,3 @@ enabled in this integration that you can check on ```ddtrace.contrib.subprocess.constants.SENSITIVE_WORDS_WILDCARDS```. """ - - -# Required to allow users to import from `ddtrace.contrib.subprocess.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.subprocess.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.subprocess.patch import patch # noqa: F401 -from ddtrace.contrib.internal.subprocess.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/unittest/__init__.py b/ddtrace/contrib/_unittest.py similarity index 83% rename from ddtrace/contrib/unittest/__init__.py rename to ddtrace/contrib/_unittest.py index 173d22cac50..67afb7d5166 100644 --- a/ddtrace/contrib/unittest/__init__.py +++ b/ddtrace/contrib/_unittest.py @@ -34,6 +34,3 @@ Default: ``True`` """ -from ..internal.unittest.patch import get_version # noqa: F401 -from ..internal.unittest.patch import patch # noqa: F401 -from ..internal.unittest.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/_urllib.py b/ddtrace/contrib/_urllib.py new file mode 100644 index 00000000000..76fd2662d80 --- /dev/null +++ b/ddtrace/contrib/_urllib.py @@ -0,0 +1,6 @@ +""" +Trace the standard library ``urllib.request`` library to trace +HTTP requests and detect SSRF vulnerabilities. It is enabled by default +if ``DD_IAST_ENABLED`` is set to ``True`` (for detecting sink points) and/or +``DD_ASM_ENABLED`` is set to ``True`` (for exploit prevention). +""" diff --git a/ddtrace/contrib/urllib3/__init__.py b/ddtrace/contrib/_urllib3.py similarity index 73% rename from ddtrace/contrib/urllib3/__init__.py rename to ddtrace/contrib/_urllib3.py index e0cec320abd..6813ccde8ce 100644 --- a/ddtrace/contrib/urllib3/__init__.py +++ b/ddtrace/contrib/_urllib3.py @@ -50,17 +50,3 @@ Default: ``False`` """ - - -# Required to allow users to import from `ddtrace.contrib.urllib3.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.urllib3.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.urllib3.patch import patch # noqa: F401 -from ddtrace.contrib.internal.urllib3.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/vertexai/__init__.py b/ddtrace/contrib/_vertexai.py similarity index 92% rename from ddtrace/contrib/vertexai/__init__.py rename to ddtrace/contrib/_vertexai.py index 5a372a9bd52..25e5fdc081b 100644 --- a/ddtrace/contrib/vertexai/__init__.py +++ b/ddtrace/contrib/_vertexai.py @@ -82,8 +82,3 @@ Pin.override(vertexai, service="my-vertexai-service") """ # noqa: E501 - - -from ddtrace.contrib.internal.vertexai.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.vertexai.patch import patch # noqa: F401 -from ddtrace.contrib.internal.vertexai.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/vertica/__init__.py b/ddtrace/contrib/_vertica.py similarity index 69% rename from ddtrace/contrib/vertica/__init__.py rename to ddtrace/contrib/_vertica.py index 2bcc2c3d987..df997f5946b 100644 --- a/ddtrace/contrib/vertica/__init__.py +++ b/ddtrace/contrib/_vertica.py @@ -38,17 +38,3 @@ # override the service Pin.override(conn, service='myverticaservice') """ - - -# Required to allow users to import from `ddtrace.contrib.vertica.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.vertica.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.vertica.patch import patch # noqa: F401 -from ddtrace.contrib.internal.vertica.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/_webbrowser.py b/ddtrace/contrib/_webbrowser.py new file mode 100644 index 00000000000..107d0bd7179 --- /dev/null +++ b/ddtrace/contrib/_webbrowser.py @@ -0,0 +1,6 @@ +""" +Trace the standard library ``webbrowser`` library to trace +HTTP requests and detect SSRF vulnerabilities. It is enabled by default +if ``DD_IAST_ENABLED`` is set to ``True`` (for detecting sink points) and/or +``DD_ASM_ENABLED`` is set to ``True`` (for exploit prevention). +""" diff --git a/ddtrace/contrib/yaaredis/__init__.py b/ddtrace/contrib/_yaaredis.py similarity index 81% rename from ddtrace/contrib/yaaredis/__init__.py rename to ddtrace/contrib/_yaaredis.py index 66aa7cc5e6e..65917b03c29 100644 --- a/ddtrace/contrib/yaaredis/__init__.py +++ b/ddtrace/contrib/_yaaredis.py @@ -65,16 +65,3 @@ async def example(): await client.get("my-key") """ - - -# Required to allow users to import from `ddtrace.contrib.yaaredis.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.yaaredis.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.yaaredis.patch import patch # noqa: F401 diff --git a/ddtrace/contrib/aiobotocore/patch.py b/ddtrace/contrib/aiobotocore/patch.py deleted file mode 100644 index 720b5b837de..00000000000 --- a/ddtrace/contrib/aiobotocore/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aiobotocore.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aiohttp/__init__.py b/ddtrace/contrib/aiohttp.py similarity index 72% rename from ddtrace/contrib/aiohttp/__init__.py rename to ddtrace/contrib/aiohttp.py index 2bb498bdf9c..dbb5def90d1 100644 --- a/ddtrace/contrib/aiohttp/__init__.py +++ b/ddtrace/contrib/aiohttp.py @@ -84,35 +84,7 @@ async def home_handler(request): :ref:`All HTTP tags ` are supported for this integration. """ - - -# Required to allow users to import from `ddtrace.contrib.aiohttp.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 from ddtrace.contrib.internal.aiohttp.middlewares import trace_app -from ddtrace.contrib.internal.aiohttp.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aiohttp.patch import patch # noqa: F401 -from ddtrace.contrib.internal.aiohttp.patch import unpatch # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("patch", "get_version", "unpatch"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["trace_app"] diff --git a/ddtrace/contrib/aiohttp/middlewares.py b/ddtrace/contrib/aiohttp/middlewares.py deleted file mode 100644 index 0a9dfcc746a..00000000000 --- a/ddtrace/contrib/aiohttp/middlewares.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aiohttp.middlewares import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aiohttp/patch.py b/ddtrace/contrib/aiohttp/patch.py deleted file mode 100644 index 39550fbea4a..00000000000 --- a/ddtrace/contrib/aiohttp/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aiohttp.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aiohttp_jinja2/__init__.py b/ddtrace/contrib/aiohttp_jinja2/__init__.py deleted file mode 100644 index 90833b19484..00000000000 --- a/ddtrace/contrib/aiohttp_jinja2/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -The ``aiohttp_jinja2`` integration adds tracing of template rendering. - - -Enabling -~~~~~~~~ - -The integration is enabled automatically when using -:ref:`ddtrace-run` or :ref:`import ddtrace.auto`. - -Or use :func:`patch()` to manually enable the integration:: - - from ddtrace import patch - patch(aiohttp_jinja2=True) -""" - - -# Required to allow users to import from `ddtrace.contrib.aiohttp.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.aiohttp_jinja2.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.aiohttp_jinja2.patch import patch # noqa: F401 -from ddtrace.contrib.internal.aiohttp_jinja2.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/aiohttp_jinja2/patch.py b/ddtrace/contrib/aiohttp_jinja2/patch.py deleted file mode 100644 index a70a181f778..00000000000 --- a/ddtrace/contrib/aiohttp_jinja2/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aiohttp_jinja2.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aiomysql/patch.py b/ddtrace/contrib/aiomysql/patch.py deleted file mode 100644 index e6c44c89591..00000000000 --- a/ddtrace/contrib/aiomysql/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aiomysql.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aiopg/connection.py b/ddtrace/contrib/aiopg/connection.py deleted file mode 100644 index f6dac65ab66..00000000000 --- a/ddtrace/contrib/aiopg/connection.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aiopg.connection import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aiopg/patch.py b/ddtrace/contrib/aiopg/patch.py deleted file mode 100644 index 2f5be810c1b..00000000000 --- a/ddtrace/contrib/aiopg/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aiopg.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aioredis/patch.py b/ddtrace/contrib/aioredis/patch.py deleted file mode 100644 index 7cc8e527a28..00000000000 --- a/ddtrace/contrib/aioredis/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aioredis.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/algoliasearch/patch.py b/ddtrace/contrib/algoliasearch/patch.py deleted file mode 100644 index 03f6abd7174..00000000000 --- a/ddtrace/contrib/algoliasearch/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.algoliasearch.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/anthropic/_streaming.py b/ddtrace/contrib/anthropic/_streaming.py deleted file mode 100644 index 80b695cefb3..00000000000 --- a/ddtrace/contrib/anthropic/_streaming.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.anthropic._streaming import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/anthropic/patch.py b/ddtrace/contrib/anthropic/patch.py deleted file mode 100644 index c672f12f6a0..00000000000 --- a/ddtrace/contrib/anthropic/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.anthropic.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/anthropic/utils.py b/ddtrace/contrib/anthropic/utils.py deleted file mode 100644 index a4c68c038f1..00000000000 --- a/ddtrace/contrib/anthropic/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.anthropic.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aredis/patch.py b/ddtrace/contrib/aredis/patch.py deleted file mode 100644 index 87bb5f21386..00000000000 --- a/ddtrace/contrib/aredis/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aredis.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asgi/__init__.py b/ddtrace/contrib/asgi.py similarity index 70% rename from ddtrace/contrib/asgi/__init__.py rename to ddtrace/contrib/asgi.py index 36c67f1f4d0..6635e0f1b18 100644 --- a/ddtrace/contrib/asgi/__init__.py +++ b/ddtrace/contrib/asgi.py @@ -57,24 +57,7 @@ def handle_request(scope, send): from ddtrace.contrib.internal.asgi.middleware import TraceMiddleware -from ddtrace.contrib.internal.asgi.middleware import get_version # noqa: F401 from ddtrace.contrib.internal.asgi.middleware import span_from_scope -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("get_version",): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["TraceMiddleware", "span_from_scope"] diff --git a/ddtrace/contrib/asgi/middleware.py b/ddtrace/contrib/asgi/middleware.py deleted file mode 100644 index 33ef2c6a363..00000000000 --- a/ddtrace/contrib/asgi/middleware.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asgi.middleware import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asgi/utils.py b/ddtrace/contrib/asgi/utils.py deleted file mode 100644 index 26853a14c93..00000000000 --- a/ddtrace/contrib/asgi/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asgi.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asyncio/__init__.py b/ddtrace/contrib/asyncio/__init__.py deleted file mode 100644 index a52166389c7..00000000000 --- a/ddtrace/contrib/asyncio/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -This integration provides context management for tracing the execution flow -of concurrent execution of ``asyncio.Task``. -""" -# Required to allow users to import from `ddtrace.contrib.asyncio.patch` directly - -import warnings as _w # noqa:E402 - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 -from ddtrace._trace.provider import DefaultContextProvider -from ddtrace.contrib.internal.asyncio.helpers import ensure_future # noqa: F401 -from ddtrace.contrib.internal.asyncio.helpers import run_in_executor # noqa: F401 -from ddtrace.contrib.internal.asyncio.helpers import set_call_context # noqa: F401 -from ddtrace.contrib.internal.asyncio.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.asyncio.patch import patch # noqa: F401 -from ddtrace.contrib.internal.asyncio.patch import unpatch # noqa: F401 - - -context_provider = DefaultContextProvider() diff --git a/ddtrace/contrib/asyncio/compat.py b/ddtrace/contrib/asyncio/compat.py deleted file mode 100644 index 90c38a995fa..00000000000 --- a/ddtrace/contrib/asyncio/compat.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asyncio.compat import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asyncio/helpers.py b/ddtrace/contrib/asyncio/helpers.py deleted file mode 100644 index c6c4396fe63..00000000000 --- a/ddtrace/contrib/asyncio/helpers.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asyncio.helpers import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asyncio/patch.py b/ddtrace/contrib/asyncio/patch.py deleted file mode 100644 index 25fef661cf3..00000000000 --- a/ddtrace/contrib/asyncio/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asyncio.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asyncio/provider.py b/ddtrace/contrib/asyncio/provider.py deleted file mode 100644 index b6dcf71a553..00000000000 --- a/ddtrace/contrib/asyncio/provider.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asyncio.provider import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asyncio/wrappers.py b/ddtrace/contrib/asyncio/wrappers.py deleted file mode 100644 index d61be8a4fbb..00000000000 --- a/ddtrace/contrib/asyncio/wrappers.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asyncio.wrappers import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/asyncpg/patch.py b/ddtrace/contrib/asyncpg/patch.py deleted file mode 100644 index 4044b5168cc..00000000000 --- a/ddtrace/contrib/asyncpg/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.asyncpg.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aws_lambda/_cold_start.py b/ddtrace/contrib/aws_lambda/_cold_start.py deleted file mode 100644 index 5a96e2cc861..00000000000 --- a/ddtrace/contrib/aws_lambda/_cold_start.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aws_lambda._cold_start import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/aws_lambda/patch.py b/ddtrace/contrib/aws_lambda/patch.py deleted file mode 100644 index be2e9fb97a7..00000000000 --- a/ddtrace/contrib/aws_lambda/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.aws_lambda.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/azure_functions/__init__.py b/ddtrace/contrib/azure_functions/__init__.py deleted file mode 100644 index 9fb5a7a27b4..00000000000 --- a/ddtrace/contrib/azure_functions/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -The azure_functions integration traces all http requests to your Azure Function app. - -Enabling -~~~~~~~~ - -Use :func:`patch()` to manually enable the integration:: - - from ddtrace import patch - patch(azure_functions=True) - - -Global Configuration -~~~~~~~~~~~~~~~~~~~~ - -.. py:data:: ddtrace.config.azure_functions["service"] - - The service name reported by default for azure_functions instances. - - This option can also be set with the ``DD_SERVICE`` environment - variable. - - Default: ``"azure_functions"`` - -""" -from ddtrace.internal.utils.importlib import require_modules - - -required_modules = ["azure.functions"] - -with require_modules(required_modules) as missing_modules: - if not missing_modules: - # Required to allow users to import from `ddtrace.contrib.azure_functions.patch` directly - import warnings as _w - - with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - from ddtrace.contrib.internal.azure_functions.patch import get_version # noqa: F401 - from ddtrace.contrib.internal.azure_functions.patch import patch # noqa: F401 - from ddtrace.contrib.internal.azure_functions.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/azure_functions/patch.py b/ddtrace/contrib/azure_functions/patch.py deleted file mode 100644 index 1a23613972d..00000000000 --- a/ddtrace/contrib/azure_functions/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.azure_functions.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/boto/patch.py b/ddtrace/contrib/boto/patch.py deleted file mode 100644 index b82fbc2beb1..00000000000 --- a/ddtrace/contrib/boto/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.boto.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/botocore/patch.py b/ddtrace/contrib/botocore/patch.py deleted file mode 100644 index b514ebe22fa..00000000000 --- a/ddtrace/contrib/botocore/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.botocore.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/botocore/services/__init__.py b/ddtrace/contrib/botocore/services/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ddtrace/contrib/botocore/services/bedrock.py b/ddtrace/contrib/botocore/services/bedrock.py deleted file mode 100644 index 54f01451bd0..00000000000 --- a/ddtrace/contrib/botocore/services/bedrock.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.botocore.services.bedrock import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/botocore/services/kinesis.py b/ddtrace/contrib/botocore/services/kinesis.py deleted file mode 100644 index 71e574042b7..00000000000 --- a/ddtrace/contrib/botocore/services/kinesis.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.botocore.services.kinesis import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/botocore/services/sqs.py b/ddtrace/contrib/botocore/services/sqs.py deleted file mode 100644 index 0cc9e2b3f63..00000000000 --- a/ddtrace/contrib/botocore/services/sqs.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.botocore.services.sqs import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/botocore/services/stepfunctions.py b/ddtrace/contrib/botocore/services/stepfunctions.py deleted file mode 100644 index bb7b3e65e3f..00000000000 --- a/ddtrace/contrib/botocore/services/stepfunctions.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.botocore.services.stepfunctions import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/botocore/utils.py b/ddtrace/contrib/botocore/utils.py deleted file mode 100644 index 916ba6e733a..00000000000 --- a/ddtrace/contrib/botocore/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.botocore.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/bottle.py b/ddtrace/contrib/bottle.py new file mode 100644 index 00000000000..84f7c3a7d7d --- /dev/null +++ b/ddtrace/contrib/bottle.py @@ -0,0 +1,38 @@ +""" +The bottle integration traces the Bottle web framework. Add the following +plugin to your app:: + + import bottle + from ddtrace import tracer + from ddtrace.contrib.bottle import TracePlugin + + app = bottle.Bottle() + plugin = TracePlugin(service="my-web-app") + app.install(plugin) + +:ref:`All HTTP tags ` are supported for this integration. + +Configuration +~~~~~~~~~~~~~ + +.. py:data:: ddtrace.config.bottle['distributed_tracing'] + + Whether to parse distributed tracing headers from requests received by your bottle app. + + Can also be enabled with the ``DD_BOTTLE_DISTRIBUTED_TRACING`` environment variable. + + Default: ``True`` + + +Example:: + + from ddtrace import config + + # Enable distributed tracing + config.bottle['distributed_tracing'] = True + +""" +from ddtrace.contrib.internal.bottle.trace import TracePlugin + + +__all__ = ["TracePlugin"] diff --git a/ddtrace/contrib/bottle/__init__.py b/ddtrace/contrib/bottle/__init__.py deleted file mode 100644 index 5ee1de17f3d..00000000000 --- a/ddtrace/contrib/bottle/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -The bottle integration traces the Bottle web framework. Add the following -plugin to your app:: - - import bottle - from ddtrace.trace import tracer - from ddtrace.contrib.bottle import TracePlugin - - app = bottle.Bottle() - plugin = TracePlugin(service="my-web-app") - app.install(plugin) - -:ref:`All HTTP tags ` are supported for this integration. - -Configuration -~~~~~~~~~~~~~ - -.. py:data:: ddtrace.config.bottle['distributed_tracing'] - - Whether to parse distributed tracing headers from requests received by your bottle app. - - Can also be enabled with the ``DD_BOTTLE_DISTRIBUTED_TRACING`` environment variable. - - Default: ``True`` - - -Example:: - - from ddtrace import config - - # Enable distributed tracing - config.bottle['distributed_tracing'] = True - -""" - - -# Required to allow users to import from `ddtrace.contrib.bottle.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.bottle.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.bottle.patch import patch # noqa: F401 -from ddtrace.contrib.internal.bottle.trace import TracePlugin -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("get_version", "patch"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) - - -__all__ = ["TracePlugin"] diff --git a/ddtrace/contrib/bottle/patch.py b/ddtrace/contrib/bottle/patch.py deleted file mode 100644 index 7c12c12e7f8..00000000000 --- a/ddtrace/contrib/bottle/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.bottle.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/bottle/trace.py b/ddtrace/contrib/bottle/trace.py deleted file mode 100644 index 3602e3d6a9a..00000000000 --- a/ddtrace/contrib/bottle/trace.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.bottle.trace import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/cassandra/patch.py b/ddtrace/contrib/cassandra/patch.py deleted file mode 100644 index afcce0abf2e..00000000000 --- a/ddtrace/contrib/cassandra/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.cassandra.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/cassandra/session.py b/ddtrace/contrib/cassandra/session.py deleted file mode 100644 index 52721dbf7c2..00000000000 --- a/ddtrace/contrib/cassandra/session.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.cassandra.session import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/celery/__init__.py b/ddtrace/contrib/celery.py similarity index 62% rename from ddtrace/contrib/celery/__init__.py rename to ddtrace/contrib/celery.py index 514d0100388..f727e53c0e3 100644 --- a/ddtrace/contrib/celery/__init__.py +++ b/ddtrace/contrib/celery.py @@ -51,38 +51,8 @@ def run(self): Default: ``'celery-worker'`` """ - - -# Required to allow users to import from `ddtrace.contrib.celery.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - from ddtrace.contrib.internal.celery.app import patch_app from ddtrace.contrib.internal.celery.app import unpatch_app -from ddtrace.contrib.internal.celery.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.celery.patch import patch # noqa: F401 -from ddtrace.contrib.internal.celery.patch import unpatch # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("patch", "unpatch", "get_version"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["patch_app", "unpatch_app"] diff --git a/ddtrace/contrib/celery/app.py b/ddtrace/contrib/celery/app.py deleted file mode 100644 index 968580efc2f..00000000000 --- a/ddtrace/contrib/celery/app.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.celery.app import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/celery/constants.py b/ddtrace/contrib/celery/constants.py deleted file mode 100644 index c344daf4150..00000000000 --- a/ddtrace/contrib/celery/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.celery.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/celery/patch.py b/ddtrace/contrib/celery/patch.py deleted file mode 100644 index 2f0b9f8fa89..00000000000 --- a/ddtrace/contrib/celery/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.celery.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/celery/signals.py b/ddtrace/contrib/celery/signals.py deleted file mode 100644 index 8a7aa2ecec0..00000000000 --- a/ddtrace/contrib/celery/signals.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.celery.signals import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/celery/utils.py b/ddtrace/contrib/celery/utils.py deleted file mode 100644 index cd642ce01da..00000000000 --- a/ddtrace/contrib/celery/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.celery.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/cherrypy/__init__.py b/ddtrace/contrib/cherrypy.py similarity index 68% rename from ddtrace/contrib/cherrypy/__init__.py rename to ddtrace/contrib/cherrypy.py index 9a78ef7b47e..b217d16b440 100644 --- a/ddtrace/contrib/cherrypy/__init__.py +++ b/ddtrace/contrib/cherrypy.py @@ -52,26 +52,7 @@ def index(self): cherrypy.quickstart(HelloWorld()) """ - - from ddtrace.contrib.internal.cherrypy.patch import TraceMiddleware -from ddtrace.contrib.internal.cherrypy.patch import get_version # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("get_version",): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["TraceMiddleware"] diff --git a/ddtrace/contrib/cherrypy/middleware.py b/ddtrace/contrib/cherrypy/middleware.py deleted file mode 100644 index 25101947c50..00000000000 --- a/ddtrace/contrib/cherrypy/middleware.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.cherrypy.middleware import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/consul/patch.py b/ddtrace/contrib/consul/patch.py deleted file mode 100644 index 1936124c21e..00000000000 --- a/ddtrace/contrib/consul/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.consul.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/coverage/__init__.py b/ddtrace/contrib/coverage/__init__.py deleted file mode 100644 index 9932f73acfe..00000000000 --- a/ddtrace/contrib/coverage/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -The Coverage.py integration traces test code coverage when using `pytest` or `unittest`. - - -Enabling -~~~~~~~~ - -The Coverage.py integration is enabled automatically when using -:ref:`ddtrace-run` or :ref:`import ddtrace.auto`. - -Alternately, use :func:`patch()` to manually enable the integration:: - - from ddtrace import patch - patch(coverage=True) - -Note: Coverage.py instrumentation is only enabled if `pytest` or `unittest` instrumentation is enabled. -""" -# Required to allow users to import from `ddtrace.contrib.internal.coverage.patch` directly -import warnings as _w # noqa:E402 - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.coverage.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.coverage.patch import patch # noqa: F401 -from ddtrace.contrib.internal.coverage.patch import unpatch # noqa: F401 -from ddtrace.internal.logger import get_logger - - -log = get_logger(__name__) diff --git a/ddtrace/contrib/coverage/constants.py b/ddtrace/contrib/coverage/constants.py deleted file mode 100644 index 0ab516c8dad..00000000000 --- a/ddtrace/contrib/coverage/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.coverage.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/coverage/data.py b/ddtrace/contrib/coverage/data.py deleted file mode 100644 index 13ed64a3d4b..00000000000 --- a/ddtrace/contrib/coverage/data.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.coverage.data import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/coverage/patch.py b/ddtrace/contrib/coverage/patch.py deleted file mode 100644 index a1e35a16412..00000000000 --- a/ddtrace/contrib/coverage/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.coverage.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/coverage/utils.py b/ddtrace/contrib/coverage/utils.py deleted file mode 100644 index edfa8b1772e..00000000000 --- a/ddtrace/contrib/coverage/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.coverage.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/dbapi/__init__.py b/ddtrace/contrib/dbapi.py similarity index 97% rename from ddtrace/contrib/dbapi/__init__.py rename to ddtrace/contrib/dbapi.py index 0ecbbd804fa..d9a46da5033 100644 --- a/ddtrace/contrib/dbapi/__init__.py +++ b/ddtrace/contrib/dbapi.py @@ -12,16 +12,16 @@ from ddtrace.internal.utils import get_argument_value from ddtrace.settings.asm import config as asm_config -from ...constants import _ANALYTICS_SAMPLE_RATE_KEY -from ...constants import _SPAN_MEASURED_KEY -from ...constants import SPAN_KIND -from ...ext import SpanKind -from ...ext import SpanTypes -from ...ext import db -from ...ext import sql -from ...trace import Pin -from ..internal.trace_utils import ext_service -from ..internal.trace_utils import iswrapped +from ..constants import _ANALYTICS_SAMPLE_RATE_KEY +from ..constants import _SPAN_MEASURED_KEY +from ..constants import SPAN_KIND +from ..ext import SpanKind +from ..ext import SpanTypes +from ..ext import db +from ..ext import sql +from ..trace import Pin +from .internal.trace_utils import ext_service +from .internal.trace_utils import iswrapped log = get_logger(__name__) diff --git a/ddtrace/contrib/dbapi_async/__init__.py b/ddtrace/contrib/dbapi_async.py similarity index 96% rename from ddtrace/contrib/dbapi_async/__init__.py rename to ddtrace/contrib/dbapi_async.py index 153e8a2c33e..ae84972aaf6 100644 --- a/ddtrace/contrib/dbapi_async/__init__.py +++ b/ddtrace/contrib/dbapi_async.py @@ -7,16 +7,16 @@ from ddtrace.internal.utils import get_argument_value from ddtrace.settings.asm import config as asm_config -from ...constants import _ANALYTICS_SAMPLE_RATE_KEY -from ...constants import _SPAN_MEASURED_KEY -from ...constants import SPAN_KIND -from ...ext import SpanKind -from ...ext import SpanTypes -from ...trace import Pin -from ..dbapi import TracedConnection -from ..dbapi import TracedCursor -from ..internal.trace_utils import ext_service -from ..internal.trace_utils import iswrapped +from ..constants import _ANALYTICS_SAMPLE_RATE_KEY +from ..constants import _SPAN_MEASURED_KEY +from ..constants import SPAN_KIND +from ..ext import SpanKind +from ..ext import SpanTypes +from ..trace import Pin +from .dbapi import TracedConnection +from .dbapi import TracedCursor +from .internal.trace_utils import ext_service +from .internal.trace_utils import iswrapped log = get_logger(__name__) diff --git a/ddtrace/contrib/django/_asgi.py b/ddtrace/contrib/django/_asgi.py deleted file mode 100644 index 74a6e1e0f2b..00000000000 --- a/ddtrace/contrib/django/_asgi.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.django._asgi import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/django/compat.py b/ddtrace/contrib/django/compat.py deleted file mode 100644 index f5d00fe18a9..00000000000 --- a/ddtrace/contrib/django/compat.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.django.compat import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/django/patch.py b/ddtrace/contrib/django/patch.py deleted file mode 100644 index 06013f436f2..00000000000 --- a/ddtrace/contrib/django/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.django.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/django/restframework.py b/ddtrace/contrib/django/restframework.py deleted file mode 100644 index bd6cdc68031..00000000000 --- a/ddtrace/contrib/django/restframework.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.django.restframework import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/django/utils.py b/ddtrace/contrib/django/utils.py deleted file mode 100644 index e95da9ccc65..00000000000 --- a/ddtrace/contrib/django/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.django.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/dogpile_cache/lock.py b/ddtrace/contrib/dogpile_cache/lock.py deleted file mode 100644 index cff1db81eae..00000000000 --- a/ddtrace/contrib/dogpile_cache/lock.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.dogpile_cache.lock import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/dogpile_cache/patch.py b/ddtrace/contrib/dogpile_cache/patch.py deleted file mode 100644 index f2c26af5c7e..00000000000 --- a/ddtrace/contrib/dogpile_cache/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.dogpile_cache.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/dogpile_cache/region.py b/ddtrace/contrib/dogpile_cache/region.py deleted file mode 100644 index ef24b094065..00000000000 --- a/ddtrace/contrib/dogpile_cache/region.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.dogpile_cache.region import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/dramatiq/patch.py b/ddtrace/contrib/dramatiq/patch.py deleted file mode 100644 index e2ba0a37bf5..00000000000 --- a/ddtrace/contrib/dramatiq/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.dramatiq.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/elasticsearch/patch.py b/ddtrace/contrib/elasticsearch/patch.py deleted file mode 100644 index 71239650944..00000000000 --- a/ddtrace/contrib/elasticsearch/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.elasticsearch.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/elasticsearch/quantize.py b/ddtrace/contrib/elasticsearch/quantize.py deleted file mode 100644 index f2011326f02..00000000000 --- a/ddtrace/contrib/elasticsearch/quantize.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.elasticsearch.quantize import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/falcon/__init__.py b/ddtrace/contrib/falcon.py similarity index 56% rename from ddtrace/contrib/falcon/__init__.py rename to ddtrace/contrib/falcon.py index d86767b9d1d..a80d298d09b 100644 --- a/ddtrace/contrib/falcon/__init__.py +++ b/ddtrace/contrib/falcon.py @@ -44,34 +44,7 @@ def on_falcon_request(span, request, response): :ref:`Headers tracing ` is supported for this integration. """ - - -# Required to allow users to import from `ddtrace.contrib.falcon.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 from ddtrace.contrib.internal.falcon.middleware import TraceMiddleware -from ddtrace.contrib.internal.falcon.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.falcon.patch import patch # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("patch", "get_version"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["TraceMiddleware"] diff --git a/ddtrace/contrib/falcon/middleware.py b/ddtrace/contrib/falcon/middleware.py deleted file mode 100644 index 4650449cc89..00000000000 --- a/ddtrace/contrib/falcon/middleware.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.falcon.middleware import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/falcon/patch.py b/ddtrace/contrib/falcon/patch.py deleted file mode 100644 index 3b272cb9032..00000000000 --- a/ddtrace/contrib/falcon/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.falcon.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/fastapi/patch.py b/ddtrace/contrib/fastapi/patch.py deleted file mode 100644 index 5d8d072e147..00000000000 --- a/ddtrace/contrib/fastapi/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.fastapi.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/flask/patch.py b/ddtrace/contrib/flask/patch.py deleted file mode 100644 index 3b3c7e16639..00000000000 --- a/ddtrace/contrib/flask/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.flask.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/flask/wrappers.py b/ddtrace/contrib/flask/wrappers.py deleted file mode 100644 index dee0355abc4..00000000000 --- a/ddtrace/contrib/flask/wrappers.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.flask.wrappers import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/flask_cache/__init__.py b/ddtrace/contrib/flask_cache.py similarity index 68% rename from ddtrace/contrib/flask_cache/__init__.py rename to ddtrace/contrib/flask_cache.py index f35b73111fb..35cae2fb164 100644 --- a/ddtrace/contrib/flask_cache/__init__.py +++ b/ddtrace/contrib/flask_cache.py @@ -43,26 +43,7 @@ def counter(): Cache = get_traced_cache(tracer, service='my-flask-cache-app', cache_cls=Cache) """ - - from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache -from ddtrace.contrib.internal.flask_cache.patch import get_version # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("get_version",): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["get_traced_cache"] diff --git a/ddtrace/contrib/flask_cache/tracers.py b/ddtrace/contrib/flask_cache/tracers.py deleted file mode 100644 index 06e2ce66f8b..00000000000 --- a/ddtrace/contrib/flask_cache/tracers.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.flask_cache.tracers import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/flask_cache/utils.py b/ddtrace/contrib/flask_cache/utils.py deleted file mode 100644 index 18aabdde802..00000000000 --- a/ddtrace/contrib/flask_cache/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.flask_cache.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/flask_login/__init__.py b/ddtrace/contrib/flask_login/__init__.py deleted file mode 100644 index 311eee7fa10..00000000000 --- a/ddtrace/contrib/flask_login/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -def get_version() -> str: - return "" - - -def patch(): - pass - - -def unpatch(): - pass diff --git a/ddtrace/contrib/futures/patch.py b/ddtrace/contrib/futures/patch.py deleted file mode 100644 index 3b8575d23df..00000000000 --- a/ddtrace/contrib/futures/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.futures.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/futures/threading.py b/ddtrace/contrib/futures/threading.py deleted file mode 100644 index d2e2f525869..00000000000 --- a/ddtrace/contrib/futures/threading.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.futures.threading import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/gevent/greenlet.py b/ddtrace/contrib/gevent/greenlet.py deleted file mode 100644 index 7eb6f357aff..00000000000 --- a/ddtrace/contrib/gevent/greenlet.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.gevent.greenlet import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/gevent/patch.py b/ddtrace/contrib/gevent/patch.py deleted file mode 100644 index 255f309a75e..00000000000 --- a/ddtrace/contrib/gevent/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.gevent.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/gevent/provider.py b/ddtrace/contrib/gevent/provider.py deleted file mode 100644 index f75fcf5ba5c..00000000000 --- a/ddtrace/contrib/gevent/provider.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.gevent.provider import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/graphql/patch.py b/ddtrace/contrib/graphql/patch.py deleted file mode 100644 index 642d5d5fbc1..00000000000 --- a/ddtrace/contrib/graphql/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.graphql.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/grpc/aio_client_interceptor.py b/ddtrace/contrib/grpc/aio_client_interceptor.py deleted file mode 100644 index 90e33ad393c..00000000000 --- a/ddtrace/contrib/grpc/aio_client_interceptor.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.grpc.aio_client_interceptor import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/grpc/aio_server_interceptor.py b/ddtrace/contrib/grpc/aio_server_interceptor.py deleted file mode 100644 index 16330f099e7..00000000000 --- a/ddtrace/contrib/grpc/aio_server_interceptor.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.grpc.aio_server_interceptor import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/grpc/client_interceptor.py b/ddtrace/contrib/grpc/client_interceptor.py deleted file mode 100644 index 43f2eb2a964..00000000000 --- a/ddtrace/contrib/grpc/client_interceptor.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.grpc.client_interceptor import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/grpc/constants.py b/ddtrace/contrib/grpc/constants.py deleted file mode 100644 index 05181842bb9..00000000000 --- a/ddtrace/contrib/grpc/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.grpc.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/grpc/patch.py b/ddtrace/contrib/grpc/patch.py deleted file mode 100644 index c903c7641c8..00000000000 --- a/ddtrace/contrib/grpc/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.grpc.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/grpc/server_interceptor.py b/ddtrace/contrib/grpc/server_interceptor.py deleted file mode 100644 index 2fb9882dcbd..00000000000 --- a/ddtrace/contrib/grpc/server_interceptor.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.grpc.server_interceptor import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/grpc/utils.py b/ddtrace/contrib/grpc/utils.py deleted file mode 100644 index 808d4219273..00000000000 --- a/ddtrace/contrib/grpc/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.grpc.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/httplib/patch.py b/ddtrace/contrib/httplib/patch.py deleted file mode 100644 index b74cc8965f5..00000000000 --- a/ddtrace/contrib/httplib/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.httplib.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/httpx/patch.py b/ddtrace/contrib/httpx/patch.py deleted file mode 100644 index 991317c8239..00000000000 --- a/ddtrace/contrib/httpx/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.httpx.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/internal/aiohttp/middlewares.py b/ddtrace/contrib/internal/aiohttp/middlewares.py index 63a60734d3b..b3dde240d44 100644 --- a/ddtrace/contrib/internal/aiohttp/middlewares.py +++ b/ddtrace/contrib/internal/aiohttp/middlewares.py @@ -2,7 +2,6 @@ from aiohttp.web_urldispatcher import SystemRoute from ddtrace import config -from ddtrace.contrib.asyncio import context_provider from ddtrace.ext import SpanTypes from ddtrace.ext import http from ddtrace.internal import core @@ -165,9 +164,6 @@ def trace_app(app, tracer, service="aiohttp-web"): "analytics_sample_rate": 1.0, } - # the tracer must work with asynchronous Context propagation - tracer._configure(context_provider=context_provider) - # add the async tracer middleware as a first middleware # and be sure that the on_prepare signal is the last one app.middlewares.insert(0, trace_middleware) diff --git a/ddtrace/contrib/internal/requests/patch.py b/ddtrace/contrib/internal/requests/patch.py index 6485bb7aed8..eab51c2c0a4 100644 --- a/ddtrace/contrib/internal/requests/patch.py +++ b/ddtrace/contrib/internal/requests/patch.py @@ -14,6 +14,7 @@ from ddtrace.trace import Pin from .connection import _wrap_send +from .session import TracedSession # requests default settings @@ -27,6 +28,10 @@ }, ) +# always patch our `TracedSession` when imported +_w(TracedSession, "send", _wrap_send) +Pin(_config=config.requests).onto(TracedSession) + def get_version(): # type: () -> str diff --git a/ddtrace/contrib/internal/requests/session.py b/ddtrace/contrib/internal/requests/session.py index 783dda4ff7a..eaa9c9e1be3 100644 --- a/ddtrace/contrib/internal/requests/session.py +++ b/ddtrace/contrib/internal/requests/session.py @@ -1,10 +1,4 @@ import requests -from wrapt import wrap_function_wrapper as _w - -from ddtrace import config -from ddtrace.trace import Pin - -from .connection import _wrap_send class TracedSession(requests.Session): @@ -14,8 +8,3 @@ class TracedSession(requests.Session): """ pass - - -# always patch our `TracedSession` when imported -_w(TracedSession, "send", _wrap_send) -Pin(_config=config.requests).onto(TracedSession) diff --git a/ddtrace/contrib/jinja2/constants.py b/ddtrace/contrib/jinja2/constants.py deleted file mode 100644 index 95f62db4948..00000000000 --- a/ddtrace/contrib/jinja2/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.jinja2.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/jinja2/patch.py b/ddtrace/contrib/jinja2/patch.py deleted file mode 100644 index 0571ce76584..00000000000 --- a/ddtrace/contrib/jinja2/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.jinja2.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/kafka/patch.py b/ddtrace/contrib/kafka/patch.py deleted file mode 100644 index 4d8f147b136..00000000000 --- a/ddtrace/contrib/kafka/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.kafka.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/kombu/constants.py b/ddtrace/contrib/kombu/constants.py deleted file mode 100644 index ee90cc3280e..00000000000 --- a/ddtrace/contrib/kombu/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.kombu.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/kombu/patch.py b/ddtrace/contrib/kombu/patch.py deleted file mode 100644 index f071da4a099..00000000000 --- a/ddtrace/contrib/kombu/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.kombu.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/kombu/utils.py b/ddtrace/contrib/kombu/utils.py deleted file mode 100644 index 3a36504d113..00000000000 --- a/ddtrace/contrib/kombu/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.kombu.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/langchain/constants.py b/ddtrace/contrib/langchain/constants.py deleted file mode 100644 index 278aec37d09..00000000000 --- a/ddtrace/contrib/langchain/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.langchain.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/langchain/patch.py b/ddtrace/contrib/langchain/patch.py deleted file mode 100644 index 8e5dea45caa..00000000000 --- a/ddtrace/contrib/langchain/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.langchain.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/langgraph/__init__.py b/ddtrace/contrib/langgraph/__init__.py deleted file mode 100644 index 4b3696ad803..00000000000 --- a/ddtrace/contrib/langgraph/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from ddtrace.internal.utils.importlib import require_modules - - -required_modules = ["langgraph"] - -with require_modules(required_modules) as missing_modules: - if not missing_modules: - from ddtrace.contrib.internal.langgraph.patch import get_version - from ddtrace.contrib.internal.langgraph.patch import patch - from ddtrace.contrib.internal.langgraph.patch import unpatch - - __all__ = ["patch", "unpatch", "get_version"] diff --git a/ddtrace/contrib/logbook/patch.py b/ddtrace/contrib/logbook/patch.py deleted file mode 100644 index 1974fe67c3d..00000000000 --- a/ddtrace/contrib/logbook/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.logbook.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/logging/constants.py b/ddtrace/contrib/logging/constants.py deleted file mode 100644 index 7a05621eacc..00000000000 --- a/ddtrace/contrib/logging/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.logging.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/logging/patch.py b/ddtrace/contrib/logging/patch.py deleted file mode 100644 index 9615ee75ecb..00000000000 --- a/ddtrace/contrib/logging/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.logging.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/loguru/patch.py b/ddtrace/contrib/loguru/patch.py deleted file mode 100644 index 55e9d26c596..00000000000 --- a/ddtrace/contrib/loguru/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.loguru.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/mako/constants.py b/ddtrace/contrib/mako/constants.py deleted file mode 100644 index 6ad269ab24e..00000000000 --- a/ddtrace/contrib/mako/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.mako.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/mako/patch.py b/ddtrace/contrib/mako/patch.py deleted file mode 100644 index 4bc20f9599b..00000000000 --- a/ddtrace/contrib/mako/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.mako.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/mariadb/patch.py b/ddtrace/contrib/mariadb/patch.py deleted file mode 100644 index 5ba40f90428..00000000000 --- a/ddtrace/contrib/mariadb/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.mariadb.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/molten/patch.py b/ddtrace/contrib/molten/patch.py deleted file mode 100644 index f629af73de9..00000000000 --- a/ddtrace/contrib/molten/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.molten.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/molten/wrappers.py b/ddtrace/contrib/molten/wrappers.py deleted file mode 100644 index e2b406b12e7..00000000000 --- a/ddtrace/contrib/molten/wrappers.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.molten.wrappers import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/mongoengine/patch.py b/ddtrace/contrib/mongoengine/patch.py deleted file mode 100644 index 13366feaf22..00000000000 --- a/ddtrace/contrib/mongoengine/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.mongoengine.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/mongoengine/trace.py b/ddtrace/contrib/mongoengine/trace.py deleted file mode 100644 index ad4da294cb3..00000000000 --- a/ddtrace/contrib/mongoengine/trace.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.mongoengine.trace import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/mysql/patch.py b/ddtrace/contrib/mysql/patch.py deleted file mode 100644 index cb347d404ec..00000000000 --- a/ddtrace/contrib/mysql/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.mysql.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/mysqldb/patch.py b/ddtrace/contrib/mysqldb/patch.py deleted file mode 100644 index 2c1c69ab8c2..00000000000 --- a/ddtrace/contrib/mysqldb/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.mysqldb.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/openai/_endpoint_hooks.py b/ddtrace/contrib/openai/_endpoint_hooks.py deleted file mode 100644 index daf356a9c7a..00000000000 --- a/ddtrace/contrib/openai/_endpoint_hooks.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.openai._endpoint_hooks import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/openai/patch.py b/ddtrace/contrib/openai/patch.py deleted file mode 100644 index 049313de0d0..00000000000 --- a/ddtrace/contrib/openai/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.openai.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/openai/utils.py b/ddtrace/contrib/openai/utils.py deleted file mode 100644 index 0e7e5f4ba87..00000000000 --- a/ddtrace/contrib/openai/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.openai.utils import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/psycopg/async_connection.py b/ddtrace/contrib/psycopg/async_connection.py deleted file mode 100644 index a9524778749..00000000000 --- a/ddtrace/contrib/psycopg/async_connection.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.psycopg.async_connection import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/psycopg/async_cursor.py b/ddtrace/contrib/psycopg/async_cursor.py deleted file mode 100644 index 937eac7c586..00000000000 --- a/ddtrace/contrib/psycopg/async_cursor.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.psycopg.async_cursor import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/psycopg/connection.py b/ddtrace/contrib/psycopg/connection.py deleted file mode 100644 index 5662cf5d854..00000000000 --- a/ddtrace/contrib/psycopg/connection.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.psycopg.connection import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/psycopg/cursor.py b/ddtrace/contrib/psycopg/cursor.py deleted file mode 100644 index f9140697015..00000000000 --- a/ddtrace/contrib/psycopg/cursor.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.psycopg.cursor import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/psycopg/extensions.py b/ddtrace/contrib/psycopg/extensions.py deleted file mode 100644 index b70af814b24..00000000000 --- a/ddtrace/contrib/psycopg/extensions.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.psycopg.extensions import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/psycopg/patch.py b/ddtrace/contrib/psycopg/patch.py deleted file mode 100644 index 0b37107fa50..00000000000 --- a/ddtrace/contrib/psycopg/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.psycopg.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pylibmc.py b/ddtrace/contrib/pylibmc.py new file mode 100644 index 00000000000..c894b1fa5e2 --- /dev/null +++ b/ddtrace/contrib/pylibmc.py @@ -0,0 +1,26 @@ +"""Instrument pylibmc to report Memcached queries. + +``import ddtrace.auto`` will automatically patch your pylibmc client to make it work. +:: + + # Be sure to import pylibmc and not pylibmc.Client directly, + # otherwise you won't have access to the patched version + from ddtrace import patch + from ddtrace.trace import Pin + import pylibmc + + # If not patched yet, you can patch pylibmc specifically + patch(pylibmc=True) + + # One client instrumented with default configuration + client = pylibmc.Client(["localhost:11211"] + client.set("key1", "value1") + + # Use a pin to specify metadata related to this client + Pin.override(client, service="memcached-sessions") +""" + +from ddtrace.contrib.internal.pylibmc.client import TracedClient + + +__all__ = ["TracedClient"] diff --git a/ddtrace/contrib/pylibmc/__init__.py b/ddtrace/contrib/pylibmc/__init__.py deleted file mode 100644 index 6c21eab770e..00000000000 --- a/ddtrace/contrib/pylibmc/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Instrument pylibmc to report Memcached queries. - -``import ddtrace.auto`` will automatically patch your pylibmc client to make it work. -:: - - # Be sure to import pylibmc and not pylibmc.Client directly, - # otherwise you won't have access to the patched version - from ddtrace import patch - from ddtrace.trace import Pin - import pylibmc - - # If not patched yet, you can patch pylibmc specifically - patch(pylibmc=True) - - # One client instrumented with default configuration - client = pylibmc.Client(["localhost:11211"] - client.set("key1", "value1") - - # Use a pin to specify metadata related to this client - Pin.override(client, service="memcached-sessions") -""" - - -# Required to allow users to import from `ddtrace.contrib.pylibmc.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - -from ddtrace.contrib.internal.pylibmc.client import TracedClient -from ddtrace.contrib.internal.pylibmc.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.pylibmc.patch import patch # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("patch", "get_version"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) - - -__all__ = ["TracedClient"] diff --git a/ddtrace/contrib/pylibmc/addrs.py b/ddtrace/contrib/pylibmc/addrs.py deleted file mode 100644 index cec17ea0032..00000000000 --- a/ddtrace/contrib/pylibmc/addrs.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pylibmc.addrs import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pylibmc/client.py b/ddtrace/contrib/pylibmc/client.py deleted file mode 100644 index a29cf27f2fc..00000000000 --- a/ddtrace/contrib/pylibmc/client.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pylibmc.client import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pylibmc/patch.py b/ddtrace/contrib/pylibmc/patch.py deleted file mode 100644 index b0f74bd2222..00000000000 --- a/ddtrace/contrib/pylibmc/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pylibmc.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pymemcache/client.py b/ddtrace/contrib/pymemcache/client.py deleted file mode 100644 index afe650a2295..00000000000 --- a/ddtrace/contrib/pymemcache/client.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pymemcache.client import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pymemcache/patch.py b/ddtrace/contrib/pymemcache/patch.py deleted file mode 100644 index 1242a1ae15a..00000000000 --- a/ddtrace/contrib/pymemcache/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pymemcache.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pymongo/client.py b/ddtrace/contrib/pymongo/client.py deleted file mode 100644 index 40b3738baaa..00000000000 --- a/ddtrace/contrib/pymongo/client.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pymongo.client import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pymongo/parse.py b/ddtrace/contrib/pymongo/parse.py deleted file mode 100644 index bba810a9eba..00000000000 --- a/ddtrace/contrib/pymongo/parse.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pymongo.parse import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pymongo/patch.py b/ddtrace/contrib/pymongo/patch.py deleted file mode 100644 index 004c33d96b7..00000000000 --- a/ddtrace/contrib/pymongo/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pymongo.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pymysql/patch.py b/ddtrace/contrib/pymysql/patch.py deleted file mode 100644 index 2c2ac5358ca..00000000000 --- a/ddtrace/contrib/pymysql/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pymysql.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pynamodb/patch.py b/ddtrace/contrib/pynamodb/patch.py deleted file mode 100644 index d31d5b39bbb..00000000000 --- a/ddtrace/contrib/pynamodb/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pynamodb.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pyodbc/patch.py b/ddtrace/contrib/pyodbc/patch.py deleted file mode 100644 index 8609aeb12c9..00000000000 --- a/ddtrace/contrib/pyodbc/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pyodbc.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pyramid/__init__.py b/ddtrace/contrib/pyramid.py similarity index 60% rename from ddtrace/contrib/pyramid/__init__.py rename to ddtrace/contrib/pyramid.py index 87aab191815..d608a83fc3e 100644 --- a/ddtrace/contrib/pyramid/__init__.py +++ b/ddtrace/contrib/pyramid.py @@ -39,38 +39,9 @@ :ref:`All HTTP tags ` are supported for this integration. """ - - -# Required to allow users to import from `ddtrace.contrib.pyramid.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.pyramid.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.pyramid.patch import patch # noqa: F401 from ddtrace.contrib.internal.pyramid.trace import includeme from ddtrace.contrib.internal.pyramid.trace import trace_pyramid from ddtrace.contrib.internal.pyramid.trace import trace_tween_factory -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("patch", "get_version"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["trace_pyramid", "trace_tween_factory", "includeme"] diff --git a/ddtrace/contrib/pyramid/constants.py b/ddtrace/contrib/pyramid/constants.py deleted file mode 100644 index f1ec8ea0480..00000000000 --- a/ddtrace/contrib/pyramid/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pyramid.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pyramid/patch.py b/ddtrace/contrib/pyramid/patch.py deleted file mode 100644 index 993facea9a9..00000000000 --- a/ddtrace/contrib/pyramid/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pyramid.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pyramid/trace.py b/ddtrace/contrib/pyramid/trace.py deleted file mode 100644 index c58b572b0ee..00000000000 --- a/ddtrace/contrib/pyramid/trace.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pyramid.trace import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pytest/constants.py b/ddtrace/contrib/pytest/constants.py deleted file mode 100644 index 695c48e5b95..00000000000 --- a/ddtrace/contrib/pytest/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pytest.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pytest/newhooks.py b/ddtrace/contrib/pytest/newhooks.py deleted file mode 100644 index b54e146fde9..00000000000 --- a/ddtrace/contrib/pytest/newhooks.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pytest.newhooks import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pytest/plugin.py b/ddtrace/contrib/pytest/plugin.py deleted file mode 100644 index 05002fc74d4..00000000000 --- a/ddtrace/contrib/pytest/plugin.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pytest.plugin import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pytest_bdd/constants.py b/ddtrace/contrib/pytest_bdd/constants.py deleted file mode 100644 index 9c2e907debd..00000000000 --- a/ddtrace/contrib/pytest_bdd/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pytest_bdd.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pytest_bdd/plugin.py b/ddtrace/contrib/pytest_bdd/plugin.py deleted file mode 100644 index 88645368d38..00000000000 --- a/ddtrace/contrib/pytest_bdd/plugin.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pytest_bdd.plugin import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pytest_benchmark/__init__.py b/ddtrace/contrib/pytest_benchmark/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ddtrace/contrib/pytest_benchmark/constants.py b/ddtrace/contrib/pytest_benchmark/constants.py deleted file mode 100644 index 522f664d4b8..00000000000 --- a/ddtrace/contrib/pytest_benchmark/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pytest_benchmark.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/pytest_benchmark/plugin.py b/ddtrace/contrib/pytest_benchmark/plugin.py deleted file mode 100644 index 7a33bbf838d..00000000000 --- a/ddtrace/contrib/pytest_benchmark/plugin.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.pytest_benchmark.plugin import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/redis/asyncio_patch.py b/ddtrace/contrib/redis/asyncio_patch.py deleted file mode 100644 index f46f432e205..00000000000 --- a/ddtrace/contrib/redis/asyncio_patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.redis.asyncio_patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/redis/patch.py b/ddtrace/contrib/redis/patch.py deleted file mode 100644 index 972c1a4320d..00000000000 --- a/ddtrace/contrib/redis/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.redis.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/redis_utils.py b/ddtrace/contrib/redis_utils.py deleted file mode 100644 index 08012fb2c65..00000000000 --- a/ddtrace/contrib/redis_utils.py +++ /dev/null @@ -1 +0,0 @@ -from ddtrace.contrib.internal.redis_utils import * # noqa: F403 diff --git a/ddtrace/contrib/rediscluster/patch.py b/ddtrace/contrib/rediscluster/patch.py deleted file mode 100644 index 88a20183ebd..00000000000 --- a/ddtrace/contrib/rediscluster/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.rediscluster.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/requests/__init__.py b/ddtrace/contrib/requests.py similarity index 62% rename from ddtrace/contrib/requests/__init__.py rename to ddtrace/contrib/requests.py index 7d034ce56bf..2f289a467e8 100644 --- a/ddtrace/contrib/requests/__init__.py +++ b/ddtrace/contrib/requests.py @@ -71,37 +71,7 @@ session = Session() Pin.override(session, service='auth-api') """ - - -# Required to allow users to import from `ddtrace.contrib.requests.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.requests.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.requests.patch import patch # noqa: F401 -from ddtrace.contrib.internal.requests.patch import unpatch # noqa: F401 -from ddtrace.contrib.internal.requests.session import TracedSession -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("patch", "unpatch", "get_version"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) +from ddtrace.contrib.internal.requests.patch import TracedSession __all__ = ["TracedSession"] diff --git a/ddtrace/contrib/requests/connection.py b/ddtrace/contrib/requests/connection.py deleted file mode 100644 index f1bbc7e1a84..00000000000 --- a/ddtrace/contrib/requests/connection.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.requests.connection import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/requests/constants.py b/ddtrace/contrib/requests/constants.py deleted file mode 100644 index ef871029e45..00000000000 --- a/ddtrace/contrib/requests/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.requests.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/requests/patch.py b/ddtrace/contrib/requests/patch.py deleted file mode 100644 index f16bf99900d..00000000000 --- a/ddtrace/contrib/requests/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.requests.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/requests/session.py b/ddtrace/contrib/requests/session.py deleted file mode 100644 index 866662a6c34..00000000000 --- a/ddtrace/contrib/requests/session.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.requests.session import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/sanic/patch.py b/ddtrace/contrib/sanic/patch.py deleted file mode 100644 index b6a2468f0d1..00000000000 --- a/ddtrace/contrib/sanic/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.sanic.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/snowflake/patch.py b/ddtrace/contrib/snowflake/patch.py deleted file mode 100644 index b18dc288250..00000000000 --- a/ddtrace/contrib/snowflake/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.snowflake.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/sqlalchemy.py b/ddtrace/contrib/sqlalchemy.py new file mode 100644 index 00000000000..04bffa87b85 --- /dev/null +++ b/ddtrace/contrib/sqlalchemy.py @@ -0,0 +1,26 @@ +""" +Enabling the SQLAlchemy integration is only necessary if there is no +instrumentation available or enabled for the underlying database engine (e.g. +pymysql, psycopg, mysql-connector, etc.). + +To trace sqlalchemy queries, add instrumentation to the engine class +using the patch method that **must be called before** importing sqlalchemy:: + + # patch before importing `create_engine` + from ddtrace import patch + from ddtrace.trace import Pin + patch(sqlalchemy=True) + + # use SQLAlchemy as usual + from sqlalchemy import create_engine + + engine = create_engine('sqlite:///:memory:') + engine.connect().execute("SELECT COUNT(*) FROM users") + + # Use a PIN to specify metadata related to this engine + Pin.override(engine, service='replica-db') +""" +from ddtrace.contrib.internal.sqlalchemy.engine import trace_engine + + +__all__ = ["trace_engine"] diff --git a/ddtrace/contrib/sqlalchemy/__init__.py b/ddtrace/contrib/sqlalchemy/__init__.py deleted file mode 100644 index c9b0f47715b..00000000000 --- a/ddtrace/contrib/sqlalchemy/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Enabling the SQLAlchemy integration is only necessary if there is no -instrumentation available or enabled for the underlying database engine (e.g. -pymysql, psycopg, mysql-connector, etc.). - -To trace sqlalchemy queries, add instrumentation to the engine class -using the patch method that **must be called before** importing sqlalchemy:: - - # patch before importing `create_engine` - from ddtrace import patch - from ddtrace.trace import Pin - patch(sqlalchemy=True) - - # use SQLAlchemy as usual - from sqlalchemy import create_engine - - engine = create_engine('sqlite:///:memory:') - engine.connect().execute("SELECT COUNT(*) FROM users") - - # Use a PIN to specify metadata related to this engine - Pin.override(engine, service='replica-db') -""" - - -# Required to allow users to import from `ddtrace.contrib.sqlalchemy.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.sqlalchemy.engine import trace_engine -from ddtrace.contrib.internal.sqlalchemy.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.sqlalchemy.patch import patch # noqa: F401 -from ddtrace.contrib.internal.sqlalchemy.patch import unpatch # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("patch", "unpatch", "get_version"): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Avoid using this package directly. " - "Set DD_TRACE_SQLALCHEMY_ENABLED=true and use ``import ddtrace.auto`` or the " - "``ddtrace-run`` command to enable and configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) - - -__all__ = ["trace_engine"] diff --git a/ddtrace/contrib/sqlalchemy/engine.py b/ddtrace/contrib/sqlalchemy/engine.py deleted file mode 100644 index 4496b74b479..00000000000 --- a/ddtrace/contrib/sqlalchemy/engine.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.sqlalchemy.engine import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/sqlalchemy/patch.py b/ddtrace/contrib/sqlalchemy/patch.py deleted file mode 100644 index 511637534e2..00000000000 --- a/ddtrace/contrib/sqlalchemy/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.sqlalchemy.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/sqlite3/patch.py b/ddtrace/contrib/sqlite3/patch.py deleted file mode 100644 index 1d1d3daf726..00000000000 --- a/ddtrace/contrib/sqlite3/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.sqlite3.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/starlette/patch.py b/ddtrace/contrib/starlette/patch.py deleted file mode 100644 index 0c85c3ff44a..00000000000 --- a/ddtrace/contrib/starlette/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.starlette.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/structlog/patch.py b/ddtrace/contrib/structlog/patch.py deleted file mode 100644 index 2f346e88f18..00000000000 --- a/ddtrace/contrib/structlog/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.structlog.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/subprocess/constants.py b/ddtrace/contrib/subprocess/constants.py deleted file mode 100644 index 29562e61200..00000000000 --- a/ddtrace/contrib/subprocess/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.subprocess.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/subprocess/patch.py b/ddtrace/contrib/subprocess/patch.py deleted file mode 100644 index 99510d5761c..00000000000 --- a/ddtrace/contrib/subprocess/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.subprocess.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/tornado/__init__.py b/ddtrace/contrib/tornado.py similarity index 89% rename from ddtrace/contrib/tornado/__init__.py rename to ddtrace/contrib/tornado.py index 1c0caf3366d..dc231fce60d 100644 --- a/ddtrace/contrib/tornado/__init__.py +++ b/ddtrace/contrib/tornado.py @@ -97,19 +97,6 @@ def log_exception(self, typ, value, tb): * ``agent_port`` (default: `8126`): define the port of the APM agent. * ``settings`` (default: ``{}``): Tracer extra settings used to change, for instance, the filtering behavior. """ - -# Required to allow users to import from `ddtrace.contrib.tornado.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.tornado.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.tornado.patch import patch # noqa: F401 -from ddtrace.contrib.internal.tornado.patch import unpatch # noqa: F401 from ddtrace.contrib.internal.tornado.stack_context import TracerStackContext from ddtrace.contrib.internal.tornado.stack_context import context_provider from ddtrace.contrib.internal.tornado.stack_context import run_with_trace_context diff --git a/ddtrace/contrib/tornado/application.py b/ddtrace/contrib/tornado/application.py deleted file mode 100644 index 4faf81a95cc..00000000000 --- a/ddtrace/contrib/tornado/application.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.tornado.application import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/tornado/constants.py b/ddtrace/contrib/tornado/constants.py deleted file mode 100644 index 861f9dd5b29..00000000000 --- a/ddtrace/contrib/tornado/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.tornado.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/tornado/decorators.py b/ddtrace/contrib/tornado/decorators.py deleted file mode 100644 index 4f3811ebfc8..00000000000 --- a/ddtrace/contrib/tornado/decorators.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.tornado.decorators import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/tornado/handlers.py b/ddtrace/contrib/tornado/handlers.py deleted file mode 100644 index 0256c401a7a..00000000000 --- a/ddtrace/contrib/tornado/handlers.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.tornado.handlers import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/tornado/patch.py b/ddtrace/contrib/tornado/patch.py deleted file mode 100644 index ff967a982d4..00000000000 --- a/ddtrace/contrib/tornado/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.tornado.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/tornado/stack_context.py b/ddtrace/contrib/tornado/stack_context.py deleted file mode 100644 index 9a1245b3afc..00000000000 --- a/ddtrace/contrib/tornado/stack_context.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.tornado.stack_context import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/tornado/template.py b/ddtrace/contrib/tornado/template.py deleted file mode 100644 index a4cdabd27b0..00000000000 --- a/ddtrace/contrib/tornado/template.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.tornado.template import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/trace_utils_async.py b/ddtrace/contrib/trace_utils_async.py deleted file mode 100644 index 46d4e8762a3..00000000000 --- a/ddtrace/contrib/trace_utils_async.py +++ /dev/null @@ -1 +0,0 @@ -from ddtrace.contrib.internal.trace_utils_async import * # noqa: F403 diff --git a/ddtrace/contrib/trace_utils_redis.py b/ddtrace/contrib/trace_utils_redis.py deleted file mode 100644 index b8aff5eef23..00000000000 --- a/ddtrace/contrib/trace_utils_redis.py +++ /dev/null @@ -1,9 +0,0 @@ -from ddtrace.contrib.internal.redis_utils import determine_row_count -from ddtrace.contrib.internal.redis_utils import stringify_cache_args - - -format_command_args = stringify_cache_args - - -def determine_row_count(redis_command, span, result): # noqa: F811 - determine_row_count(redis_command=redis_command, result=result) diff --git a/ddtrace/contrib/unittest/constants.py b/ddtrace/contrib/unittest/constants.py deleted file mode 100644 index fc8643d5e06..00000000000 --- a/ddtrace/contrib/unittest/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.unittest.constants import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/unittest/patch.py b/ddtrace/contrib/unittest/patch.py deleted file mode 100644 index 277b3b421c6..00000000000 --- a/ddtrace/contrib/unittest/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.unittest.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/urllib/__init__.py b/ddtrace/contrib/urllib/__init__.py deleted file mode 100644 index bc9fae37949..00000000000 --- a/ddtrace/contrib/urllib/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Trace the standard library ``urllib.request`` library to trace -HTTP requests and detect SSRF vulnerabilities. It is enabled by default -if ``DD_IAST_ENABLED`` is set to ``True`` (for detecting sink points) and/or -``DD_ASM_ENABLED`` is set to ``True`` (for exploit prevention). -""" - - -# Required to allow users to import from `ddtrace.contrib.urllib.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.urllib.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.urllib.patch import patch # noqa: F401 -from ddtrace.contrib.internal.urllib.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/urllib/patch.py b/ddtrace/contrib/urllib/patch.py deleted file mode 100644 index 033916e6e46..00000000000 --- a/ddtrace/contrib/urllib/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.urllib.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/urllib3/patch.py b/ddtrace/contrib/urllib3/patch.py deleted file mode 100644 index 01d775de390..00000000000 --- a/ddtrace/contrib/urllib3/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.urllib3.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/vertica/patch.py b/ddtrace/contrib/vertica/patch.py deleted file mode 100644 index 0cdbe6cd956..00000000000 --- a/ddtrace/contrib/vertica/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.vertica.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/webbrowser/__init__.py b/ddtrace/contrib/webbrowser/__init__.py deleted file mode 100644 index 74160b052e3..00000000000 --- a/ddtrace/contrib/webbrowser/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Trace the standard library ``webbrowser`` library to trace -HTTP requests and detect SSRF vulnerabilities. It is enabled by default -if ``DD_IAST_ENABLED`` is set to ``True`` (for detecting sink points) and/or -``DD_ASM_ENABLED`` is set to ``True`` (for exploit prevention). -""" - - -# Required to allow users to import from `ddtrace.contrib.webbrowser.patch` directly -import warnings as _w - - -with _w.catch_warnings(): - _w.simplefilter("ignore", DeprecationWarning) - from . import patch as _ # noqa: F401, I001 - - -from ddtrace.contrib.internal.webbrowser.patch import get_version # noqa: F401 -from ddtrace.contrib.internal.webbrowser.patch import patch # noqa: F401 -from ddtrace.contrib.internal.webbrowser.patch import unpatch # noqa: F401 diff --git a/ddtrace/contrib/webbrowser/patch.py b/ddtrace/contrib/webbrowser/patch.py deleted file mode 100644 index 03dfb3b14cf..00000000000 --- a/ddtrace/contrib/webbrowser/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.webbrowser.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/wsgi/__init__.py b/ddtrace/contrib/wsgi.py similarity index 56% rename from ddtrace/contrib/wsgi/__init__.py rename to ddtrace/contrib/wsgi.py index 9e674993be3..94f44fbb9df 100644 --- a/ddtrace/contrib/wsgi/__init__.py +++ b/ddtrace/contrib/wsgi.py @@ -37,23 +37,6 @@ """ from ddtrace.contrib.internal.wsgi.wsgi import DDWSGIMiddleware -from ddtrace.contrib.internal.wsgi.wsgi import get_version # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - if name in ("get_version",): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to configure this integration.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) __all__ = ["DDWSGIMiddleware"] diff --git a/ddtrace/contrib/wsgi/wsgi.py b/ddtrace/contrib/wsgi/wsgi.py deleted file mode 100644 index e2f1f6bcea4..00000000000 --- a/ddtrace/contrib/wsgi/wsgi.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.wsgi.wsgi import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/contrib/yaaredis/patch.py b/ddtrace/contrib/yaaredis/patch.py deleted file mode 100644 index 83b8fe0a468..00000000000 --- a/ddtrace/contrib/yaaredis/patch.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace.contrib.internal.yaaredis.patch import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst index ca55d55e4ca..5fe21321680 100644 --- a/docs/advanced_usage.rst +++ b/docs/advanced_usage.rst @@ -371,7 +371,7 @@ the pipeline or ``None`` if the trace should be discarded:: Logs Injection -------------- -.. automodule:: ddtrace.contrib.logging +.. automodule:: ddtrace.contrib._logging .. _http-tagging: diff --git a/docs/integrations.rst b/docs/integrations.rst index 62e096aa668..0566ab7fa9c 100644 --- a/docs/integrations.rst +++ b/docs/integrations.rst @@ -7,27 +7,27 @@ Integrations aiobotocore ^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.aiobotocore +.. automodule:: ddtrace.contrib._aiobotocore .. _aiopg: aiopg ^^^^^ -.. automodule:: ddtrace.contrib.aiopg +.. automodule:: ddtrace.contrib._aiopg .. _algoliasearch: algoliasearch ^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.algoliasearch +.. automodule:: ddtrace.contrib._algoliasearch .. _aredis: aredis ^^^^^^ -.. automodule:: ddtrace.contrib.aredis +.. automodule:: ddtrace.contrib._aredis .. _asgi: @@ -45,49 +45,49 @@ aiohttp aiomysql ^^^^^^^^ -.. automodule:: ddtrace.contrib.aiomysql +.. automodule:: ddtrace.contrib._aiomysql .. _aiohttp_jinja2: aiohttp_jinja2 ^^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.aiohttp_jinja2 +.. automodule:: ddtrace.contrib._aiohttp_jinja2 .. _anthropic: anthropic ^^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.anthropic +.. automodule:: ddtrace.contrib._anthropic .. _asyncio: asyncio ^^^^^^^ -.. automodule:: ddtrace.contrib.asyncio +.. automodule:: ddtrace.contrib._asyncio .. _asyncpg: asyncpg ^^^^^^^ -.. automodule:: ddtrace.contrib.asyncpg +.. automodule:: ddtrace.contrib._asyncpg .. _botocore: botocore ^^^^^^^^ -.. automodule:: ddtrace.contrib.botocore +.. automodule:: ddtrace.contrib._botocore .. _boto2: boto2 ^^^^^ -.. automodule:: ddtrace.contrib.boto +.. automodule:: ddtrace.contrib._boto .. _bottle: @@ -101,7 +101,7 @@ Bottle Cassandra ^^^^^^^^^ -.. automodule:: ddtrace.contrib.cassandra +.. automodule:: ddtrace.contrib._cassandra .. _celery: @@ -122,14 +122,14 @@ CherryPy Consul ^^^^^^ -.. automodule:: ddtrace.contrib.consul +.. automodule:: ddtrace.contrib._consul .. _datadog_lambda: Datadog Lambda ^^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.aws_lambda +.. automodule:: ddtrace.contrib._aws_lambda .. _djangorestframework: @@ -137,21 +137,21 @@ Datadog Lambda Django ^^^^^^ -.. automodule:: ddtrace.contrib.django +.. automodule:: ddtrace.contrib._django .. _dogpile.cache: dogpile.cache ^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.dogpile_cache +.. automodule:: ddtrace.contrib._dogpile_cache .. _elasticsearch: Elasticsearch ^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.elasticsearch +.. automodule:: ddtrace.contrib._elasticsearch .. _falcon: @@ -165,14 +165,14 @@ Falcon Fastapi ^^^^^^^^^ -.. automodule:: ddtrace.contrib.fastapi +.. automodule:: ddtrace.contrib._fastapi .. _flask: Flask ^^^^^ -.. automodule:: ddtrace.contrib.flask +.. automodule:: ddtrace.contrib._flask .. _flask_cache: @@ -186,128 +186,128 @@ Flask Cache futures ^^^^^^^ -.. automodule:: ddtrace.contrib.futures +.. automodule:: ddtrace.contrib._futures .. _gevent: gevent ^^^^^^ -.. automodule:: ddtrace.contrib.gevent +.. automodule:: ddtrace.contrib._gevent .. _google_generativeai: google-generativeai ^^^^^^^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.google_generativeai +.. automodule:: ddtrace.contrib._google_generativeai .. _graphql: graphql ^^^^^^^ -.. automodule:: ddtrace.contrib.graphql +.. automodule:: ddtrace.contrib._graphql .. _grpc: Grpc ^^^^ -.. automodule:: ddtrace.contrib.grpc +.. automodule:: ddtrace.contrib._grpc .. _gunicorn: gunicorn ^^^^^^^^ -.. automodule:: ddtrace.contrib.gunicorn +.. automodule:: ddtrace.contrib._gunicorn .. _httplib: httplib ^^^^^^^ -.. automodule:: ddtrace.contrib.httplib +.. automodule:: ddtrace.contrib._httplib .. _httpx: httpx ^^^^^ -.. automodule:: ddtrace.contrib.httpx +.. automodule:: ddtrace.contrib._httpx .. _jinja2: Jinja2 ^^^^^^ -.. automodule:: ddtrace.contrib.jinja2 +.. automodule:: ddtrace.contrib._jinja2 .. _kafka: Kafka ^^^^^ -.. automodule:: ddtrace.contrib.kafka +.. automodule:: ddtrace.contrib._kafka .. _kombu: kombu ^^^^^ -.. automodule:: ddtrace.contrib.kombu +.. automodule:: ddtrace.contrib._kombu .. _langchain: LangChain ^^^^^^^^^ -.. automodule:: ddtrace.contrib.langchain +.. automodule:: ddtrace.contrib._langchain .. _logbook: Logbook ^^^^^^^^^ -.. automodule:: ddtrace.contrib.logbook +.. automodule:: ddtrace.contrib._logbook .. _loguru: Loguru ^^^^^^^^^ -.. automodule:: ddtrace.contrib.loguru +.. automodule:: ddtrace.contrib._loguru .. _mako: Mako ^^^^ -.. automodule:: ddtrace.contrib.mako +.. automodule:: ddtrace.contrib._mako .. _mariadb: MariaDB ^^^^^^^ -.. automodule:: ddtrace.contrib.mariadb +.. automodule:: ddtrace.contrib._mariadb .. _molten: Molten ^^^^^^ -.. automodule:: ddtrace.contrib.molten +.. automodule:: ddtrace.contrib._molten .. _mongoengine: Mongoengine ^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.mongoengine +.. automodule:: ddtrace.contrib._mongoengine .. _mysql-connector: mysql-connector ^^^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.mysql +.. automodule:: ddtrace.contrib._mysql .. _mysqlclient: @@ -315,14 +315,14 @@ mysql-connector mysqlclient ^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.mysqldb +.. automodule:: ddtrace.contrib._mysqldb .. _openai: OpenAI ^^^^^^ -.. automodule:: ddtrace.contrib.openai +.. automodule:: ddtrace.contrib._openai .. _pylibmc: @@ -336,35 +336,35 @@ pylibmc PynamoDB ^^^^^^^^ -.. automodule:: ddtrace.contrib.pynamodb +.. automodule:: ddtrace.contrib._pynamodb .. _pyodbc: PyODBC ^^^^^^^^ -.. automodule:: ddtrace.contrib.pyodbc +.. automodule:: ddtrace.contrib._pyodbc .. _pymemcache: pymemcache ^^^^^^^^^^ -.. automodule:: ddtrace.contrib.pymemcache +.. automodule:: ddtrace.contrib._pymemcache .. _pymongo: Pymongo ^^^^^^^ -.. automodule:: ddtrace.contrib.pymongo +.. automodule:: ddtrace.contrib._pymongo .. _pymysql: pymysql ^^^^^^^ -.. automodule:: ddtrace.contrib.pymysql +.. automodule:: ddtrace.contrib._pymysql .. _pyramid: @@ -378,34 +378,34 @@ Pyramid pytest ^^^^^^ -.. automodule:: ddtrace.contrib.pytest +.. automodule:: ddtrace.contrib._pytest .. _pytest_bdd: pytest-bdd ^^^^^^^^^^ -.. automodule:: ddtrace.contrib.pytest_bdd +.. automodule:: ddtrace.contrib._pytest_bdd .. _psycopg: psycopg ^^^^^^^ -.. automodule:: ddtrace.contrib.psycopg +.. automodule:: ddtrace.contrib._psycopg .. _redis: redis ^^^^^ -.. automodule:: ddtrace.contrib.redis +.. automodule:: ddtrace.contrib._redis .. _rediscluster: redis-py-cluster ^^^^^^^^^^^^^^^^ -.. automodule:: ddtrace.contrib.rediscluster +.. automodule:: ddtrace.contrib._rediscluster .. _requests: @@ -419,35 +419,35 @@ Requests RQ ^^^^^^^^ -.. automodule:: ddtrace.contrib.rq +.. automodule:: ddtrace.contrib._rq .. _sanic: Sanic ^^^^^ -.. automodule:: ddtrace.contrib.sanic +.. automodule:: ddtrace.contrib._sanic .. _snowflake: Snowflake ^^^^^^^^^ -.. automodule:: ddtrace.contrib.snowflake +.. automodule:: ddtrace.contrib._snowflake .. _starlette: Starlette ^^^^^^^^^ -.. automodule:: ddtrace.contrib.starlette +.. automodule:: ddtrace.contrib._starlette .. _structlog: Structlog ^^^^^^^^^ -.. automodule:: ddtrace.contrib.structlog +.. automodule:: ddtrace.contrib._structlog .. _sqlalchemy: @@ -461,7 +461,7 @@ SQLAlchemy SQLite ^^^^^^ -.. automodule:: ddtrace.contrib.sqlite3 +.. automodule:: ddtrace.contrib._sqlite3 .. _tornado: @@ -475,34 +475,34 @@ Tornado unittest ^^^^^^^^ -.. automodule:: ddtrace.contrib.unittest +.. automodule:: ddtrace.contrib._unittest .. _urllib3: urllib3 ^^^^^^^ -.. automodule:: ddtrace.contrib.urllib3 +.. automodule:: ddtrace.contrib._urllib3 .. _vertexai: vertexai ^^^^^^^^ -.. automodule:: ddtrace.contrib.vertexai +.. automodule:: ddtrace.contrib._vertexai .. _vertica: Vertica ^^^^^^^ -.. automodule:: ddtrace.contrib.vertica +.. automodule:: ddtrace.contrib._vertica .. _yaaredis: yaaredis ^^^^^^^^ -.. automodule:: ddtrace.contrib.yaaredis +.. automodule:: ddtrace.contrib._yaaredis .. _wsgi: diff --git a/releasenotes/notes/remove-deprecated-code-integrations-ae6970bbf9b10047.yaml b/releasenotes/notes/remove-deprecated-code-integrations-ae6970bbf9b10047.yaml new file mode 100644 index 00000000000..8b007a636d4 --- /dev/null +++ b/releasenotes/notes/remove-deprecated-code-integrations-ae6970bbf9b10047.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + integrations: Removes deprecated interfaces from all integrations. \ No newline at end of file diff --git a/tests/appsec/integrations/django_tests/django_app/settings.py b/tests/appsec/integrations/django_tests/django_app/settings.py index 9464c37fd43..836c7602c5f 100644 --- a/tests/appsec/integrations/django_tests/django_app/settings.py +++ b/tests/appsec/integrations/django_tests/django_app/settings.py @@ -4,12 +4,7 @@ from tests.webclient import PingFilter -tracer.configure( - settings={ - "FILTERS": [PingFilter()], - } -) - +tracer._configure(trace_processors=[PingFilter()]) ALLOWED_HOSTS = [ "testserver", diff --git a/tests/appsec/suitespec.yml b/tests/appsec/suitespec.yml index 8f10e3ddee7..3ee0afdb8c5 100644 --- a/tests/appsec/suitespec.yml +++ b/tests/appsec/suitespec.yml @@ -6,10 +6,10 @@ components: appsec_iast: - ddtrace/appsec/iast/* urllib: - - ddtrace/contrib/urllib/* + - ddtrace/contrib/_urllib.py - ddtrace/contrib/internal/urllib/* webbrowser: - - ddtrace/contrib/webbrowser/* + - ddtrace/contrib/_webbrowser.py - ddtrace/contrib/internal/webbrowser/* suites: appsec: diff --git a/tests/ci_visibility/suitespec.yml b/tests/ci_visibility/suitespec.yml index 9012ced61d8..46e524e9f4d 100644 --- a/tests/ci_visibility/suitespec.yml +++ b/tests/ci_visibility/suitespec.yml @@ -7,14 +7,14 @@ components: dd_coverage: - ddtrace/internal/coverage/* pytest: - - ddtrace/contrib/pytest/* - - ddtrace/contrib/pytest_bdd/* - - ddtrace/contrib/pytest_benchmark/* + - ddtrace/contrib/_pytest.py + - ddtrace/contrib/_pytest_bdd.py + - ddtrace/contrib/_pytest_benchmark.py selenium: - - ddtrace/contrib/selenium/* + - ddtrace/contrib/_selenium.py - ddtrace/contrib/internal/selenium/* unittest: - - ddtrace/contrib/unittest/* + - ddtrace/contrib/_unittest.py suites: ci_visibility: parallelism: 4 diff --git a/tests/contrib/suitespec.yml b/tests/contrib/suitespec.yml index 40a677109fc..366e28aaaf9 100644 --- a/tests/contrib/suitespec.yml +++ b/tests/contrib/suitespec.yml @@ -1,60 +1,61 @@ --- components: aiohttp: - - ddtrace/contrib/aiohttp/* + - ddtrace/contrib/aiohttp.py - ddtrace/contrib/internal/aiohttp/* - - ddtrace/contrib/aiohttp_jinja2/* + - ddtrace/contrib/_aiohttp_jinja2.py - ddtrace/contrib/internal/aiohttp_jinja2/* aiopg: - - ddtrace/contrib/aiopg/* + - ddtrace/contrib/_aiopg.py - ddtrace/contrib/internal/aiopg/* algoliasearch: - - ddtrace/contrib/algoliasearch/* + - ddtrace/contrib/_algoliasearch.py - ddtrace/contrib/internal/algoliasearch/* asgi: - - ddtrace/contrib/asgi/* + - ddtrace/contrib/asgi.py - ddtrace/contrib/internal/asgi/* asyncio: - - ddtrace/contrib/asyncio/* + - ddtrace/contrib/_asyncio.py avro: - - ddtrace/contrib/avro/* + - ddtrace/contrib/_avro.py - ddtrace/contrib/internal/avro/* aws_lambda: - - ddtrace/contrib/aws_lambda/* + - ddtrace/contrib/_aws_lambda.py - ddtrace/contrib/internal/aws_lambda/* - ddtrace/ext/aws.py azure_functions: - - ddtrace/contrib/azure_functions/* + - ddtrace/contrib/_azure_functions.py - ddtrace/contrib/internal/azure_functions/* botocore: - - ddtrace/contrib/botocore/* + - ddtrace/contrib/_botocore.py - ddtrace/contrib/internal/botocore/* - - ddtrace/contrib/boto/* + - ddtrace/contrib/_boto.py - ddtrace/contrib/internal/boto/* - - ddtrace/contrib/aiobotocore/* + - ddtrace/contrib/_aiobotocore.py - ddtrace/contrib/internal/aiobotocore/* bottle: - - ddtrace/contrib/bottle/* + - ddtrace/contrib/bottle.py - ddtrace/contrib/internal/bottle/* cassandra: - - ddtrace/contrib/cassandra/* + - ddtrace/contrib/_cassandra.py - ddtrace/contrib/internal/cassandra/* - ddtrace/ext/cassandra.py celery: - - ddtrace/contrib/celery/* + - ddtrace/contrib/celery.py - ddtrace/contrib/internal/celery/* cherrypy: - - ddtrace/contrib/cherrypy/* + - ddtrace/contrib/cherrypy.py - ddtrace/contrib/internal/cherrypy/* consul: - - ddtrace/contrib/consul/* + - ddtrace/contrib/_consul.py - ddtrace/contrib/internal/consul/* - ddtrace/ext/consul.py contrib: - ddtrace/contrib/__init__.py - ddtrace/contrib/trace_utils.py - - ddtrace/contrib/trace_utils_async.py - - ddtrace/contrib/internal/* + - ddtrace/contrib/internal/trace_utils_async.py + - ddtrace/contrib/internal/trace_utils.py + - ddtrace/contrib/internal/redis_utils.py - ddtrace/ext/__init__.py - ddtrace/ext/http.py - ddtrace/ext/net.py @@ -69,182 +70,180 @@ components: - tests/contrib/__init__.py - tests/contrib/suitespec.yml coverage: - - ddtrace/contrib/coverage/* + - ddtrace/contrib/_coverage.py - ddtrace/contrib/internal/coverage/* dbapi: - - ddtrace/contrib/dbapi/* - - ddtrace/contrib/dbapi_async/* + - ddtrace/contrib/dbapi.py + - ddtrace/contrib/dbapi_async.py - ddtrace/ext/db.py django: - - ddtrace/contrib/django/* + - ddtrace/contrib/_django.py - ddtrace/contrib/internal/django/* dogpile_cache: - - ddtrace/contrib/dogpile_cache/* + - ddtrace/contrib/_dogpile_cache.py - ddtrace/contrib/internal/dogpile_cache/* dramatiq: - - ddtrace/contrib/dramatiq/* + - ddtrace/contrib/_dramatiq.py - ddtrace/contrib/internal/dramatiq/* elasticsearch: - - ddtrace/contrib/elasticsearch/* + - ddtrace/contrib/_elasticsearch.py - ddtrace/contrib/internal/elasticsearch/* - ddtrace/ext/elasticsearch.py falcon: - - ddtrace/contrib/falcon/* + - ddtrace/contrib/falcon.py - ddtrace/contrib/internal/falcon/* fastapi: - - ddtrace/contrib/fastapi/* + - ddtrace/contrib/_fastapi.py - ddtrace/contrib/internal/fastapi/* flask: - - ddtrace/contrib/flask/* + - ddtrace/contrib/_flask.py - ddtrace/contrib/internal/flask/* - - ddtrace/contrib/flask_cache/* + - ddtrace/contrib/flask_cache.py - ddtrace/contrib/internal/flask_cache/* - - ddtrace/contrib/flask_login/* freezegun: - - ddtrace/contrib/freezegun/* + - ddtrace/contrib/_freezegun.py - ddtrace/contrib/internal/freezegun/* futures: - - ddtrace/contrib/futures/* + - ddtrace/contrib/_futures.py - ddtrace/contrib/internal/futures/* gevent: - - ddtrace/contrib/gevent/* + - ddtrace/contrib/_gevent.py - ddtrace/contrib/internal/gevent/* graphql: - - ddtrace/contrib/graphql/* + - ddtrace/contrib/_graphql.py - ddtrace/contrib/internal/graphql/* grpc: - - ddtrace/contrib/grpc/* + - ddtrace/contrib/_grpc.py - ddtrace/contrib/internal/grpc/* gunicorn: - - ddtrace/contrib/gunicorn/* + - ddtrace/contrib/_gunicorn.py httplib: - - ddtrace/contrib/httplib/* + - ddtrace/contrib/_httplib.py - ddtrace/contrib/internal/httplib/* httpx: - - ddtrace/contrib/httpx/* + - ddtrace/contrib/_httpx.py - ddtrace/contrib/internal/httpx/* jinja2: - - ddtrace/contrib/jinja2/* + - ddtrace/contrib/_jinja2.py - ddtrace/contrib/internal/jinja2/* kafka: - - ddtrace/contrib/kafka/* + - ddtrace/contrib/_kafka.py - ddtrace/contrib/internal/kafka/* - ddtrace/ext/kafka.py kombu: - - ddtrace/contrib/kombu/* + - ddtrace/contrib/_kombu.py - ddtrace/contrib/internal/kombu/* - ddtrace/ext/kombu.py logbook: - - ddtrace/contrib/logbook/* + - ddtrace/contrib/_logbook.py - ddtrace/contrib/internal/logbook/* logging: - - ddtrace/contrib/logging/* + - ddtrace/contrib/_logging.py - ddtrace/contrib/internal/logging/* loguru: - - ddtrace/contrib/logging/* + - ddtrace/contrib/_logging.py - ddtrace/contrib/internal/logging/* - - ddtrace/contrib/loguru/* + - ddtrace/contrib/_loguru.py - ddtrace/contrib/internal/loguru/* mako: - - ddtrace/contrib/mako/* + - ddtrace/contrib/_mako.py - ddtrace/contrib/internal/mako/* mariadb: - - ddtrace/contrib/mariadb/* + - ddtrace/contrib/_mariadb.py - ddtrace/contrib/internal/mariadb/* molten: - - ddtrace/contrib/molten/* + - ddtrace/contrib/_molten.py - ddtrace/contrib/internal/molten/* mongo: - - ddtrace/contrib/pymongo/* + - ddtrace/contrib/_pymongo.py - ddtrace/contrib/internal/pymongo/* - - ddtrace/contrib/mongoengine/* + - ddtrace/contrib/_mongoengine.py - ddtrace/contrib/internal/mongoengine/* - ddtrace/ext/mongo.py mysql: - - ddtrace/contrib/mysql/* + - ddtrace/contrib/_mysql.py - ddtrace/contrib/internal/mysql/* - - ddtrace/contrib/mysqldb/* + - ddtrace/contrib/_mysqldb.py - ddtrace/contrib/internal/mysqldb/* - - ddtrace/contrib/pymysql/* + - ddtrace/contrib/_pymysql.py - ddtrace/contrib/internal/pymysql/* - - ddtrace/contrib/aiomysql/* + - ddtrace/contrib/_aiomysql.py - ddtrace/contrib/internal/aiomysql/* pg: - - ddtrace/contrib/aiopg/* + - ddtrace/contrib/_aiopg.py - ddtrace/contrib/internal/aiopg/* - - ddtrace/contrib/asyncpg/* + - ddtrace/contrib/_asyncpg.py - ddtrace/contrib/internal/psycopg/* - ddtrace/contrib/internal/asyncpg/* - - ddtrace/contrib/psycopg/* + - ddtrace/contrib/_psycopg.py protobuf: - - ddtrace/contrib/protobuf/* + - ddtrace/contrib/_protobuf.py - ddtrace/contrib/internal/protobuf/* pylibmc: - - ddtrace/contrib/pylibmc/* + - ddtrace/contrib/pylibmc.py - ddtrace/contrib/internal/pylibmc/* pymemcache: - - ddtrace/contrib/pymemcache/* + - ddtrace/contrib/_pymemcache.py - ddtrace/contrib/internal/pymemcache/* - ddtrace/ext/memcached.py pynamodb: - - ddtrace/contrib/pynamodb/* + - ddtrace/contrib/_pynamodb.py - ddtrace/contrib/internal/pynamodb/* pyodbc: - - ddtrace/contrib/pyodbc/* + - ddtrace/contrib/_pyodbc.py - ddtrace/contrib/internal/pyodbc/* pyramid: - - ddtrace/contrib/pyramid/* + - ddtrace/contrib/pyramid.py - ddtrace/contrib/internal/pyramid/* redis: - - ddtrace/contrib/rediscluster/* + - ddtrace/contrib/_rediscluster.py - ddtrace/contrib/internal/rediscluster/* - - ddtrace/contrib/redis/* + - ddtrace/contrib/_redis.py - ddtrace/contrib/internal/redis/* - - ddtrace/contrib/aredis/* + - ddtrace/contrib/_aredis.py - ddtrace/contrib/internal/aredis/* - - ddtrace/contrib/yaaredis/* + - ddtrace/contrib/_yaaredis.py - ddtrace/contrib/internal/yaaredis/* - ddtrace/_trace/utils_redis.py - - ddtrace/contrib/redis_utils.py - - ddtrace/contrib/trace_utils_redis.py + - ddtrace/contrib/internal/redis_utils.py - ddtrace/ext/redis.py requests: - - ddtrace/contrib/requests/* + - ddtrace/contrib/requests.py - ddtrace/contrib/internal/requests/* rq: - - ddtrace/contrib/rq/* + - ddtrace/contrib/_rq.py sanic: - - ddtrace/contrib/sanic/* + - ddtrace/contrib/_sanic.py - ddtrace/contrib/internal/sanic/* snowflake: - - ddtrace/contrib/snowflake/* + - ddtrace/contrib/_snowflake.py - ddtrace/contrib/internal/snowflake/* sqlalchemy: - - ddtrace/contrib/sqlalchemy/* + - ddtrace/contrib/sqlalchemy.py - ddtrace/contrib/internal/sqlalchemy/* sqlite3: - - ddtrace/contrib/sqlite3/* + - ddtrace/contrib/_sqlite3.py - ddtrace/contrib/internal/sqlite3/* starlette: - - ddtrace/contrib/starlette/* + - ddtrace/contrib/_starlette.py - ddtrace/contrib/internal/starlette/* structlog: - - ddtrace/contrib/structlog/* + - ddtrace/contrib/_structlog.py - ddtrace/contrib/internal/structlog/* subprocess: - - ddtrace/contrib/subprocess/* + - ddtrace/contrib/_subprocess.py - ddtrace/contrib/internal/subprocess/* tornado: - - ddtrace/contrib/tornado/* + - ddtrace/contrib/tornado.py - ddtrace/contrib/internal/tornado/* urllib3: - - ddtrace/contrib/urllib3/* + - ddtrace/contrib/_urllib3.py - ddtrace/contrib/internal/urllib3/* vertica: - - ddtrace/contrib/vertica/* + - ddtrace/contrib/_vertica.py - ddtrace/contrib/internal/vertica/* wsgi: - - ddtrace/contrib/wsgi/* + - ddtrace/contrib/wsgi.py - ddtrace/contrib/internal/wsgi/* suites: aiobotocore: diff --git a/tests/internal/test_module.py b/tests/internal/test_module.py index 668dcb3d175..d93c361ac3f 100644 --- a/tests/internal/test_module.py +++ b/tests/internal/test_module.py @@ -528,51 +528,43 @@ def test_module_import_side_effect(): import tests.internal.side_effect_module # noqa:F401 -def test_deprecated_modules_in_ddtrace_contrib(): - # Test that all files in the ddtrace/contrib directory except a few exceptions (ex: ddtrace/contrib/redis_utils.py) - # have the deprecation template below. - deprecation_template = """from ddtrace.contrib.internal.{} import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -def __getattr__(name): - deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=DDTraceDeprecationWarning, - ) - - if name in globals(): - return globals()[name] - raise AttributeError("%s has no attribute %s", __name__, name) -""" - +def test_public_modules_in_ddtrace_contrib(): + # Ensures that public modules are not accidentally added to the integration API contrib_dir = Path(DDTRACE_PATH) / "ddtrace" / "contrib" - missing_deprecations = set() + public_modules = set() for directory, _, file_names in os.walk(contrib_dir): - if directory.startswith(str(contrib_dir / "internal")): - # Files in ddtrace/contrib/internal/... are not part of the public API, they should not be deprecated + relative_dir = Path(directory).relative_to(contrib_dir) + if "internal" in relative_dir.parts or any([x.startswith("_") for x in relative_dir.parts]): continue + # Open files in ddtrace/contrib/ and check if the content matches the template for file_name in file_names: # Skip internal and __init__ modules, as they are not supposed to have the deprecation template if file_name.endswith(".py") and not (file_name.startswith("_") or file_name == "__init__.py"): # Get the relative path of the file from ddtrace/contrib to the deprecated file (ex: pymongo/patch) - relative_path = Path(directory).relative_to(contrib_dir) / file_name[:-3] # Remove the .py extension + relative_dir_with_file = relative_dir / file_name[:-3] # Remove the .py extension # Convert the relative path to python module format (ex: [pymongo, patch] -> pymongo.patch) - sub_modules = ".".join(relative_path.parts) - with open(os.path.join(directory, file_name), "r") as f: - content = f.read() - if deprecation_template.format(sub_modules) != content: - missing_deprecations.add(f"ddtrace.contrib.{sub_modules}") - - assert missing_deprecations == set( - [ - "ddtrace.contrib.trace_utils", - # Note: The modules below are deprecated but they do not follow the template above - "ddtrace.contrib.redis_utils", - "ddtrace.contrib.trace_utils_async", - "ddtrace.contrib.trace_utils_redis", - ] - ) + sub_modules = ".".join(relative_dir_with_file.parts) + public_modules.add(f"ddtrace.contrib.{sub_modules}") + + # The following modules contain attributes that are exposed to ddtrace users. All other modules in ddtrace.contrib + # are internal. + assert public_modules == { + "ddtrace.contrib.trace_utils", + "ddtrace.contrib.celery", + "ddtrace.contrib.tornado", + "ddtrace.contrib.asgi", + "ddtrace.contrib.bottle", + "ddtrace.contrib.flask_cache", + "ddtrace.contrib.aiohttp", + "ddtrace.contrib.dbapi_async", + "ddtrace.contrib.wsgi", + "ddtrace.contrib.sqlalchemy", + "ddtrace.contrib.falcon", + "ddtrace.contrib.pylibmc", + "ddtrace.contrib.dbapi", + "ddtrace.contrib.cherrypy", + "ddtrace.contrib.requests", + "ddtrace.contrib.pyramid", + } diff --git a/tests/llmobs/suitespec.yml b/tests/llmobs/suitespec.yml index 29ee63dc0dd..a9d3da34dc5 100644 --- a/tests/llmobs/suitespec.yml +++ b/tests/llmobs/suitespec.yml @@ -1,24 +1,24 @@ --- components: anthropic: - - ddtrace/contrib/anthropic/* + - ddtrace/contrib/_anthropic.py - ddtrace/contrib/internal/anthropic/* google_generativeai: - - ddtrace/contrib/google_generativeai/* + - ddtrace/contrib/_google_generativeai.py - ddtrace/contrib/internal/google_generativeai/* vertexai: - - ddtrace/contrib/vertexai/* + - ddtrace/contrib/_vertexai.py - ddtrace/contrib/internal/vertexai/* langchain: - - ddtrace/contrib/langchain/* + - ddtrace/contrib/_langchain.py - ddtrace/contrib/internal/langchain/* llmobs: - ddtrace/llmobs/* openai: - - ddtrace/contrib/openai/* + - ddtrace/contrib/_openai.py - ddtrace/contrib/internal/openai/* langgraph: - - ddtrace/contrib/langgraph/* + - ddtrace/contrib/_langgraph.py - ddtrace/contrib/internal/langgraph/* suites: anthropic: diff --git a/tests/opentracer/test_tracer_asyncio.py b/tests/opentracer/test_tracer_asyncio.py index 230ca776986..35ece48c126 100644 --- a/tests/opentracer/test_tracer_asyncio.py +++ b/tests/opentracer/test_tracer_asyncio.py @@ -3,7 +3,6 @@ import pytest from ddtrace.constants import ERROR_MSG -from ddtrace.contrib.asyncio import context_provider @pytest.mark.asyncio @@ -66,8 +65,6 @@ async def f1(): @pytest.mark.asyncio async def test_trace_multiple_calls(ot_tracer, test_spans): - ot_tracer._dd_tracer._configure(context_provider=context_provider) - # create multiple futures so that we expect multiple # traces instead of a single one (helper not used) async def coro(): diff --git a/tests/opentracer/test_tracer_gevent.py b/tests/opentracer/test_tracer_gevent.py index 90b22c644d0..320b39ee997 100644 --- a/tests/opentracer/test_tracer_gevent.py +++ b/tests/opentracer/test_tracer_gevent.py @@ -2,7 +2,6 @@ from opentracing.scope_managers.gevent import GeventScopeManager import pytest -from ddtrace.contrib.gevent import context_provider from ddtrace.contrib.internal.gevent.patch import patch from ddtrace.contrib.internal.gevent.patch import unpatch @@ -12,7 +11,7 @@ def ot_tracer(ot_tracer_factory): """Fixture providing an opentracer configured for gevent usage.""" # patch gevent patch() - yield ot_tracer_factory("gevent_svc", {}, GeventScopeManager(), context_provider) + yield ot_tracer_factory("gevent_svc", {}, GeventScopeManager()) # unpatch gevent unpatch() From e294f474a0ccb219831bc774d2a52c2144e617b7 Mon Sep 17 00:00:00 2001 From: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:05:48 -0500 Subject: [PATCH 41/63] ci(langchain): mark all llm cassette tests as flaky (#12206) Ever since we re-enabled the langchain tests, we've gotten a surge of flaky langchain tests that are all centered around our mocking openai/llm network calls via vcrpy. While we work on a more robust/long-term solution, I'm marking these tests as flaky to unblock others on CI. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .../cassettes/openai_embedding_query.yaml | 201 ------------------ tests/contrib/langchain/test_langchain.py | 32 ++- 2 files changed, 22 insertions(+), 211 deletions(-) delete mode 100644 tests/contrib/langchain/cassettes/openai_embedding_query.yaml diff --git a/tests/contrib/langchain/cassettes/openai_embedding_query.yaml b/tests/contrib/langchain/cassettes/openai_embedding_query.yaml deleted file mode 100644 index eee82a8fd90..00000000000 --- a/tests/contrib/langchain/cassettes/openai_embedding_query.yaml +++ /dev/null @@ -1,201 +0,0 @@ -interactions: -- request: - body: '{"input": [[576, 374, 264, 1296, 3319, 13]], "model": "text-embedding-ada-002", - "encoding_format": "base64"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '108' - content-type: - - application/json - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.12.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - Linux - x-stainless-package-version: - - 1.12.0 - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.10.3 - method: POST - uri: https://api.openai.com/v1/embeddings - response: - body: - string: !!binary | - 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 - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 862e6dc81e690f36-EWR - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 11 Mar 2024 20:52:32 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=YXU4DtMePAsaJx2kty.2jSeqq5zjQQY1epSJLQkBDq0-1710190352-1.0.1.1-IZASGeqa6i8uV9e7rvisun.N6t0Vsj8fdicmV4OF.AUAcpXJ7bOwpjV8QBMZV37zd91bdrc_2dZ62W3Y3pZ_Rw; - path=/; expires=Mon, 11-Mar-24 21:22:32 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=v6MSy3Sk6pxtoYL8kXXuNiO2j0OK_HAODXl1hNcZp0o-1710190352774-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - access-control-allow-origin: - - '*' - alt-svc: - - h3=":443"; ma=86400 - openai-model: - - text-embedding-ada-002 - openai-organization: - - datadog-4 - openai-processing-ms: - - '21' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=15724800; includeSubDomains - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '10000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '9999994' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_75612d53833fe21791b4426615e1d4ca - status: - code: 200 - message: OK -version: 1 diff --git a/tests/contrib/langchain/test_langchain.py b/tests/contrib/langchain/test_langchain.py index a811a53099b..86a14f524d9 100644 --- a/tests/contrib/langchain/test_langchain.py +++ b/tests/contrib/langchain/test_langchain.py @@ -37,6 +37,7 @@ def request_vcr(): yield get_request_vcr() +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_openai_llm_sync(langchain_openai, request_vcr): llm = langchain_openai.OpenAI() @@ -44,6 +45,7 @@ def test_openai_llm_sync(langchain_openai, request_vcr): llm.invoke("Can you explain what Descartes meant by 'I think, therefore I am'?") +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_openai_llm_sync_multiple_prompts(langchain_openai, request_vcr): llm = langchain_openai.OpenAI() @@ -56,6 +58,7 @@ def test_openai_llm_sync_multiple_prompts(langchain_openai, request_vcr): ) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.asyncio @pytest.mark.snapshot(ignores=IGNORE_FIELDS) async def test_openai_llm_async(langchain_openai, request_vcr): @@ -64,6 +67,7 @@ async def test_openai_llm_async(langchain_openai, request_vcr): await llm.agenerate(["Which team won the 2019 NBA finals?"]) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_openai_llm_error(langchain, langchain_openai, request_vcr): import openai # Imported here because the os env OPENAI_API_KEY needs to be set via langchain fixture before import @@ -79,6 +83,7 @@ def test_openai_llm_error(langchain, langchain_openai, request_vcr): llm.generate([12345, 123456]) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.skipif(LANGCHAIN_VERSION < (0, 2), reason="Requires separate cassette for langchain v0.1") @pytest.mark.snapshot def test_cohere_llm_sync(langchain_cohere, request_vcr): @@ -87,6 +92,7 @@ def test_cohere_llm_sync(langchain_cohere, request_vcr): llm.invoke("What is the secret Krabby Patty recipe?") +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.skipif( LANGCHAIN_VERSION < (0, 2) or sys.version_info < (3, 10), reason="Requires separate cassette for langchain v0.1, Python 3.9", @@ -186,8 +192,7 @@ async def test_openai_chat_model_async_generate(langchain_openai, request_vcr): def test_openai_embedding_query(langchain_openai, request_vcr): with mock.patch("langchain_openai.OpenAIEmbeddings._get_len_safe_embeddings", return_value=[0.0] * 1536): embeddings = langchain_openai.OpenAIEmbeddings() - with request_vcr.use_cassette("openai_embedding_query.yaml"): - embeddings.embed_query("this is a test query.") + embeddings.embed_query("this is a test query.") @pytest.mark.snapshot @@ -227,6 +232,7 @@ def test_pinecone_vectorstore_similarity_search(langchain_openai, request_vcr): vectorstore.similarity_search("Who was Alan Turing?", 1) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_lcel_chain_simple(langchain_core, langchain_openai, request_vcr): prompt = langchain_core.prompts.ChatPromptTemplate.from_messages( @@ -239,6 +245,7 @@ def test_lcel_chain_simple(langchain_core, langchain_openai, request_vcr): chain.invoke({"input": "how can langsmith help with testing?"}) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_lcel_chain_complicated(langchain_core, langchain_openai, request_vcr): prompt = langchain_core.prompts.ChatPromptTemplate.from_template( @@ -268,6 +275,7 @@ def test_lcel_chain_complicated(langchain_core, langchain_openai, request_vcr): chain.invoke({"topic": "chickens", "style": "a 90s rapper"}) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.asyncio @pytest.mark.snapshot(ignores=IGNORE_FIELDS) async def test_lcel_chain_simple_async(langchain_core, langchain_openai, request_vcr): @@ -315,6 +323,7 @@ def test_lcel_chain_batch_311(langchain_core, langchain_openai, request_vcr): chain.batch(inputs=["chickens", "pigs"]) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_lcel_chain_nested(langchain_core, langchain_openai, request_vcr): """ @@ -367,6 +376,7 @@ def test_lcel_chain_non_dict_input(langchain_core): sequence.invoke(1) +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_lcel_with_tools_openai(langchain_core, langchain_openai, request_vcr): import langchain_core.tools @@ -387,6 +397,7 @@ def add(a: int, b: int) -> int: llm_with_tools.invoke("What is the sum of 1 and 2?") +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_lcel_with_tools_anthropic(langchain_core, langchain_anthropic, request_vcr): import langchain_core.tools @@ -413,16 +424,15 @@ def test_faiss_vectorstore_retrieval(langchain_community, langchain_openai, requ pytest.skip("langchain-community not installed which is required for this test.") pytest.importorskip("faiss", reason="faiss required for this test.") with mock.patch("langchain_openai.OpenAIEmbeddings._get_len_safe_embeddings", return_value=[[0.0] * 1536]): - with request_vcr.use_cassette("openai_embedding_query.yaml"): - faiss = langchain_community.vectorstores.faiss.FAISS.from_texts( - ["this is a test query."], - embedding=langchain_openai.OpenAIEmbeddings(), - ) - retriever = faiss.as_retriever() + faiss = langchain_community.vectorstores.faiss.FAISS.from_texts( + ["this is a test query."], embedding=langchain_openai.OpenAIEmbeddings() + ) + retriever = faiss.as_retriever() with request_vcr.use_cassette("openai_retrieval_embedding.yaml"): retriever.invoke("What was the message of the last test query?") +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_streamed_chain(langchain_core, langchain_openai, streamed_response_responder): client = streamed_response_responder( @@ -444,6 +454,7 @@ def test_streamed_chain(langchain_core, langchain_openai, streamed_response_resp pass +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_streamed_chat(langchain_openai, streamed_response_responder): client = streamed_response_responder( @@ -459,6 +470,7 @@ def test_streamed_chat(langchain_openai, streamed_response_responder): pass +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=IGNORE_FIELDS) def test_streamed_llm(langchain_openai, streamed_response_responder): client = streamed_response_responder( @@ -520,6 +532,7 @@ async def test_astreamed_chat(langchain_openai, async_streamed_response_responde pass +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot( ignores=IGNORE_FIELDS, token="tests.contrib.langchain.test_langchain.test_streamed_llm", @@ -539,8 +552,7 @@ async def test_astreamed_llm(langchain_openai, async_streamed_response_responder pass -# TODO: needs fixing in follow-up -@pytest.mark.skip(reason="Problematic test that needs fixing") +@flaky(until=1754218112, reason="Problematic test that needs fixing") @pytest.mark.snapshot(ignores=(IGNORE_FIELDS + ["meta.langchain.request.inputs.0"])) def test_streamed_json_output_parser(langchain, langchain_core, langchain_openai, streamed_response_responder): client = streamed_response_responder( From 63d13ab421562046fec2c3cfc46dfd229de6ea97 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Tue, 4 Feb 2025 01:22:48 -0500 Subject: [PATCH 42/63] chore(tracing): remove deprecated modules [3.0] (#12186) - Removes all tracing modules and packages that are not defined in ddtrace._trace, ddtrace.internal, or ddtrace.trace. - Removes deprecated tracing attributes from ddtrace. ddtrace.trace should be the sole public interface for tracing. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- benchmarks/sampling_rule_matches/scenario.py | 2 +- ddtrace/__init__.py | 42 ++-------- ddtrace/constants.py | 79 +++++-------------- ddtrace/context.py | 10 --- ddtrace/filters.py | 10 --- ddtrace/pin.py | 10 --- ddtrace/provider.py | 14 ---- ddtrace/sampler.py | 10 --- ddtrace/sampling_rule.py | 10 --- ddtrace/span.py | 10 --- ddtrace/tracer.py | 10 --- ddtrace/tracing/__init__.py | 11 --- ...ated-tracing-modules-a129231d42e1218d.yaml | 4 + tests/internal/test_settings.py | 25 ++++++ tests/llmobs/test_llmobs_ragas_evaluators.py | 2 +- tests/suitespec.yml | 9 --- tests/tracer/test_tracer.py | 15 ---- 17 files changed, 57 insertions(+), 216 deletions(-) delete mode 100644 ddtrace/context.py delete mode 100644 ddtrace/filters.py delete mode 100644 ddtrace/pin.py delete mode 100644 ddtrace/provider.py delete mode 100644 ddtrace/sampler.py delete mode 100644 ddtrace/sampling_rule.py delete mode 100644 ddtrace/span.py delete mode 100644 ddtrace/tracer.py delete mode 100644 ddtrace/tracing/__init__.py create mode 100644 releasenotes/notes/remove-deprecated-tracing-modules-a129231d42e1218d.yaml diff --git a/benchmarks/sampling_rule_matches/scenario.py b/benchmarks/sampling_rule_matches/scenario.py index 70ee5111bf8..d77926f5d65 100644 --- a/benchmarks/sampling_rule_matches/scenario.py +++ b/benchmarks/sampling_rule_matches/scenario.py @@ -4,8 +4,8 @@ import bm +from ddtrace._trace.sampling_rule import SamplingRule from ddtrace._trace.span import Span -from ddtrace.sampling_rule import SamplingRule def rands(size=6, chars=string.ascii_uppercase + string.digits): diff --git a/ddtrace/__init__.py b/ddtrace/__init__.py index e480851926f..008e931a482 100644 --- a/ddtrace/__init__.py +++ b/ddtrace/__init__.py @@ -27,9 +27,11 @@ from ._monkey import patch_all # noqa: E402 from .internal.compat import PYTHON_VERSION_INFO # noqa: E402 from .internal.utils.deprecations import DDTraceDeprecationWarning # noqa: E402 -from ddtrace._trace.pin import Pin # noqa: E402 -from ddtrace._trace.span import Span # noqa: E402 -from ddtrace._trace.tracer import Tracer # noqa: E402 + +# TODO(munir): Remove the imports below in v3.0 +from ddtrace._trace import pin as _p # noqa: E402, F401 +from ddtrace._trace import span as _s # noqa: E402, F401 +from ddtrace._trace import tracer as _t # noqa: E402, F401 from ddtrace.vendor import debtcollector from .version import get_version # noqa: E402 @@ -39,15 +41,6 @@ _start_mini_agent() -# DEV: Import deprecated tracer module in order to retain side-effect of package -# initialization, which added this module to sys.modules. We catch deprecation -# warnings as this is only to retain a side effect of the package -# initialization. -# TODO: Remove this in v3.0 when the ddtrace/tracer.py module is removed -with warnings.catch_warnings(): - warnings.simplefilter("ignore") - from .tracer import Tracer as _ - __version__ = get_version() # TODO: Deprecate accessing tracer from ddtrace.__init__ module in v4.0 @@ -57,36 +50,11 @@ __all__ = [ "patch", "patch_all", - "Pin", - "Span", - "Tracer", "config", "DDTraceDeprecationWarning", ] -_DEPRECATED_TRACE_ATTRIBUTES = [ - "Span", - "Tracer", - "Pin", -] - - -def __getattr__(name): - if name in _DEPRECATED_TRACE_ATTRIBUTES: - debtcollector.deprecate( - ("%s.%s is deprecated" % (__name__, name)), - message="Import from ddtrace.trace instead.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - - raise AttributeError("%s has no attribute %s", __name__, name) - - def check_supported_python_version(): if PYTHON_VERSION_INFO < (3, 8): deprecation_message = ( diff --git a/ddtrace/constants.py b/ddtrace/constants.py index b4694e24345..829a57a45a7 100644 --- a/ddtrace/constants.py +++ b/ddtrace/constants.py @@ -1,39 +1,37 @@ -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning as _DDTraceDeprecationWarning -from ddtrace.vendor import debtcollector as _debtcollector - - -# TODO: Deprecate and remove the SAMPLE_RATE_METRIC_KEY constant. -# This key enables legacy trace sampling support in the Datadog agent. -_SAMPLE_RATE_METRIC_KEY = SAMPLE_RATE_METRIC_KEY = "_sample_rate" -_SAMPLING_PRIORITY_KEY = SAMPLING_PRIORITY_KEY = "_sampling_priority_v1" -_ANALYTICS_SAMPLE_RATE_KEY = ANALYTICS_SAMPLE_RATE_KEY = "_dd1.sr.eausr" -_SAMPLING_AGENT_DECISION = SAMPLING_AGENT_DECISION = "_dd.agent_psr" -_SAMPLING_RULE_DECISION = SAMPLING_RULE_DECISION = "_dd.rule_psr" -_SAMPLING_LIMIT_DECISION = SAMPLING_LIMIT_DECISION = "_dd.limit_psr" +""" +This module contains constants used across ddtrace products. + +Constants that should NOT be referenced by ddtrace users are marked with a leading underscore. +""" +_SAMPLING_PRIORITY_KEY = "_sampling_priority_v1" +_ANALYTICS_SAMPLE_RATE_KEY = "_dd1.sr.eausr" +_SAMPLING_AGENT_DECISION = "_dd.agent_psr" +_SAMPLING_RULE_DECISION = "_dd.rule_psr" +_SAMPLING_LIMIT_DECISION = "_dd.limit_psr" _SINGLE_SPAN_SAMPLING_MECHANISM = "_dd.span_sampling.mechanism" _SINGLE_SPAN_SAMPLING_RATE = "_dd.span_sampling.rule_rate" _SINGLE_SPAN_SAMPLING_MAX_PER_SEC = "_dd.span_sampling.max_per_second" _SINGLE_SPAN_SAMPLING_MAX_PER_SEC_NO_LIMIT = -1 _APM_ENABLED_METRIC_KEY = "_dd.apm.enabled" -_ORIGIN_KEY = ORIGIN_KEY = "_dd.origin" -_USER_ID_KEY = USER_ID_KEY = "_dd.p.usr.id" -_HOSTNAME_KEY = HOSTNAME_KEY = "_dd.hostname" -_RUNTIME_FAMILY = RUNTIME_FAMILY = "_dd.runtime_family" +_ORIGIN_KEY = "_dd.origin" +_USER_ID_KEY = "_dd.p.usr.id" +_HOSTNAME_KEY = "_dd.hostname" +_RUNTIME_FAMILY = "_dd.runtime_family" ENV_KEY = "env" VERSION_KEY = "version" SERVICE_KEY = "service.name" -_BASE_SERVICE_KEY = BASE_SERVICE_KEY = "_dd.base_service" +_BASE_SERVICE_KEY = "_dd.base_service" SERVICE_VERSION_KEY = "service.version" SPAN_KIND = "span.kind" -_SPAN_MEASURED_KEY = SPAN_MEASURED_KEY = "_dd.measured" -_KEEP_SPANS_RATE_KEY = KEEP_SPANS_RATE_KEY = "_dd.tracer_kr" -_MULTIPLE_IP_HEADERS = MULTIPLE_IP_HEADERS = "_dd.multiple-ip-headers" +_SPAN_MEASURED_KEY = "_dd.measured" +_KEEP_SPANS_RATE_KEY = "_dd.tracer_kr" +_MULTIPLE_IP_HEADERS = "_dd.multiple-ip-headers" APPSEC_ENV = "DD_APPSEC_ENABLED" -_CONFIG_ENDPOINT_ENV = CONFIG_ENDPOINT_ENV = "_DD_CONFIG_ENDPOINT" -_CONFIG_ENDPOINT_RETRIES_ENV = CONFIG_ENDPOINT_RETRIES_ENV = "_DD_CONFIG_ENDPOINT_RETRIES" -_CONFIG_ENDPOINT_TIMEOUT_ENV = CONFIG_ENDPOINT_TIMEOUT_ENV = "_DD_CONFIG_ENDPOINT_TIMEOUT" +_CONFIG_ENDPOINT_ENV = "_DD_CONFIG_ENDPOINT" +_CONFIG_ENDPOINT_RETRIES_ENV = "_DD_CONFIG_ENDPOINT_RETRIES" +_CONFIG_ENDPOINT_TIMEOUT_ENV = "_DD_CONFIG_ENDPOINT_TIMEOUT" IAST_ENV = "DD_IAST_ENABLED" MANUAL_DROP_KEY = "manual.drop" @@ -53,38 +51,3 @@ AUTO_KEEP = 1 # Use this to explicitly inform the backend that a trace should be kept and stored. USER_KEEP = 2 - - -_DEPRECATED_MODULE_ATTRIBUTES = [ - "ANALYTICS_SAMPLE_RATE_KEY", - "SAMPLE_RATE_METRIC_KEY", - "SAMPLING_PRIORITY_KEY", - "SAMPLING_AGENT_DECISION", - "SAMPLING_RULE_DECISION", - "SAMPLING_LIMIT_DECISION", - "USER_ID_KEY", - "ORIGIN_KEY", - "HOSTNAME_KEY", - "RUNTIME_FAMILY", - "BASE_SERVICE_KEY", - "SPAN_MEASURED_KEY", - "KEEP_SPANS_RATE_KEY", - "MULTIPLE_IP_HEADERS", - "CONFIG_ENDPOINT_ENV", - "CONFIG_ENDPOINT_RETRIES_ENV", - "CONFIG_ENDPOINT_TIMEOUT_ENV", -] - - -def __getattr__(name): - if name in _DEPRECATED_MODULE_ATTRIBUTES: - _debtcollector.deprecate( - ("%s.%s is deprecated" % (__name__, name)), - category=_DDTraceDeprecationWarning, - removal_version="3.0.0", - ) - - if name in globals(): - return globals()[name] - - raise AttributeError("%s has no attribute %s", __name__, name) diff --git a/ddtrace/context.py b/ddtrace/context.py deleted file mode 100644 index 843ef510c38..00000000000 --- a/ddtrace/context.py +++ /dev/null @@ -1,10 +0,0 @@ -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.trace import Context # noqa: F401 -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The ddtrace.context module is deprecated and will be removed from the public API.", - message="Context should be imported from the ddtrace.trace package", - category=DDTraceDeprecationWarning, -) diff --git a/ddtrace/filters.py b/ddtrace/filters.py deleted file mode 100644 index bd6367d5635..00000000000 --- a/ddtrace/filters.py +++ /dev/null @@ -1,10 +0,0 @@ -from ddtrace._trace.filters import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The ddtrace.filters module and the ``FilterRequestsOnUrl`` class is deprecated and will be removed.", - message="Import ``TraceFilter`` from the ddtrace.trace package.", - category=DDTraceDeprecationWarning, -) diff --git a/ddtrace/pin.py b/ddtrace/pin.py deleted file mode 100644 index 0e683b3b22e..00000000000 --- a/ddtrace/pin.py +++ /dev/null @@ -1,10 +0,0 @@ -from ddtrace._trace.pin import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The ddtrace.trace.Pin module is deprecated and will be removed.", - message="Import ``Pin`` from the ddtrace.trace package.", - category=DDTraceDeprecationWarning, -) diff --git a/ddtrace/provider.py b/ddtrace/provider.py deleted file mode 100644 index 7b9867de01a..00000000000 --- a/ddtrace/provider.py +++ /dev/null @@ -1,14 +0,0 @@ -from ddtrace._trace.provider import BaseContextProvider # noqa: F401 -from ddtrace._trace.provider import DatadogContextMixin # noqa: F401 -from ddtrace._trace.provider import DefaultContextProvider # noqa: F401 -from ddtrace.internal.ci_visibility.context import CIContextProvider # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The context provider interface is deprecated", - message="Import BaseContextProvider from `ddtrace.trace` instead.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", -) diff --git a/ddtrace/sampler.py b/ddtrace/sampler.py deleted file mode 100644 index c7f4b9d499a..00000000000 --- a/ddtrace/sampler.py +++ /dev/null @@ -1,10 +0,0 @@ -from ddtrace._trace.sampler import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The ddtrace.sampler module is deprecated and will be removed.", - message="Use DD_TRACE_SAMPLING_RULES to configure sampling rates.", - category=DDTraceDeprecationWarning, -) diff --git a/ddtrace/sampling_rule.py b/ddtrace/sampling_rule.py deleted file mode 100644 index 244cebddd31..00000000000 --- a/ddtrace/sampling_rule.py +++ /dev/null @@ -1,10 +0,0 @@ -from ddtrace._trace.sampling_rule import * # noqa: F403 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The ddtrace.sample_rule module is deprecated and will be removed.", - message="Use DD_TRACE_SAMPLING_RULES to set sampling rules.", - category=DDTraceDeprecationWarning, -) diff --git a/ddtrace/span.py b/ddtrace/span.py deleted file mode 100644 index 48f1835262c..00000000000 --- a/ddtrace/span.py +++ /dev/null @@ -1,10 +0,0 @@ -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.trace import Span # noqa: F401 -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The span module is deprecated and will be moved.", - message="A new span interface will be provided by the trace sub-package.", - category=DDTraceDeprecationWarning, -) diff --git a/ddtrace/tracer.py b/ddtrace/tracer.py deleted file mode 100644 index afb4e05492d..00000000000 --- a/ddtrace/tracer.py +++ /dev/null @@ -1,10 +0,0 @@ -from ddtrace._trace.tracer import Tracer # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The ddtrace.tracer module is deprecated and will be removed.", - message="A new interface will be provided by the trace sub-package.", - category=DDTraceDeprecationWarning, -) diff --git a/ddtrace/tracing/__init__.py b/ddtrace/tracing/__init__.py deleted file mode 100644 index c66bb230093..00000000000 --- a/ddtrace/tracing/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from ddtrace._trace import trace_handlers # noqa: F401 -from ddtrace._trace._span_link import SpanLink # noqa: F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The tracing module is deprecated and will be moved.", - message="A new interface will be provided by the _trace sub-package.", - category=DDTraceDeprecationWarning, -) diff --git a/releasenotes/notes/remove-deprecated-tracing-modules-a129231d42e1218d.yaml b/releasenotes/notes/remove-deprecated-tracing-modules-a129231d42e1218d.yaml new file mode 100644 index 00000000000..575bb8f1e55 --- /dev/null +++ b/releasenotes/notes/remove-deprecated-tracing-modules-a129231d42e1218d.yaml @@ -0,0 +1,4 @@ +--- +other: + - | + tracing: Removes the deprecated tracing modules and constants from the ``ddtrace`` package. diff --git a/tests/internal/test_settings.py b/tests/internal/test_settings.py index a3f5fa97802..2ff1843690e 100644 --- a/tests/internal/test_settings.py +++ b/tests/internal/test_settings.py @@ -615,3 +615,28 @@ def test_remoteconfig_header_tags(run_python_code_in_subprocess): env=env, ) assert status == 0, f"err={err.decode('utf-8')} out={out.decode('utf-8')}" + + +def test_config_public_properties_and_methods(): + # Regression test to prevent unexpected changes to public attributes in Config + # By default most attributes should be private and set via Environment Variables + from ddtrace.settings import Config + + public_attrs = set() + c = Config() + # Check for public attributes in Config + for attr in dir(c): + if not attr.startswith("_") and not attr.startswith("__"): + public_attrs.add(attr) + # Check for public keys in Config._config + for key in c._config: + if not key.startswith("_"): + public_attrs.add(key) + + assert public_attrs == { + "service", + "service_mapping", + "env", + "tags", + "version", + }, public_attrs diff --git a/tests/llmobs/test_llmobs_ragas_evaluators.py b/tests/llmobs/test_llmobs_ragas_evaluators.py index c46dce740c2..a182653455a 100644 --- a/tests/llmobs/test_llmobs_ragas_evaluators.py +++ b/tests/llmobs/test_llmobs_ragas_evaluators.py @@ -7,7 +7,7 @@ from ddtrace.llmobs._evaluators.ragas.context_precision import RagasContextPrecisionEvaluator from ddtrace.llmobs._evaluators.ragas.faithfulness import RagasFaithfulnessEvaluator from ddtrace.llmobs._evaluators.runner import EvaluatorRunner -from ddtrace.span import Span +from ddtrace.trace import Span from tests.llmobs._utils import _expected_llmobs_llm_span_event from tests.llmobs._utils import _expected_ragas_answer_relevancy_spans from tests.llmobs._utils import _expected_ragas_context_precision_spans diff --git a/tests/suitespec.yml b/tests/suitespec.yml index b135ba986c8..d9da18df66d 100644 --- a/tests/suitespec.yml +++ b/tests/suitespec.yml @@ -116,15 +116,6 @@ components: - ddtrace/_trace/* - ddtrace/trace/* - ddtrace/constants.py - - ddtrace/context.py - - ddtrace/filters.py - - ddtrace/pin.py - - ddtrace/provider.py - - ddtrace/sampler.py - - ddtrace/sampling_rule.py - - ddtrace/span.py - - ddtrace/tracer.py - - ddtrace/tracing/* - ddtrace/settings/__init__.py - ddtrace/settings/config.py - ddtrace/settings/http.py diff --git a/tests/tracer/test_tracer.py b/tests/tracer/test_tracer.py index 0a75e5fc037..1aa1c42bf1d 100644 --- a/tests/tracer/test_tracer.py +++ b/tests/tracer/test_tracer.py @@ -2010,21 +2010,6 @@ def test_ctx_api(): assert core.get_items(["appsec.key"]) == [None] -@pytest.mark.subprocess(parametrize={"IMPORT_DDTRACE_TRACER": ["true", "false"]}) -def test_import_ddtrace_tracer_not_module(): - import os - - import_ddtrace_tracer = os.environ["IMPORT_DDTRACE_TRACER"] == "true" - - if import_ddtrace_tracer: - import ddtrace.tracer # noqa: F401 - - from ddtrace.trace import Tracer - from ddtrace.trace import tracer - - assert isinstance(tracer, Tracer) - - @pytest.mark.parametrize("sca_enabled", ["true", "false"]) @pytest.mark.parametrize("appsec_enabled", [True, False]) @pytest.mark.parametrize("iast_enabled", [True, False]) From 56a6ca2028b6b9ac6d7a455fcb62e9fd0a5f58ad Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Tue, 4 Feb 2025 09:53:02 +0100 Subject: [PATCH 43/63] chore(iast): test code injection performance in ci (#12195) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: William Conti <58711692+wconti27@users.noreply.github.com> Co-authored-by: Laplie Anderson Co-authored-by: Brett Langdon --- hatch.toml | 3 ++- scripts/iast/mod_leak_functions.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hatch.toml b/hatch.toml index 6dcd32e6794..337ace3ca26 100644 --- a/hatch.toml +++ b/hatch.toml @@ -466,7 +466,8 @@ _DD_IAST_PATCH_MODULES = "scripts.iast" test = [ "uname -a", "pip freeze", - "python -m pytest tests/appsec/iast_aggregated_memcheck/test_aggregated_memleaks.py", + # We use --no-cov due to a pytest-cov problem with eval https://github.com/pytest-dev/pytest-cov/issues/676 + "python -m pytest --no-cov tests/appsec/iast_aggregated_memcheck/test_aggregated_memleaks.py", ] [[envs.iast_aggregated_leak_testing.matrix]] diff --git a/scripts/iast/mod_leak_functions.py b/scripts/iast/mod_leak_functions.py index bf96d93c497..f53e7aa2e94 100644 --- a/scripts/iast/mod_leak_functions.py +++ b/scripts/iast/mod_leak_functions.py @@ -258,6 +258,7 @@ def sink_points(string_tainted): except Exception: pass + _ = eval(f"'a' + '{string_tainted}'") # Weak Randomness vulnerability _ = random.randint(1, 10) From eff31558bf05bb9d2e57faf1701a476e4edffc92 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Tue, 4 Feb 2025 10:54:58 +0100 Subject: [PATCH 44/63] feat(iast): xss vulnerability for django applications (#12116) XSS vulnerability detection. System tests (merge after this PR): https://github.com/DataDog/system-tests/pull/3923 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Federico Mon --- .../_evidence_redaction/_sensitive_handler.py | 2 + ddtrace/appsec/_iast/_patch_modules.py | 1 + ddtrace/appsec/_iast/constants.py | 1 + ddtrace/appsec/_iast/taint_sinks/xss.py | 78 ++ docker-compose.yml | 1 - ...iast-feat-xss-django-6781a8b9a4092832.yaml | 6 + .../iast/taint_sinks/_taint_sinks_utils.py | 1 + .../iast/taint_sinks/test_xss_redacted.py | 48 + .../integrations/django_tests/conftest.py | 14 +- .../django_tests/django_app/settings.py | 2 +- .../django_app/templates/index.html | 5 + .../templates/index_autoescape.html | 7 + .../django_app/templates/index_safe.html | 5 + .../django_tests/django_app/urls.py | 4 + .../django_tests/django_app/views.py | 30 + .../django_tests/test_django_appsec_iast.py | 1008 +++++++++-------- .../integrations/pygoat_tests/test_pygoat.py | 34 +- 17 files changed, 736 insertions(+), 511 deletions(-) create mode 100644 ddtrace/appsec/_iast/taint_sinks/xss.py create mode 100644 releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml create mode 100644 tests/appsec/iast/taint_sinks/test_xss_redacted.py create mode 100644 tests/appsec/integrations/django_tests/django_app/templates/index.html create mode 100644 tests/appsec/integrations/django_tests/django_app/templates/index_autoescape.html create mode 100644 tests/appsec/integrations/django_tests/django_app/templates/index_safe.html diff --git a/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py b/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py index a10455dee42..dccc18a39b6 100644 --- a/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py +++ b/ddtrace/appsec/_iast/_evidence_redaction/_sensitive_handler.py @@ -10,6 +10,7 @@ from ..constants import VULN_HEADER_INJECTION from ..constants import VULN_SQL_INJECTION from ..constants import VULN_SSRF +from ..constants import VULN_XSS from .command_injection_sensitive_analyzer import command_injection_sensitive_analyzer from .default_sensitive_analyzer import default_sensitive_analyzer from .header_injection_sensitive_analyzer import header_injection_sensitive_analyzer @@ -45,6 +46,7 @@ def __init__(self): VULN_SQL_INJECTION: sql_sensitive_analyzer, VULN_SSRF: url_sensitive_analyzer, VULN_HEADER_INJECTION: header_injection_sensitive_analyzer, + VULN_XSS: default_sensitive_analyzer, VULN_CODE_INJECTION: default_sensitive_analyzer, } diff --git a/ddtrace/appsec/_iast/_patch_modules.py b/ddtrace/appsec/_iast/_patch_modules.py index e91438ebd49..634cd6399c5 100644 --- a/ddtrace/appsec/_iast/_patch_modules.py +++ b/ddtrace/appsec/_iast/_patch_modules.py @@ -7,6 +7,7 @@ "header_injection": True, "weak_cipher": True, "weak_hash": True, + "xss": True, } diff --git a/ddtrace/appsec/_iast/constants.py b/ddtrace/appsec/_iast/constants.py index 9ac6edb0ab1..3d0edc31b83 100644 --- a/ddtrace/appsec/_iast/constants.py +++ b/ddtrace/appsec/_iast/constants.py @@ -14,6 +14,7 @@ VULN_CMDI = "COMMAND_INJECTION" VULN_HEADER_INJECTION = "HEADER_INJECTION" VULN_CODE_INJECTION = "CODE_INJECTION" +VULN_XSS = "XSS" VULN_SSRF = "SSRF" VULN_STACKTRACE_LEAK = "STACKTRACE_LEAK" diff --git a/ddtrace/appsec/_iast/taint_sinks/xss.py b/ddtrace/appsec/_iast/taint_sinks/xss.py new file mode 100644 index 00000000000..425affac77a --- /dev/null +++ b/ddtrace/appsec/_iast/taint_sinks/xss.py @@ -0,0 +1,78 @@ +from typing import Text + +from ddtrace.appsec._common_module_patches import try_unwrap +from ddtrace.appsec._constants import IAST_SPAN_TAGS +from ddtrace.appsec._iast import oce +from ddtrace.appsec._iast._iast_request_context import is_iast_request_enabled +from ddtrace.appsec._iast._metrics import _set_metric_iast_executed_sink +from ddtrace.appsec._iast._metrics import _set_metric_iast_instrumented_sink +from ddtrace.appsec._iast._metrics import increment_iast_span_metric +from ddtrace.appsec._iast._patch import set_and_check_module_is_patched +from ddtrace.appsec._iast._patch import set_module_unpatched +from ddtrace.appsec._iast._patch import try_wrap_function_wrapper +from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted +from ddtrace.appsec._iast.constants import VULN_XSS +from ddtrace.appsec._iast.taint_sinks._base import VulnerabilityBase +from ddtrace.internal.logger import get_logger +from ddtrace.settings.asm import config as asm_config + + +log = get_logger(__name__) + + +@oce.register +class XSS(VulnerabilityBase): + vulnerability_type = VULN_XSS + + +def get_version() -> Text: + return "" + + +def patch(): + if not asm_config._iast_enabled: + return + + if not set_and_check_module_is_patched("flask", default_attr="_datadog_xss_patch"): + return + if not set_and_check_module_is_patched("django", default_attr="_datadog_xss_patch"): + return + if not set_and_check_module_is_patched("fastapi", default_attr="_datadog_xss_patch"): + return + + try_wrap_function_wrapper( + "django.utils.safestring", + "mark_safe", + _iast_django_xss, + ) + + try_wrap_function_wrapper( + "django.template.defaultfilters", + "mark_safe", + _iast_django_xss, + ) + + _set_metric_iast_instrumented_sink(VULN_XSS) + + +def unpatch(): + try_unwrap("django.utils.safestring", "mark_safe") + try_unwrap("django.template.defaultfilters", "mark_safe") + + set_module_unpatched("flask", default_attr="_datadog_xss_patch") + set_module_unpatched("django", default_attr="_datadog_xss_patch") + set_module_unpatched("fastapi", default_attr="_datadog_xss_patch") + + +def _iast_django_xss(wrapped, instance, args, kwargs): + if args and len(args) >= 1: + _iast_report_xss(args[0]) + return wrapped(*args, **kwargs) + + +def _iast_report_xss(code_string: Text): + increment_iast_span_metric(IAST_SPAN_TAGS.TELEMETRY_EXECUTED_SINK, XSS.vulnerability_type) + _set_metric_iast_executed_sink(XSS.vulnerability_type) + if is_iast_request_enabled(): + if is_pyobject_tainted(code_string): + XSS.report(evidence_value=code_string) diff --git a/docker-compose.yml b/docker-compose.yml index 701b5a7d0f0..dfcee9a54ce 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -198,7 +198,6 @@ services: ports: - "127.0.0.1:8321:8321" environment: - - DD_APPSEC_ENABLED=true - DD_IAST_ENABLED=true - DD_IAST_REQUEST_SAMPLING=100 - DD_IAST_VULNERABILITIES_PER_REQUEST=100 diff --git a/releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml b/releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml new file mode 100644 index 00000000000..db470196b36 --- /dev/null +++ b/releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Code Security (IAST): XSS detection for Django applications, + which will be displayed on your DataDog Vulnerability Explorer dashboard. + See the `Application Vulnerability Management `_ documentation for more information about this feature. diff --git a/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py b/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py index 288b72d015c..ae69fbda120 100644 --- a/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py +++ b/tests/appsec/iast/taint_sinks/_taint_sinks_utils.py @@ -22,6 +22,7 @@ def get_parametrize(vuln_type, ignore_list=None): "$1 - Tainted range based redaction - multiple ranges", "Redacted source that needs to be truncated", "Query with single quoted string literal and null source", + "No redacted that needs to be truncated - whole text", ): continue diff --git a/tests/appsec/iast/taint_sinks/test_xss_redacted.py b/tests/appsec/iast/taint_sinks/test_xss_redacted.py new file mode 100644 index 00000000000..c192962e53e --- /dev/null +++ b/tests/appsec/iast/taint_sinks/test_xss_redacted.py @@ -0,0 +1,48 @@ +import os + +import pytest + +from ddtrace.appsec._iast._taint_tracking import origin_to_str +from ddtrace.appsec._iast._taint_tracking import str_to_origin +from ddtrace.appsec._iast.constants import VULN_XSS +from ddtrace.appsec._iast.taint_sinks.xss import XSS +from tests.appsec.iast.taint_sinks._taint_sinks_utils import _taint_pyobject_multiranges +from tests.appsec.iast.taint_sinks._taint_sinks_utils import get_parametrize +from tests.appsec.iast.taint_sinks.conftest import _get_iast_data + + +ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) + + +@pytest.mark.parametrize( + "evidence_input, sources_expected, vulnerabilities_expected,element", list(get_parametrize(VULN_XSS)) +) +def test_xss_redaction_suite( + evidence_input, sources_expected, vulnerabilities_expected, iast_context_defaults, element +): + tainted_object = evidence_input_value = evidence_input.get("value", "") + if evidence_input_value: + tainted_object = _taint_pyobject_multiranges( + evidence_input_value, + [ + ( + input_ranges["iinfo"]["parameterName"], + input_ranges["iinfo"]["parameterValue"], + str_to_origin(input_ranges["iinfo"]["type"]), + input_ranges["start"], + input_ranges["end"] - input_ranges["start"], + ) + for input_ranges in evidence_input.get("ranges", {}) + ], + ) + + XSS.report(tainted_object) + + data = _get_iast_data() + vulnerability = list(data["vulnerabilities"])[0] + source = list(data["sources"])[0] + source["origin"] = origin_to_str(source["origin"]) + + assert vulnerability["type"] == VULN_XSS + assert vulnerability["evidence"] == vulnerabilities_expected["evidence"] + assert source == sources_expected diff --git a/tests/appsec/integrations/django_tests/conftest.py b/tests/appsec/integrations/django_tests/conftest.py index d150edf68be..57bd68db6a6 100644 --- a/tests/appsec/integrations/django_tests/conftest.py +++ b/tests/appsec/integrations/django_tests/conftest.py @@ -5,6 +5,7 @@ import pytest from ddtrace.appsec._iast import enable_iast_propagation +from ddtrace.appsec._iast._patch_modules import patch_iast from ddtrace.contrib.internal.django.patch import patch from ddtrace.trace import Pin from tests.appsec.iast.conftest import _end_iast_context_and_oce @@ -27,11 +28,22 @@ def pytest_configure(): ) ): settings.DEBUG = False - enable_iast_propagation() + patch_iast() patch() + enable_iast_propagation() django.setup() +@pytest.fixture +def debug_mode(): + from django.conf import settings + + original_debug = settings.DEBUG + settings.DEBUG = True + yield + settings.DEBUG = original_debug + + @pytest.fixture def tracer(): tracer = DummyTracer() diff --git a/tests/appsec/integrations/django_tests/django_app/settings.py b/tests/appsec/integrations/django_tests/django_app/settings.py index 836c7602c5f..cbd7eea9c25 100644 --- a/tests/appsec/integrations/django_tests/django_app/settings.py +++ b/tests/appsec/integrations/django_tests/django_app/settings.py @@ -40,7 +40,7 @@ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ - os.path.join(BASE_DIR, "templates"), + os.path.join(BASE_DIR, "django_app", "templates"), ], "APP_DIRS": True, "OPTIONS": { diff --git a/tests/appsec/integrations/django_tests/django_app/templates/index.html b/tests/appsec/integrations/django_tests/django_app/templates/index.html new file mode 100644 index 00000000000..7135619ca9d --- /dev/null +++ b/tests/appsec/integrations/django_tests/django_app/templates/index.html @@ -0,0 +1,5 @@ + + +

Input: {{ user_input }}

+ + \ No newline at end of file diff --git a/tests/appsec/integrations/django_tests/django_app/templates/index_autoescape.html b/tests/appsec/integrations/django_tests/django_app/templates/index_autoescape.html new file mode 100644 index 00000000000..ef5f5a64ed4 --- /dev/null +++ b/tests/appsec/integrations/django_tests/django_app/templates/index_autoescape.html @@ -0,0 +1,7 @@ + + +

{% autoescape on %} + {{ user_input }} +{% endautoescape %}

+ + diff --git a/tests/appsec/integrations/django_tests/django_app/templates/index_safe.html b/tests/appsec/integrations/django_tests/django_app/templates/index_safe.html new file mode 100644 index 00000000000..8bc39da3351 --- /dev/null +++ b/tests/appsec/integrations/django_tests/django_app/templates/index_safe.html @@ -0,0 +1,5 @@ + + +

Input: {{ user_input|safe }}

+ + \ No newline at end of file diff --git a/tests/appsec/integrations/django_tests/django_app/urls.py b/tests/appsec/integrations/django_tests/django_app/urls.py index dd1d069ad77..e79b6bee284 100644 --- a/tests/appsec/integrations/django_tests/django_app/urls.py +++ b/tests/appsec/integrations/django_tests/django_app/urls.py @@ -73,6 +73,10 @@ def shutdown(request): handler("appsec/insecure-cookie/test_insecure/$", views.view_insecure_cookies_insecure), handler("appsec/insecure-cookie/test_secure/$", views.view_insecure_cookies_secure), handler("appsec/insecure-cookie/test_empty_cookie/$", views.view_insecure_cookies_empty), + handler("appsec/xss/$", views.xss_http_request_parameter_mark_safe), + handler("appsec/xss/secure/$", views.xss_secure), + handler("appsec/xss/safe/$", views.xss_http_request_parameter_template_safe), + handler("appsec/xss/autoscape/$", views.xss_http_request_parameter_autoscape), path( "appsec/sqli_http_path_parameter//", views.sqli_http_path_parameter, diff --git a/tests/appsec/integrations/django_tests/django_app/views.py b/tests/appsec/integrations/django_tests/django_app/views.py index 693a9eab365..685b3c598c2 100644 --- a/tests/appsec/integrations/django_tests/django_app/views.py +++ b/tests/appsec/integrations/django_tests/django_app/views.py @@ -8,6 +8,8 @@ from django.db import connection from django.http import HttpResponse from django.http import JsonResponse +from django.shortcuts import render +from django.utils.safestring import mark_safe from ddtrace.appsec import _asm_request_context from ddtrace.appsec._iast._taint_tracking import OriginType @@ -68,6 +70,34 @@ def checkuser_view(request, user_id): return HttpResponse(status=200) +def xss_http_request_parameter_mark_safe(request): + user_input = request.GET.get("input", "") + + # label xss_http_request_parameter_mark_safe + return render(request, "index.html", {"user_input": mark_safe(user_input)}) + + +def xss_secure(request): + user_input = request.GET.get("input", "") + + # label xss_http_request_parameter_mark_safe + return render(request, "index.html", {"user_input": user_input}) + + +def xss_http_request_parameter_template_safe(request): + user_input = request.GET.get("input", "") + + # label xss_http_request_parameter_template_safe + return render(request, "index_safe.html", {"user_input": user_input}) + + +def xss_http_request_parameter_autoscape(request): + user_input = request.GET.get("input", "") + + # label xss_http_request_parameter_autoscape + return render(request, "index_autoescape.html", {"user_input": user_input}) + + def sqli_http_request_parameter(request): import bcrypt from django.contrib.auth.hashers import BCryptSHA256PasswordHasher diff --git a/tests/appsec/integrations/django_tests/test_django_appsec_iast.py b/tests/appsec/integrations/django_tests/test_django_appsec_iast.py index dd400c64df6..657688f5760 100644 --- a/tests/appsec/integrations/django_tests/test_django_appsec_iast.py +++ b/tests/appsec/integrations/django_tests/test_django_appsec_iast.py @@ -3,20 +3,16 @@ import pytest -from ddtrace.appsec._asm_request_context import start_context +from ddtrace.appsec._common_module_patches import patch_common_modules from ddtrace.appsec._constants import IAST -from ddtrace.appsec._iast import oce -from ddtrace.appsec._iast._patch_modules import patch_iast from ddtrace.appsec._iast.constants import VULN_CMDI from ddtrace.appsec._iast.constants import VULN_HEADER_INJECTION from ddtrace.appsec._iast.constants import VULN_INSECURE_COOKIE from ddtrace.appsec._iast.constants import VULN_SQL_INJECTION from ddtrace.appsec._iast.constants import VULN_STACKTRACE_LEAK -from ddtrace.ext import SpanTypes from ddtrace.internal.compat import urlencode from ddtrace.settings.asm import config as asm_config from tests.appsec.iast.iast_utils import get_line_and_hash -from tests.utils import override_env from tests.utils import override_global_config @@ -25,7 +21,9 @@ @pytest.fixture(autouse=True) def iast_context(): - with override_env({IAST.ENV: "True", IAST.ENV_REQUEST_SAMPLING: "100", "DD_IAST_DEDUPLICATION_ENABLED": "false"}): + with override_global_config( + dict(_iast_enabled=True, _iast_deduplication_enabled=False, _iast_request_sampling=100.0) + ): yield @@ -85,32 +83,28 @@ def _aux_appsec_get_root_span_with_exception( @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_weak_hash(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - patch_iast({"weak_hash": True}) - root_span, _ = _aux_appsec_get_root_span(client, test_spans, tracer, url="/appsec/weak-hash/") - str_json = root_span.get_tag(IAST.JSON) - assert str_json is not None, "no JSON tag in root span" - vulnerability = json.loads(str_json)["vulnerabilities"][0] - assert vulnerability["location"]["path"].endswith(TEST_FILE) - assert vulnerability["evidence"]["value"] == "md5" + root_span, _ = _aux_appsec_get_root_span(client, test_spans, tracer, url="/appsec/weak-hash/") + str_json = root_span.get_tag(IAST.JSON) + assert str_json is not None, "no JSON tag in root span" + vulnerability = json.loads(str_json)["vulnerabilities"][0] + assert vulnerability["location"]["path"].endswith(TEST_FILE) + assert vulnerability["evidence"]["value"] == "md5" @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_tainted_user_agent_iast_enabled(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), - content_type="application/x-www-form-urlencoded", - url="/appsec/taint-checking-enabled/?q=aaa", - headers={"HTTP_USER_AGENT": "test/1.2.3"}, - ) + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), + content_type="application/x-www-form-urlencoded", + url="/appsec/taint-checking-enabled/?q=aaa", + headers={"HTTP_USER_AGENT": "test/1.2.3"}, + ) - assert response.status_code == 200 - assert response.content == b"test/1.2.3" + assert response.status_code == 200 + assert response.content == b"test/1.2.3" @pytest.mark.parametrize( @@ -156,8 +150,6 @@ def test_django_view_with_exception(client, test_spans, tracer, payload, content @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_tainted_user_agent_iast_disabled(client, test_spans, tracer): with override_global_config(dict(_iast_enabled=False, _iast_deduplication_enabled=False)): - oce.reconfigure() - root_span, response = _aux_appsec_get_root_span( client, test_spans, @@ -177,191 +169,181 @@ def test_django_tainted_user_agent_iast_disabled(client, test_spans, tracer): @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_tainted_user_agent_iast_enabled_sqli_http_request_parameter(client, test_spans, tracer): - with override_global_config( - dict(_iast_enabled=True, _iast_deduplication_enabled=False, _iast_request_sampling=100.0) - ): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), - content_type="application/x-www-form-urlencoded", - url="/appsec/sqli_http_request_parameter/?q=SELECT 1 FROM sqlite_master WHERE name='", - headers={"HTTP_USER_AGENT": "test/1.2.3"}, - ) + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), + content_type="application/x-www-form-urlencoded", + url="/appsec/sqli_http_request_parameter/?q=SELECT 1 FROM sqlite_master WHERE name='", + headers={"HTTP_USER_AGENT": "test/1.2.3"}, + ) - vuln_type = "SQL_INJECTION" + vuln_type = "SQL_INJECTION" - assert response.status_code == 200 - assert response.content == b"test/1.2.3" + assert response.status_code == 200 + assert response.content == b"test/1.2.3" - loaded = json.loads(root_span.get_tag(IAST.JSON)) + loaded = json.loads(root_span.get_tag(IAST.JSON)) - line, hash_value = get_line_and_hash("iast_enabled_sqli_http_request_parameter", vuln_type, filename=TEST_FILE) + line, hash_value = get_line_and_hash("iast_enabled_sqli_http_request_parameter", vuln_type, filename=TEST_FILE) - assert loaded["sources"] == [ - { - "name": "q", - "origin": "http.request.parameter", - "pattern": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN", - "redacted": True, - } - ] - - assert loaded["vulnerabilities"][0]["type"] == vuln_type - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [ - {"source": 0, "value": "SELECT "}, - {"pattern": "h", "redacted": True, "source": 0}, - {"source": 0, "value": " FROM sqlite_master WHERE name='"}, - {"redacted": True}, - {"value": "'"}, - ] + assert loaded["sources"] == [ + { + "name": "q", + "origin": "http.request.parameter", + "pattern": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN", + "redacted": True, } - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["hash"] == hash_value + ] + + assert loaded["vulnerabilities"][0]["type"] == vuln_type + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"source": 0, "value": "SELECT "}, + {"pattern": "h", "redacted": True, "source": 0}, + {"source": 0, "value": " FROM sqlite_master WHERE name='"}, + {"redacted": True}, + {"value": "'"}, + ] + } + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["hash"] == hash_value @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_parameter_name_get(client, test_spans, tracer): - with override_global_config( - dict(_iast_enabled=True, _iast_deduplication_enabled=False, _iast_request_sampling=100.0) - ): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - content_type="application/x-www-form-urlencoded", - url="/appsec/sqli_http_request_parameter_name_get/?SELECT=unused", - headers={"HTTP_USER_AGENT": "test/1.2.3"}, - ) + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + content_type="application/x-www-form-urlencoded", + url="/appsec/sqli_http_request_parameter_name_get/?SELECT=unused", + headers={"HTTP_USER_AGENT": "test/1.2.3"}, + ) - vuln_type = "SQL_INJECTION" + vuln_type = "SQL_INJECTION" - assert response.status_code == 200 - assert response.content == b"test/1.2.3" + assert response.status_code == 200 + assert response.content == b"test/1.2.3" - loaded = json.loads(root_span.get_tag(IAST.JSON)) + loaded = json.loads(root_span.get_tag(IAST.JSON)) - line, hash_value = get_line_and_hash( - "iast_enabled_sqli_http_request_parameter_name_get", vuln_type, filename=TEST_FILE - ) + line, hash_value = get_line_and_hash( + "iast_enabled_sqli_http_request_parameter_name_get", vuln_type, filename=TEST_FILE + ) - assert loaded["sources"] == [ + assert loaded["sources"] == [ + { + "name": "SELECT", + "origin": "http.request.parameter.name", + "value": "SELECT", + } + ] + + assert loaded["vulnerabilities"][0]["type"] == vuln_type + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"source": 0, "value": "SELECT"}, { - "name": "SELECT", - "origin": "http.request.parameter.name", - "value": "SELECT", - } + "value": " ", + }, + { + "redacted": True, + }, ] - - assert loaded["vulnerabilities"][0]["type"] == vuln_type - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [ - {"source": 0, "value": "SELECT"}, - { - "value": " ", - }, - { - "redacted": True, - }, - ] - } - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["hash"] == hash_value + } + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["hash"] == hash_value @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_parameter_name_post(client, test_spans, tracer): - with override_global_config( - dict(_iast_enabled=True, _iast_deduplication_enabled=False, _iast_request_sampling=100.0) - ): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - payload=urlencode({"SELECT": "unused"}), - content_type="application/x-www-form-urlencoded", - url="/appsec/sqli_http_request_parameter_name_post/", - headers={"HTTP_USER_AGENT": "test/1.2.3"}, - ) + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + payload=urlencode({"SELECT": "unused"}), + content_type="application/x-www-form-urlencoded", + url="/appsec/sqli_http_request_parameter_name_post/", + headers={"HTTP_USER_AGENT": "test/1.2.3"}, + ) - vuln_type = "SQL_INJECTION" + vuln_type = "SQL_INJECTION" - assert response.status_code == 200 - assert response.content == b"test/1.2.3" + assert response.status_code == 200 + assert response.content == b"test/1.2.3" + + loaded = json.loads(root_span.get_tag(IAST.JSON)) - loaded = json.loads(root_span.get_tag(IAST.JSON)) + line, hash_value = get_line_and_hash( + "iast_enabled_sqli_http_request_parameter_name_post", vuln_type, filename=TEST_FILE + ) - line, hash_value = get_line_and_hash( - "iast_enabled_sqli_http_request_parameter_name_post", vuln_type, filename=TEST_FILE - ) + assert loaded["sources"] == [ + { + "name": "SELECT", + "origin": "http.request.parameter.name", + "value": "SELECT", + } + ] - assert loaded["sources"] == [ + assert loaded["vulnerabilities"][0]["type"] == vuln_type + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"source": 0, "value": "SELECT"}, + { + "value": " ", + }, { - "name": "SELECT", - "origin": "http.request.parameter.name", - "value": "SELECT", - } + "redacted": True, + }, ] - - assert loaded["vulnerabilities"][0]["type"] == vuln_type - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [ - {"source": 0, "value": "SELECT"}, - { - "value": " ", - }, - { - "redacted": True, - }, - ] - } - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["hash"] == hash_value + } + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["hash"] == hash_value @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_header_value(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), - content_type="application/x-www-form-urlencoded", - url="/appsec/sqli_http_request_header_value/", - headers={"HTTP_USER_AGENT": "master"}, - ) + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), + content_type="application/x-www-form-urlencoded", + url="/appsec/sqli_http_request_header_value/", + headers={"HTTP_USER_AGENT": "master"}, + ) - assert response.status_code == 200 - assert response.content == b"master" + assert response.status_code == 200 + assert response.content == b"master" - loaded = json.loads(root_span.get_tag(IAST.JSON)) - - assert loaded["sources"] == [{"origin": "http.request.header", "name": "HTTP_USER_AGENT", "value": "master"}] - assert loaded["vulnerabilities"][0]["type"] == VULN_SQL_INJECTION - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [ - {"value": "SELECT "}, - {"redacted": True}, - {"value": " FROM sqlite_"}, - {"source": 0, "value": "master"}, - ] - } + loaded = json.loads(root_span.get_tag(IAST.JSON)) - line, hash_value = get_line_and_hash( - "iast_enabled_sqli_http_request_header_value", VULN_SQL_INJECTION, filename=TEST_FILE - ) - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["hash"] == hash_value + assert loaded["sources"] == [{"origin": "http.request.header", "name": "HTTP_USER_AGENT", "value": "master"}] + assert loaded["vulnerabilities"][0]["type"] == VULN_SQL_INJECTION + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"value": "SELECT "}, + {"redacted": True}, + {"value": " FROM sqlite_"}, + {"source": 0, "value": "master"}, + ] + } + + line, hash_value = get_line_and_hash( + "iast_enabled_sqli_http_request_header_value", VULN_SQL_INJECTION, filename=TEST_FILE + ) + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["hash"] == hash_value @pytest.mark.django_db() @@ -387,39 +369,38 @@ def test_django_iast_disabled_sqli_http_request_header_value(client, test_spans, @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_request_header_name(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), - content_type="application/x-www-form-urlencoded", - url="/appsec/sqli_http_request_header_name/", - headers={"master": "test/1.2.3"}, - ) + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + payload=urlencode({"mytestingbody_key": "mytestingbody_value"}), + content_type="application/x-www-form-urlencoded", + url="/appsec/sqli_http_request_header_name/", + headers={"master": "test/1.2.3"}, + ) - assert response.status_code == 200 - assert response.content == b"test/1.2.3" + assert response.status_code == 200 + assert response.content == b"test/1.2.3" - loaded = json.loads(root_span.get_tag(IAST.JSON)) - - assert loaded["sources"] == [{"origin": "http.request.header.name", "name": "master", "value": "master"}] - assert loaded["vulnerabilities"][0]["type"] == VULN_SQL_INJECTION - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [ - {"value": "SELECT "}, - {"redacted": True}, - {"value": " FROM sqlite_"}, - {"value": "master", "source": 0}, - ] - } + loaded = json.loads(root_span.get_tag(IAST.JSON)) - line, hash_value = get_line_and_hash( - "iast_enabled_sqli_http_request_header_name", VULN_SQL_INJECTION, filename=TEST_FILE - ) - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["hash"] == hash_value + assert loaded["sources"] == [{"origin": "http.request.header.name", "name": "master", "value": "master"}] + assert loaded["vulnerabilities"][0]["type"] == VULN_SQL_INJECTION + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"value": "SELECT "}, + {"redacted": True}, + {"value": " FROM sqlite_"}, + {"value": "master", "source": 0}, + ] + } + + line, hash_value = get_line_and_hash( + "iast_enabled_sqli_http_request_header_name", VULN_SQL_INJECTION, filename=TEST_FILE + ) + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["hash"] == hash_value @pytest.mark.django_db() @@ -498,41 +479,38 @@ def test_django_iast_disabled_sqli_http_path_parameter(client, test_spans, trace @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_cookies_name(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/sqli_http_request_cookie_name/", - cookies={"master": "test/1.2.3"}, - ) - assert response.status_code == 200 - assert response.content == b"test/1.2.3" + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/sqli_http_request_cookie_name/", + cookies={"master": "test/1.2.3"}, + ) + assert response.status_code == 200 + assert response.content == b"test/1.2.3" - loaded = json.loads(root_span.get_tag(IAST.JSON)) + loaded = json.loads(root_span.get_tag(IAST.JSON)) - vulnerability = False - for vuln in loaded["vulnerabilities"]: - if vuln["type"] == VULN_SQL_INJECTION: - vulnerability = vuln + vulnerability = False + for vuln in loaded["vulnerabilities"]: + if vuln["type"] == VULN_SQL_INJECTION: + vulnerability = vuln - assert vulnerability, "No {} reported".format(VULN_SQL_INJECTION) + assert vulnerability, "No {} reported".format(VULN_SQL_INJECTION) - assert loaded["sources"] == [{"origin": "http.request.cookie.name", "name": "master", "value": "master"}] - assert vulnerability["evidence"] == { - "valueParts": [ - {"value": "SELECT "}, - {"redacted": True}, - {"value": " FROM sqlite_"}, - {"value": "master", "source": 0}, - ] - } - line, hash_value = get_line_and_hash( - "iast_enabled_sqli_http_cookies_name", VULN_SQL_INJECTION, filename=TEST_FILE - ) - assert vulnerability["location"]["path"] == TEST_FILE - assert vulnerability["location"]["line"] == line - assert vulnerability["hash"] == hash_value + assert loaded["sources"] == [{"origin": "http.request.cookie.name", "name": "master", "value": "master"}] + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": "SELECT "}, + {"redacted": True}, + {"value": " FROM sqlite_"}, + {"value": "master", "source": 0}, + ] + } + line, hash_value = get_line_and_hash("iast_enabled_sqli_http_cookies_name", VULN_SQL_INJECTION, filename=TEST_FILE) + assert vulnerability["location"]["path"] == TEST_FILE + assert vulnerability["location"]["line"] == line + assert vulnerability["hash"] == hash_value @pytest.mark.django_db() @@ -556,43 +534,40 @@ def test_django_iast_disabled_sqli_http_cookies_name(client, test_spans, tracer) @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_cookies_value(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/sqli_http_request_cookie_value/", - cookies={"master": "master"}, - ) - assert response.status_code == 200 - assert response.content == b"master" + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/sqli_http_request_cookie_value/", + cookies={"master": "master"}, + ) + assert response.status_code == 200 + assert response.content == b"master" - loaded = json.loads(root_span.get_tag(IAST.JSON)) + loaded = json.loads(root_span.get_tag(IAST.JSON)) - vulnerability = False - for vuln in loaded["vulnerabilities"]: - if vuln["type"] == VULN_SQL_INJECTION: - vulnerability = vuln + vulnerability = False + for vuln in loaded["vulnerabilities"]: + if vuln["type"] == VULN_SQL_INJECTION: + vulnerability = vuln - assert vulnerability, "No {} reported".format(VULN_SQL_INJECTION) - assert loaded["sources"] == [{"origin": "http.request.cookie.value", "name": "master", "value": "master"}] - assert vulnerability["type"] == "SQL_INJECTION" + assert vulnerability, "No {} reported".format(VULN_SQL_INJECTION) + assert loaded["sources"] == [{"origin": "http.request.cookie.value", "name": "master", "value": "master"}] + assert vulnerability["type"] == "SQL_INJECTION" - assert vulnerability["evidence"] == { - "valueParts": [ - {"value": "SELECT "}, - {"redacted": True}, - {"value": " FROM sqlite_"}, - {"value": "master", "source": 0}, - ] - } + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": "SELECT "}, + {"redacted": True}, + {"value": " FROM sqlite_"}, + {"value": "master", "source": 0}, + ] + } - line, hash_value = get_line_and_hash( - "iast_enabled_sqli_http_cookies_value", VULN_SQL_INJECTION, filename=TEST_FILE - ) - assert vulnerability["location"]["line"] == line - assert vulnerability["location"]["path"] == TEST_FILE - assert vulnerability["hash"] == hash_value + line, hash_value = get_line_and_hash("iast_enabled_sqli_http_cookies_value", VULN_SQL_INJECTION, filename=TEST_FILE) + assert vulnerability["location"]["line"] == line + assert vulnerability["location"]["path"] == TEST_FILE + assert vulnerability["hash"] == hash_value @pytest.mark.django_db() @@ -623,35 +598,34 @@ def test_django_iast_disabled_sqli_http_cookies_value(client, test_spans, tracer @pytest.mark.django_db() @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_sqli_http_body(client, test_spans, tracer, payload, content_type): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/sqli_http_request_body/", - payload=payload, - content_type=content_type, - ) - loaded = json.loads(root_span.get_tag(IAST.JSON)) - - line, hash_value = get_line_and_hash("iast_enabled_sqli_http_body", VULN_SQL_INJECTION, filename=TEST_FILE) - - assert loaded["sources"] == [{"origin": "http.request.body", "name": "http.request.body", "value": "master"}] - assert loaded["vulnerabilities"][0]["type"] == VULN_SQL_INJECTION - assert loaded["vulnerabilities"][0]["hash"] == hash_value - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [ - {"value": "SELECT "}, - {"redacted": True}, - {"value": " FROM sqlite_"}, - {"value": "master", "source": 0}, - ] - } - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/sqli_http_request_body/", + payload=payload, + content_type=content_type, + ) + loaded = json.loads(root_span.get_tag(IAST.JSON)) - assert response.status_code == 200 - assert response.content == b"master" + line, hash_value = get_line_and_hash("iast_enabled_sqli_http_body", VULN_SQL_INJECTION, filename=TEST_FILE) + + assert loaded["sources"] == [{"origin": "http.request.body", "name": "http.request.body", "value": "master"}] + assert loaded["vulnerabilities"][0]["type"] == VULN_SQL_INJECTION + assert loaded["vulnerabilities"][0]["hash"] == hash_value + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"value": "SELECT "}, + {"redacted": True}, + {"value": " FROM sqlite_"}, + {"value": "master", "source": 0}, + ] + } + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + + assert response.status_code == 200 + assert response.content == b"master" @pytest.mark.parametrize( @@ -718,244 +692,314 @@ def test_django_iast_disabled_sqli_http_body(client, test_spans, tracer): @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_querydict(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True)): - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/validate_querydict/?x=1&y=2&x=3", - ) + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/validate_querydict/?x=1&y=2&x=3", + ) - assert root_span.get_tag(IAST.JSON) is None - assert response.status_code == 200 - assert ( - response.content == b"x=['1', '3'], all=[('x', ['1', '3']), ('y', ['2'])]," - b" keys=['x', 'y'], urlencode=x=1&x=3&y=2" - ) + assert root_span.get_tag(IAST.JSON) is None + assert response.status_code == 200 + assert ( + response.content == b"x=['1', '3'], all=[('x', ['1', '3']), ('y', ['2'])]," + b" keys=['x', 'y'], urlencode=x=1&x=3&y=2" + ) @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_command_injection(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - patch_iast({"command_injection": True}) - from ddtrace.appsec._common_module_patches import patch_common_modules - - patch_common_modules() - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/command-injection/", - payload="master", - content_type="application/json", - ) + patch_common_modules() + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/command-injection/", + payload="master", + content_type="application/json", + ) - loaded = json.loads(root_span.get_tag(IAST.JSON)) + loaded = json.loads(root_span.get_tag(IAST.JSON)) - line, hash_value = get_line_and_hash("iast_command_injection", VULN_CMDI, filename=TEST_FILE) + line, hash_value = get_line_and_hash("iast_command_injection", VULN_CMDI, filename=TEST_FILE) - assert loaded["sources"] == [ - {"name": "http.request.body", "origin": "http.request.body", "pattern": "abcdef", "redacted": True} - ] - assert loaded["vulnerabilities"][0]["type"] == VULN_CMDI - assert loaded["vulnerabilities"][0]["hash"] == hash_value - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [{"value": "dir "}, {"redacted": True}, {"pattern": "abcdef", "redacted": True, "source": 0}] - } - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["sources"] == [ + {"name": "http.request.body", "origin": "http.request.body", "pattern": "abcdef", "redacted": True} + ] + assert loaded["vulnerabilities"][0]["type"] == VULN_CMDI + assert loaded["vulnerabilities"][0]["hash"] == hash_value + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [{"value": "dir "}, {"redacted": True}, {"pattern": "abcdef", "redacted": True, "source": 0}] + } + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_header_injection(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - patch_iast({"header_injection": True}) - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/header-injection/", - payload="master", - content_type="application/json", - ) + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/header-injection/", + payload="master", + content_type="application/json", + ) - loaded = json.loads(root_span.get_tag(IAST.JSON)) + loaded = json.loads(root_span.get_tag(IAST.JSON)) - line, hash_value = get_line_and_hash("iast_header_injection", VULN_HEADER_INJECTION, filename=TEST_FILE) + line, hash_value = get_line_and_hash("iast_header_injection", VULN_HEADER_INJECTION, filename=TEST_FILE) - assert loaded["sources"] == [{"origin": "http.request.body", "name": "http.request.body", "value": "master"}] - assert loaded["vulnerabilities"][0]["type"] == VULN_HEADER_INJECTION - assert loaded["vulnerabilities"][0]["hash"] == hash_value - assert loaded["vulnerabilities"][0]["evidence"] == { - "valueParts": [{"value": "Header-Injection: "}, {"source": 0, "value": "master"}] - } - assert loaded["vulnerabilities"][0]["location"]["line"] == line - assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["sources"] == [{"origin": "http.request.body", "name": "http.request.body", "value": "master"}] + assert loaded["vulnerabilities"][0]["type"] == VULN_HEADER_INJECTION + assert loaded["vulnerabilities"][0]["hash"] == hash_value + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [{"value": "Header-Injection: "}, {"source": 0, "value": "master"}] + } + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/insecure-cookie/test_insecure/", - ) + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/insecure-cookie/test_insecure/", + ) - assert root_span.get_metric(IAST.ENABLED) == 1.0 + assert root_span.get_metric(IAST.ENABLED) == 1.0 - loaded = json.loads(root_span.get_tag(IAST.JSON)) - assert loaded["sources"] == [] - assert len(loaded["vulnerabilities"]) == 1 - vulnerability = loaded["vulnerabilities"][0] - assert vulnerability["type"] == VULN_INSECURE_COOKIE - assert vulnerability["evidence"] == {"valueParts": [{"value": "insecure"}]} - assert "path" not in vulnerability["location"].keys() - assert "line" not in vulnerability["location"].keys() - assert vulnerability["location"]["spanId"] - assert vulnerability["hash"] + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [] + assert len(loaded["vulnerabilities"]) == 1 + vulnerability = loaded["vulnerabilities"][0] + assert vulnerability["type"] == VULN_INSECURE_COOKIE + assert vulnerability["evidence"] == {"valueParts": [{"value": "insecure"}]} + assert "path" not in vulnerability["location"].keys() + assert "line" not in vulnerability["location"].keys() + assert vulnerability["location"]["spanId"] + assert vulnerability["hash"] @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_secure(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/insecure-cookie/test_secure/", - ) + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/insecure-cookie/test_secure/", + ) - assert root_span.get_metric(IAST.ENABLED) == 1.0 + assert root_span.get_metric(IAST.ENABLED) == 1.0 - assert root_span.get_tag(IAST.JSON) is None + assert root_span.get_tag(IAST.JSON) is None @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_empty_cookie(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/insecure-cookie/test_empty_cookie/", - ) + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/insecure-cookie/test_empty_cookie/", + ) - assert root_span.get_metric(IAST.ENABLED) == 1.0 + assert root_span.get_metric(IAST.ENABLED) == 1.0 - assert root_span.get_tag(IAST.JSON) is None + assert root_span.get_tag(IAST.JSON) is None @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_2_insecure_1_secure(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/insecure-cookie/test_insecure_2_1/", - ) + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/insecure-cookie/test_insecure_2_1/", + ) - assert root_span.get_metric(IAST.ENABLED) == 1.0 + assert root_span.get_metric(IAST.ENABLED) == 1.0 - loaded = json.loads(root_span.get_tag(IAST.JSON)) - assert loaded["sources"] == [] - assert len(loaded["vulnerabilities"]) == 2 + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [] + assert len(loaded["vulnerabilities"]) == 2 @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_insecure_cookie_special_characters(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _iast_deduplication_enabled=False)): - oce.reconfigure() - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/insecure-cookie/test_insecure_special/", - ) + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/insecure-cookie/test_insecure_special/", + ) - assert root_span.get_metric(IAST.ENABLED) == 1.0 + assert root_span.get_metric(IAST.ENABLED) == 1.0 - loaded = json.loads(root_span.get_tag(IAST.JSON)) - assert loaded["sources"] == [] - assert len(loaded["vulnerabilities"]) == 1 - vulnerability = loaded["vulnerabilities"][0] - assert vulnerability["type"] == VULN_INSECURE_COOKIE - assert vulnerability["evidence"] == {"valueParts": [{"value": "insecure"}]} - assert "path" not in vulnerability["location"].keys() - assert "line" not in vulnerability["location"].keys() - assert vulnerability["location"]["spanId"] - assert vulnerability["hash"] + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [] + assert len(loaded["vulnerabilities"]) == 1 + vulnerability = loaded["vulnerabilities"][0] + assert vulnerability["type"] == VULN_INSECURE_COOKIE + assert vulnerability["evidence"] == {"valueParts": [{"value": "insecure"}]} + assert "path" not in vulnerability["location"].keys() + assert "line" not in vulnerability["location"].keys() + assert vulnerability["location"]["spanId"] + assert vulnerability["hash"] @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_django_stacktrace_leak(client, test_spans, tracer): - with override_global_config(dict(_iast_enabled=True, _deduplication_enabled=False)): - oce.reconfigure() - root_span, _ = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/stacktrace_leak/", - ) + root_span, _ = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/stacktrace_leak/", + ) + + assert root_span.get_metric(IAST.ENABLED) == 1.0 + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [] + assert len(loaded["vulnerabilities"]) == 1 + vulnerability = loaded["vulnerabilities"][0] + assert vulnerability["type"] == VULN_STACKTRACE_LEAK + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": 'Module: ".home.foobaruser.sources.minimal-django-example.app.py"\nException: IndexError'} + ] + } + assert vulnerability["hash"] + + +def test_django_stacktrace_from_technical_500_response(client, test_spans, tracer, debug_mode): + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/stacktrace_leak_500/", + content_type="text/html", + ) + + assert response.status_code == 500, "Expected a 500 status code" + assert root_span.get_metric(IAST.ENABLED) == 1.0 + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + # technical_500_response reports a XSS also + vulnerability = [vln for vln in loaded["vulnerabilities"] if vln["type"] == VULN_STACKTRACE_LEAK][0] + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": "Module: tests.appsec.integrations.django_tests.django_app.views\nException: Exception"} + ] + } + assert vulnerability["hash"] + + +def test_django_xss(client, test_spans, tracer): + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/xss/?input=", + ) + + vuln_type = "XSS" - assert root_span.get_metric(IAST.ENABLED) == 1.0 - - loaded = json.loads(root_span.get_tag(IAST.JSON)) - assert loaded["sources"] == [] - assert len(loaded["vulnerabilities"]) == 1 - vulnerability = loaded["vulnerabilities"][0] - assert vulnerability["type"] == VULN_STACKTRACE_LEAK - assert vulnerability["evidence"] == { - "valueParts": [ - {"value": 'Module: ".home.foobaruser.sources.minimal-django-example.app.py"\nException: IndexError'} - ] + assert response.status_code == 200 + assert response.content == b"\n\n

Input:

\n\n" + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + + line, hash_value = get_line_and_hash("xss_http_request_parameter_mark_safe", vuln_type, filename=TEST_FILE) + + assert loaded["sources"] == [ + { + "name": "input", + "origin": "http.request.parameter", + "value": "", } - assert vulnerability["hash"] + ] + assert loaded["vulnerabilities"][0]["type"] == vuln_type + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"source": 0, "value": ""}, + ] + } + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["hash"] == hash_value -@pytest.fixture -def debug_mode(): - from django.conf import settings - original_debug = settings.DEBUG - settings.DEBUG = True - yield - settings.DEBUG = original_debug +def test_django_xss_safe_template_tag(client, test_spans, tracer): + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/xss/safe/?input=", + ) + vuln_type = "XSS" -@pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") -def test_django_stacktrace_from_technical_500_response(client, test_spans, tracer, debug_mode): - with override_global_config(dict(_iast_enabled=True, _deduplication_enabled=False)): - with tracer.trace("test", span_type=SpanTypes.WEB, service="test") as span: - start_context(span) - oce.reconfigure() - root_span, response = _aux_appsec_get_root_span( - client, - test_spans, - tracer, - url="/appsec/stacktrace_leak_500/", - content_type="text/html", - ) - - assert response.status_code == 500, "Expected a 500 status code" - assert root_span.get_metric(IAST.ENABLED) == 1.0 - - loaded = json.loads(root_span.get_tag(IAST.JSON)) - assert loaded["sources"] == [] - assert len(loaded["vulnerabilities"]) == 1 - vulnerability = loaded["vulnerabilities"][0] - assert vulnerability["type"] == VULN_STACKTRACE_LEAK - assert vulnerability["evidence"] == { - "valueParts": [ - {"value": "Module: tests.appsec.integrations.django_tests.django_app.views\nException: Exception"} - ] - } - assert vulnerability["hash"] + assert response.status_code == 200 + assert response.content == b"\n\n

Input:

\n\n" + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + + line, hash_value = get_line_and_hash("xss_http_request_parameter_template_safe", vuln_type, filename=TEST_FILE) + + assert loaded["sources"] == [ + { + "name": "input", + "origin": "http.request.parameter", + "value": "", + } + ] + + assert loaded["vulnerabilities"][0]["type"] == vuln_type + assert loaded["vulnerabilities"][0]["evidence"] == { + "valueParts": [ + {"source": 0, "value": ""}, + ] + } + assert loaded["vulnerabilities"][0]["location"]["path"] == TEST_FILE + assert loaded["vulnerabilities"][0]["location"]["line"] == line + assert loaded["vulnerabilities"][0]["hash"] == hash_value + + +def test_django_xss_autoscape(client, test_spans, tracer): + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/xss/autoscape/?input=", + ) + + assert response.status_code == 200 + assert ( + response.content + == b"\n\n

\n <script>alert('XSS')</script>\n

\n\n\n" + ), f"Error. content is {response.content}" + + loaded = root_span.get_tag(IAST.JSON) + assert loaded is None + + +def test_django_xss_secure(client, test_spans, tracer): + root_span, response = _aux_appsec_get_root_span( + client, + test_spans, + tracer, + url="/appsec/xss/secure/?input=", + ) + + assert response.status_code == 200 + assert ( + response.content + == b"\n\n

Input: <script>alert('XSS')</script>

\n\n" + ) + + loaded = root_span.get_tag(IAST.JSON) + assert loaded is None diff --git a/tests/appsec/integrations/pygoat_tests/test_pygoat.py b/tests/appsec/integrations/pygoat_tests/test_pygoat.py index 8bb8baae1bd..8e6ff5da0ff 100644 --- a/tests/appsec/integrations/pygoat_tests/test_pygoat.py +++ b/tests/appsec/integrations/pygoat_tests/test_pygoat.py @@ -5,7 +5,6 @@ import requests from tests.appsec.iast.conftest import iast_context_defaults -from tests.utils import flaky span_defaults = iast_context_defaults # So ruff does not remove it @@ -108,7 +107,6 @@ def test_nohttponly_cookie(client): assert vulnerability_in_traces("NO_HTTPONLY_COOKIE", client.agent_session) -@flaky(1735812000) def test_weak_random(client): reply = client.pygoat_session.get(PYGOAT_URL + "/otp?email=test%40test.com", headers=TESTAGENT_HEADERS) assert reply.status_code == 200 @@ -124,7 +122,6 @@ def test_weak_hash(client): assert vulnerability_in_traces("WEAK_HASH", client.agent_session) -@flaky(1735812000) def test_cmdi(client): payload = {"domain": "google.com && ls", "csrfmiddlewaretoken": client.csrftoken} reply = client.pygoat_session.post(PYGOAT_URL + "/cmd_lab", data=payload, headers=TESTAGENT_HEADERS) @@ -132,7 +129,6 @@ def test_cmdi(client): assert vulnerability_in_traces("COMMAND_INJECTION", client.agent_session) -@pytest.mark.skip("TODO: fix interaction with new RASP rules") def test_sqli(client): payload = {"name": "admin", "pass": "anything' OR '1' ='1", "csrfmiddlewaretoken": client.csrftoken} reply = client.pygoat_session.post(PYGOAT_URL + "/sql_lab", data=payload, headers=TESTAGENT_HEADERS) @@ -142,34 +138,20 @@ def test_sqli(client): @pytest.mark.skip("TODO: SSRF is not implemented for open()") def test_ssrf1(client, iast_context_defaults): - from ddtrace.appsec._iast._taint_tracking import OriginType - from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject - - s = "templates/Lab/ssrf/blogs/blog2.txt" - tainted_path = taint_pyobject( - pyobject=s, - source_name="test_ssrf", - source_value=s, - source_origin=OriginType.PARAMETER, - ) - payload = {"blog": tainted_path, "csrfmiddlewaretoken": client.csrftoken} + payload = {"blog": "templates/Lab/ssrf/blogs/blog2.txt", "csrfmiddlewaretoken": client.csrftoken} reply = client.pygoat_session.post(PYGOAT_URL + "/ssrf_lab", data=payload, headers=TESTAGENT_HEADERS) assert reply.status_code == 200 assert vulnerability_in_traces("SSRF", client.agent_session) def test_ssrf2(client, iast_context_defaults): - from ddtrace.appsec._iast._taint_tracking import OriginType - from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject - - s = "http://example.com" - tainted_path = taint_pyobject( - pyobject=s, - source_name="test_ssrf", - source_value=s, - source_origin=OriginType.PARAMETER, - ) - payload = {"url": tainted_path, "csrfmiddlewaretoken": client.csrftoken} + payload = {"url": "http://example.com", "csrfmiddlewaretoken": client.csrftoken} reply = client.pygoat_session.post(PYGOAT_URL + "/ssrf_lab2", data=payload, headers=TESTAGENT_HEADERS) assert reply.status_code == 200 assert vulnerability_in_traces("SSRF", client.agent_session) + + +def test_xss(client): + reply = client.pygoat_session.get(PYGOAT_URL + '/xssL?q=', headers=TESTAGENT_HEADERS) + assert reply.status_code == 200 + assert vulnerability_in_traces("XSS", client.agent_session) From 2ccaaef5ff4a231f53bc1d0798dac0ddcb5f5177 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Tue, 4 Feb 2025 11:54:44 +0100 Subject: [PATCH 45/63] chore(ci): migrate Appsec fastapi tests (#12196) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Laplie Anderson Co-authored-by: Brett Langdon --- hatch.toml | 39 ++++++++++++++++++ .../integrations/fastapi_tests/__init__.py | 0 .../appsec/integrations/fastapi_tests/app.py | 6 +++ .../integrations/fastapi_tests/conftest.py | 41 +++++++++++++++++++ .../fastapi_tests}/test_fastapi_appsec.py | 0 .../test_fastapi_appsec_iast.py | 2 +- 6 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 tests/appsec/integrations/fastapi_tests/__init__.py create mode 100644 tests/appsec/integrations/fastapi_tests/app.py create mode 100644 tests/appsec/integrations/fastapi_tests/conftest.py rename tests/{contrib/fastapi => appsec/integrations/fastapi_tests}/test_fastapi_appsec.py (100%) rename tests/{contrib/fastapi => appsec/integrations/fastapi_tests}/test_fastapi_appsec_iast.py (99%) diff --git a/hatch.toml b/hatch.toml index 337ace3ca26..3e80f24a5e7 100644 --- a/hatch.toml +++ b/hatch.toml @@ -400,6 +400,45 @@ python = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] flask = ["~=3.0"] +[envs.appsec_integrations_fastapi] +template = "appsec_integrations_fastapi" +dependencies = [ + "pytest", + "pytest-cov", + "requests", + "hypothesis", + "jinja2", + "httpx<0.28.0", + "anyio{matrix:anyio:}", + "fastapi{matrix:fastapi}" +] + +[envs.appsec_integrations_fastapi.env-vars] +CMAKE_BUILD_PARALLEL_LEVEL = "12" + +[envs.appsec_integrations_fastapi.scripts] +test = [ + "uname -a", + "pip freeze", + "DD_TRACE_AGENT_URL=\"http://testagent:9126\" DD_CIVISIBILITY_ITR_ENABLED=0 DD_IAST_REQUEST_SAMPLING=100 DD_IAST_DEDUPLICATION_ENABLED=false python -m pytest -vvv {args:tests/appsec/integrations/fastapi_tests/}", +] + + +# if you add or remove a version here, please also update the parallelism parameter +# in .circleci/config.templ.yml +[[envs.appsec_integrations_fastapi.matrix]] +python = ["3.8", "3.10", "3.13"] +fastapi = ["==0.86.0"] +anyio = ["==3.7.1"] + +[[envs.appsec_integrations_fastapi.matrix]] +python = ["3.8", "3.10", "3.13"] +fastapi = ["==0.94.1"] + +[[envs.appsec_integrations_fastapi.matrix]] +python = ["3.8", "3.10", "3.13"] +fastapi = ["~=0.114.2"] + ## ASM FastAPI diff --git a/tests/appsec/integrations/fastapi_tests/__init__.py b/tests/appsec/integrations/fastapi_tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/appsec/integrations/fastapi_tests/app.py b/tests/appsec/integrations/fastapi_tests/app.py new file mode 100644 index 00000000000..40df0036fd2 --- /dev/null +++ b/tests/appsec/integrations/fastapi_tests/app.py @@ -0,0 +1,6 @@ +from fastapi import FastAPI + + +def get_app(): + app = FastAPI() + return app diff --git a/tests/appsec/integrations/fastapi_tests/conftest.py b/tests/appsec/integrations/fastapi_tests/conftest.py new file mode 100644 index 00000000000..5b235f5e6dd --- /dev/null +++ b/tests/appsec/integrations/fastapi_tests/conftest.py @@ -0,0 +1,41 @@ +from fastapi.testclient import TestClient +import pytest + +import ddtrace +from ddtrace.contrib.internal.fastapi.patch import patch as fastapi_patch +from ddtrace.contrib.internal.fastapi.patch import unpatch as fastapi_unpatch +from tests.utils import DummyTracer +from tests.utils import TracerSpanContainer + +from . import app + + +@pytest.fixture +def tracer(): + original_tracer = ddtrace.tracer + tracer = DummyTracer() + + ddtrace.tracer = tracer + fastapi_patch() + yield tracer + ddtrace.tracer = original_tracer + fastapi_unpatch() + + +@pytest.fixture +def test_spans(tracer): + container = TracerSpanContainer(tracer) + yield container + container.reset() + + +@pytest.fixture +def fastapi_application(tracer): + application = app.get_app() + yield application + + +@pytest.fixture +def client(tracer, fastapi_application): + with TestClient(fastapi_application) as test_client: + yield test_client diff --git a/tests/contrib/fastapi/test_fastapi_appsec.py b/tests/appsec/integrations/fastapi_tests/test_fastapi_appsec.py similarity index 100% rename from tests/contrib/fastapi/test_fastapi_appsec.py rename to tests/appsec/integrations/fastapi_tests/test_fastapi_appsec.py diff --git a/tests/contrib/fastapi/test_fastapi_appsec_iast.py b/tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py similarity index 99% rename from tests/contrib/fastapi/test_fastapi_appsec_iast.py rename to tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py index 23174d81abf..81702f3c8d9 100644 --- a/tests/contrib/fastapi/test_fastapi_appsec_iast.py +++ b/tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py @@ -35,7 +35,7 @@ from tests.utils import override_global_config -TEST_FILE_PATH = "tests/contrib/fastapi/test_fastapi_appsec_iast.py" +TEST_FILE_PATH = "tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py" fastapi_version = tuple([int(v) for v in _fastapi_version.split(".")]) From 3ac70254751d343d4a4a518c7fc8ad85ff0bdb5c Mon Sep 17 00:00:00 2001 From: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Date: Tue, 4 Feb 2025 13:12:04 -0500 Subject: [PATCH 46/63] chore(openai): remove remaining v0 snapshot files (#12218) Removes unused snapshots from now-removed v0 tests. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ...t_integration_service_name[None-None].json | 77 ------------------- ...est_integration_service_name[None-v0].json | 77 ------------------- ...est_integration_service_name[None-v1].json | 77 ------------------- ..._integration_service_name[mysvc-None].json | 77 ------------------- ...st_integration_service_name[mysvc-v0].json | 77 ------------------- ...st_integration_service_name[mysvc-v1].json | 77 ------------------- 6 files changed, 462 deletions(-) delete mode 100644 tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-None].json delete mode 100644 tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v0].json delete mode 100644 tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v1].json delete mode 100644 tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-None].json delete mode 100644 tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v0].json delete mode 100644 tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v1].json diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-None].json b/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-None].json deleted file mode 100644 index 65eec00d960..00000000000 --- a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-None].json +++ /dev/null @@ -1,77 +0,0 @@ -[[ - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65674d7100000000", - "component": "openai", - "language": "python", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.max_tokens": "10", - "openai.request.method": "POST", - "openai.request.model": "ada", - "openai.request.n": "2", - "openai.request.prompt.0": "Hello world", - "openai.request.stop": ".", - "openai.request.temperature": "0.8", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": ", relax!\u201d I said to my laptop", - "openai.response.choices.1.finish_reason": "stop", - "openai.response.choices.1.text": " (1", - "openai.response.created": "1681852797", - "openai.response.id": "cmpl-76n1xLvRKv3mfjx7hJ41UHrHy9ar6", - "openai.response.model": "ada", - "openai.user.api_key": "sk-...key>", - "runtime-id": "8c92d3e850d9413593bf481d805039d1" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249979, - "process_id": 20673 - }, - "duration": 21745000, - "start": 1701268849462298000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "ddtrace_subprocess_dir", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.2", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 2999000, - "start": 1701268849479960000 - }]] diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v0].json b/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v0].json deleted file mode 100644 index d6417fb5667..00000000000 --- a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v0].json +++ /dev/null @@ -1,77 +0,0 @@ -[[ - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65674d7200000000", - "component": "openai", - "language": "python", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.max_tokens": "10", - "openai.request.method": "POST", - "openai.request.model": "ada", - "openai.request.n": "2", - "openai.request.prompt.0": "Hello world", - "openai.request.stop": ".", - "openai.request.temperature": "0.8", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": ", relax!\u201d I said to my laptop", - "openai.response.choices.1.finish_reason": "stop", - "openai.response.choices.1.text": " (1", - "openai.response.created": "1681852797", - "openai.response.id": "cmpl-76n1xLvRKv3mfjx7hJ41UHrHy9ar6", - "openai.response.model": "ada", - "openai.user.api_key": "sk-...key>", - "runtime-id": "675032183b244929ba8c3a0a1c0021e5" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249979, - "process_id": 20696 - }, - "duration": 20412000, - "start": 1701268850764763000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "ddtrace_subprocess_dir", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.2", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 3134000, - "start": 1701268850780901000 - }]] diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v1].json b/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v1].json deleted file mode 100644 index 979ea768ef5..00000000000 --- a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[None-v1].json +++ /dev/null @@ -1,77 +0,0 @@ -[[ - { - "name": "openai.request", - "service": "ddtrace_subprocess_dir", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65674d7400000000", - "component": "openai", - "language": "python", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.max_tokens": "10", - "openai.request.method": "POST", - "openai.request.model": "ada", - "openai.request.n": "2", - "openai.request.prompt.0": "Hello world", - "openai.request.stop": ".", - "openai.request.temperature": "0.8", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": ", relax!\u201d I said to my laptop", - "openai.response.choices.1.finish_reason": "stop", - "openai.response.choices.1.text": " (1", - "openai.response.created": "1681852797", - "openai.response.id": "cmpl-76n1xLvRKv3mfjx7hJ41UHrHy9ar6", - "openai.response.model": "ada", - "openai.user.api_key": "sk-...key>", - "runtime-id": "1f3499a720954236be60cf0fece4246c" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249979, - "process_id": 20714 - }, - "duration": 19970000, - "start": 1701268852029562000 - }, - { - "name": "http.client.request", - "service": "ddtrace_subprocess_dir", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "http", - "error": 0, - "meta": { - "_dd.peer.service.source": "out.host", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.2", - "out.host": "api.openai.com", - "peer.service": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 2897000, - "start": 1701268852045569000 - }]] diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-None].json b/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-None].json deleted file mode 100644 index a80c1218caf..00000000000 --- a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-None].json +++ /dev/null @@ -1,77 +0,0 @@ -[[ - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65674d7500000000", - "component": "openai", - "language": "python", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.max_tokens": "10", - "openai.request.method": "POST", - "openai.request.model": "ada", - "openai.request.n": "2", - "openai.request.prompt.0": "Hello world", - "openai.request.stop": ".", - "openai.request.temperature": "0.8", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": ", relax!\u201d I said to my laptop", - "openai.response.choices.1.finish_reason": "stop", - "openai.response.choices.1.text": " (1", - "openai.response.created": "1681852797", - "openai.response.id": "cmpl-76n1xLvRKv3mfjx7hJ41UHrHy9ar6", - "openai.response.model": "ada", - "openai.user.api_key": "sk-...key>", - "runtime-id": "1244eea37568412fb5bdedf9c37ed48a" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249979, - "process_id": 20736 - }, - "duration": 19953000, - "start": 1701268853284736000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "mysvc", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.2", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 2837000, - "start": 1701268853300833000 - }]] diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v0].json b/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v0].json deleted file mode 100644 index f3f9c57f768..00000000000 --- a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v0].json +++ /dev/null @@ -1,77 +0,0 @@ -[[ - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65674d7600000000", - "component": "openai", - "language": "python", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.max_tokens": "10", - "openai.request.method": "POST", - "openai.request.model": "ada", - "openai.request.n": "2", - "openai.request.prompt.0": "Hello world", - "openai.request.stop": ".", - "openai.request.temperature": "0.8", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": ", relax!\u201d I said to my laptop", - "openai.response.choices.1.finish_reason": "stop", - "openai.response.choices.1.text": " (1", - "openai.response.created": "1681852797", - "openai.response.id": "cmpl-76n1xLvRKv3mfjx7hJ41UHrHy9ar6", - "openai.response.model": "ada", - "openai.user.api_key": "sk-...key>", - "runtime-id": "12b4a711854c44f681695957b545dcf5" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249979, - "process_id": 20750 - }, - "duration": 25352000, - "start": 1701268854568669000 - }, - { - "name": "requests.request", - "service": "openai", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "http", - "error": 0, - "meta": { - "_dd.base_service": "mysvc", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.2", - "out.host": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1 - }, - "duration": 3922000, - "start": 1701268854588758000 - }]] diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v1].json b/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v1].json deleted file mode 100644 index 0696ae54454..00000000000 --- a/tests/snapshots/tests.contrib.openai.test_openai_v0.test_integration_service_name[mysvc-v1].json +++ /dev/null @@ -1,77 +0,0 @@ -[[ - { - "name": "openai.request", - "service": "mysvc", - "resource": "createCompletion", - "trace_id": 0, - "span_id": 1, - "parent_id": 0, - "type": "", - "error": 0, - "meta": { - "_dd.p.dm": "-0", - "_dd.p.tid": "65674d7700000000", - "component": "openai", - "language": "python", - "openai.api_base": "https://api.openai.com/v1", - "openai.api_type": "open_ai", - "openai.organization.name": "datadog-4", - "openai.request.client": "OpenAI", - "openai.request.endpoint": "/v1/completions", - "openai.request.max_tokens": "10", - "openai.request.method": "POST", - "openai.request.model": "ada", - "openai.request.n": "2", - "openai.request.prompt.0": "Hello world", - "openai.request.stop": ".", - "openai.request.temperature": "0.8", - "openai.response.choices.0.finish_reason": "length", - "openai.response.choices.0.text": ", relax!\u201d I said to my laptop", - "openai.response.choices.1.finish_reason": "stop", - "openai.response.choices.1.text": " (1", - "openai.response.created": "1681852797", - "openai.response.id": "cmpl-76n1xLvRKv3mfjx7hJ41UHrHy9ar6", - "openai.response.model": "ada", - "openai.user.api_key": "sk-...key>", - "runtime-id": "03e7664126ea4fe99e0aefec4efd003c" - }, - "metrics": { - "_dd.measured": 1, - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "openai.organization.ratelimit.requests.limit": 3000, - "openai.organization.ratelimit.requests.remaining": 2999, - "openai.organization.ratelimit.tokens.limit": 250000, - "openai.organization.ratelimit.tokens.remaining": 249979, - "process_id": 20772 - }, - "duration": 19966000, - "start": 1701268855885252000 - }, - { - "name": "http.client.request", - "service": "mysvc", - "resource": "POST /v1/completions", - "trace_id": 0, - "span_id": 2, - "parent_id": 1, - "type": "http", - "error": 0, - "meta": { - "_dd.peer.service.source": "out.host", - "component": "requests", - "http.method": "POST", - "http.status_code": "200", - "http.url": "https://api.openai.com/v1/completions", - "http.useragent": "OpenAI/v1 PythonBindings/0.27.2", - "out.host": "api.openai.com", - "peer.service": "api.openai.com", - "span.kind": "client" - }, - "metrics": { - "_dd.measured": 1 - }, - "duration": 2849000, - "start": 1701268855901267000 - }]] From 12458463905e0dae248e74ad9496c25ebd39f53f Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Tue, 4 Feb 2025 13:56:01 -0500 Subject: [PATCH 47/63] chore(tracing): remove deprecated properties and parameters (#12199) - Introduces the following breaking changes to tracing components: - Removes deprecated parameters from ``Tracer.configure(...)`` method and removes the ``Tracer.sampler`` attribute. - Drops support for multiple tracer instances, ``ddtrace.trace.Tracer`` can not be reinitialized. - Removes the deprecated ``Span.sampled`` property - Drops support for configuring sampling rules using functions and regex in the ``ddtrace.tracer.sampler.rules[].choose_matcher(...)`` method and removes the ``timestamp_ns`` parameter from ``ddtrace.internal.rate_limiter.RateLimiter.is_allowed()``. - Drops support for configuring ``DD_TRACE_METHODS`` with the '[]' notation. Ensure DD_TRACE_METHODS use the ':' notation instead". - Removes the deprecated ``ddtracer`` parameter from ``ddtrace.opentracer.tracer.Tracer()``. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- benchmarks/bm/utils.py | 2 +- benchmarks/rate_limiter/scenario.py | 4 +- ddtrace/_trace/sampling_rule.py | 14 +- ddtrace/_trace/span.py | 25 --- ddtrace/_trace/tracer.py | 174 ++---------------- ddtrace/internal/rate_limiter.py | 15 +- ddtrace/internal/tracemethods.py | 98 +--------- ddtrace/opentracer/tracer.py | 17 +- ...ve-tracing-attrs-3-0-5743fa668289d5bc.yaml | 15 ++ tests/integration/test_tracemethods.py | 45 +---- .../opentracer/core/test_dd_compatibility.py | 8 - tests/opentracer/core/test_tracer.py | 8 - tests/opentracer/utils.py | 2 +- tests/tracer/test_sampler.py | 89 +-------- 14 files changed, 53 insertions(+), 463 deletions(-) create mode 100644 releasenotes/notes/remove-tracing-attrs-3-0-5743fa668289d5bc.yaml diff --git a/benchmarks/bm/utils.py b/benchmarks/bm/utils.py index dd7b4991c57..13e99e8be74 100644 --- a/benchmarks/bm/utils.py +++ b/benchmarks/bm/utils.py @@ -65,7 +65,7 @@ def process_trace(self, trace): def drop_traces(tracer): - tracer.configure(settings={"FILTERS": [_DropTraces()]}) + tracer.configure(trace_processors=[_DropTraces()]) def drop_telemetry_events(): diff --git a/benchmarks/rate_limiter/scenario.py b/benchmarks/rate_limiter/scenario.py index 5210647ef89..3388af1cfb8 100644 --- a/benchmarks/rate_limiter/scenario.py +++ b/benchmarks/rate_limiter/scenario.py @@ -23,8 +23,8 @@ def _(loops): windows = [start + (i * self.time_window) for i in range(self.num_windows)] per_window = math.floor(loops / self.num_windows) - for window in windows: + for _ in windows: for _ in range(per_window): - rate_limiter.is_allowed(window) + rate_limiter.is_allowed() yield _ diff --git a/ddtrace/_trace/sampling_rule.py b/ddtrace/_trace/sampling_rule.py index 532a0b71f51..482a95d403a 100644 --- a/ddtrace/_trace/sampling_rule.py +++ b/ddtrace/_trace/sampling_rule.py @@ -8,8 +8,6 @@ from ddtrace.internal.glob_matching import GlobMatcher from ddtrace.internal.logger import get_logger from ddtrace.internal.utils.cache import cachedmethod -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate if TYPE_CHECKING: # pragma: no cover @@ -210,14 +208,12 @@ def choose_matcher(self, prop): # We currently support the ability to pass in a function, a regular expression, or a string # If a string is passed in we create a GlobMatcher to handle the matching if callable(prop) or isinstance(prop, pattern_type): - # deprecated: passing a function or a regular expression' - deprecate( - "Using methods or regular expressions for SamplingRule matching is deprecated. ", - message="Please move to passing in a string for Glob matching.", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, + log.error( + "Using methods or regular expressions for SamplingRule matching is not supported: %s ." + "Please move to passing in a string for Glob matching.", + str(prop), ) - return prop + return "None" # Name and Resource will never be None, but service can be, since we str() # whatever we pass into the GlobMatcher, we can just use its matching elif prop is None: diff --git a/ddtrace/_trace/span.py b/ddtrace/_trace/span.py index 446239a8091..c6eb4d4b72a 100644 --- a/ddtrace/_trace/span.py +++ b/ddtrace/_trace/span.py @@ -52,8 +52,6 @@ from ddtrace.internal.logger import get_logger from ddtrace.internal.sampling import SamplingMechanism from ddtrace.internal.sampling import set_sampling_decision_maker -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate _NUMERIC_TAGS = (_ANALYTICS_SAMPLE_RATE_KEY,) @@ -279,29 +277,6 @@ def duration(self) -> Optional[float]: def duration(self, value: float) -> None: self.duration_ns = int(value * 1e9) - @property - def sampled(self) -> Optional[bool]: - deprecate( - "span.sampled is deprecated and will be removed in a future version of the tracer.", - message="""span.sampled references the state of span.context.sampling_priority. - Please use span.context.sampling_priority instead to check if a span is sampled.""", - category=DDTraceDeprecationWarning, - ) - if self.context.sampling_priority is None: - # this maintains original span.sampled behavior, where all spans would start - # with span.sampled = True until sampling runs - return True - return self.context.sampling_priority > 0 - - @sampled.setter - def sampled(self, value: bool) -> None: - deprecate( - "span.sampled is deprecated and will be removed in a future version of the tracer.", - message="""span.sampled has a no-op setter. - Please use span.set_tag('manual.keep'/'manual.drop') to keep or drop spans.""", - category=DDTraceDeprecationWarning, - ) - def finish(self, finish_time: Optional[float] = None) -> None: """Mark the end time of the span and submit it to the tracer. If the span has already been finished don't do anything. diff --git a/ddtrace/_trace/tracer.py b/ddtrace/_trace/tracer.py index 87f312bb18c..7030ec823d6 100644 --- a/ddtrace/_trace/tracer.py +++ b/ddtrace/_trace/tracer.py @@ -24,6 +24,7 @@ from ddtrace._trace.processor import TraceProcessor from ddtrace._trace.processor import TraceSamplingProcessor from ddtrace._trace.processor import TraceTagsProcessor +from ddtrace._trace.provider import BaseContextProvider from ddtrace._trace.provider import DefaultContextProvider from ddtrace._trace.sampler import BasePrioritySampler from ddtrace._trace.sampler import BaseSampler @@ -200,7 +201,7 @@ def __init__( self, url: Optional[str] = None, dogstatsd_url: Optional[str] = None, - context_provider: Optional[DefaultContextProvider] = None, + context_provider: Optional[BaseContextProvider] = None, ) -> None: """ Create a new ``Tracer`` instance. A global tracer is already initialized @@ -328,28 +329,6 @@ def sample(self, span): else: log.error("No sampler available to sample span") - @property - def sampler(self): - deprecate( - "tracer.sampler is deprecated and will be removed.", - message="To manually sample call tracer.sample(span) instead.", - category=DDTraceDeprecationWarning, - ) - return self._sampler - - @sampler.setter - def sampler(self, value): - deprecate( - "Setting a custom sampler is deprecated and will be removed.", - message="""Please use DD_TRACE_SAMPLING_RULES to configure the sampler instead: - https://ddtrace.readthedocs.io/en/stable/configuration.html#DD_TRACE_SAMPLING_RULES""", - category=DDTraceDeprecationWarning, - ) - if asm_config._apm_opt_out: - log.warning("Cannot set a custom sampler with Standalone ASM mode") - return - self._sampler = value - def on_start_span(self, func: Callable) -> Callable: """Register a function to execute when a span start. @@ -441,21 +420,7 @@ def get_log_correlation_context(self, active: Optional[Union[Context, Span]] = N def configure( self, - enabled: Optional[bool] = None, - hostname: Optional[str] = None, - port: Optional[int] = None, - uds_path: Optional[str] = None, - https: Optional[bool] = None, - sampler: Optional[BaseSampler] = None, - context_provider: Optional[DefaultContextProvider] = None, - wrap_executor: Optional[Callable] = None, - priority_sampling: Optional[bool] = None, - settings: Optional[Dict[str, Any]] = None, - dogstatsd_url: Optional[str] = None, - writer: Optional[TraceWriter] = None, - partial_flush_enabled: Optional[bool] = None, - partial_flush_min_spans: Optional[int] = None, - api_version: Optional[str] = None, + context_provider: Optional[BaseContextProvider] = None, compute_stats_enabled: Optional[bool] = None, appsec_enabled: Optional[bool] = None, iast_enabled: Optional[bool] = None, @@ -472,58 +437,14 @@ def configure( :param bool appsec_standalone_enabled: When tracing is disabled ensures ASM support is still enabled. :param List[TraceProcessor] trace_processors: This parameter sets TraceProcessor (ex: TraceFilters). Trace processors are used to modify and filter traces based on certain criteria. - - :param bool enabled: If True, finished traces will be submitted to the API, else they'll be dropped. - This parameter is deprecated and will be removed. - :param str hostname: Hostname running the Trace Agent. This parameter is deprecated and will be removed. - :param int port: Port of the Trace Agent. This parameter is deprecated and will be removed. - :param str uds_path: The Unix Domain Socket path of the agent. This parameter is deprecated and will be removed. - :param bool https: Whether to use HTTPS or HTTP. This parameter is deprecated and will be removed. - :param object sampler: A custom Sampler instance, locally deciding to totally drop the trace or not. - This parameter is deprecated and will be removed. - :param object wrap_executor: callable that is used when a function is decorated with - ``Tracer.wrap()``. This is an advanced option that usually doesn't need to be changed - from the default value. This parameter is deprecated and will be removed. - :param priority_sampling: This parameter is deprecated and will be removed in a future version. - :param bool settings: This parameter is deprecated and will be removed. - :param str dogstatsd_url: URL for UDP or Unix socket connection to DogStatsD - This parameter is deprecated and will be removed. - :param TraceWriter writer: This parameter is deprecated and will be removed. - :param bool partial_flush_enabled: This parameter is deprecated and will be removed. - :param bool partial_flush_min_spans: This parameter is deprecated and will be removed. - :param str api_version: This parameter is deprecated and will be removed. - :param bool compute_stats_enabled: This parameter is deprecated and will be removed. """ - if settings is not None: - deprecate( - "Support for ``tracer.configure(...)`` with the settings parameter is deprecated", - message="Please use the trace_processors parameter instead of settings['FILTERS'].", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) - trace_processors = (trace_processors or []) + (settings.get("FILTERS") or []) - return self._configure( - enabled, - hostname, - port, - uds_path, - https, - sampler, - context_provider, - wrap_executor, - priority_sampling, - trace_processors, - dogstatsd_url, - writer, - partial_flush_enabled, - partial_flush_min_spans, - api_version, - compute_stats_enabled, - appsec_enabled, - iast_enabled, - appsec_standalone_enabled, - True, + context_provider=context_provider, + trace_processors=trace_processors, + compute_stats_enabled=compute_stats_enabled, + appsec_enabled=appsec_enabled, + iast_enabled=iast_enabled, + appsec_standalone_enabled=appsec_standalone_enabled, ) def _configure( @@ -534,7 +455,7 @@ def _configure( uds_path: Optional[str] = None, https: Optional[bool] = None, sampler: Optional[BaseSampler] = None, - context_provider: Optional[DefaultContextProvider] = None, + context_provider: Optional[BaseContextProvider] = None, wrap_executor: Optional[Callable] = None, priority_sampling: Optional[bool] = None, trace_processors: Optional[List[TraceProcessor]] = None, @@ -547,48 +468,18 @@ def _configure( appsec_enabled: Optional[bool] = None, iast_enabled: Optional[bool] = None, appsec_standalone_enabled: Optional[bool] = None, - log_deprecations: bool = False, ) -> None: if enabled is not None: self.enabled = enabled - if log_deprecations: - deprecate( - "Enabling/Disabling tracing after application start is deprecated", - message="Please use DD_TRACE_ENABLED instead.", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) - - if priority_sampling is not None and log_deprecations: - deprecate( - "Disabling priority sampling is deprecated", - message="Calling `tracer.configure(priority_sampling=....) has no effect", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) if trace_processors is not None: self._user_trace_processors = trace_processors if partial_flush_enabled is not None: self._partial_flush_enabled = partial_flush_enabled - if log_deprecations: - deprecate( - "Configuring partial flushing after application start is deprecated", - message="Please use DD_TRACE_PARTIAL_FLUSH_ENABLED to enable/disable the partial flushing instead.", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) if partial_flush_min_spans is not None: self._partial_flush_min_spans = partial_flush_min_spans - if log_deprecations: - deprecate( - "Configuring partial flushing after application start is deprecated", - message="Please use DD_TRACE_PARTIAL_FLUSH_MIN_SPANS to set the flushing threshold instead.", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) if appsec_enabled is not None: asm_config._asm_enabled = appsec_enabled @@ -620,33 +511,11 @@ def _configure( if sampler is not None: self._sampler = sampler self._user_sampler = self._sampler - if log_deprecations: - deprecate( - "Configuring custom samplers is deprecated", - message="Please use DD_TRACE_SAMPLING_RULES to configure the sample rates instead", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", - ) if dogstatsd_url is not None: - if log_deprecations: - deprecate( - "Configuring dogstatsd_url after application start is deprecated", - message="Please use DD_DOGSTATSD_URL instead.", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) self._dogstatsd_url = dogstatsd_url if any(x is not None for x in [hostname, port, uds_path, https]): - if log_deprecations: - deprecate( - "Configuring tracer agent connection after application start is deprecated", - message="Please use DD_TRACE_AGENT_URL instead.", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) - # If any of the parts of the URL have updated, merge them with # the previous writer values. prev_url_parsed = compat.parse.urlparse(self._agent_url) @@ -670,13 +539,6 @@ def _configure( new_url = None if compute_stats_enabled is not None: - if log_deprecations: - deprecate( - "Configuring tracer stats computation after application start is deprecated", - message="Please use DD_TRACE_STATS_COMPUTATION_ENABLED instead.", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) self._compute_stats = compute_stats_enabled try: @@ -685,14 +547,6 @@ def _configure( # It's possible the writer never got started pass - if api_version is not None and log_deprecations: - deprecate( - "Configuring Tracer API version after application start is deprecated", - message="Please use DD_TRACE_API_VERSION instead.", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) - if writer is not None: self._writer = writer elif any(x is not None for x in [new_url, api_version, sampler, dogstatsd_url, appsec_enabled]): @@ -754,12 +608,6 @@ def _configure( if wrap_executor is not None: self._wrap_executor = wrap_executor - if log_deprecations: - deprecate( - "Support for tracer.configure(...) with the wrap_executor parameter is deprecated", - version="3.0.0", - category=DDTraceDeprecationWarning, - ) self._generate_diagnostic_logs() @@ -1344,7 +1192,7 @@ def _handle_sampler_update(self, cfg: Config) -> None: and self._user_sampler ): # if we get empty configs from rc for both sample rate and rules, we should revert to the user sampler - self.sampler = self._user_sampler + self._sampler = self._user_sampler return if cfg._get_source("_trace_sample_rate") != "remote_config" and self._user_sampler: diff --git a/ddtrace/internal/rate_limiter.py b/ddtrace/internal/rate_limiter.py index 0a97a6a7abc..9b514e5ff32 100644 --- a/ddtrace/internal/rate_limiter.py +++ b/ddtrace/internal/rate_limiter.py @@ -9,9 +9,6 @@ from typing import Callable # noqa:F401 from typing import Optional # noqa:F401 -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate - class RateLimiter(object): """ @@ -57,26 +54,18 @@ def __init__(self, rate_limit: int, time_window: float = 1e9): self._lock = threading.Lock() - def is_allowed(self, timestamp_ns: Optional[int] = None) -> bool: + def is_allowed(self) -> bool: """ Check whether the current request is allowed or not This method will also reduce the number of available tokens by 1 - :param int timestamp_ns: timestamp in nanoseconds for the current request. :returns: Whether the current request is allowed or not :rtype: :obj:`bool` """ - if timestamp_ns is not None: - deprecate( - "The `timestamp_ns` parameter is deprecated and will be removed in a future version." - "Ratelimiter will use the current time.", - category=DDTraceDeprecationWarning, - ) - # rate limits are tested and mocked in pytest so we need to compute the timestamp here # (or move the unit tests to rust) - timestamp_ns = timestamp_ns or time.monotonic_ns() + timestamp_ns = time.monotonic_ns() allowed = self._is_allowed(timestamp_ns) # Update counts used to determine effective rate self._update_rate_counts(allowed, timestamp_ns) diff --git a/ddtrace/internal/tracemethods.py b/ddtrace/internal/tracemethods.py index 5328797c09f..456cca597e1 100644 --- a/ddtrace/internal/tracemethods.py +++ b/ddtrace/internal/tracemethods.py @@ -4,8 +4,6 @@ import wrapt from ddtrace.internal.logger import get_logger -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate log = get_logger(__name__) @@ -65,102 +63,10 @@ def _parse_trace_methods(raw_dd_trace_methods: str) -> List[Tuple[str, str]]: return dd_trace_methods -def _parse_legacy_trace_methods(raw_dd_trace_methods: str) -> List[str]: - """ - Return a list of method names to trace based on the specification of - DD_TRACE_METHODS. - - Note that support for wildcard methods with [*] is not implemented. - - This square bracket notation will be deprecated in favor of the new ':' notation - TODO: This method can be deleted once the legacy syntax is officially deprecated - """ - if not raw_dd_trace_methods: - return [] - dd_trace_methods = [] - for qualified_methods in raw_dd_trace_methods.split(";"): - # Validate that methods are specified - if "[" not in qualified_methods or "]" not in qualified_methods: - log.warning( - ( - "Invalid DD_TRACE_METHODS: %s. " - "Methods must be specified in square brackets following the fully qualified module or class name." - ), - qualified_methods, - ) - return [] - - # Store the prefix of the qualified method name (eg. for "foo.bar.baz[qux,quux]", this is "foo.bar.baz") - qualified_method_prefix = qualified_methods.split("[")[0] - - if qualified_method_prefix == "__main__": - # __main__ cannot be used since the __main__ that exists now is not the same as the __main__ that the user - # application will have. __main__ when sitecustomize module is run is the builtin __main__. - log.warning( - "Invalid DD_TRACE_METHODS: %s. Methods cannot be traced on the __main__ module.", qualified_methods - ) - return [] - - # Get the class or module name of the method (eg. for "foo.bar.baz[qux,quux]", this is "baz[qux,quux]") - class_or_module_with_methods = qualified_methods.split(".")[-1] - - # Strip off the leading 'moduleOrClass[' and trailing ']' - methods = class_or_module_with_methods.split("[")[1] - methods = methods[:-1] - - # Add the methods to the list of methods to trace - for method in methods.split(","): - if not str.isidentifier(method): - log.warning( - "Invalid method name: %r. %s", - method, - ( - "You might have a trailing comma." - if method == "" - else "Method names must be valid Python identifiers." - ), - ) - return [] - dd_trace_methods.append("%s.%s" % (qualified_method_prefix, method)) - return dd_trace_methods - - def _install_trace_methods(raw_dd_trace_methods: str) -> None: """Install tracing on the given methods.""" - if "[" in raw_dd_trace_methods: - deprecate( - "Using DD_TRACE_METHODS with the '[]' notation is deprecated", - message="Please use DD_TRACE_METHODS with the new ':' notation instead", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - # Using legacy syntax - for qualified_method in _parse_legacy_trace_methods(raw_dd_trace_methods): - # We don't know if the method is a class method or a module method, so we need to assume it's a module - # and if the import fails then go a level up and try again. - base_module_guess = ".".join(qualified_method.split(".")[:-1]) - method_name = qualified_method.split(".")[-1] - module = None - - while base_module_guess: - try: - module = __import__(base_module_guess) - except ImportError: - # Add the class to the method name - method_name = "%s.%s" % (base_module_guess.split(".")[-1], method_name) - base_module_guess = ".".join(base_module_guess.split(".")[:-1]) - else: - break - - if module is None: - log.warning("Could not import module for %r", qualified_method) - continue - - trace_method(base_module_guess, method_name) - else: - # Using updated syntax, no need to try to import - for module_name, method_name in _parse_trace_methods(raw_dd_trace_methods): - trace_method(module_name, method_name) + for module_name, method_name in _parse_trace_methods(raw_dd_trace_methods): + trace_method(module_name, method_name) def trace_method(module, method_name): diff --git a/ddtrace/opentracer/tracer.py b/ddtrace/opentracer/tracer.py index ca10cb8125a..65d1b95b314 100644 --- a/ddtrace/opentracer/tracer.py +++ b/ddtrace/opentracer/tracer.py @@ -18,7 +18,6 @@ from ddtrace.trace import Context as DatadogContext # noqa:F401 from ddtrace.trace import Span as DatadogSpan from ddtrace.trace import Tracer as DatadogTracer -from ddtrace.vendor.debtcollector import deprecate from ..internal.logger import get_logger from .propagation import HTTPPropagator @@ -55,7 +54,7 @@ def __init__( service_name: Optional[str] = None, config: Optional[Dict[str, Any]] = None, scope_manager: Optional[ScopeManager] = None, - dd_tracer: Optional[DatadogTracer] = None, + _dd_tracer: Optional[DatadogTracer] = None, ) -> None: """Initialize a new Datadog opentracer. @@ -70,9 +69,6 @@ def __init__( here: https://github.com/opentracing/opentracing-python#scope-managers. If ``None`` is provided, defaults to :class:`opentracing.scope_managers.ThreadLocalScopeManager`. - :param dd_tracer: (optional) the Datadog tracer for this tracer to use. This - parameter is deprecated and will be removed in v3.0.0. The - to the global tracer (``ddtrace.tracer``) should always be used. """ # Merge the given config with the default into a new dict self._config = DEFAULT_CONFIG.copy() @@ -100,14 +96,7 @@ def __init__( self._scope_manager = scope_manager or ThreadLocalScopeManager() dd_context_provider = get_context_provider_for_scope_manager(self._scope_manager) - if dd_tracer is not None: - deprecate( - "The ``dd_tracer`` parameter is deprecated", - message="The global tracer (``ddtrace.tracer``) will be used instead.", - removal_version="3.0.0", - ) - - self._dd_tracer = dd_tracer or ddtrace.tracer + self._dd_tracer = _dd_tracer or ddtrace.tracer self._dd_tracer.set_tags(self._config.get(keys.GLOBAL_TAGS)) # type: ignore[arg-type] trace_processors = None if keys.SETTINGS in self._config: @@ -121,7 +110,7 @@ def __init__( trace_processors=trace_processors, priority_sampling=self._config.get(keys.PRIORITY_SAMPLING), uds_path=self._config.get(keys.UDS_PATH), - context_provider=dd_context_provider, # type: ignore[arg-type] + context_provider=dd_context_provider, ) self._propagators = { Format.HTTP_HEADERS: HTTPPropagator, diff --git a/releasenotes/notes/remove-tracing-attrs-3-0-5743fa668289d5bc.yaml b/releasenotes/notes/remove-tracing-attrs-3-0-5743fa668289d5bc.yaml new file mode 100644 index 00000000000..35ee9378801 --- /dev/null +++ b/releasenotes/notes/remove-tracing-attrs-3-0-5743fa668289d5bc.yaml @@ -0,0 +1,15 @@ +--- +upgrade: + - | + tracer: Removes deprecated parameters from ``Tracer.configure(...)`` method and removes the ``Tracer.sampler`` attribute. + - | + tracing: Drops support for multiple tracer instances, ``ddtrace.trace.Tracer`` can not be reinitialized. + - | + span: Removes the deprecated ``Span.sampled`` property + - | + sampling: Drops support for configuring sampling rules using functions and regex in the ``ddtrace.tracer.sampler.rules[].choose_matcher(...)`` method + and removes the ``timestamp_ns`` parameter from ``ddtrace.internal.rate_limiter.RateLimiter.is_allowed()``. + - | + configurations: Drops support for configuring ``DD_TRACE_METHODS`` with the '[]' notation. Ensure DD_TRACE_METHODS use the ':' notation instead". + - | + opentracing: Removes the deprecated ``ddtracer`` parameter from ``ddtrace.opentracer.tracer.Tracer()``. \ No newline at end of file diff --git a/tests/integration/test_tracemethods.py b/tests/integration/test_tracemethods.py index 15129c56161..7353c12182a 100644 --- a/tests/integration/test_tracemethods.py +++ b/tests/integration/test_tracemethods.py @@ -27,14 +27,10 @@ "mod.mod2.mod3:Class.test_method,Class.test_method2", [("mod.mod2.mod3", "Class.test_method"), ("mod.mod2.mod3", "Class.test_method2")], ), - ("module[method1, method2]", []), ("module", []), ("module.", []), ("module.method", []), - ("module.method[m1,m2,]", []), ("module.method;module.method", []), - ("module.method[m1];module.method[m1,m2,]", []), - ("module.method[[m1]", []), ], ) def test_trace_methods_parse(dd_trace_methods: str, expected_output: List[Tuple[str, str]]): @@ -43,37 +39,6 @@ def test_trace_methods_parse(dd_trace_methods: str, expected_output: List[Tuple[ assert _parse_trace_methods(dd_trace_methods) == expected_output -def test_legacy_trace_methods_parse(): - from ddtrace.internal.tracemethods import _parse_legacy_trace_methods - - assert _parse_legacy_trace_methods("") == [] - assert _parse_legacy_trace_methods("module[method1]") == ["module.method1"] - assert _parse_legacy_trace_methods("module[method1,method2]") == ["module.method1", "module.method2"] - assert _parse_legacy_trace_methods("module[method1,method2];mod2[m1,m2]") == [ - "module.method1", - "module.method2", - "mod2.m1", - "mod2.m2", - ] - assert _parse_legacy_trace_methods("mod.submod[m1,m2,m3]") == ["mod.submod.m1", "mod.submod.m2", "mod.submod.m3"] - assert _parse_legacy_trace_methods("mod.submod.subsubmod[m1,m2]") == [ - "mod.submod.subsubmod.m1", - "mod.submod.subsubmod.m2", - ] - assert _parse_legacy_trace_methods("mod.mod2.mod3.Class[test_method,test_method2]") == [ - "mod.mod2.mod3.Class.test_method", - "mod.mod2.mod3.Class.test_method2", - ] - assert _parse_legacy_trace_methods("module[method1, method2]") == [] - assert _parse_legacy_trace_methods("module") == [] - assert _parse_legacy_trace_methods("module.") == [] - assert _parse_legacy_trace_methods("module.method") == [] - assert _parse_legacy_trace_methods("module.method[m1,m2,]") == [] - assert _parse_legacy_trace_methods("module.method;module.method") == [] - assert _parse_legacy_trace_methods("module.method[m1];module.method[m1,m2,]") == [] - assert _parse_legacy_trace_methods("module.method[[m1]") == [] - - def _test_method(): pass @@ -105,9 +70,9 @@ def test_method(self): ddtrace_run=True, env=dict( DD_TRACE_METHODS=( - "tests.integration.test_tracemethods[_test_method,_test_method2];" - "tests.integration.test_tracemethods._Class[test_method,test_method2];" - "tests.integration.test_tracemethods._Class.NestedClass[test_method]" + "tests.integration.test_tracemethods:_test_method,_test_method2;" + "tests.integration.test_tracemethods:_Class.test_method,_Class.test_method2;" + "tests.integration.test_tracemethods:_Class.NestedClass.test_method" ) ), ) @@ -139,8 +104,8 @@ async def _async_test_method2(): def test_ddtrace_run_trace_methods_async(ddtrace_run_python_code_in_subprocess): env = os.environ.copy() env["DD_TRACE_METHODS"] = ( - "tests.integration.test_tracemethods[_async_test_method,_async_test_method2];" - "tests.integration.test_tracemethods._Class[async_test_method]" + "tests.integration.test_tracemethods:_async_test_method,_async_test_method2;" + "tests.integration.test_tracemethods:_Class.async_test_method" ) tests_dir = os.path.dirname(os.path.dirname(__file__)) env["PYTHONPATH"] = os.pathsep.join([tests_dir, env.get("PYTHONPATH", "")]) diff --git a/tests/opentracer/core/test_dd_compatibility.py b/tests/opentracer/core/test_dd_compatibility.py index 4ba14b0618f..c68b5ca6d6c 100644 --- a/tests/opentracer/core/test_dd_compatibility.py +++ b/tests/opentracer/core/test_dd_compatibility.py @@ -15,14 +15,6 @@ def test_ottracer_uses_global_ddtracer(self): tracer = ddtrace.opentracer.Tracer() assert tracer._dd_tracer is ddtrace.tracer - def test_custom_ddtracer(self): - """A user should be able to specify their own Datadog tracer instance if - they wish. - """ - custom_dd_tracer = ddtrace.trace.Tracer() - tracer = ddtrace.opentracer.Tracer(dd_tracer=custom_dd_tracer) - assert tracer._dd_tracer is custom_dd_tracer - def test_ot_dd_global_tracers(self, global_tracer): """Ensure our test function opentracer_init() prep""" ot_tracer = global_tracer diff --git a/tests/opentracer/core/test_tracer.py b/tests/opentracer/core/test_tracer.py index a0a18ff0dd8..f5534c8f1b0 100644 --- a/tests/opentracer/core/test_tracer.py +++ b/tests/opentracer/core/test_tracer.py @@ -15,8 +15,6 @@ from ddtrace.opentracer.span_context import SpanContext from ddtrace.propagation.http import HTTP_HEADER_TRACE_ID from ddtrace.settings import ConfigException -from ddtrace.trace import Tracer as DDTracer -from tests.utils import override_global_config class TestTracerConfig(object): @@ -69,12 +67,6 @@ def test_invalid_config_key(self): assert ["enabeld", "setttings"] in str(ce_info) # codespell:ignore assert tracer is not None - def test_ddtrace_fallback_config(self): - """Ensure datadog configuration is used by default.""" - with override_global_config(dict(_tracing_enabled=False)): - tracer = Tracer(dd_tracer=DDTracer()) - assert tracer._dd_tracer.enabled is False - def test_global_tags(self): """Global tags should be passed from the opentracer to the tracer.""" config = { diff --git a/tests/opentracer/utils.py b/tests/opentracer/utils.py index 6a34052a385..85b84865ad8 100644 --- a/tests/opentracer/utils.py +++ b/tests/opentracer/utils.py @@ -7,5 +7,5 @@ def init_tracer(service_name, dd_tracer, scope_manager=None): It accepts a Datadog tracer that should be the same one used for testing. """ - ot_tracer = Tracer(service_name, dd_tracer=dd_tracer, scope_manager=scope_manager) + ot_tracer = Tracer(service_name, scope_manager=scope_manager, _dd_tracer=dd_tracer) return ot_tracer diff --git a/tests/tracer/test_sampler.py b/tests/tracer/test_sampler.py index 813dc1be439..22620d8184b 100644 --- a/tests/tracer/test_sampler.py +++ b/tests/tracer/test_sampler.py @@ -1,6 +1,5 @@ from __future__ import division -import re import unittest import mock @@ -250,7 +249,7 @@ def test_sampling_rule_init_defaults(): def test_sampling_rule_init(): - a_regex = re.compile(r"\.request$") + a_regex = "*request" a_string = "my-service" rule = SamplingRule( @@ -261,7 +260,7 @@ def test_sampling_rule_init(): assert rule.sample_rate == 0.0, "SamplingRule should store the rate it's initialized with" assert rule.service.pattern == a_string, "SamplingRule should store the service it's initialized with" - assert rule.name == a_regex, "SamplingRule should store the name regex it's initialized with" + assert rule.name.pattern == a_regex, "SamplingRule should store the name regex it's initialized with" @pytest.mark.parametrize( @@ -272,38 +271,13 @@ def test_sampling_rule_init(): (SamplingRule(sample_rate=0.0), SamplingRule(sample_rate=0.0), True), (SamplingRule(sample_rate=0.5), SamplingRule(sample_rate=1.0), False), (SamplingRule(sample_rate=1.0, service="my-svc"), SamplingRule(sample_rate=1.0, service="my-svc"), True), - ( - SamplingRule(sample_rate=1.0, service=re.compile("my-svc")), - SamplingRule(sample_rate=1.0, service=re.compile("my-svc")), - True, - ), (SamplingRule(sample_rate=1.0, service="my-svc"), SamplingRule(sample_rate=1.0, service="other-svc"), False), (SamplingRule(sample_rate=1.0, service="my-svc"), SamplingRule(sample_rate=0.5, service="my-svc"), False), - ( - SamplingRule(sample_rate=1.0, service=re.compile("my-svc")), - SamplingRule(sample_rate=0.5, service=re.compile("my-svc")), - False, - ), - ( - SamplingRule(sample_rate=1.0, service=re.compile("my-svc")), - SamplingRule(sample_rate=1.0, service=re.compile("other")), - False, - ), ( SamplingRule(sample_rate=1.0, name="span.name"), SamplingRule(sample_rate=1.0, name="span.name"), True, ), - ( - SamplingRule(sample_rate=1.0, name=re.compile("span.name")), - SamplingRule(sample_rate=1.0, name=re.compile("span.name")), - True, - ), - ( - SamplingRule(sample_rate=1.0, name=re.compile("span.name")), - SamplingRule(sample_rate=1.0, name=re.compile("span.other")), - False, - ), ( SamplingRule(sample_rate=1.0, name="span.name"), SamplingRule(sample_rate=0.5, name="span.name"), @@ -316,16 +290,6 @@ def test_sampling_rule_init(): SamplingRule(sample_rate=1.0, service="my-svc", name="span.name"), True, ), - ( - SamplingRule(sample_rate=1.0, service="my-svc", name=re.compile("span.name")), - SamplingRule(sample_rate=1.0, service="my-svc", name=re.compile("span.name")), - True, - ), - ( - SamplingRule(sample_rate=1.0, service=re.compile("my-svc"), name=re.compile("span.name")), - SamplingRule(sample_rate=1.0, service=re.compile("my-svc"), name=re.compile("span.name")), - True, - ), ( SamplingRule(sample_rate=1.0, service="my-svc", name="span.name"), SamplingRule(sample_rate=0.5, service="my-svc", name="span.name"), @@ -491,15 +455,6 @@ def test_sampling_rule_init_via_env(): ("test.span", None, False), ("test.span", "test.span", True), ("test.span", "test_span", False), - ("test.span", re.compile(r"^test\.span$"), True), - ("test_span", re.compile(r"^test.span$"), True), - ("test.span", re.compile(r"^test_span$"), False), - ("test.span", re.compile(r"test"), True), - ("test.span", re.compile(r"test\.span|another\.span"), True), - ("another.span", re.compile(r"test\.span|another\.span"), True), - ("test.span", lambda name: "span" in name, True), - ("test.span", lambda name: "span" not in name, False), - ("test.span", lambda name: 1 / 0, False), ] ], ) @@ -518,20 +473,8 @@ def test_sampling_rule_matches_name(span, rule, span_expected_to_match_rule): ("my-service", None, False), (None, "tests.tracer", True), ("tests.tracer", "my-service", False), - ("tests.tracer", re.compile(r"my-service"), False), - ("tests.tracer", lambda service: "service" in service, False), ("my-service", "my-service", True), ("my-service", "my_service", False), - ("my-service", re.compile(r"^my-"), True), - ("my_service", re.compile(r"^my[_-]"), True), - ("my-service", re.compile(r"^my_"), False), - ("my-service", re.compile(r"my-service"), True), - ("my-service", re.compile(r"my"), True), - ("my-service", re.compile(r"my-service|another-service"), True), - ("another-service", re.compile(r"my-service|another-service"), True), - ("my-service", lambda service: "service" in service, True), - ("my-service", lambda service: "service" not in service, False), - ("my-service", lambda service: 1 / 0, False), ] ], ) @@ -553,7 +496,7 @@ def test_sampling_rule_matches_service(span, rule, span_expected_to_match_rule): SamplingRule( sample_rate=1, name="test.span", - service=re.compile(r"^my-"), + service="my-*", ), True, ), @@ -567,7 +510,7 @@ def test_sampling_rule_matches_service(span, rule, span_expected_to_match_rule): SamplingRule( sample_rate=0, name="test.span", - service=re.compile(r"^my-"), + service="my-*", ), True, ), @@ -580,7 +523,7 @@ def test_sampling_rule_matches_service(span, rule, span_expected_to_match_rule): SamplingRule( sample_rate=1, name="test_span", - service=re.compile(r"^my-"), + service="my-*", ), False, ), @@ -593,7 +536,7 @@ def test_sampling_rule_matches_service(span, rule, span_expected_to_match_rule): SamplingRule( sample_rate=1, name="test.span", - service=re.compile(r"^service-"), + service="service-", ), False, ), @@ -605,26 +548,6 @@ def test_sampling_rule_matches(span, rule, span_expected_to_match_rule): ) -def test_sampling_rule_matches_exception(): - def pattern(prop): - raise Exception("an error occurred") - - rule = SamplingRule(sample_rate=1.0, name=pattern) - span = create_span(name="test.span") - - with mock.patch("ddtrace._trace.sampling_rule.log") as mock_log: - assert ( - rule.matches(span) is False - ), "SamplingRule should not match when its name pattern function throws an exception" - mock_log.warning.assert_called_once_with( - "%r pattern %r failed with %r", - rule, - pattern, - "test.span", - exc_info=True, - ) - - @pytest.mark.subprocess( parametrize={"DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED": ["true", "false"]}, ) From 17c60dd38e51234a2ebe1d239b072ce06276fd5e Mon Sep 17 00:00:00 2001 From: Zachary Groves <32471391+ZStriker19@users.noreply.github.com> Date: Tue, 4 Feb 2025 14:31:40 -0500 Subject: [PATCH 48/63] fix(tracing): add flag for aiohttp that disables potential for memory leak (#12081) This PR adds the environment variable ``DD_AIOHTTP_CLIENT_DISABLE_STREAM_TIMING_FOR_MEM_LEAK`` to address a potential memory leak in the aiohttp integration. When set to true, this flag may cause streamed response span timing to be inaccurate. The flag defaults to false. When this was merged https://github.com/DataDog/dd-trace-py/pull/7551 we essentially added support for getting the correct timing of streamed responses, however it also caused us to sometimes never close spans, which lead to a memory leak. When set to true, this flag essentially reverts that behavior. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/contrib/aiohttp.py | 7 +++++ .../contrib/internal/aiohttp/middlewares.py | 15 +++++++---- ddtrace/contrib/internal/aiohttp/patch.py | 8 +++++- ...ttp_memory_leak_flag-66005f987dbfbd47.yaml | 5 ++++ tests/contrib/aiohttp/test_request.py | 27 +++++++++++++++++++ 5 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/add_aiohttp_memory_leak_flag-66005f987dbfbd47.yaml diff --git a/ddtrace/contrib/aiohttp.py b/ddtrace/contrib/aiohttp.py index dbb5def90d1..d001139dde8 100644 --- a/ddtrace/contrib/aiohttp.py +++ b/ddtrace/contrib/aiohttp.py @@ -36,6 +36,13 @@ Default: ``False`` +.. py:data:: ddtrace.config.aiohttp['disable_stream_timing_for_mem_leak'] + + Whether or not to to address a potential memory leak in the aiohttp integration. + When set to ``True``, this flag may cause streamed response span timing to be inaccurate. + + Default: ``False`` + Server ****** diff --git a/ddtrace/contrib/internal/aiohttp/middlewares.py b/ddtrace/contrib/internal/aiohttp/middlewares.py index b3dde240d44..c1a5b8e4f3b 100644 --- a/ddtrace/contrib/internal/aiohttp/middlewares.py +++ b/ddtrace/contrib/internal/aiohttp/middlewares.py @@ -59,8 +59,9 @@ async def attach_context(request): request[REQUEST_CONFIG_KEY] = app[CONFIG_KEY] try: response = await handler(request) - if isinstance(response, web.StreamResponse): - request.task.add_done_callback(lambda _: finish_request_span(request, response)) + if not config.aiohttp["disable_stream_timing_for_mem_leak"]: + if isinstance(response, web.StreamResponse): + request.task.add_done_callback(lambda _: finish_request_span(request, response)) return response except Exception: req_span.set_traceback() @@ -134,9 +135,13 @@ async def on_prepare(request, response): the trace middleware execution. """ # NB isinstance is not appropriate here because StreamResponse is a parent of the other - # aiohttp response types - if type(response) is web.StreamResponse and not response.task.done(): - return + # aiohttp response types. However in some cases this can also lead to missing the closing of + # spans, leading to a memory leak, which is why we have this flag. + # todo: this is a temporary fix for a memory leak in aiohttp. We should find a way to + # consistently close spans with the correct timing. + if not config.aiohttp["disable_stream_timing_for_mem_leak"]: + if type(response) is web.StreamResponse and not response.task.done(): + return finish_request_span(request, response) diff --git a/ddtrace/contrib/internal/aiohttp/patch.py b/ddtrace/contrib/internal/aiohttp/patch.py index 900a8d26e41..4643ba2ae43 100644 --- a/ddtrace/contrib/internal/aiohttp/patch.py +++ b/ddtrace/contrib/internal/aiohttp/patch.py @@ -22,6 +22,7 @@ from ddtrace.internal.utils import get_argument_value from ddtrace.internal.utils.formats import asbool from ddtrace.propagation.http import HTTPPropagator +from ddtrace.settings._core import get_config as _get_config from ddtrace.trace import Pin @@ -31,7 +32,12 @@ # Server config config._add( "aiohttp", - dict(distributed_tracing=True), + dict( + distributed_tracing=True, + disable_stream_timing_for_mem_leak=asbool( + _get_config("DD_AIOHTTP_CLIENT_DISABLE_STREAM_TIMING_FOR_MEM_LEAK", default=False) + ), + ), ) config._add( diff --git a/releasenotes/notes/add_aiohttp_memory_leak_flag-66005f987dbfbd47.yaml b/releasenotes/notes/add_aiohttp_memory_leak_flag-66005f987dbfbd47.yaml new file mode 100644 index 00000000000..67ef6980a36 --- /dev/null +++ b/releasenotes/notes/add_aiohttp_memory_leak_flag-66005f987dbfbd47.yaml @@ -0,0 +1,5 @@ +--- + +fixes: + - | + aiohttp: Adds the environment variable ``DD_AIOHTTP_CLIENT_DISABLE_STREAM_TIMING_FOR_MEM_LEAK`` to address a potential memory leak in the aiohttp integration. When set to true, this flag may cause streamed response span timing to be inaccurate. The flag defaults to false. \ No newline at end of file diff --git a/tests/contrib/aiohttp/test_request.py b/tests/contrib/aiohttp/test_request.py index 36e9d8a399a..056eda09c4b 100644 --- a/tests/contrib/aiohttp/test_request.py +++ b/tests/contrib/aiohttp/test_request.py @@ -31,6 +31,33 @@ async def test_full_request(patched_app_tracer, aiohttp_client, loop): assert "GET /" == request_span.resource +async def test_full_request_w_mem_leak_prevention_flag(patched_app_tracer, aiohttp_client, loop): + config.aiohttp.disable_stream_timing_for_mem_leak = True + try: + app, tracer = patched_app_tracer + client = await aiohttp_client(app) + # it should create a root span when there is a handler hit + # with the proper tags + request = await client.request("GET", "/") + assert 200 == request.status + await request.text() + # the trace is created + traces = tracer.pop_traces() + assert 1 == len(traces) + assert 1 == len(traces[0]) + request_span = traces[0][0] + assert_is_measured(request_span) + + # request + assert "aiohttp-web" == request_span.service + assert "aiohttp.request" == request_span.name + assert "GET /" == request_span.resource + except Exception: + raise + finally: + config.aiohttp.disable_stream_timing_for_mem_leak = False + + async def test_stream_request(patched_app_tracer, aiohttp_client, loop): app, tracer = patched_app_tracer async with await aiohttp_client(app) as client: From be50fd787b0319988bdd50a9984f30f803cd3653 Mon Sep 17 00:00:00 2001 From: Zachary Groves <32471391+ZStriker19@users.noreply.github.com> Date: Tue, 4 Feb 2025 17:44:44 -0500 Subject: [PATCH 49/63] fix(logging): remove unneeded forksafe unregister to avoid unneeded logging (#12193) Removes unneeded forksafe unregister hook. The unregister is not needed, because we never actually registered the hook to begin with. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/internal/remoteconfig/worker.py | 4 ---- .../notes/remove_unneeded_unregister-ad20120201768a7e.yaml | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 releasenotes/notes/remove_unneeded_unregister-ad20120201768a7e.yaml diff --git a/ddtrace/internal/remoteconfig/worker.py b/ddtrace/internal/remoteconfig/worker.py index 5429e599e74..08650bd8507 100644 --- a/ddtrace/internal/remoteconfig/worker.py +++ b/ddtrace/internal/remoteconfig/worker.py @@ -2,7 +2,6 @@ from typing import List # noqa:F401 from ddtrace.internal import agent -from ddtrace.internal import atexit from ddtrace.internal import forksafe from ddtrace.internal import periodic from ddtrace.internal.logger import get_logger @@ -132,9 +131,6 @@ def disable(self, join=False): if self.status == ServiceStatus.STOPPED: return - forksafe.unregister(self.reset_at_fork) - atexit.unregister(self.disable) - self.stop(join=join) def _stop_service(self, *args, **kwargs): diff --git a/releasenotes/notes/remove_unneeded_unregister-ad20120201768a7e.yaml b/releasenotes/notes/remove_unneeded_unregister-ad20120201768a7e.yaml new file mode 100644 index 00000000000..1a5dc451340 --- /dev/null +++ b/releasenotes/notes/remove_unneeded_unregister-ad20120201768a7e.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + logging: Resolves an an unneeded info log being logged on process exit + due to a forksafe hook being unregistered that was never registered to begin with. From cdaa1e36d2ef9043e22310eb163cd040c8bae37f Mon Sep 17 00:00:00 2001 From: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Date: Tue, 4 Feb 2025 18:25:43 -0500 Subject: [PATCH 50/63] chore(openai): drop legacy integration metrics and logs (#12211) This PR removes integration metrics and logs from the OpenAI integration. Prompt-completion logs were always experimental, rarely used, and unofficially deprecated since the release of LLM Observability. For any customers looking to continue getting visibility into their OpenAI call prompt/completions, we are now pushing to migrate over to use LLM Observability instead. Operational Integration metrics can either be replaced with LLM Observability or APM trace metrics instead. The only caveat of using LLM Observability is for customers who may not want prompt/completion logging, and the only caveat of using APM trace metrics is that token metrics will not be included, primarily only operation metrics. [](https://datadoghq.atlassian.net/browse/MLOB-2186) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/contrib/_openai.py | 135 +------- .../internal/openai/_endpoint_hooks.py | 52 --- ddtrace/contrib/internal/openai/patch.py | 11 - ddtrace/llmobs/_integrations/openai.py | 43 +-- ...-openai-metrics-logs-656c6ba8e2e07ea3.yaml | 8 + tests/contrib/openai/conftest.py | 37 +-- tests/contrib/openai/test_openai_llmobs.py | 8 +- tests/contrib/openai/test_openai_v1.py | 309 ++---------------- ...test_openai_v1.test_integration_async.json | 3 + ...t_integration_service_name[None-None].json | 3 + ...est_integration_service_name[None-v0].json | 3 + ...est_integration_service_name[None-v1].json | 3 + ..._integration_service_name[mysvc-None].json | 3 + ...st_integration_service_name[mysvc-v0].json | 3 + ...st_integration_service_name[mysvc-v1].json | 3 + ....test_openai_v1.test_integration_sync.json | 3 + 16 files changed, 62 insertions(+), 565 deletions(-) create mode 100644 releasenotes/notes/remove-openai-metrics-logs-656c6ba8e2e07ea3.yaml diff --git a/ddtrace/contrib/_openai.py b/ddtrace/contrib/_openai.py index 8e2eb87aeb5..0642bbb0881 100644 --- a/ddtrace/contrib/_openai.py +++ b/ddtrace/contrib/_openai.py @@ -1,10 +1,8 @@ """ -The OpenAI integration instruments the OpenAI Python library to emit metrics, -traces, and logs (logs are disabled by default) for requests made to the models, -completions, chat completions, edits, images, embeddings, audio, files, fine-tunes, -and moderations endpoints. +The OpenAI integration instruments the OpenAI Python library to emit traces for requests made to the models, +completions, chat completions, images, embeddings, audio, files, and moderations endpoints. -All metrics, logs, and traces submitted from the OpenAI integration are tagged by: +All traces submitted from the OpenAI integration are tagged by: - ``service``, ``env``, ``version``: see the `Unified Service Tagging docs `_. - ``openai.request.endpoint``: OpenAI API endpoint used in the request. @@ -15,84 +13,6 @@ - ``openai.user.api_key``: OpenAI API key used to make the request (obfuscated to match the OpenAI UI representation ``sk-...XXXX`` where ``XXXX`` is the last 4 digits of the key). -Metrics -~~~~~~~ - -The following metrics are collected by default by the OpenAI integration. - -.. important:: - If the Agent is configured to use a non-default Statsd hostname or port, use ``DD_DOGSTATSD_URL`` to configure - ``ddtrace`` to use it. - - -.. important:: - Ratelimit and token metrics only reflect usage of the supported completions, chat completions, and embedding - endpoints. Usage of other OpenAI endpoints will not be recorded as they are not provided. - - -.. py:data:: openai.request.duration - - The duration of the OpenAI request in seconds. - - Type: ``distribution`` - - -.. py:data:: openai.request.error - - The number of errors from requests made to OpenAI. - - Type: ``count`` - - -.. py:data:: openai.ratelimit.requests - - The maximum number of OpenAI requests permitted before exhausting the rate limit. - - Type: ``gauge`` - - -.. py:data:: openai.ratelimit.tokens - - The maximum number of OpenAI tokens permitted before exhausting the rate limit. - - Type: ``gauge`` - - -.. py:data:: openai.ratelimit.remaining.requests - - The remaining number of OpenAI requests permitted before exhausting the rate limit. - - Type: ``gauge`` - - -.. py:data:: openai.ratelimit.remaining.tokens - - The remaining number of OpenAI tokens permitted before exhausting the rate limit. - - Type: ``gauge`` - - -.. py:data:: openai.tokens.prompt - - The number of tokens used in the prompt of an OpenAI request. - - Type: ``distribution`` - - -.. py:data:: openai.tokens.completion - - The number of tokens used in the completion of a OpenAI response. - - Type: ``distribution`` - - -.. py:data:: openai.tokens.total - - The total number of tokens used in the prompt and completion of a OpenAI request/response. - - Type: ``distribution`` - - (beta) Prompt and Completion Sampling ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -101,22 +21,9 @@ - Prompt inputs and completions for the ``completions`` endpoint. - Message inputs and completions for the ``chat.completions`` endpoint. - Embedding inputs for the ``embeddings`` endpoint. -- Edit inputs, instructions, and completions for the ``edits`` endpoint. - Image input filenames and completion URLs for the ``images`` endpoint. - Audio input filenames and completions for the ``audio`` endpoint. -Prompt and message inputs and completions can also be emitted as log data. -Logs are **not** emitted by default. When logs are enabled they are sampled at ``0.1``. - -Read the **Global Configuration** section for information about enabling logs and configuring sampling -rates. - -.. important:: - - To submit logs, you must set the ``DD_API_KEY`` environment variable. - - Set ``DD_SITE`` to send logs to a Datadog site such as ``datadoghq.eu``. The default is ``datadoghq.com``. - (beta) Streamed Responses Support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -172,32 +79,6 @@ Default: ``DD_SERVICE`` -.. py:data:: ddtrace.config.openai["logs_enabled"] - - Enable collection of prompts and completions as logs. You can adjust the rate of prompts and completions collected - using the sample rate configuration described below. - - Alternatively, you can set this option with the ``DD_OPENAI_LOGS_ENABLED`` environment - variable. - - Note that you must set the ``DD_API_KEY`` environment variable to enable sending logs. - - Default: ``False`` - - -.. py:data:: ddtrace.config.openai["metrics_enabled"] - - Enable collection of OpenAI metrics. - - If the Datadog Agent is configured to use a non-default Statsd hostname - or port, use ``DD_DOGSTATSD_URL`` to configure ``ddtrace`` to use it. - - Alternatively, you can set this option with the ``DD_OPENAI_METRICS_ENABLED`` environment - variable. - - Default: ``True`` - - .. py:data:: (beta) ddtrace.config.openai["span_char_limit"] Configure the maximum number of characters for the following data within span tags: @@ -225,16 +106,6 @@ Default: ``1.0`` -.. py:data:: (beta) ddtrace.config.openai["log_prompt_completion_sample_rate"] - - Configure the sample rate for the collection of prompts and completions as logs. - - Alternatively, you can set this option with the ``DD_OPENAI_LOG_PROMPT_COMPLETION_SAMPLE_RATE`` environment - variable. - - Default: ``0.1`` - - Instance Configuration ~~~~~~~~~~~~~~~~~~~~~~ diff --git a/ddtrace/contrib/internal/openai/_endpoint_hooks.py b/ddtrace/contrib/internal/openai/_endpoint_hooks.py index 00ee44aef4b..786bb67f919 100644 --- a/ddtrace/contrib/internal/openai/_endpoint_hooks.py +++ b/ddtrace/contrib/internal/openai/_endpoint_hooks.py @@ -112,7 +112,6 @@ def shared_gen(): _process_finished_stream(integration, span, kwargs, streamed_chunks, is_completion=is_completion) finally: span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) if _is_async_generator(resp): @@ -199,16 +198,6 @@ def _record_response(self, pin, integration, span, args, kwargs, resp, error): resp = super()._record_response(pin, integration, span, args, kwargs, resp, error) if kwargs.get("stream") and error is None: return self._handle_streamed_response(integration, span, kwargs, resp, is_completion=True) - if integration.is_pc_sampled_log(span): - attrs_dict = {"prompt": kwargs.get("prompt", "")} - if error is None: - log_choices = resp.choices - if hasattr(resp.choices[0], "model_dump"): - log_choices = [choice.model_dump() for choice in resp.choices] - attrs_dict.update({"choices": log_choices}) - integration.log( - span, "info" if error is None else "error", "sampled %s" % self.OPERATION_ID, attrs=attrs_dict - ) integration.llmobs_set_tags(span, args=[], kwargs=kwargs, response=resp, operation="completion") if not resp: return @@ -268,14 +257,6 @@ def _record_response(self, pin, integration, span, args, kwargs, resp, error): resp = super()._record_response(pin, integration, span, args, kwargs, resp, error) if kwargs.get("stream") and error is None: return self._handle_streamed_response(integration, span, kwargs, resp, is_completion=False) - if integration.is_pc_sampled_log(span): - log_choices = resp.choices - if hasattr(resp.choices[0], "model_dump"): - log_choices = [choice.model_dump() for choice in resp.choices] - attrs_dict = {"messages": kwargs.get("messages", []), "completion": log_choices} - integration.log( - span, "info" if error is None else "error", "sampled %s" % self.OPERATION_ID, attrs=attrs_dict - ) integration.llmobs_set_tags(span, args=[], kwargs=kwargs, response=resp, operation="chat") if not resp: return @@ -518,26 +499,6 @@ def _record_request(self, pin, integration, instance, span, args, kwargs): def _record_response(self, pin, integration, span, args, kwargs, resp, error): resp = super()._record_response(pin, integration, span, args, kwargs, resp, error) - if integration.is_pc_sampled_log(span): - attrs_dict = {} - if kwargs.get("response_format", "") == "b64_json": - attrs_dict.update({"choices": [{"b64_json": "returned"} for _ in resp.data]}) - else: - log_choices = resp.data - if hasattr(resp.data[0], "model_dump"): - log_choices = [choice.model_dump() for choice in resp.data] - attrs_dict.update({"choices": log_choices}) - if "prompt" in self._request_kwarg_params: - attrs_dict.update({"prompt": kwargs.get("prompt", "")}) - if "image" in self._request_kwarg_params: - image = args[0] if len(args) >= 1 else kwargs.get("image", "") - attrs_dict.update({"image": image.name.split("/")[-1]}) - if "mask" in self._request_kwarg_params: - mask = args[1] if len(args) >= 2 else kwargs.get("mask", "") - attrs_dict.update({"mask": mask.name.split("/")[-1]}) - integration.log( - span, "info" if error is None else "error", "sampled %s" % self.OPERATION_ID, attrs=attrs_dict - ) if not resp: return choices = resp.data @@ -629,19 +590,6 @@ def _record_response(self, pin, integration, span, args, kwargs, resp, error): span.set_metric("openai.response.segments_count", len(resp_to_tag.get("segments"))) if integration.is_pc_sampled_span(span): span.set_tag_str("openai.response.text", integration.trunc(text)) - if integration.is_pc_sampled_log(span): - file_input = args[1] if len(args) >= 2 else kwargs.get("file", "") - integration.log( - span, - "info" if error is None else "error", - "sampled %s" % self.OPERATION_ID, - attrs={ - "file": getattr(file_input, "name", "").split("/")[-1], - "prompt": kwargs.get("prompt", ""), - "language": kwargs.get("language", ""), - "text": text, - }, - ) return resp diff --git a/ddtrace/contrib/internal/openai/patch.py b/ddtrace/contrib/internal/openai/patch.py index 3696314acc4..812c786dfc4 100644 --- a/ddtrace/contrib/internal/openai/patch.py +++ b/ddtrace/contrib/internal/openai/patch.py @@ -10,7 +10,6 @@ from ddtrace.contrib.trace_utils import with_traced_module from ddtrace.contrib.trace_utils import wrap from ddtrace.internal.logger import get_logger -from ddtrace.internal.utils.formats import asbool from ddtrace.internal.utils.formats import deep_getattr from ddtrace.internal.utils.version import parse_version from ddtrace.llmobs._integrations import OpenAIIntegration @@ -23,10 +22,7 @@ config._add( "openai", { - "logs_enabled": asbool(os.getenv("DD_OPENAI_LOGS_ENABLED", False)), - "metrics_enabled": asbool(os.getenv("DD_OPENAI_METRICS_ENABLED", True)), "span_prompt_completion_sample_rate": float(os.getenv("DD_OPENAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE", 1.0)), - "log_prompt_completion_sample_rate": float(os.getenv("DD_OPENAI_LOG_PROMPT_COMPLETION_SAMPLE_RATE", 0.1)), "span_char_limit": int(os.getenv("DD_OPENAI_SPAN_CHAR_LIMIT", 128)), }, ) @@ -183,7 +179,6 @@ def _traced_endpoint(endpoint_hook, integration, instance, pin, args, kwargs): # Record any error information if err is not None: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) # Pass the response and the error to the hook try: @@ -196,7 +191,6 @@ def _traced_endpoint(endpoint_hook, integration, instance, pin, args, kwargs): # Streamed responses with error will need to be finished manually as well. if not kwargs.get("stream") or err is not None: span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) def _patched_endpoint(openai, patch_hook): @@ -256,7 +250,6 @@ async def patched_endpoint(openai, pin, func, instance, args, kwargs): @with_traced_module def patched_convert(openai, pin, func, instance, args, kwargs): """Patch convert captures header information in the openai response""" - integration = openai._datadog_integration span = pin.tracer.current_span() if not span: return func(*args, **kwargs) @@ -281,23 +274,19 @@ def patched_convert(openai, pin, func, instance, args, kwargs): if headers.get("x-ratelimit-limit-requests"): v = headers.get("x-ratelimit-limit-requests") if v is not None: - integration.metric(span, "gauge", "ratelimit.requests", int(v)) span.set_metric("openai.organization.ratelimit.requests.limit", int(v)) if headers.get("x-ratelimit-limit-tokens"): v = headers.get("x-ratelimit-limit-tokens") if v is not None: - integration.metric(span, "gauge", "ratelimit.tokens", int(v)) span.set_metric("openai.organization.ratelimit.tokens.limit", int(v)) # Gauge and set span info for remaining requests and tokens if headers.get("x-ratelimit-remaining-requests"): v = headers.get("x-ratelimit-remaining-requests") if v is not None: - integration.metric(span, "gauge", "ratelimit.remaining.requests", int(v)) span.set_metric("openai.organization.ratelimit.requests.remaining", int(v)) if headers.get("x-ratelimit-remaining-tokens"): v = headers.get("x-ratelimit-remaining-tokens") if v is not None: - integration.metric(span, "gauge", "ratelimit.remaining.tokens", int(v)) span.set_metric("openai.organization.ratelimit.tokens.remaining", int(v)) return func(*args, **kwargs) diff --git a/ddtrace/llmobs/_integrations/openai.py b/ddtrace/llmobs/_integrations/openai.py index 7ed3aace08a..86b46123057 100644 --- a/ddtrace/llmobs/_integrations/openai.py +++ b/ddtrace/llmobs/_integrations/openai.py @@ -5,7 +5,6 @@ from typing import Optional from typing import Tuple -from ddtrace import config from ddtrace.internal.constants import COMPONENT from ddtrace.internal.utils.version import parse_version from ddtrace.llmobs._constants import INPUT_DOCUMENTS @@ -88,54 +87,14 @@ def _is_azure_openai(span): return False return "azure" in base_url.lower() - @classmethod - def _logs_tags(cls, span: Span) -> str: - tags = ( - "env:%s,version:%s,openai.request.endpoint:%s,openai.request.method:%s,openai.request.model:%s,openai.organization.name:%s," - "openai.user.api_key:%s" - % ( # noqa: E501 - (config.env or ""), - (config.version or ""), - (span.get_tag("openai.request.endpoint") or ""), - (span.get_tag("openai.request.method") or ""), - (span.get_tag("openai.request.model") or ""), - (span.get_tag("openai.organization.name") or ""), - (span.get_tag("openai.user.api_key") or ""), - ) - ) - return tags - - @classmethod - def _metrics_tags(cls, span: Span) -> List[str]: - model_name = span.get_tag("openai.request.model") or "" - tags = [ - "version:%s" % (config.version or ""), - "env:%s" % (config.env or ""), - "service:%s" % (span.service or ""), - "openai.request.model:%s" % model_name, - "model:%s" % model_name, - "openai.request.endpoint:%s" % (span.get_tag("openai.request.endpoint") or ""), - "openai.request.method:%s" % (span.get_tag("openai.request.method") or ""), - "openai.organization.id:%s" % (span.get_tag("openai.organization.id") or ""), - "openai.organization.name:%s" % (span.get_tag("openai.organization.name") or ""), - "openai.user.api_key:%s" % (span.get_tag("openai.user.api_key") or ""), - "error:%d" % span.error, - ] - err_type = span.get_tag("error.type") - if err_type: - tags.append("error_type:%s" % err_type) - return tags - def record_usage(self, span: Span, usage: Dict[str, Any]) -> None: - if not usage or not self.metrics_enabled: + if not usage: return - tags = ["openai.estimated:false"] for token_type in ("prompt", "completion", "total"): num_tokens = getattr(usage, token_type + "_tokens", None) if not num_tokens: continue span.set_metric("openai.response.usage.%s_tokens" % token_type, num_tokens) - self.metric(span, "dist", "tokens.%s" % token_type, num_tokens, tags=tags) def _llmobs_set_tags( self, diff --git a/releasenotes/notes/remove-openai-metrics-logs-656c6ba8e2e07ea3.yaml b/releasenotes/notes/remove-openai-metrics-logs-656c6ba8e2e07ea3.yaml new file mode 100644 index 00000000000..63153702d16 --- /dev/null +++ b/releasenotes/notes/remove-openai-metrics-logs-656c6ba8e2e07ea3.yaml @@ -0,0 +1,8 @@ +--- +upgrade: + - | + openai: Removes prompt-completion log sampling from the OpenAI integration. To continue logging prompt completions, + enable LLM Observability. + - | + openai: Removes integration metrics from the OpenAI integration. To continue tracking operational metrics from the + OpenAI integration, enable LLM Observability or use trace metrics instead. diff --git a/tests/contrib/openai/conftest.py b/tests/contrib/openai/conftest.py index 615a4e773b1..47f258b3ed0 100644 --- a/tests/contrib/openai/conftest.py +++ b/tests/contrib/openai/conftest.py @@ -92,34 +92,6 @@ def process_trace(self, trace): return trace -@pytest.fixture(scope="session") -def mock_metrics(): - patcher = mock.patch("ddtrace.llmobs._integrations.base.get_dogstatsd_client") - try: - DogStatsdMock = patcher.start() - m = mock.MagicMock() - DogStatsdMock.return_value = m - yield m - finally: - patcher.stop() - - -@pytest.fixture(scope="session") -def mock_logs(): - """ - Note that this fixture must be ordered BEFORE mock_tracer as it needs to patch the log writer - before it is instantiated. - """ - patcher = mock.patch("ddtrace.llmobs._integrations.base.V2LogWriter") - try: - V2LogWriterMock = patcher.start() - m = mock.MagicMock() - V2LogWriterMock.return_value = m - yield m - finally: - patcher.stop() - - @pytest.fixture() def mock_llmobs_writer(): patcher = mock.patch("ddtrace.llmobs._llmobs.LLMObsSpanWriter") @@ -163,18 +135,15 @@ def patch_openai(ddtrace_global_config, ddtrace_config_openai, openai_api_key, o @pytest.fixture -def snapshot_tracer(openai, patch_openai, mock_logs, mock_metrics): +def snapshot_tracer(openai, patch_openai): pin = Pin.get_from(openai) pin.tracer._configure(trace_processors=[FilterOrg()]) yield pin.tracer - mock_logs.reset_mock() - mock_metrics.reset_mock() - @pytest.fixture -def mock_tracer(ddtrace_global_config, openai, patch_openai, mock_logs, mock_metrics): +def mock_tracer(ddtrace_global_config, openai, patch_openai): pin = Pin.get_from(openai) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) pin.override(openai, tracer=mock_tracer) @@ -187,6 +156,4 @@ def mock_tracer(ddtrace_global_config, openai, patch_openai, mock_logs, mock_met yield mock_tracer - mock_logs.reset_mock() - mock_metrics.reset_mock() LLMObs.disable() diff --git a/tests/contrib/openai/test_openai_llmobs.py b/tests/contrib/openai/test_openai_llmobs.py index 70adff39ef5..91e454c1673 100644 --- a/tests/contrib/openai/test_openai_llmobs.py +++ b/tests/contrib/openai/test_openai_llmobs.py @@ -602,9 +602,7 @@ def test_embedding_string_base64(self, openai, ddtrace_global_config, mock_llmob [dict(_llmobs_enabled=True, _llmobs_ml_app="", _llmobs_agentless_enabled=True)], ) @pytest.mark.skipif(parse_version(openai_module.version.VERSION) < (1, 0), reason="These tests are for openai >= 1.0") -def test_agentless_enabled_does_not_submit_metrics( - openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer, mock_metrics -): +def test_agentless_enabled_does_not_submit_metrics(openai, ddtrace_global_config, mock_llmobs_writer, mock_tracer): """Ensure openai metrics are not emitted when agentless mode is enabled.""" with get_openai_vcr(subdirectory_name="v1").use_cassette("completion.yaml"): model = "ada" @@ -619,7 +617,3 @@ def test_agentless_enabled_does_not_submit_metrics( user="ddtrace-test", ) assert mock_llmobs_writer.enqueue.call_count == 1 - mock_metrics.assert_not_called() - assert mock_metrics.increment.call_count == 0 - assert mock_metrics.distribution.call_count == 0 - assert mock_metrics.gauge.call_count == 0 diff --git a/tests/contrib/openai/test_openai_v1.py b/tests/contrib/openai/test_openai_v1.py index a081583b4d1..468f4b03606 100644 --- a/tests/contrib/openai/test_openai_v1.py +++ b/tests/contrib/openai/test_openai_v1.py @@ -25,18 +25,8 @@ def openai_vcr(): yield get_openai_vcr(subdirectory_name="v1") -@pytest.mark.parametrize("ddtrace_config_openai", [dict(metrics_enabled=True), dict(metrics_enabled=False)]) -def test_config(ddtrace_config_openai, mock_tracer, openai): - # Ensure that the module state is reloaded for each test run - assert not hasattr(openai, "_test") - openai._test = 1 - - # Ensure overriding the config works - assert ddtrace.config.openai.metrics_enabled is ddtrace_config_openai["metrics_enabled"] - - @pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_model_list(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): +def test_model_list(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): with snapshot_context( token="tests.contrib.openai.test_openai.test_model_list", ignores=["meta.http.useragent", "meta.openai.api_type", "meta.openai.api_base", "meta.openai.request.user"], @@ -47,7 +37,7 @@ def test_model_list(api_key_in_env, request_api_key, openai, openai_vcr, mock_me @pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_model_alist(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): +async def test_model_alist(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): with snapshot_context( token="tests.contrib.openai.test_openai.test_model_list", ignores=["meta.http.useragent", "meta.openai.api_type", "meta.openai.api_base", "meta.openai.request.user"], @@ -58,7 +48,7 @@ async def test_model_alist(api_key_in_env, request_api_key, openai, openai_vcr, @pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_model_retrieve(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): +def test_model_retrieve(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): with snapshot_context( token="tests.contrib.openai.test_openai.test_model_retrieve", ignores=["meta.http.useragent", "meta.openai.api_type", "meta.openai.api_base", "meta.openai.request.user"], @@ -69,7 +59,7 @@ def test_model_retrieve(api_key_in_env, request_api_key, openai, openai_vcr, moc @pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_model_aretrieve(api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, snapshot_tracer): +async def test_model_aretrieve(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): with snapshot_context( token="tests.contrib.openai.test_openai.test_model_retrieve", ignores=["meta.http.useragent", "meta.openai.api_type", "meta.openai.api_base", "meta.openai.request.user"], @@ -80,9 +70,7 @@ async def test_model_aretrieve(api_key_in_env, request_api_key, openai, openai_v @pytest.mark.parametrize("api_key_in_env", [True, False]) -def test_completion( - api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, mock_logs, mock_llmobs_writer, snapshot_tracer -): +def test_completion(api_key_in_env, request_api_key, openai, openai_vcr, mock_llmobs_writer, snapshot_tracer): with snapshot_context( token="tests.contrib.openai.test_openai.test_completion", ignores=["meta.http.useragent", "meta.openai.api_type", "meta.openai.api_base"], @@ -111,42 +99,12 @@ def test_completion( assert choice.logprobs == expected_choices[idx]["logprobs"] assert choice.text == expected_choices[idx]["text"] - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:ada", - "model:ada", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [ - mock.call.distribution("tokens.prompt", 2, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.completion", 12, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.total", 14, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("request.duration", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.tokens", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.tokens", mock.ANY, tags=expected_tags), - ], - any_order=True, - ) - mock_logs.start.assert_not_called() - mock_logs.enqueue.assert_not_called() mock_llmobs_writer.start.assert_not_called() mock_llmobs_writer.enqueue.assert_not_called() @pytest.mark.parametrize("api_key_in_env", [True, False]) -async def test_acompletion( - api_key_in_env, request_api_key, openai, openai_vcr, mock_metrics, mock_logs, mock_llmobs_writer, snapshot_tracer -): +async def test_acompletion(api_key_in_env, request_api_key, openai, openai_vcr, mock_llmobs_writer, snapshot_tracer): with snapshot_context( token="tests.contrib.openai.test_openai.test_acompletion", ignores=["meta.http.useragent", "meta.openai.api_type", "meta.openai.api_base"], @@ -181,88 +139,11 @@ async def test_acompletion( for key, value in expected_choices.items(): assert getattr(resp.choices[0], key, None) == value - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:curie", - "model:curie", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - ] - mock_metrics.assert_has_calls( - [ - mock.call.distribution("tokens.prompt", 10, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.completion", 150, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("tokens.total", 160, tags=expected_tags + ["openai.estimated:false"]), - mock.call.distribution("request.duration", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.requests", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.remaining.tokens", mock.ANY, tags=expected_tags), - mock.call.gauge("ratelimit.tokens", mock.ANY, tags=expected_tags), - ], - any_order=True, - ) - mock_logs.start.assert_not_called() - mock_logs.enqueue.assert_not_called() mock_llmobs_writer.start.assert_not_called() mock_llmobs_writer.enqueue.assert_not_called() -@pytest.mark.xfail(reason="An API key is required when logs are enabled") -@pytest.mark.parametrize( - "ddtrace_global_config,ddtrace_config_openai", - [(dict(_dd_api_key=""), dict(logs_enabled=True))], -) -def test_logs_no_api_key(openai, ddtrace_global_config, ddtrace_config_openai, mock_tracer): - """When no DD_API_KEY is set, the patching fails""" - pass - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_completions(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for completion endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - with openai_vcr.use_cassette("completion.yaml"): - client = openai.OpenAI() - client.completions.create( - model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10, user="ddtrace-test" - ) - - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "tests.contrib.openai", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/completions,openai.request.method:POST,openai.request.model:ada,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "prompt": "Hello world", - "choices": mock.ANY, - } - ), - ] - ) - - -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_global_tags(openai_vcr, ddtrace_config_openai, openai, mock_metrics, mock_logs, mock_tracer): +def test_global_tags(openai_vcr, openai, mock_tracer): """ When the global config UST tags are set The service name should be used for all data @@ -288,32 +169,6 @@ def test_global_tags(openai_vcr, ddtrace_config_openai, openai, mock_metrics, mo assert span.get_tag("openai.organization.name") == "datadog-4" assert span.get_tag("openai.user.api_key") == "sk-...key>" - for _, _args, kwargs in mock_metrics.mock_calls: - expected_metrics = [ - "service:test-svc", - "env:staging", - "version:1234", - "openai.request.model:ada", - "model:ada", - "openai.request.endpoint:/v1/completions", - "openai.request.method:POST", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - ] - actual_tags = kwargs.get("tags") - for m in expected_metrics: - assert m in actual_tags - - for call, args, _kwargs in mock_logs.mock_calls: - if call != "enqueue": - continue - log = args[0] - assert log["service"] == "test-svc" - assert ( - log["ddtags"] - == "env:staging,version:1234,openai.request.endpoint:/v1/completions,openai.request.method:POST,openai.request.model:ada,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>" # noqa: E501 - ) - def test_completion_raw_response(openai, openai_vcr, snapshot_tracer): with snapshot_context( @@ -440,20 +295,6 @@ def test_chat_completion_raw_response(openai, openai_vcr, snapshot_tracer): ) -@pytest.mark.parametrize("ddtrace_config_openai", [dict(metrics_enabled=b) for b in [True, False]]) -def test_enable_metrics(openai, openai_vcr, ddtrace_config_openai, mock_metrics, mock_tracer): - """Ensure the metrics_enabled configuration works.""" - with openai_vcr.use_cassette("completion.yaml"): - client = openai.OpenAI() - client.completions.create( - model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10, user="ddtrace-test" - ) - if ddtrace_config_openai["metrics_enabled"]: - assert mock_metrics.mock_calls - else: - assert not mock_metrics.mock_calls - - @pytest.mark.parametrize("api_key_in_env", [True, False]) async def test_achat_completion(api_key_in_env, request_api_key, openai, openai_vcr, snapshot_tracer): with snapshot_context( @@ -510,47 +351,6 @@ async def test_image_acreate(api_key_in_env, request_api_key, openai, openai_vcr ) -@pytest.mark.parametrize("ddtrace_config_openai", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)]) -def test_logs_image_create(openai_vcr, openai, ddtrace_config_openai, mock_logs, mock_tracer): - """Ensure logs are emitted for image endpoints when configured. - - Also ensure the logs have the correct tagging including the trace-logs correlation tagging. - """ - with openai_vcr.use_cassette("image_create.yaml"): - client = openai.OpenAI() - client.images.generate( - prompt="sleepy capybara with monkey on top", - n=1, - size="256x256", - response_format="url", - user="ddtrace-test", - ) - span = mock_tracer.pop_traces()[0][0] - trace_id, span_id = span.trace_id, span.span_id - - assert mock_logs.enqueue.call_count == 1 - mock_logs.assert_has_calls( - [ - mock.call.start(), - mock.call.enqueue( - { - "timestamp": mock.ANY, - "message": mock.ANY, - "hostname": mock.ANY, - "ddsource": "openai", - "service": "tests.contrib.openai", - "status": "info", - "ddtags": "env:,version:,openai.request.endpoint:/v1/images/generations,openai.request.method:POST,openai.request.model:dall-e,openai.organization.name:datadog-4,openai.user.api_key:sk-...key>", # noqa: E501 - "dd.trace_id": "{:x}".format(trace_id), - "dd.span_id": str(span_id), - "prompt": "sleepy capybara with monkey on top", - "choices": mock.ANY, - } - ), - ] - ) - - # TODO: Note that vcr tests for image edit/variation don't work as they error out when recording the vcr request, # during the payload decoding. We'll need to migrate those tests over once we can address this. @pytest.mark.snapshot( @@ -871,7 +671,7 @@ def test_span_finish_on_stream_error(openai, openai_vcr, snapshot_tracer): @pytest.mark.snapshot @pytest.mark.skipif(TIKTOKEN_AVAILABLE, reason="This test estimates token counts") -def test_completion_stream_est_tokens(openai, openai_vcr, mock_metrics, snapshot_tracer): +def test_completion_stream_est_tokens(openai, openai_vcr, snapshot_tracer): with openai_vcr.use_cassette("completion_streamed.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: mock_encoding.return_value.encode.side_effect = lambda x: [1, 2] @@ -882,7 +682,7 @@ def test_completion_stream_est_tokens(openai, openai_vcr, mock_metrics, snapshot @pytest.mark.skipif(not TIKTOKEN_AVAILABLE, reason="This test computes token counts using tiktoken") @pytest.mark.snapshot(token="tests.contrib.openai.test_openai.test_completion_stream") -def test_completion_stream(openai, openai_vcr, mock_metrics, snapshot_tracer): +def test_completion_stream(openai, openai_vcr, snapshot_tracer): with openai_vcr.use_cassette("completion_streamed.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: mock_encoding.return_value.encode.side_effect = lambda x: [1, 2] @@ -893,7 +693,7 @@ def test_completion_stream(openai, openai_vcr, mock_metrics, snapshot_tracer): @pytest.mark.skipif(not TIKTOKEN_AVAILABLE, reason="This test computes token counts using tiktoken") @pytest.mark.snapshot(token="tests.contrib.openai.test_openai.test_completion_stream") -async def test_completion_async_stream(openai, openai_vcr, mock_metrics, snapshot_tracer): +async def test_completion_async_stream(openai, openai_vcr, snapshot_tracer): with openai_vcr.use_cassette("completion_streamed.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: mock_encoding.return_value.encode.side_effect = lambda x: [1, 2] @@ -907,7 +707,7 @@ async def test_completion_async_stream(openai, openai_vcr, mock_metrics, snapsho reason="Streamed response context managers are only available v1.6.0+", ) @pytest.mark.snapshot(token="tests.contrib.openai.test_openai.test_completion_stream") -def test_completion_stream_context_manager(openai, openai_vcr, mock_metrics, snapshot_tracer): +def test_completion_stream_context_manager(openai, openai_vcr, snapshot_tracer): with openai_vcr.use_cassette("completion_streamed.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: mock_encoding.return_value.encode.side_effect = lambda x: [1, 2] @@ -920,7 +720,7 @@ def test_completion_stream_context_manager(openai, openai_vcr, mock_metrics, sna parse_version(openai_module.version.VERSION) < (1, 26), reason="Stream options only available openai >= 1.26" ) @pytest.mark.snapshot(token="tests.contrib.openai.test_openai.test_chat_completion_stream") -def test_chat_completion_stream(openai, openai_vcr, mock_metrics, snapshot_tracer): +def test_chat_completion_stream(openai, openai_vcr, snapshot_tracer): """Assert that streamed token chunk extraction logic works automatically.""" with openai_vcr.use_cassette("chat_completion_streamed_tokens.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: @@ -939,7 +739,7 @@ def test_chat_completion_stream(openai, openai_vcr, mock_metrics, snapshot_trace @pytest.mark.skipif( parse_version(openai_module.version.VERSION) < (1, 26), reason="Stream options only available openai >= 1.26" ) -def test_chat_completion_stream_explicit_no_tokens(openai, openai_vcr, mock_metrics, snapshot_tracer): +def test_chat_completion_stream_explicit_no_tokens(openai, openai_vcr, mock_tracer): """Assert that streamed token chunk extraction logic is avoided if explicitly set to False by the user.""" with openai_vcr.use_cassette("chat_completion_streamed.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: @@ -956,41 +756,22 @@ def test_chat_completion_stream_explicit_no_tokens(openai, openai_vcr, mock_metr user="ddtrace-test", n=None, ) - span = snapshot_tracer.current_span() chunks = [c for c in resp] assert len(chunks) == 15 completion = "".join([c.choices[0].delta.content for c in chunks if c.choices[0].delta.content is not None]) assert completion == expected_completion - expected_tags = [ - "version:", - "env:", - "service:tests.contrib.openai", - "openai.request.model:gpt-3.5-turbo", - "model:gpt-3.5-turbo", - "openai.request.endpoint:/v1/chat/completions", - "openai.request.method:POST", - "openai.organization.id:", - "openai.organization.name:datadog-4", - "openai.user.api_key:sk-...key>", - "error:0", - ] - assert mock.call.distribution("request.duration", span.duration_ns, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.requests", 3000, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.gauge("ratelimit.remaining.requests", 2999, tags=expected_tags) in mock_metrics.mock_calls - expected_tags += ["openai.estimated:true"] - if TIKTOKEN_AVAILABLE: - expected_tags = expected_tags[:-1] - assert mock.call.distribution("tokens.prompt", 8, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.completion", mock.ANY, tags=expected_tags) in mock_metrics.mock_calls - assert mock.call.distribution("tokens.total", mock.ANY, tags=expected_tags) in mock_metrics.mock_calls + span = mock_tracer.pop_traces()[0][0] + assert span.get_metric("openai.response.usage.prompt_tokens") == 8 + assert span.get_metric("openai.response.usage.completion_tokens") is not None + assert span.get_metric("openai.response.usage.total_tokens") is not None @pytest.mark.skipif( parse_version(openai_module.version.VERSION) < (1, 26, 0), reason="Streamed tokens available in 1.26.0+" ) @pytest.mark.snapshot(token="tests.contrib.openai.test_openai.test_chat_completion_stream") -async def test_chat_completion_async_stream(openai, openai_vcr, mock_metrics, snapshot_tracer): +async def test_chat_completion_async_stream(openai, openai_vcr, snapshot_tracer): with openai_vcr.use_cassette("chat_completion_streamed_tokens.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: mock_encoding.return_value.encode.side_effect = lambda x: [1, 2, 3, 4, 5, 6, 7, 8] @@ -1012,7 +793,7 @@ async def test_chat_completion_async_stream(openai, openai_vcr, mock_metrics, sn reason="Streamed response context managers are only available v1.6.0+, tokens available 1.26.0+", ) @pytest.mark.snapshot(token="tests.contrib.openai.test_openai.test_chat_completion_stream") -async def test_chat_completion_async_stream_context_manager(openai, openai_vcr, mock_metrics, snapshot_tracer): +async def test_chat_completion_async_stream_context_manager(openai, openai_vcr, snapshot_tracer): with openai_vcr.use_cassette("chat_completion_streamed_tokens.yaml"): with mock.patch("ddtrace.contrib.internal.openai.utils.encoding_for_model", create=True) as mock_encoding: mock_encoding.return_value.encode.side_effect = lambda x: [1, 2, 3, 4, 5, 6, 7, 8] @@ -1045,14 +826,7 @@ def test_integration_sync(openai_api_key, ddtrace_run_python_code_in_subprocess) pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] if "PYTHONPATH" in env: pypath.append(env["PYTHONPATH"]) - env.update( - { - "OPENAI_API_KEY": openai_api_key, - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_OPENAI_METRICS_ENABLED": "false", - } - ) + env.update({"OPENAI_API_KEY": openai_api_key, "PYTHONPATH": ":".join(pypath)}) out, err, status, pid = ddtrace_run_python_code_in_subprocess( """ import openai @@ -1092,14 +866,7 @@ def test_integration_async(openai_api_key, ddtrace_run_python_code_in_subprocess pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] if "PYTHONPATH" in env: pypath.append(env["PYTHONPATH"]) - env.update( - { - "OPENAI_API_KEY": openai_api_key, - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_OPENAI_METRICS_ENABLED": "false", - } - ) + env.update({"OPENAI_API_KEY": openai_api_key, "PYTHONPATH": ":".join(pypath)}) out, err, status, pid = ddtrace_run_python_code_in_subprocess( """ import asyncio @@ -1247,36 +1014,13 @@ def test_completion_truncation(openai, openai_vcr, mock_tracer, ddtrace_config_o @pytest.mark.parametrize("ddtrace_config_openai", [dict(span_prompt_completion_sample_rate=0)]) -def test_embedding_unsampled_prompt_completion(openai, openai_vcr, ddtrace_config_openai, mock_logs, mock_tracer): +def test_embedding_unsampled_prompt_completion(openai, openai_vcr, ddtrace_config_openai, mock_tracer): with openai_vcr.use_cassette("embedding.yaml"): client = openai.OpenAI() client.embeddings.create(input="hello world", model="text-embedding-ada-002") - logs = mock_logs.enqueue.call_count traces = mock_tracer.pop_traces() assert len(traces) == 1 assert traces[0][0].get_tag("openai.request.input") is None - assert logs == 0 - - -@pytest.mark.parametrize( - "ddtrace_config_openai", - [dict(logs_enabled=True, log_prompt_completion_sample_rate=r) for r in [0, 0.25, 0.75, 1]], -) -def test_logs_sample_rate(openai, openai_vcr, ddtrace_config_openai, mock_logs, mock_tracer): - total_calls = 200 - for _ in range(total_calls): - with openai_vcr.use_cassette("completion.yaml"): - client = openai.OpenAI() - client.completions.create(model="ada", prompt="Hello world", temperature=0.8, n=2, stop=".", max_tokens=10) - - logs = mock_logs.enqueue.call_count - if ddtrace.config.openai["log_prompt_completion_sample_rate"] == 0: - assert logs == 0 - elif ddtrace.config.openai["log_prompt_completion_sample_rate"] == 1: - assert logs == total_calls - else: - rate = ddtrace.config.openai["log_prompt_completion_sample_rate"] * total_calls - assert (rate - 30) < logs < (rate + 30) def test_est_tokens(): @@ -1489,14 +1233,7 @@ def test_integration_service_name(openai_api_key, ddtrace_run_python_code_in_sub pypath = [os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))] if "PYTHONPATH" in env: pypath.append(env["PYTHONPATH"]) - env.update( - { - "OPENAI_API_KEY": openai_api_key, - "PYTHONPATH": ":".join(pypath), - # Disable metrics because the test agent doesn't support metrics - "DD_OPENAI_METRICS_ENABLED": "false", - } - ) + env.update({"OPENAI_API_KEY": openai_api_key, "PYTHONPATH": ":".join(pypath)}) if schema_version: env["DD_TRACE_SPAN_ATTRIBUTE_SCHEMA"] = schema_version if service_name: diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_async.json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_async.json index 9cfd3a107cd..ab2f74aa60b 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_async.json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_async.json @@ -44,6 +44,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 24448 }, "duration": 17466000, diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-None].json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-None].json index 3361ea38b5c..d7faa3f22e2 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-None].json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-None].json @@ -39,6 +39,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 20806 }, "duration": 16421000, diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v0].json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v0].json index 9815b378221..3af343273f6 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v0].json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v0].json @@ -39,6 +39,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 20827 }, "duration": 17257000, diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v1].json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v1].json index 3c9e6612d78..7f51ec196a6 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v1].json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[None-v1].json @@ -39,6 +39,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 20839 }, "duration": 17259000, diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-None].json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-None].json index fb11e4200a0..35268ec5092 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-None].json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-None].json @@ -39,6 +39,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 20848 }, "duration": 17004000, diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v0].json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v0].json index 63341870faa..999dbb7529c 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v0].json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v0].json @@ -39,6 +39,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 20864 }, "duration": 17872000, diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v1].json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v1].json index 4ff254b053c..76d352a3f59 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v1].json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_service_name[mysvc-v1].json @@ -39,6 +39,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 20888 }, "duration": 16629000, diff --git a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_sync.json b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_sync.json index 9cfd3a107cd..ab2f74aa60b 100644 --- a/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_sync.json +++ b/tests/snapshots/tests.contrib.openai.test_openai_v1.test_integration_sync.json @@ -44,6 +44,9 @@ "openai.organization.ratelimit.requests.remaining": 2999, "openai.organization.ratelimit.tokens.limit": 250000, "openai.organization.ratelimit.tokens.remaining": 249979, + "openai.response.usage.completion_tokens": 12, + "openai.response.usage.prompt_tokens": 2, + "openai.response.usage.total_tokens": 14, "process_id": 24448 }, "duration": 17466000, From 3081919b446d42bc1e17eec3e741d988be7c4e82 Mon Sep 17 00:00:00 2001 From: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Date: Tue, 4 Feb 2025 18:25:49 -0500 Subject: [PATCH 51/63] chore(langchain): drop legacy integration metrics and logs (#12220) This PR removes integration metrics and logs from the langchain integration. Prompt-completion logs were always experimental, rarely used, and unofficially deprecated since the release of LLM Observability. For any customers looking to continue getting visibility into their langchain call prompt/completions, we are now pushing to migrate over to use LLM Observability instead. Operational Integration metrics can either be replaced with LLM Observability or APM trace metrics instead. The only caveat of using LLM Observability is for customers who may not want prompt/completion logging, and the only caveat of using APM trace metrics is that token metrics will not be included, primarily only operation metrics. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/contrib/_langchain.py | 105 +------------ ddtrace/contrib/internal/langchain/patch.py | 142 ------------------ ddtrace/llmobs/_integrations/langchain.py | 50 ------ ...in-drop-logs-metrics-a997e8059886b20a.yaml | 8 + 4 files changed, 10 insertions(+), 295 deletions(-) create mode 100644 releasenotes/notes/langchain-drop-logs-metrics-a997e8059886b20a.yaml diff --git a/ddtrace/contrib/_langchain.py b/ddtrace/contrib/_langchain.py index d36cd76f3f1..4d419cc5d5c 100644 --- a/ddtrace/contrib/_langchain.py +++ b/ddtrace/contrib/_langchain.py @@ -1,9 +1,8 @@ """ -The LangChain integration instruments the LangChain Python library to emit metrics, -traces, and logs (logs are disabled by default) for requests made to the LLMs, +The LangChain integration instruments the LangChain Python library to emit traces for requests made to the LLMs, chat models, embeddings, chains, and vector store interfaces. -All metrics, logs, and traces submitted from the LangChain integration are tagged by: +All traces submitted from the LangChain integration are tagged by: - ``service``, ``env``, ``version``: see the `Unified Service Tagging docs `_. - ``langchain.request.provider``: LLM provider used in the request. @@ -26,58 +25,6 @@ - Total cost metrics for OpenAI requests -Metrics -~~~~~~~ - -The following metrics are collected by default by the LangChain integration. - -.. important:: - If the Agent is configured to use a non-default Statsd hostname or port, use ``DD_DOGSTATSD_URL`` to configure - ``ddtrace`` to use it. - - -.. py:data:: langchain.request.duration - - The duration of the LangChain request in seconds. - - Type: ``distribution`` - - -.. py:data:: langchain.request.error - - The number of errors from requests made with LangChain. - - Type: ``count`` - - -.. py:data:: langchain.tokens.prompt - - The number of tokens used in the prompt of a LangChain request. - - Type: ``distribution`` - - -.. py:data:: langchain.tokens.completion - - The number of tokens used in the completion of a LangChain response. - - Type: ``distribution`` - - -.. py:data:: langchain.tokens.total - - The total number of tokens used in the prompt and completion of a LangChain request/response. - - Type: ``distribution`` - - -.. py:data:: langchain.tokens.total_cost - - The estimated cost in USD based on token usage. - - Type: ``count`` - - (beta) Prompt and Completion Sampling ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -89,18 +36,6 @@ - Prompt inputs, chain inputs, and outputs for the ``Chain`` interface. - Query inputs and document outputs for the ``VectorStore`` interface. -Prompt and message inputs and completions can also be emitted as log data. -Logs are **not** emitted by default. When logs are enabled they are sampled at ``0.1``. - -Read the **Global Configuration** section for information about enabling logs and configuring sampling -rates. - -.. important:: - - To submit logs, you must set the ``DD_API_KEY`` environment variable. - - Set ``DD_SITE`` to send logs to a Datadog site such as ``datadoghq.eu``. The default is ``datadoghq.com``. - Enabling ~~~~~~~~ @@ -143,32 +78,6 @@ Default: ``DD_SERVICE`` -.. py:data:: ddtrace.config.langchain["logs_enabled"] - - Enable collection of prompts and completions as logs. You can adjust the rate of prompts and completions collected - using the sample rate configuration described below. - - Alternatively, you can set this option with the ``DD_LANGCHAIN_LOGS_ENABLED`` environment - variable. - - Note that you must set the ``DD_API_KEY`` environment variable to enable sending logs. - - Default: ``False`` - - -.. py:data:: ddtrace.config.langchain["metrics_enabled"] - - Enable collection of LangChain metrics. - - If the Datadog Agent is configured to use a non-default Statsd hostname - or port, use ``DD_DOGSTATSD_URL`` to configure ``ddtrace`` to use it. - - Alternatively, you can set this option with the ``DD_LANGCHAIN_METRICS_ENABLED`` environment - variable. - - Default: ``True`` - - .. py:data:: (beta) ddtrace.config.langchain["span_char_limit"] Configure the maximum number of characters for the following data within span tags: @@ -195,14 +104,4 @@ Default: ``1.0`` - -.. py:data:: (beta) ddtrace.config.langchain["log_prompt_completion_sample_rate"] - - Configure the sample rate for the collection of prompts and completions as logs. - - Alternatively, you can set this option with the ``DD_LANGCHAIN_LOG_PROMPT_COMPLETION_SAMPLE_RATE`` environment - variable. - - Default: ``0.1`` - """ # noqa: E501 diff --git a/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py index 9badbf22d87..f9681dd1302 100644 --- a/ddtrace/contrib/internal/langchain/patch.py +++ b/ddtrace/contrib/internal/langchain/patch.py @@ -56,7 +56,6 @@ from ddtrace.internal.logger import get_logger from ddtrace.internal.utils import ArgumentError from ddtrace.internal.utils import get_argument_value -from ddtrace.internal.utils.formats import asbool from ddtrace.internal.utils.formats import deep_getattr from ddtrace.internal.utils.version import parse_version from ddtrace.llmobs._integrations import LangChainIntegration @@ -76,10 +75,7 @@ def get_version(): config._add( "langchain", { - "logs_enabled": asbool(os.getenv("DD_LANGCHAIN_LOGS_ENABLED", False)), - "metrics_enabled": asbool(os.getenv("DD_LANGCHAIN_METRICS_ENABLED", True)), "span_prompt_completion_sample_rate": float(os.getenv("DD_LANGCHAIN_SPAN_PROMPT_COMPLETION_SAMPLE_RATE", 1.0)), - "log_prompt_completion_sample_rate": float(os.getenv("DD_LANGCHAIN_LOG_PROMPT_COMPLETION_SAMPLE_RATE", 0.1)), "span_char_limit": int(os.getenv("DD_LANGCHAIN_SPAN_CHAR_LIMIT", 128)), }, ) @@ -221,7 +217,6 @@ def traced_llm_generate(langchain, pin, func, instance, args, kwargs): completions = func(*args, **kwargs) if _is_openai_llm_instance(instance): _tag_openai_token_usage(span, completions.llm_output) - integration.record_usage(span, completions.llm_output) for idx, completion in enumerate(completions.generations): if integration.is_pc_sampled_span(span): @@ -237,28 +232,10 @@ def traced_llm_generate(langchain, pin, func, instance, args, kwargs): ) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=args, kwargs=kwargs, response=completions, operation="llm") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - if completions is None: - log_completions = [] - else: - log_completions = [ - [{"text": completion.text} for completion in completions] for completions in completions.generations - ] - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={ - "prompts": prompts, - "choices": log_completions, - }, - ) return completions @@ -292,7 +269,6 @@ async def traced_llm_agenerate(langchain, pin, func, instance, args, kwargs): completions = await func(*args, **kwargs) if _is_openai_llm_instance(instance): _tag_openai_token_usage(span, completions.llm_output) - integration.record_usage(span, completions.llm_output) for idx, completion in enumerate(completions.generations): if integration.is_pc_sampled_span(span): @@ -308,28 +284,10 @@ async def traced_llm_agenerate(langchain, pin, func, instance, args, kwargs): ) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=args, kwargs=kwargs, response=completions, operation="llm") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - if completions is None: - log_completions = [] - else: - log_completions = [ - [{"text": completion.text} for completion in completions] for completions in completions.generations - ] - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={ - "prompts": prompts, - "choices": log_completions, - }, - ) return completions @@ -376,7 +334,6 @@ def traced_chat_model_generate(langchain, pin, func, instance, args, kwargs): chat_completions = func(*args, **kwargs) if _is_openai_chat_instance(instance): _tag_openai_token_usage(span, chat_completions.llm_output) - integration.record_usage(span, chat_completions.llm_output) for message_set_idx, message_set in enumerate(chat_completions.generations): for idx, chat_completion in enumerate(message_set): @@ -417,45 +374,10 @@ def traced_chat_model_generate(langchain, pin, func, instance, args, kwargs): ) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=args, kwargs=kwargs, response=chat_completions, operation="chat") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - if chat_completions is None: - log_chat_completions = [] - else: - log_chat_completions = [ - [ - {"content": message.text, "message_type": message.message.__class__.__name__} - for message in messages - ] - for messages in chat_completions.generations - ] - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={ - "messages": [ - [ - { - "content": ( - message.get("content", "") - if isinstance(message, dict) - else str(getattr(message, "content", "")) - ), - "message_type": message.__class__.__name__, - } - for message in messages - ] - for messages in chat_messages - ], - "choices": log_chat_completions, - }, - ) return chat_completions @@ -502,7 +424,6 @@ async def traced_chat_model_agenerate(langchain, pin, func, instance, args, kwar chat_completions = await func(*args, **kwargs) if _is_openai_chat_instance(instance): _tag_openai_token_usage(span, chat_completions.llm_output) - integration.record_usage(span, chat_completions.llm_output) for message_set_idx, message_set in enumerate(chat_completions.generations): for idx, chat_completion in enumerate(message_set): @@ -542,45 +463,10 @@ async def traced_chat_model_agenerate(langchain, pin, func, instance, args, kwar ) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=args, kwargs=kwargs, response=chat_completions, operation="chat") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - if chat_completions is None: - log_chat_completions = [] - else: - log_chat_completions = [ - [ - {"content": message.text, "message_type": message.message.__class__.__name__} - for message in messages - ] - for messages in chat_completions.generations - ] - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={ - "messages": [ - [ - { - "content": ( - message.get("content", "") - if isinstance(message, dict) - else str(getattr(message, "content", "")) - ), - "message_type": message.__class__.__name__, - } - for message in messages - ] - for messages in chat_messages - ], - "choices": log_chat_completions, - }, - ) return chat_completions @@ -627,19 +513,10 @@ def traced_embedding(langchain, pin, func, instance, args, kwargs): span.set_metric("langchain.response.outputs.embedding_length", len(embeddings)) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=args, kwargs=kwargs, response=embeddings, operation="embedding") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={"inputs": [input_texts] if isinstance(input_texts, str) else input_texts}, - ) return embeddings @@ -689,12 +566,10 @@ def traced_lcel_runnable_sequence(langchain, pin, func, instance, args, kwargs): span.set_tag_str("langchain.response.outputs.%d" % idx, integration.trunc(str(output))) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=[], kwargs=inputs, response=final_output, operation="chain") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) return final_output @@ -735,12 +610,10 @@ async def traced_lcel_runnable_sequence_async(langchain, pin, func, instance, ar span.set_tag_str("langchain.response.outputs.%d" % idx, integration.trunc(str(output))) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=[], kwargs=inputs, response=final_output, operation="chain") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) return final_output @@ -793,25 +666,10 @@ def traced_similarity_search(langchain, pin, func, instance, args, kwargs): ) except Exception: span.set_exc_info(*sys.exc_info()) - integration.metric(span, "incr", "request.error", 1) raise finally: integration.llmobs_set_tags(span, args=args, kwargs=kwargs, response=documents, operation="retrieval") span.finish() - integration.metric(span, "dist", "request.duration", span.duration_ns) - if integration.is_pc_sampled_log(span): - integration.log( - span, - "info" if span.error == 0 else "error", - "sampled %s.%s" % (instance.__module__, instance.__class__.__name__), - attrs={ - "query": query, - "k": k or "", - "documents": [ - {"page_content": document.page_content, "metadata": document.metadata} for document in documents - ], - }, - ) return documents diff --git a/ddtrace/llmobs/_integrations/langchain.py b/ddtrace/llmobs/_integrations/langchain.py index c6a77fad3bc..d380c6ab7a8 100644 --- a/ddtrace/llmobs/_integrations/langchain.py +++ b/ddtrace/llmobs/_integrations/langchain.py @@ -6,8 +6,6 @@ from typing import Optional from typing import Union -from ddtrace import config -from ddtrace.constants import ERROR_TYPE from ddtrace.internal.logger import get_logger from ddtrace.internal.utils import ArgumentError from ddtrace.internal.utils import get_argument_value @@ -454,54 +452,6 @@ def _set_base_span_tags( # type: ignore[override] else: span.set_tag_str(API_KEY, api_key) - @classmethod - def _logs_tags(cls, span: Span) -> str: - api_key = span.get_tag(API_KEY) or "" - tags = "env:%s,version:%s,%s:%s,%s:%s,%s:%s,%s:%s" % ( # noqa: E501 - (config.env or ""), - (config.version or ""), - PROVIDER, - (span.get_tag(PROVIDER) or ""), - MODEL, - (span.get_tag(MODEL) or ""), - TYPE, - (span.get_tag(TYPE) or ""), - API_KEY, - api_key, - ) - return tags - - @classmethod - def _metrics_tags(cls, span: Span) -> List[str]: - provider = span.get_tag(PROVIDER) or "" - api_key = span.get_tag(API_KEY) or "" - tags = [ - "version:%s" % (config.version or ""), - "env:%s" % (config.env or ""), - "service:%s" % (span.service or ""), - "%s:%s" % (PROVIDER, provider), - "%s:%s" % (MODEL, span.get_tag(MODEL) or ""), - "%s:%s" % (TYPE, span.get_tag(TYPE) or ""), - "%s:%s" % (API_KEY, api_key), - "error:%d" % span.error, - ] - err_type = span.get_tag(ERROR_TYPE) - if err_type: - tags.append("%s:%s" % (ERROR_TYPE, err_type)) - return tags - - def record_usage(self, span: Span, usage: Dict[str, Any]) -> None: - if not usage or self.metrics_enabled is False: - return - for token_type in ("prompt", "completion", "total"): - num_tokens = usage.get("token_usage", {}).get(token_type + "_tokens") - if not num_tokens: - continue - self.metric(span, "dist", "tokens.%s" % token_type, num_tokens) - total_cost = span.get_metric(TOTAL_COST) - if total_cost: - self.metric(span, "incr", "tokens.total_cost", total_cost) - def check_token_usage_chat_or_llm_result(self, result): """Checks for token usage on the top-level ChatResult or LLMResult object""" llm_output = getattr(result, "llm_output", {}) diff --git a/releasenotes/notes/langchain-drop-logs-metrics-a997e8059886b20a.yaml b/releasenotes/notes/langchain-drop-logs-metrics-a997e8059886b20a.yaml new file mode 100644 index 00000000000..e7099dd1a77 --- /dev/null +++ b/releasenotes/notes/langchain-drop-logs-metrics-a997e8059886b20a.yaml @@ -0,0 +1,8 @@ +--- +upgrade: + - | + langchain: Removes prompt-completion log sampling from the LangChain integration. To continue logging prompt completions, + enable LLM Observability. + - | + langchain: Removes integration metrics from the LangChain integration. To continue tracking operational metrics from the + OpenAI integration, enable LLM Observability or use trace metrics instead. From a2b1d7baab286a972c07aaff5f47e799384f4184 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Tue, 4 Feb 2025 20:17:28 -0500 Subject: [PATCH 52/63] chore(configurations): remove deprecated tracing env vars (#12176) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/settings/_config.py | 71 ++---------- ddtrace/settings/_otel_remapper.py | 12 +- ddtrace/settings/config.py | 11 -- ddtrace/settings/integration.py | 39 +------ docs/advanced_usage.rst | 24 +--- docs/configuration.rst | 1 + ...ated-tracing-configs-c6711b57037576f6.yaml | 10 ++ tests/appsec/iast/test_processor.py | 3 +- tests/integration/test_settings.py | 54 +++++---- tests/internal/test_settings.py | 106 ++++++------------ tests/opentelemetry/test_config.py | 40 +++++-- tests/suitespec.yml | 4 +- tests/telemetry/test_writer.py | 8 +- tests/tracer/test_encoders.py | 16 --- tests/tracer/test_sampler.py | 24 ---- 15 files changed, 137 insertions(+), 286 deletions(-) delete mode 100644 ddtrace/settings/config.py create mode 100644 releasenotes/notes/remove-deprecated-tracing-configs-c6711b57037576f6.yaml diff --git a/ddtrace/settings/_config.py b/ddtrace/settings/_config.py index 35d2849884d..0072986286e 100644 --- a/ddtrace/settings/_config.py +++ b/ddtrace/settings/_config.py @@ -16,8 +16,6 @@ from ddtrace.internal.serverless import in_gcp_function from ddtrace.internal.telemetry import telemetry_writer from ddtrace.internal.utils.cache import cachedmethod -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate from .._trace.pin import Pin from ..internal import gitmetadata @@ -264,9 +262,11 @@ def _parse_global_tags(s): def _default_config() -> Dict[str, _ConfigItem]: return { + # Remove the _trace_sample_rate property, _trace_sampling_rules should be the source of truth "_trace_sample_rate": _ConfigItem( default=1.0, - envs=[("DD_TRACE_SAMPLE_RATE", float)], + # trace_sample_rate is placeholder, this code will be removed up after v3.0 + envs=[("trace_sample_rate", float)], ), "_trace_sampling_rules": _ConfigItem( default=lambda: "", @@ -352,14 +352,6 @@ def __init__(self): self._from_endpoint = ENDPOINT_FETCHED_CONFIG self._config = _default_config() - sample_rate = os.getenv("DD_TRACE_SAMPLE_RATE") - if sample_rate is not None: - deprecate( - "DD_TRACE_SAMPLE_RATE is deprecated", - message="Please use DD_TRACE_SAMPLING_RULES instead.", - removal_version="3.0.0", - ) - # Use a dict as underlying storing mechanism for integration configs self._integration_configs = {} @@ -368,9 +360,6 @@ def __init__(self): rate_limit = os.getenv("DD_TRACE_RATE_LIMIT") if rate_limit is not None and self._trace_sampling_rules in ("", "[]"): - # This warning will be logged when DD_TRACE_SAMPLE_RATE is set. This is intentional. - # Even though DD_TRACE_SAMPLE_RATE is treated as a global trace sampling rule, this configuration - # is deprecated. We should always encourage users to set DD_TRACE_SAMPLING_RULES instead. log.warning( "DD_TRACE_RATE_LIMIT is set to %s and DD_TRACE_SAMPLING_RULES is not set. " "Tracer rate limiting is only applied to spans that match tracer sampling rules. " @@ -388,13 +377,9 @@ def __init__(self): ) self._trace_api = _get_config("DD_TRACE_API_VERSION") if self._trace_api == "v0.3": - deprecate( - "DD_TRACE_API_VERSION=v0.3 is deprecated", - message="Traces will be submitted to the v0.4/traces agent endpoint instead.", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, + log.error( + "Setting DD_TRACE_API_VERSION to ``v0.3`` is not supported. The default ``v0.5`` format will be used.", ) - self._trace_api = "v0.4" self._trace_writer_buffer_size = _get_config("DD_TRACE_WRITER_BUFFER_SIZE_BYTES", DEFAULT_BUFFER_SIZE, int) self._trace_writer_payload_size = _get_config( "DD_TRACE_WRITER_MAX_PAYLOAD_SIZE_BYTES", DEFAULT_MAX_PAYLOAD_SIZE, int @@ -418,18 +403,8 @@ def __init__(self): self._span_traceback_max_size = _get_config("DD_TRACE_SPAN_TRACEBACK_MAX_SIZE", 30, int) - # Master switch for turning on and off trace search by default - # this weird invocation of getenv is meant to read the DD_ANALYTICS_ENABLED - # legacy environment variable. It should be removed in the future - self._analytics_enabled = _get_config(["DD_TRACE_ANALYTICS_ENABLED", "DD_ANALYTICS_ENABLED"], False, asbool) - if self._analytics_enabled: - deprecate( - "Datadog App Analytics is deprecated and will be removed in a future version. " - "App Analytics can be enabled via DD_TRACE_ANALYTICS_ENABLED and DD_ANALYTICS_ENABLED " - "environment variables and ddtrace.config.analytics_enabled configuration. " - "These configurations will also be removed.", - category=DDTraceDeprecationWarning, - ) + # DD_ANALYTICS_ENABLED is not longer supported, remove this functionatiy from all integrations in the future + self._analytics_enabled = False self._client_ip_header = _get_config("DD_TRACE_CLIENT_IP_HEADER") self._retrieve_client_ip = _get_config("DD_TRACE_CLIENT_IP_ENABLED", False, asbool) @@ -477,14 +452,6 @@ def __init__(self): self._128_bit_trace_id_enabled = _get_config("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", True, asbool) self._128_bit_trace_id_logging_enabled = _get_config("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", False, asbool) - if self._128_bit_trace_id_logging_enabled: - deprecate( - "Using DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED is deprecated.", - message="Log injection format is now configured automatically.", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - self._sampling_rules = _get_config("DD_SPAN_SAMPLING_RULES") self._sampling_rules_file = _get_config("DD_SPAN_SAMPLING_RULES_FILE") @@ -536,18 +503,7 @@ def __init__(self): ["DD_TRACE_COMPUTE_STATS", "DD_TRACE_STATS_COMPUTATION_ENABLED"], trace_compute_stats_default, asbool ) self._data_streams_enabled = _get_config("DD_DATA_STREAMS_ENABLED", False, asbool) - - legacy_client_tag_enabled = _get_config("DD_HTTP_CLIENT_TAG_QUERY_STRING") - if legacy_client_tag_enabled is None: - self._http_client_tag_query_string = _get_config("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING", "true") - else: - deprecate( - "DD_HTTP_CLIENT_TAG_QUERY_STRING is deprecated", - message="Please use DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING instead.", - removal_version="3.0.0", - category=DDTraceDeprecationWarning, - ) - self._http_client_tag_query_string = legacy_client_tag_enabled.lower() + self._http_client_tag_query_string = _get_config("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING", "true") dd_trace_obfuscation_query_string_regexp = _get_config( "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP", DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP_DEFAULT @@ -577,15 +533,8 @@ def __init__(self): # https://github.com/open-telemetry/opentelemetry-python/blob/v1.16.0/opentelemetry-api/src/opentelemetry/context/__init__.py#L53 os.environ["OTEL_PYTHON_CONTEXT"] = "ddcontextvars_context" self._subscriptions = [] # type: List[Tuple[List[str], Callable[[Config, List[str]], None]]] - self._span_aggregator_rlock = _get_config("DD_TRACE_SPAN_AGGREGATOR_RLOCK", True, asbool) - if self._span_aggregator_rlock is False: - deprecate( - "DD_TRACE_SPAN_AGGREGATOR_RLOCK is deprecated", - message="Soon the ddtrace library will only support using threading.Rlock to " - "aggregate and encode span data. If you need to disable the re-entrant lock and " - "revert to using threading.Lock, please contact Datadog support.", - removal_version="3.0.0", - ) + # Disabled Span Aggregator Rlock is not supported. Remove this configuration in the future + self._span_aggregator_rlock = True self._trace_methods = _get_config("DD_TRACE_METHODS") diff --git a/ddtrace/settings/_otel_remapper.py b/ddtrace/settings/_otel_remapper.py index ec238e8a3cb..e495f783cd3 100644 --- a/ddtrace/settings/_otel_remapper.py +++ b/ddtrace/settings/_otel_remapper.py @@ -52,12 +52,16 @@ def _remap_traces_sampler(otel_value: str) -> Optional[str]: otel_value, ) otel_value = f"parentbased_{otel_value}" + rate = None if otel_value == "parentbased_always_on": - return "1.0" + rate = "1.0" elif otel_value == "parentbased_always_off": - return "0.0" + rate = "0.0" elif otel_value == "parentbased_traceidratio": - return os.environ.get("OTEL_TRACES_SAMPLER_ARG", "1") + rate = os.environ.get("OTEL_TRACES_SAMPLER_ARG", "1") + + if rate is not None: + return f'[{{"sample_rate":{rate}}}]' return None @@ -130,7 +134,7 @@ def _remap_default(otel_value: str) -> Optional[str]: "OTEL_SERVICE_NAME": ("DD_SERVICE", _remap_default), "OTEL_LOG_LEVEL": ("DD_TRACE_DEBUG", _remap_otel_log_level), "OTEL_PROPAGATORS": ("DD_TRACE_PROPAGATION_STYLE", _remap_otel_propagators), - "OTEL_TRACES_SAMPLER": ("DD_TRACE_SAMPLE_RATE", _remap_traces_sampler), + "OTEL_TRACES_SAMPLER": ("DD_TRACE_SAMPLING_RULES", _remap_traces_sampler), "OTEL_TRACES_EXPORTER": ("DD_TRACE_ENABLED", _remap_traces_exporter), "OTEL_METRICS_EXPORTER": ("DD_RUNTIME_METRICS_ENABLED", _remap_metrics_exporter), "OTEL_LOGS_EXPORTER": ("", _validate_logs_exporter), # Does not set a DDTRACE environment variable. diff --git a/ddtrace/settings/config.py b/ddtrace/settings/config.py deleted file mode 100644 index 00c0ee9917c..00000000000 --- a/ddtrace/settings/config.py +++ /dev/null @@ -1,11 +0,0 @@ -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.settings._config import * # noqa: F403 -from ddtrace.vendor.debtcollector import deprecate - - -deprecate( - "The ddtrace.settings.config module is deprecated", - message="Access the global configuration using ``ddtrace.config``.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", -) diff --git a/ddtrace/settings/integration.py b/ddtrace/settings/integration.py index 354e99f7625..eef7f5c81c6 100644 --- a/ddtrace/settings/integration.py +++ b/ddtrace/settings/integration.py @@ -1,13 +1,8 @@ import os from typing import Optional # noqa:F401 -from typing import Tuple # noqa:F401 - -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning -from ddtrace.vendor.debtcollector import deprecate from .._hooks import Hooks from ..internal.utils.attrdict import AttrDict -from ..internal.utils.formats import asbool from .http import HttpConfig @@ -43,9 +38,10 @@ def __init__(self, global_config, name, *args, **kwargs): object.__setattr__(self, "hooks", Hooks()) object.__setattr__(self, "http", HttpConfig()) - analytics_enabled, analytics_sample_rate = self._get_analytics_settings() - self.setdefault("analytics_enabled", analytics_enabled) - self.setdefault("analytics_sample_rate", float(analytics_sample_rate)) + # Trace Analytics was removed in v3.0.0 + # TODO(munir): Remove all references to analytics_enabled and analytics_sample_rate + self.setdefault("analytics_enabled", False) + self.setdefault("analytics_sample_rate", 1.0) service = os.getenv( "DD_%s_SERVICE" % name.upper(), default=os.getenv( @@ -65,33 +61,6 @@ def __init__(self, global_config, name, *args, **kwargs): self.get_http_tag_query_string(getattr(self, "default_http_tag_query_string", None)), ) - def _get_analytics_settings(self): - # type: () -> Tuple[Optional[bool], float] - # Set default analytics configuration, default is disabled - # DEV: Default to `None` which means do not set this key - # Inject environment variables for integration - env = "DD_TRACE_%s_ANALYTICS_ENABLED" % self.integration_name.upper() - legacy_env = "DD_%s_ANALYTICS_ENABLED" % self.integration_name.upper() - analytics_enabled = asbool(os.getenv(env, os.getenv(legacy_env, default=None))) - - if analytics_enabled: - deprecate( - "Datadog App Analytics is deprecated. " - f"App Analytics can be enabled via {env} and {legacy_env} " - f"environment variables and the ddtrace.config.{self.integration_name}.analytics_enabled configuration." - " This feature and its associated configurations will be removed in a future release.", - category=DDTraceDeprecationWarning, - ) - - analytics_sample_rate = float( - os.getenv( - "DD_TRACE_%s_ANALYTICS_SAMPLE_RATE" % self.integration_name.upper(), - os.getenv("DD_%s_ANALYTICS_SAMPLE_RATE" % self.integration_name.upper(), default=1.0), - ) - ) - - return analytics_enabled, analytics_sample_rate - def get_http_tag_query_string(self, value): if self.global_config._http_tag_query_string: dd_http_server_tag_query_string = value if value else os.getenv("DD_HTTP_SERVER_TAG_QUERY_STRING", "true") diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst index 5fe21321680..e6ead60c1f5 100644 --- a/docs/advanced_usage.rst +++ b/docs/advanced_usage.rst @@ -1,28 +1,6 @@ Advanced Usage ============== -.. _agentconfiguration: - -Agent Configuration -------------------- - -If the Datadog Agent is on a separate host from your application, you can modify -the default ``ddtrace.tracer`` object to utilize another hostname and port. Here -is a small example showcasing this:: - - from ddtrace.trace import tracer - - tracer.configure(hostname=, port=, https=) - -By default, these will be set to ``localhost``, ``8126``, and ``False`` respectively. - -You can also use a Unix Domain Socket to connect to the agent:: - - from ddtrace.trace import tracer - - tracer.configure(uds_path="/path/to/socket") - - .. _context: @@ -223,7 +201,7 @@ provider can be used. It must implement the :class:`ddtrace.trace.BaseContextProvider` interface and can be configured with:: - tracer.configure(context_provider=MyContextProvider) + tracer.configure(context_provider=MyContextProvider()) .. _disttracing: diff --git a/docs/configuration.rst b/docs/configuration.rst index f45ac992582..6f5c87a945e 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -817,6 +817,7 @@ Sampling version_added: v0.33.0: v2.15.0: Only applied when DD_TRACE_SAMPLE_RATE, DD_TRACE_SAMPLING_RULES, or DD_SPAN_SAMPLING_RULE are set. + v3.0.0: Only applied when DD_TRACE_SAMPLING_RULES or DD_SPAN_SAMPLING_RULE are set. DD_TRACE_SAMPLING_RULES: type: JSON array diff --git a/releasenotes/notes/remove-deprecated-tracing-configs-c6711b57037576f6.yaml b/releasenotes/notes/remove-deprecated-tracing-configs-c6711b57037576f6.yaml new file mode 100644 index 00000000000..b47613d504e --- /dev/null +++ b/releasenotes/notes/remove-deprecated-tracing-configs-c6711b57037576f6.yaml @@ -0,0 +1,10 @@ +--- +upgrade: + - | + configurations: Drops support for deprecated tracing configurations. The following configurations are no longer supported: + - DD_TRACE_SAMPLE_RATE, use DD_TRACE_SAMPLING_RULES instead. + - DD_TRACE_API_VERSION=v0.3, the default ``v0.5`` version is used instead. + - DD_ANALYTICS_ENABLED, Datadog Analytics is no longer supported. + - DD_TRACE_ANALYTICS_ENABLED, Datadog Analytics is no longer supported. + - DD_HTTP_CLIENT_TAG_QUERY_STRING, DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING should be used instead. + - DD_TRACE_SPAN_AGGREGATOR_RLOCK, disabling the span aggregator rlock is no longer supported. diff --git a/tests/appsec/iast/test_processor.py b/tests/appsec/iast/test_processor.py index 3bb5eaa5015..4f9b912ffc2 100644 --- a/tests/appsec/iast/test_processor.py +++ b/tests/appsec/iast/test_processor.py @@ -51,7 +51,7 @@ def test_appsec_iast_processor_ensure_span_is_manual_keep(iast_context_defaults, test_appsec_iast_processor_ensure_span_is_manual_keep. This test throws 'finished span not connected to a trace' log error """ - with override_env(dict(DD_TRACE_SAMPLE_RATE=sampling_rate)): + with override_env({"DD_TRACE_SAMPLING_RULES": '[{"sample_rate":%s]"}]' % (sampling_rate,)}): oce.reconfigure() tracer = DummyTracer(iast_enabled=True) @@ -59,7 +59,6 @@ def test_appsec_iast_processor_ensure_span_is_manual_keep(iast_context_defaults, tracer._on_span_finish(span) result = span.get_tag(IAST.JSON) - assert len(json.loads(result)["vulnerabilities"]) == 1 assert span.get_metric(_SAMPLING_PRIORITY_KEY) is USER_KEEP diff --git a/tests/integration/test_settings.py b/tests/integration/test_settings.py index 249b0211bb4..ba9bcd66f37 100644 --- a/tests/integration/test_settings.py +++ b/tests/integration/test_settings.py @@ -20,7 +20,7 @@ def test_setting_origin_environment(test_agent_session, run_python_code_in_subpr env = os.environ.copy() env.update( { - "DD_TRACE_SAMPLE_RATE": "0.1", + "DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.1}]', "DD_LOGS_INJECTION": "true", "DD_TRACE_HEADER_TAGS": "X-Header-Tag-1:header_tag_1,X-Header-Tag-2:header_tag_2", "DD_TAGS": "team:apm,component:web", @@ -39,11 +39,11 @@ def test_setting_origin_environment(test_agent_session, run_python_code_in_subpr assert status == 0, err events = test_agent_session.get_events(subprocess=True) - events_trace_sample_rate = _get_telemetry_config_items(events, "DD_TRACE_SAMPLE_RATE") + events_trace_sample_rate = _get_telemetry_config_items(events, "DD_TRACE_SAMPLING_RULES") assert { - "name": "DD_TRACE_SAMPLE_RATE", - "value": 0.1, + "name": "DD_TRACE_SAMPLING_RULES", + "value": '[{"sample_rate":0.1}]', "origin": "env_var", } in events_trace_sample_rate @@ -69,7 +69,6 @@ def test_setting_origin_code(test_agent_session, run_python_code_in_subprocess): env = os.environ.copy() env.update( { - "DD_TRACE_SAMPLE_RATE": "0.1", "DD_LOGS_INJECTION": "true", "DD_TRACE_HEADER_TAGS": "X-Header-Tag-1:header_tag_1,X-Header-Tag-2:header_tag_2", "DD_TAGS": "team:apm,component:web", @@ -81,7 +80,6 @@ def test_setting_origin_code(test_agent_session, run_python_code_in_subprocess): """ from ddtrace import config, tracer -config._trace_sample_rate = 0.2 config._logs_injection = False config._trace_http_header_tags = {"header": "value"} config.tags = {"header": "value"} @@ -96,12 +94,6 @@ def test_setting_origin_code(test_agent_session, run_python_code_in_subprocess): assert status == 0, err events = test_agent_session.get_events(subprocess=True) - events_trace_sample_rate = _get_telemetry_config_items(events, "DD_TRACE_SAMPLE_RATE") - assert { - "name": "DD_TRACE_SAMPLE_RATE", - "value": 0.2, - "origin": "code", - } in events_trace_sample_rate events_logs_injection_enabled = _get_telemetry_config_items(events, "DD_LOGS_INJECTION") assert { @@ -174,8 +166,8 @@ def test_remoteconfig_sampling_rate_default(test_agent_session, run_python_code_ assert status == 0, err events = test_agent_session.get_events(subprocess=True) - events_trace_sample_rate = _get_telemetry_config_items(events, "DD_TRACE_SAMPLE_RATE") - assert {"name": "DD_TRACE_SAMPLE_RATE", "value": 1.0, "origin": "default"} in events_trace_sample_rate + events_trace_sample_rate = _get_telemetry_config_items(events, "trace_sample_rate") + assert {"name": "trace_sample_rate", "value": 1.0, "origin": "default"} in events_trace_sample_rate @pytest.mark.skipif(AGENT_VERSION != "testagent", reason="Tests only compatible with a testagent") @@ -191,7 +183,22 @@ def test_remoteconfig_sampling_rate_telemetry(test_agent_session, run_python_cod from ddtrace import config, tracer from tests.internal.test_settings import _base_rc_config -config._handle_remoteconfig(_base_rc_config({"tracing_sampling_rate": 0.5})) +config._handle_remoteconfig( + _base_rc_config( + { + "tracing_sampling_rules": [ + { + "sample_rate": "0.5", + "service": "*", + "name": "*", + "resource": "*", + "tags": {}, + "provenance": "customer", + } + ] + } + ) +) with tracer.trace("test") as span: pass assert span.get_metric("_dd.rule_psr") == 0.5 @@ -201,8 +208,13 @@ def test_remoteconfig_sampling_rate_telemetry(test_agent_session, run_python_cod assert status == 0, err events = test_agent_session.get_events(subprocess=True) - events_trace_sample_rate = _get_telemetry_config_items(events, "DD_TRACE_SAMPLE_RATE") - assert {"name": "DD_TRACE_SAMPLE_RATE", "value": 0.5, "origin": "remote_config"} in events_trace_sample_rate + events_trace_sample_rate = _get_telemetry_config_items(events, "DD_TRACE_SAMPLING_RULES") + assert { + "name": "DD_TRACE_SAMPLING_RULES", + "origin": "remote_config", + "value": '[{"sample_rate": "0.5", "service": "*", "name": "*", "resource": "*", ' + '"tags": {}, "provenance": "customer"}]', + } in events_trace_sample_rate @pytest.mark.skipif(AGENT_VERSION != "testagent", reason="Tests only compatible with a testagent") @@ -226,9 +238,11 @@ def test_remoteconfig_header_tags_telemetry(test_agent_session, run_python_code_ {"header": "used-with-default", "tag_name":""}] })) with tracer.trace("test") as span: - trace_utils.set_http_meta(span, - config.falcon, # randomly chosen http integration config - request_headers={"used": "foobarbanana", "used-with-default": "defaultname"}) + trace_utils.set_http_meta( + span, + config.falcon, # randomly chosen http integration config + request_headers={"used": "foobarbanana", "used-with-default": "defaultname"}, + ) assert span.get_tag("header_tag_69") == "foobarbanana" assert span.get_tag("header_tag_70") is None assert span.get_tag("http.request.headers.used-with-default") == "defaultname" diff --git a/tests/internal/test_settings.py b/tests/internal/test_settings.py index 2ff1843690e..a26d692eea4 100644 --- a/tests/internal/test_settings.py +++ b/tests/internal/test_settings.py @@ -62,22 +62,36 @@ def _deleted_rc_config(): }, }, { - "env": {"DD_TRACE_SAMPLE_RATE": "0.9"}, - "expected": {"_trace_sample_rate": 0.9}, - "expected_source": {"_trace_sample_rate": "env_var"}, + "env": {"DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.91}]'}, + "expected": {"_trace_sampling_rules": '[{"sample_rate":0.91}]'}, + "expected_source": {"_trace_sampling_rules": "env_var"}, }, { - "env": {"DD_TRACE_SAMPLE_RATE": "0.9"}, - "code": {"_trace_sample_rate": 0.8}, - "expected": {"_trace_sample_rate": 0.8}, - "expected_source": {"_trace_sample_rate": "code"}, + "env": {"DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.92}]'}, + "code": {"_trace_sampling_rules": '[{"sample_rate":0.82}]'}, + "expected": {"_trace_sampling_rules": '[{"sample_rate":0.82}]'}, + "expected_source": {"_trace_sampling_rules": "code"}, }, { - "env": {"DD_TRACE_SAMPLE_RATE": "0.9"}, - "code": {"_trace_sample_rate": 0.8}, - "rc": {"tracing_sampling_rate": 0.7}, - "expected": {"_trace_sample_rate": 0.7}, - "expected_source": {"_trace_sample_rate": "remote_config"}, + "env": {"DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.93}]'}, + "code": {"_trace_sampling_rules": '[{"sample_rate":0.83}]'}, + "rc": { + "tracing_sampling_rules": [ + { + "sample_rate": "0.73", + "service": "*", + "name": "*", + "resource": "*", + "tags": [], + "provenance": "customer", + } + ] + }, + "expected": { + "_trace_sampling_rules": '[{"sample_rate": "0.73", "service": "*", "name": "*", ' + '"resource": "*", "tags": [], "provenance": "customer"}]', + }, + "expected_source": {"_trace_sampling_rules": "remote_config"}, }, { "env": {"DD_LOGS_INJECTION": "true"}, @@ -227,60 +241,6 @@ def test_config_subscription(config): _handler.assert_called_once_with(config, [s]) -def test_remoteconfig_sampling_rate_user(run_python_code_in_subprocess): - env = os.environ.copy() - env.update({"DD_TRACE_SAMPLE_RATE": "0.1"}) - out, err, status, _ = run_python_code_in_subprocess( - """ -from ddtrace import config, tracer -from ddtrace._trace.sampler import DatadogSampler -from tests.internal.test_settings import _base_rc_config, _deleted_rc_config - -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.1 - -config._handle_remoteconfig(_base_rc_config({"tracing_sampling_rate": 0.2})) -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.2 - -config._handle_remoteconfig(_base_rc_config({})) -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.1 - -custom_sampler = DatadogSampler(default_sample_rate=0.3) -tracer._configure(sampler=custom_sampler) -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.3 - -config._handle_remoteconfig(_base_rc_config({"tracing_sampling_rate": 0.4})) -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.4 - -config._handle_remoteconfig(_base_rc_config({})) -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.3 - -config._handle_remoteconfig(_base_rc_config({"tracing_sampling_rate": 0.4})) -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.4 - -config._handle_remoteconfig(_deleted_rc_config()) -with tracer.trace("test") as span: - pass -assert span.get_metric("_dd.rule_psr") == 0.3 - """, - env=env, - ) - assert status == 0, err.decode("utf-8") - - def test_remoteconfig_sampling_rules(run_python_code_in_subprocess): env = os.environ.copy() env.update({"DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.1, "name":"test"}]'}) @@ -368,13 +328,12 @@ def test_remoteconfig_sampling_rules(run_python_code_in_subprocess): assert status == 0, err.decode("utf-8") -def test_remoteconfig_sample_rate_and_rules(run_python_code_in_subprocess): +def test_remoteconfig_global_sample_rate_and_rules(run_python_code_in_subprocess): """There is complex logic regarding the interaction between setting new sample rates and rules with remote config. """ env = os.environ.copy() - env.update({"DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.9, "name":"rules"}]'}) - env.update({"DD_TRACE_SAMPLE_RATE": "0.8"}) + env.update({"DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.9, "name":"rules"}, {"sample_rate":0.8}]'}) out, err, status, _ = run_python_code_in_subprocess( """ @@ -410,8 +369,9 @@ def test_remoteconfig_sample_rate_and_rules(run_python_code_in_subprocess): with tracer.trace("sample_rate") as span: pass -assert span.get_metric("_dd.rule_psr") == 0.8 -assert span.get_tag("_dd.p.dm") == "-3" +# Global sampling rule was overwritten +assert span.get_metric("_dd.rule_psr") is None +assert span.get_tag("_dd.p.dm") == "-0" config._handle_remoteconfig(_base_rc_config({"tracing_sampling_rate": 0.2})) @@ -482,8 +442,8 @@ def test_remoteconfig_sample_rate_and_rules(run_python_code_in_subprocess): with tracer.trace("sample_rate") as span: pass -assert span.get_metric("_dd.rule_psr") == 0.8 -assert span.get_tag("_dd.p.dm") == "-3" +assert span.get_metric("_dd.rule_psr") is None +assert span.get_tag("_dd.p.dm") == "-0" """, env=env, diff --git a/tests/opentelemetry/test_config.py b/tests/opentelemetry/test_config.py index 39a43128e9e..d5e9bf570fd 100644 --- a/tests/opentelemetry/test_config.py +++ b/tests/opentelemetry/test_config.py @@ -1,6 +1,24 @@ import pytest +def _global_sampling_rule(): + from ddtrace._trace.sampling_rule import SamplingRule + from ddtrace.trace import tracer + + assert hasattr(tracer._sampler, "rules") + + for rule in tracer._sampler.rules: + if ( + rule.service == SamplingRule.NO_RULE + and rule.name == SamplingRule.NO_RULE + and rule.resource == SamplingRule.NO_RULE + and rule.tags == SamplingRule.NO_RULE + and rule.provenance == "default" + ): + return rule + assert False, "Rule not found" + + @pytest.mark.subprocess( env={ "OTEL_SERVICE_NAME": "Test", @@ -10,7 +28,7 @@ "OTEL_PROPAGATORS": "jaegar, tracecontext, b3", "DD_TRACE_PROPAGATION_STYLE": "b3", "OTEL_TRACES_SAMPLER": "always_off", - "DD_TRACE_SAMPLE_RATE": "1.0", + "DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.1}]', "OTEL_TRACES_EXPORTER": "True", "DD_TRACE_ENABLED": "True", "OTEL_METRICS_EXPORTER": "none", @@ -26,11 +44,12 @@ ) def test_dd_otel_mixed_env_configuration(): from ddtrace import config + from tests.opentelemetry.test_config import _global_sampling_rule assert config.service == "DD_service_test", config.service assert config._debug_mode is False, config._debug_mode assert config._propagation_style_extract == ["b3"], config._propagation_style_extract - assert config._trace_sample_rate == 1.0, config._trace_sample_rate + assert _global_sampling_rule().sample_rate == 0.1 assert config._tracing_enabled is True, config._tracing_enabled assert config._runtime_metrics_enabled is True, config._runtime_metrics_enabled assert config._otel_enabled is True, config._otel_enabled @@ -45,7 +64,7 @@ def test_dd_otel_mixed_env_configuration(): "OTEL_LOG_LEVEL": "debug", "OTEL_PROPAGATORS": "jaegar, tracecontext, b3", "OTEL_TRACES_SAMPLER": "always_off", - "DD_TRACE_SAMPLE_RATE": "1.0", + "DD_TRACE_SAMPLING_RULES": '[{"sample_rate":0.9}]', "OTEL_TRACES_EXPORTER": "OTLP", "OTEL_METRICS_EXPORTER": "none", "OTEL_LOGS_EXPORTER": "warning", @@ -59,13 +78,14 @@ def test_dd_otel_mixed_env_configuration(): ) def test_dd_otel_missing_dd_env_configuration(): from ddtrace import config + from tests.opentelemetry.test_config import _global_sampling_rule assert config.service == "Test", config.service assert config.version == "1.0" assert config._otel_enabled is True, config._otel_enabled assert config._debug_mode is True, config._debug_mode assert config._propagation_style_extract == ["tracecontext", "b3"], config._propagation_style_extract - assert config._trace_sample_rate == 1.0, config._trace_sample_rate + assert _global_sampling_rule().sample_rate == 0.9 assert config._tracing_enabled is True, config._tracing_enabled assert config._runtime_metrics_enabled is False, config._runtime_metrics_enabled assert config.tags == { @@ -133,8 +153,9 @@ def test_otel_propagation_style_configuration_unsupportedwarning(): ) def test_otel_traces_sampler_configuration_alwayson(): from ddtrace import config + from tests.opentelemetry.test_config import _global_sampling_rule - assert config._trace_sample_rate == 1.0, config._trace_sample_rate + assert _global_sampling_rule().sample_rate == 1.0, config._trace_sample_rate @pytest.mark.subprocess( @@ -143,8 +164,9 @@ def test_otel_traces_sampler_configuration_alwayson(): ) def test_otel_traces_sampler_configuration_ignore_parent(): from ddtrace import config + from tests.opentelemetry.test_config import _global_sampling_rule - assert config._trace_sample_rate == 1.0, config._trace_sample_rate + assert _global_sampling_rule().sample_rate == 1.0, config._trace_sample_rate @pytest.mark.subprocess( @@ -153,8 +175,9 @@ def test_otel_traces_sampler_configuration_ignore_parent(): ) def test_otel_traces_sampler_configuration_alwaysoff(): from ddtrace import config + from tests.opentelemetry.test_config import _global_sampling_rule - assert config._trace_sample_rate == 0.0, config._trace_sample_rate + assert _global_sampling_rule().sample_rate == 0.0, config._trace_sample_rate @pytest.mark.subprocess( @@ -167,8 +190,9 @@ def test_otel_traces_sampler_configuration_alwaysoff(): ) def test_otel_traces_sampler_configuration_traceidratio(): from ddtrace import config + from tests.opentelemetry.test_config import _global_sampling_rule - assert config._trace_sample_rate == 0.5, config._trace_sample_rate + assert _global_sampling_rule().sample_rate == 0.5, config._trace_sample_rate @pytest.mark.subprocess(env={"OTEL_TRACES_EXPORTER": "none"}) diff --git a/tests/suitespec.yml b/tests/suitespec.yml index d9da18df66d..69c6b19e8d8 100644 --- a/tests/suitespec.yml +++ b/tests/suitespec.yml @@ -76,7 +76,7 @@ components: - ddtrace/__init__.py - ddtrace/py.typed - ddtrace/version.py - - ddtrace/settings/config.py + - ddtrace/settings/_config.py - src/native/* datastreams: - ddtrace/internal/datastreams/* @@ -117,7 +117,7 @@ components: - ddtrace/trace/* - ddtrace/constants.py - ddtrace/settings/__init__.py - - ddtrace/settings/config.py + - ddtrace/settings/_config.py - ddtrace/settings/http.py - ddtrace/settings/exceptions.py - ddtrace/settings/integration.py diff --git a/tests/telemetry/test_writer.py b/tests/telemetry/test_writer.py index 39d672a1c01..2de23c9fba3 100644 --- a/tests/telemetry/test_writer.py +++ b/tests/telemetry/test_writer.py @@ -118,7 +118,6 @@ def test_app_started_event(telemetry_writer, test_agent_session, mock_time): {"name": "DD_SPAN_SAMPLING_RULES_FILE", "origin": "unknown", "value": None}, {"name": "DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "origin": "unknown", "value": True}, {"name": "DD_TRACE_AGENT_TIMEOUT_SECONDS", "origin": "unknown", "value": 2.0}, - {"name": "DD_TRACE_ANALYTICS_ENABLED", "origin": "unknown", "value": False}, {"name": "DD_TRACE_API_VERSION", "origin": "unknown", "value": None}, {"name": "DD_TRACE_CLIENT_IP_ENABLED", "origin": "unknown", "value": None}, {"name": "DD_TRACE_COMPUTE_STATS", "origin": "unknown", "value": False}, @@ -225,7 +224,6 @@ def test_app_started_event_configuration_override(test_agent_session, run_python env["DD_RUNTIME_METRICS_ENABLED"] = "True" env["DD_SERVICE_MAPPING"] = "default_dd_service:remapped_dd_service" env["DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED"] = "True" - env["DD_TRACE_ANALYTICS_ENABLED"] = "True" env["DD_TRACE_CLIENT_IP_ENABLED"] = "True" env["DD_TRACE_COMPUTE_STATS"] = "True" env["DD_TRACE_DEBUG"] = "True" @@ -237,7 +235,6 @@ def test_app_started_event_configuration_override(test_agent_session, run_python env["DD_TRACE_PROPAGATION_STYLE_INJECT"] = "tracecontext" env["DD_REMOTE_CONFIGURATION_ENABLED"] = "True" env["DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS"] = "1" - env["DD_TRACE_SAMPLE_RATE"] = "0.5" env["DD_TRACE_RATE_LIMIT"] = "50" env["DD_TRACE_SAMPLING_RULES"] = '[{"sample_rate":1.0,"service":"xyz","name":"abc"}]' env["DD_PROFILING_ENABLED"] = "True" @@ -356,7 +353,6 @@ def test_app_started_event_configuration_override(test_agent_session, run_python {"name": "DD_EXCEPTION_REPLAY_CAPTURE_MAX_FRAMES", "origin": "default", "value": 8}, {"name": "DD_EXCEPTION_REPLAY_ENABLED", "origin": "env_var", "value": True}, {"name": "DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED", "origin": "default", "value": False}, - {"name": "DD_HTTP_CLIENT_TAG_QUERY_STRING", "origin": "default", "value": None}, {"name": "DD_IAST_DEDUPLICATION_ENABLED", "origin": "default", "value": True}, {"name": "DD_IAST_ENABLED", "origin": "default", "value": False}, {"name": "DD_IAST_MAX_CONCURRENT_REQUESTS", "origin": "default", "value": 2}, @@ -433,7 +429,6 @@ def test_app_started_event_configuration_override(test_agent_session, run_python {"name": "DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "origin": "env_var", "value": True}, {"name": "DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "origin": "default", "value": False}, {"name": "DD_TRACE_AGENT_TIMEOUT_SECONDS", "origin": "default", "value": 2.0}, - {"name": "DD_TRACE_ANALYTICS_ENABLED", "origin": "env_var", "value": True}, {"name": "DD_TRACE_API_VERSION", "origin": "env_var", "value": "v0.5"}, {"name": "DD_TRACE_CLIENT_IP_ENABLED", "origin": "env_var", "value": True}, {"name": "DD_TRACE_CLIENT_IP_HEADER", "origin": "default", "value": None}, @@ -456,13 +451,11 @@ def test_app_started_event_configuration_override(test_agent_session, run_python {"name": "DD_TRACE_PROPAGATION_STYLE_INJECT", "origin": "env_var", "value": "tracecontext"}, {"name": "DD_TRACE_RATE_LIMIT", "origin": "env_var", "value": 50}, {"name": "DD_TRACE_REPORT_HOSTNAME", "origin": "default", "value": False}, - {"name": "DD_TRACE_SAMPLE_RATE", "origin": "env_var", "value": 0.5}, { "name": "DD_TRACE_SAMPLING_RULES", "origin": "env_var", "value": '[{"sample_rate":1.0,"service":"xyz","name":"abc"}]', }, - {"name": "DD_TRACE_SPAN_AGGREGATOR_RLOCK", "origin": "default", "value": True}, {"name": "DD_TRACE_SPAN_TRACEBACK_MAX_SIZE", "origin": "default", "value": 30}, {"name": "DD_TRACE_STARTUP_LOGS", "origin": "env_var", "value": True}, {"name": "DD_TRACE_WRITER_BUFFER_SIZE_BYTES", "origin": "env_var", "value": 1000}, @@ -483,6 +476,7 @@ def test_app_started_event_configuration_override(test_agent_session, run_python {"name": "python_build_gnu_type", "origin": "unknown", "value": sysconfig.get_config_var("BUILD_GNU_TYPE")}, {"name": "python_host_gnu_type", "origin": "unknown", "value": sysconfig.get_config_var("HOST_GNU_TYPE")}, {"name": "python_soabi", "origin": "unknown", "value": sysconfig.get_config_var("SOABI")}, + {"name": "trace_sample_rate", "origin": "default", "value": 1.0}, ] assert configurations == expected, configurations diff --git a/tests/tracer/test_encoders.py b/tests/tracer/test_encoders.py index 7006bc6b95d..4fe48a2a838 100644 --- a/tests/tracer/test_encoders.py +++ b/tests/tracer/test_encoders.py @@ -869,19 +869,3 @@ def test_json_encoder_traces_bytes(): assert "\\x80span.a" == span_a["name"] assert "\x80span.b" == span_b["name"] assert "\x80span.b" == span_c["name"] - - -@pytest.mark.subprocess(env={"DD_TRACE_API_VERSION": "v0.3"}) -def test_v03_trace_api_deprecation(): - import warnings - - with warnings.catch_warnings(record=True) as warns: - warnings.simplefilter("always") - from ddtrace.trace import tracer - - assert tracer._writer._api_version == "v0.4" - assert len(warns) == 1, warns - assert ( - warns[0].message.args[0] == "DD_TRACE_API_VERSION=v0.3 is deprecated and will be " - "removed in version '3.0.0': Traces will be submitted to the v0.4/traces agent endpoint instead." - ), warns[0].message diff --git a/tests/tracer/test_sampler.py b/tests/tracer/test_sampler.py index 22620d8184b..f54c7de55da 100644 --- a/tests/tracer/test_sampler.py +++ b/tests/tracer/test_sampler.py @@ -568,21 +568,6 @@ def test_sampling_rule_sample(): ) -@pytest.mark.subprocess(env={"DD_TRACE_SAMPLE_RATE": "0.2"}) -def test_sampling_rate_config_deprecated(): - import warnings - - with warnings.catch_warnings(record=True) as ws: - warnings.simplefilter("always") - - from ddtrace import config - - assert config._trace_sample_rate == 0.2 - - assert len(ws) >= 1 - assert any(w for w in ws if "DD_TRACE_SAMPLE_RATE is deprecated" in str(w.message)), [w.message for w in ws] - - def test_sampling_rule_sample_rate_1(): rule = SamplingRule(sample_rate=1) @@ -650,15 +635,6 @@ def test_datadog_sampler_init(): SamplingRule(sample_rate=0.5) ], "DatadogSampler initialized with no arguments and envvars set should hold a sample_rate from the envvar" - with override_global_config(dict(_trace_sample_rate=0)): - sampler = DatadogSampler() - assert ( - sampler.limiter.rate_limit == DatadogSampler.DEFAULT_RATE_LIMIT - ), "DatadogSampler initialized with DD_TRACE_SAMPLE_RATE=0 envvar should hold the default rate limit" - assert sampler.rules == [ - SamplingRule(sample_rate=0) - ], "DatadogSampler initialized with DD_TRACE_SAMPLE_RATE=0 envvar should hold sample_rate=0" - with override_global_config(dict(_trace_sample_rate="asdf")): with pytest.raises(ValueError): DatadogSampler() From a8760c6944ff1ecf5dfde1dc2c408eb38a470ab1 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Wed, 5 Feb 2025 08:45:26 +0100 Subject: [PATCH 53/63] chore(iast): xss vulnerability for jinja2 template engine (#12183) xss vulnerability for jinja2 template engine ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/appsec/_iast/taint_sinks/xss.py | 18 ++ .../fastapi_tests/test_fastapi_appsec_iast.py | 36 ++++ .../flask_tests/test_iast_flask.py | 197 ++++++++++++++---- .../flask/test_templates/test_insecure.html | 1 + 4 files changed, 217 insertions(+), 35 deletions(-) create mode 100644 tests/contrib/flask/test_templates/test_insecure.html diff --git a/ddtrace/appsec/_iast/taint_sinks/xss.py b/ddtrace/appsec/_iast/taint_sinks/xss.py index 425affac77a..6f7d263f7c2 100644 --- a/ddtrace/appsec/_iast/taint_sinks/xss.py +++ b/ddtrace/appsec/_iast/taint_sinks/xss.py @@ -52,6 +52,18 @@ def patch(): _iast_django_xss, ) + try_wrap_function_wrapper( + "jinja2.filters", + "do_mark_safe", + _iast_jinja2_xss, + ) + try_wrap_function_wrapper( + "flask", + "render_template_string", + _iast_jinja2_xss, + ) + + _set_metric_iast_instrumented_sink(VULN_XSS) _set_metric_iast_instrumented_sink(VULN_XSS) @@ -70,6 +82,12 @@ def _iast_django_xss(wrapped, instance, args, kwargs): return wrapped(*args, **kwargs) +def _iast_jinja2_xss(wrapped, instance, args, kwargs): + if args and len(args) >= 1: + _iast_report_xss(args[0]) + return wrapped(*args, **kwargs) + + def _iast_report_xss(code_string: Text): increment_iast_span_metric(IAST_SPAN_TAGS.TELEMETRY_EXECUTED_SINK, XSS.vulnerability_type) _set_metric_iast_executed_sink(XSS.vulnerability_type) diff --git a/tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py b/tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py index 81702f3c8d9..07d8e1c9dc6 100644 --- a/tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py +++ b/tests/appsec/integrations/fastapi_tests/test_fastapi_appsec_iast.py @@ -27,6 +27,7 @@ from ddtrace.appsec._iast.constants import VULN_NO_SAMESITE_COOKIE from ddtrace.appsec._iast.constants import VULN_SQL_INJECTION from ddtrace.appsec._iast.constants import VULN_STACKTRACE_LEAK +from ddtrace.appsec._iast.constants import VULN_XSS from ddtrace.contrib.internal.fastapi.patch import patch as patch_fastapi from ddtrace.contrib.internal.sqlite3.patch import patch as patch_sqlite_sqli from tests.appsec.iast.iast_utils import get_line_and_hash @@ -987,3 +988,38 @@ async def stacktrace_leak_inline_response(request: Request): assert len(loaded["vulnerabilities"]) == 1 vulnerability = loaded["vulnerabilities"][0] assert vulnerability["type"] == VULN_STACKTRACE_LEAK + + +def test_fastapi_xss(fastapi_application, client, tracer, test_spans): + @fastapi_application.get("/index.html") + async def test_route(request: Request): + from fastapi.responses import HTMLResponse + from jinja2 import Template + + query_params = request.query_params.get("iast_queryparam") + template = Template("

{{ user_input|safe }}

") + html = template.render(user_input=query_params) + return HTMLResponse(html) + + with override_global_config(dict(_iast_enabled=True, _iast_request_sampling=100.0)): + patch_iast({"xss": True}) + from jinja2.filters import FILTERS + from jinja2.filters import do_mark_safe + + FILTERS["safe"] = do_mark_safe + _aux_appsec_prepare_tracer(tracer) + resp = client.get( + "/index.html?iast_queryparam=test1234", + headers={"Content-Type": "application/json"}, + ) + assert resp.status_code == 200 + + span = test_spans.pop_traces()[0][0] + assert span.get_metric(IAST.ENABLED) == 1.0 + + iast_tag = span.get_tag(IAST.JSON) + assert iast_tag is not None + loaded = json.loads(iast_tag) + assert len(loaded["vulnerabilities"]) == 1 + vulnerability = loaded["vulnerabilities"][0] + assert vulnerability["type"] == VULN_XSS diff --git a/tests/appsec/integrations/flask_tests/test_iast_flask.py b/tests/appsec/integrations/flask_tests/test_iast_flask.py index be45e6bb82f..0c84326e60f 100644 --- a/tests/appsec/integrations/flask_tests/test_iast_flask.py +++ b/tests/appsec/integrations/flask_tests/test_iast_flask.py @@ -16,7 +16,9 @@ from ddtrace.appsec._iast.constants import VULN_NO_SAMESITE_COOKIE from ddtrace.appsec._iast.constants import VULN_SQL_INJECTION from ddtrace.appsec._iast.constants import VULN_STACKTRACE_LEAK +from ddtrace.appsec._iast.constants import VULN_XSS from ddtrace.appsec._iast.taint_sinks.header_injection import patch as patch_header_injection +from ddtrace.appsec._iast.taint_sinks.xss import patch as patch_xss_injection from ddtrace.contrib.internal.sqlite3.patch import patch as patch_sqlite_sqli from ddtrace.settings.asm import config as asm_config from tests.appsec.iast.iast_utils import get_line_and_hash @@ -45,11 +47,15 @@ def setUp(self): _iast_request_sampling=100.0, ) ): - super(FlaskAppSecIASTEnabledTestCase, self).setUp() patch_sqlite_sqli() patch_header_injection() + patch_xss_injection() patch_json() + from jinja2.filters import FILTERS + from jinja2.filters import do_mark_safe + FILTERS["safe"] = do_mark_safe + super(FlaskAppSecIASTEnabledTestCase, self).setUp() self.tracer._configure(api_version="v0.4", appsec_enabled=True, iast_enabled=True) oce.reconfigure() @@ -59,7 +65,6 @@ def test_flask_full_sqli_iast_http_request_path_parameter(self): def sqli_1(param_str): import sqlite3 - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect assert is_pyobject_tainted(param_str) @@ -274,7 +279,6 @@ def sqli_5(param_str, param_int): from ddtrace.appsec._iast._taint_tracking import OriginType from ddtrace.appsec._iast._taint_tracking._taint_objects import get_tainted_ranges - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted header_ranges = get_tainted_ranges(request.headers["User-Agent"]) assert header_ranges @@ -324,8 +328,6 @@ def test_flask_simple_iast_path_header_and_querystring_tainted_request_sampling_ def sqli_6(param_str): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - # Note: these are not tainted because of request sampling at 0% assert not is_pyobject_tainted(request.headers["User-Agent"]) assert not is_pyobject_tainted(request.query_string) @@ -535,7 +537,6 @@ def test_flask_full_sqli_iast_http_request_parameter_name_post(self): def sqli_13(): import sqlite3 - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect for i in request.form.keys(): @@ -593,7 +594,6 @@ def test_flask_full_sqli_iast_http_request_parameter_name_get(self): def sqli_14(): import sqlite3 - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect for i in request.args.keys(): @@ -654,7 +654,6 @@ def sqli_10(): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect con = sqlite3.connect(":memory:") @@ -719,7 +718,6 @@ def sqli_11(): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect con = sqlite3.connect(":memory:") @@ -784,7 +782,6 @@ def sqli_11(): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect con = sqlite3.connect(":memory:") @@ -849,7 +846,6 @@ def sqli_11(): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect con = sqlite3.connect(":memory:") @@ -916,7 +912,6 @@ def sqli_11(): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect def iterate_json(data, parent_key=""): @@ -1057,7 +1052,6 @@ def sqli_10(): from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect con = sqlite3.connect(":memory:") @@ -1160,8 +1154,6 @@ def header_injection(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1194,14 +1186,12 @@ def header_injection(): # TODO: vulnerability path is flaky, it points to "tests/contrib/flask/__init__.py" @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") - def test_flask_header_injection_exlusions_location(self): + def test_flask_header_injection_exclusions_location(self): @self.app.route("/header_injection/", methods=["GET", "POST"]) def header_injection(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1223,14 +1213,12 @@ def header_injection(): assert root_span.get_tag(IAST.JSON) is None @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") - def test_flask_header_injection_exlusions_access_control(self): + def test_flask_header_injection_exclusions_access_control(self): @self.app.route("/header_injection/", methods=["GET", "POST"]) def header_injection(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1258,8 +1246,6 @@ def insecure_cookie(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1296,8 +1282,6 @@ def insecure_cookie_empty(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1326,8 +1310,6 @@ def no_http_only_cookie(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1364,8 +1346,6 @@ def no_http_only_cookie_empty(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1395,8 +1375,6 @@ def no_samesite_cookie(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1433,8 +1411,6 @@ def no_samesite_cookie_empty(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1461,8 +1437,6 @@ def cookie_secure(): from flask import Response from flask import request - from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted - tainted_string = request.form.get("name") assert is_pyobject_tainted(tainted_string) resp = Response("OK") @@ -1587,6 +1561,159 @@ def stacktrace_leak(): ) assert "Exception: ValueError" in vulnerability["evidence"]["valueParts"][0]["value"] + def test_flask_xss(self): + @self.app.route("/xss/", methods=["GET"]) + def xss_view(): + from flask import render_template_string + from flask import request + + user_input = request.args.get("input", "") + + # label test_flask_xss + return render_template_string("

XSS: {{ user_input|safe }}

", user_input=user_input) + + with override_global_config( + dict( + _iast_enabled=True, + _iast_deduplication_enabled=False, + _iast_request_sampling=100.0, + ) + ): + resp = self.client.get("/xss/?input=") + assert resp.status_code == 200 + assert resp.data == b"

XSS:

" + + root_span = self.pop_spans()[0] + assert root_span.get_metric(IAST.ENABLED) == 1.0 + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [ + {"origin": "http.request.parameter", "name": "input", "value": ""} + ] + + line, hash_value = get_line_and_hash("test_flask_xss", VULN_SQL_INJECTION, filename=TEST_FILE_PATH) + vulnerability = loaded["vulnerabilities"][0] + assert vulnerability["type"] == VULN_XSS + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": "", "source": 0}, + ] + } + assert vulnerability["location"]["line"] == line + assert vulnerability["location"]["path"] == TEST_FILE_PATH + + def test_flask_xss_concat(self): + @self.app.route("/xss/concat/", methods=["GET"]) + def xss_view(): + from flask import render_template_string + from flask import request + + from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect + + user_input = request.args.get("input", "") + + # label test_flask_xss_concat + return render_template_string(add_aspect(add_aspect("

XSS: ", user_input), "

")) + + with override_global_config( + dict( + _iast_enabled=True, + _iast_deduplication_enabled=False, + _iast_request_sampling=100.0, + ) + ): + resp = self.client.get("/xss/concat/?input=") + assert resp.status_code == 200 + assert resp.data == b"

XSS:

" + + root_span = self.pop_spans()[0] + assert root_span.get_metric(IAST.ENABLED) == 1.0 + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [ + {"origin": "http.request.parameter", "name": "input", "value": ""} + ] + + line, hash_value = get_line_and_hash("test_flask_xss_concat", VULN_SQL_INJECTION, filename=TEST_FILE_PATH) + vulnerability = loaded["vulnerabilities"][0] + assert vulnerability["type"] == VULN_XSS + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": "

XSS: "}, + {"source": 0, "value": ""}, + {"value": "

"}, + ] + } + assert vulnerability["location"]["line"] == line + assert vulnerability["location"]["path"] == TEST_FILE_PATH + + def test_flask_xss_template_secure(self): + @self.app.route("/xss/template/secure/", methods=["GET"]) + def xss_view_template(): + from flask import render_template + from flask import request + + user_input = request.args.get("input", "") + + # label test_flask_xss_template + return render_template("test.html", world=user_input) + + with override_global_config( + dict( + _iast_enabled=True, + _iast_deduplication_enabled=False, + _iast_request_sampling=100.0, + ) + ): + resp = self.client.get("/xss/template/secure/?input=") + assert resp.status_code == 200 + assert resp.data == b"hello <script>alert('XSS')</script>" + + root_span = self.pop_spans()[0] + assert root_span.get_metric(IAST.ENABLED) == 1.0 + + assert root_span.get_tag(IAST.JSON) is None + + def test_flask_xss_template(self): + @self.app.route("/xss/template/", methods=["GET"]) + def xss_view_template(): + from flask import render_template + from flask import request + + user_input = request.args.get("input", "") + + # label test_flask_xss_template + return render_template("test_insecure.html", world=user_input) + + with override_global_config( + dict( + _iast_enabled=True, + _iast_deduplication_enabled=False, + _iast_request_sampling=100.0, + ) + ): + resp = self.client.get("/xss/template/?input=") + assert resp.status_code == 200 + assert resp.data == b"hello " + + root_span = self.pop_spans()[0] + assert root_span.get_metric(IAST.ENABLED) == 1.0 + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [ + {"origin": "http.request.parameter", "name": "input", "value": ""} + ] + + line, hash_value = get_line_and_hash("test_flask_xss", VULN_SQL_INJECTION, filename=TEST_FILE_PATH) + vulnerability = loaded["vulnerabilities"][0] + assert vulnerability["type"] == VULN_XSS + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": "", "source": 0}, + ] + } + assert vulnerability["location"]["path"] == "tests/contrib/flask/test_templates/test_insecure.html" + class FlaskAppSecIASTDisabledTestCase(BaseFlaskTestCase): @pytest.fixture(autouse=True) diff --git a/tests/contrib/flask/test_templates/test_insecure.html b/tests/contrib/flask/test_templates/test_insecure.html new file mode 100644 index 00000000000..a1921295a57 --- /dev/null +++ b/tests/contrib/flask/test_templates/test_insecure.html @@ -0,0 +1 @@ +hello {{world|safe}} From a54a55d166779be3434412b4fef59c1a4060e253 Mon Sep 17 00:00:00 2001 From: Taegyun Kim Date: Wed, 5 Feb 2025 02:51:51 -0500 Subject: [PATCH 54/63] chore: remove more 3.7 related code (#12221) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .github/workflows/build_deploy.yml | 2 +- .../appsec/_python_info/stdlib/__init__.py | 6 +- ddtrace/internal/wrapping/asyncs.py | 90 ------------------- ddtrace/internal/wrapping/context.py | 2 +- ddtrace/internal/wrapping/generators.py | 71 --------------- lib-injection/sources/sitecustomize.py | 2 +- tests/appsec/iast_packages/test_packages.py | 16 ++-- tests/integration/test_debug.py | 9 -- 8 files changed, 12 insertions(+), 186 deletions(-) diff --git a/.github/workflows/build_deploy.yml b/.github/workflows/build_deploy.yml index 179ed367141..47584911df4 100644 --- a/.github/workflows/build_deploy.yml +++ b/.github/workflows/build_deploy.yml @@ -27,7 +27,7 @@ jobs: build_wheels: uses: ./.github/workflows/build_python_3.yml with: - cibw_build: 'cp37* cp38* cp39* cp310* cp311* cp312* cp313*' + cibw_build: 'cp38* cp39* cp310* cp311* cp312* cp313*' build_sdist: name: Build source distribution diff --git a/ddtrace/appsec/_python_info/stdlib/__init__.py b/ddtrace/appsec/_python_info/stdlib/__init__.py index e745c392f55..8b220b0af85 100644 --- a/ddtrace/appsec/_python_info/stdlib/__init__.py +++ b/ddtrace/appsec/_python_info/stdlib/__init__.py @@ -3,11 +3,7 @@ from sys import version_info -if version_info < (3, 7, 0): - from .module_names_py36 import STDLIB_MODULE_NAMES -elif version_info < (3, 8, 0): - from .module_names_py37 import STDLIB_MODULE_NAMES -elif version_info < (3, 9, 0): +if version_info < (3, 9, 0): from .module_names_py38 import STDLIB_MODULE_NAMES elif version_info < (3, 10, 0): from .module_names_py39 import STDLIB_MODULE_NAMES diff --git a/ddtrace/internal/wrapping/asyncs.py b/ddtrace/internal/wrapping/asyncs.py index 855578f9db2..d0ed131e962 100644 --- a/ddtrace/internal/wrapping/asyncs.py +++ b/ddtrace/internal/wrapping/asyncs.py @@ -537,96 +537,6 @@ """ ) -elif PY >= (3, 7): - COROUTINE_ASSEMBLY.parse( - r""" - get_awaitable - load_const None - yield_from - """ - ) - - ASYNC_GEN_ASSEMBLY.parse( - r""" - setup_except @stopiter - dup_top - store_fast $__ddgen - load_attr $asend - store_fast $__ddgensend - load_fast $__ddgen - load_attr $__anext__ - call_function 0 - - loop: - get_awaitable - load_const None - yield_from - - yield: - setup_except @genexit - yield_value - pop_block - load_fast $__ddgensend - rot_two - call_function 1 - jump_absolute @loop - - genexit: - dup_top - load_const GeneratorExit - compare_op asm.Compare.EXC_MATCH - pop_jump_if_false @exc - pop_top - pop_top - pop_top - pop_top - load_fast $__ddgen - load_attr $aclose - call_function 0 - get_awaitable - load_const None - yield_from - pop_except - return_value - - exc: - pop_top - pop_top - pop_top - pop_top - load_fast $__ddgen - load_attr $athrow - load_const sys.exc_info - call_function 0 - call_function_ex 0 - get_awaitable - load_const None - yield_from - store_fast $__value - pop_except - load_fast $__value - jump_absolute @yield - - stopiter: - dup_top - load_const StopAsyncIteration - compare_op asm.Compare.EXC_MATCH - pop_jump_if_false @propagate - pop_top - pop_top - pop_top - pop_except - load_const None - return_value - - propagate: - end_finally - load_const None - return_value - """ - ) - - else: msg = "No async wrapping support for Python %d.%d" % PY[:2] raise RuntimeError(msg) diff --git a/ddtrace/internal/wrapping/context.py b/ddtrace/internal/wrapping/context.py index cf36a93011b..393bd097da5 100644 --- a/ddtrace/internal/wrapping/context.py +++ b/ddtrace/internal/wrapping/context.py @@ -274,7 +274,7 @@ ) -elif sys.version_info >= (3, 7): +elif sys.version_info >= (3, 8): CONTEXT_HEAD.parse( r""" load_const {context} diff --git a/ddtrace/internal/wrapping/generators.py b/ddtrace/internal/wrapping/generators.py index f2a98b42a18..9ec5a654556 100644 --- a/ddtrace/internal/wrapping/generators.py +++ b/ddtrace/internal/wrapping/generators.py @@ -383,77 +383,6 @@ """ ) - -elif PY >= (3, 7): - GENERATOR_ASSEMBLY.parse( - r""" - setup_except @stopiter - dup_top - store_fast $__ddgen - load_attr $send - store_fast $__ddgensend - load_const next - load_fast $__ddgen - - loop: - call_function 1 - - yield: - setup_except @genexit - yield_value - pop_block - load_fast $__ddgensend - rot_two - jump_absolute @loop - - genexit: - dup_top - load_const GeneratorExit - compare_op asm.Compare.EXC_MATCH - pop_jump_if_false @exc - pop_top - pop_top - pop_top - pop_top - load_fast $__ddgen - load_attr $close - call_function 0 - return_value - - exc: - pop_top - pop_top - pop_top - pop_top - load_fast $__ddgen - load_attr $throw - load_const sys.exc_info - call_function 0 - call_function_ex 0 - store_fast $__value - pop_except - load_fast $__value - jump_absolute @yield - - stopiter: - dup_top - load_const StopIteration - compare_op asm.Compare.EXC_MATCH - pop_jump_if_false @propagate - pop_top - pop_top - pop_top - pop_except - load_const None - return_value - - propagate: - end_finally - load_const None - return_value - """ - ) - else: msg = "No generator wrapping support for Python %d.%d" % PY[:2] raise RuntimeError(msg) diff --git a/lib-injection/sources/sitecustomize.py b/lib-injection/sources/sitecustomize.py index 32ab1c31ff3..0daa9c2413a 100644 --- a/lib-injection/sources/sitecustomize.py +++ b/lib-injection/sources/sitecustomize.py @@ -35,7 +35,7 @@ def parse_version(version): SCRIPT_DIR = os.path.dirname(__file__) RUNTIMES_ALLOW_LIST = { "cpython": { - "min": Version(version=(3, 7), constraint=""), + "min": Version(version=(3, 8), constraint=""), "max": Version(version=(3, 13), constraint=""), } } diff --git a/tests/appsec/iast_packages/test_packages.py b/tests/appsec/iast_packages/test_packages.py index 83e53ae92c9..d65cf2ea709 100644 --- a/tests/appsec/iast_packages/test_packages.py +++ b/tests/appsec/iast_packages/test_packages.py @@ -626,7 +626,7 @@ def uninstall(self, python_cmd): "", import_module_to_validate="soupsieve.css_match", extras=[("beautifulsoup4", "4.12.3")], - skip_python_version=[(3, 6), (3, 7), (3, 8)], + skip_python_version=[(3, 8)], test_propagation=True, fixme_propagation_fails=True, ), @@ -638,7 +638,7 @@ def uninstall(self, python_cmd): # "Original password: your-password\nHashed password: replaced_hashed\nPassword match: True", # "", # import_module_to_validate="werkzeug.http", - # skip_python_version=[(3, 6), (3, 7), (3, 8)], + # skip_python_version=[(3, 8)], # ), PackageForTesting( "yarl", @@ -648,7 +648,7 @@ def uninstall(self, python_cmd): + " example.com\nPath: /path\nQuery: \n", "", import_module_to_validate="yarl._url", - skip_python_version=[(3, 6), (3, 7), (3, 8)], + skip_python_version=[(3, 8)], test_propagation=True, fixme_propagation_fails=True, ), @@ -659,7 +659,7 @@ def uninstall(self, python_cmd): # "example.zip", # "Contents of example.zip: ['example.zip/example.txt']", # "", - # skip_python_version=[(3, 6), (3, 7), (3, 8)], + # skip_python_version=[(3, 8)], # ), ## Skip due to typing-extensions added to the denylist # PackageForTesting( @@ -670,7 +670,7 @@ def uninstall(self, python_cmd): # "", # import_name="typing_extensions", # test_e2e=False, - # skip_python_version=[(3, 6), (3, 7), (3, 8)], + # skip_python_version=[(3, 8)], # ), PackageForTesting( "six", @@ -678,7 +678,7 @@ def uninstall(self, python_cmd): "", "We're in Python 3", "", - skip_python_version=[(3, 6), (3, 7), (3, 8)], + skip_python_version=[(3, 8)], ), ## Skip due to pillow added to the denylist # PackageForTesting( @@ -688,7 +688,7 @@ def uninstall(self, python_cmd): # "Image correctly generated", # "", # import_name="PIL.Image", - # skip_python_version=[(3, 6), (3, 7), (3, 8)], + # skip_python_version=[(3, 8)], # ), PackageForTesting( "aiobotocore", "2.13.0", "", "", "", test_e2e=False, test_import=False, import_name="aiobotocore.session" @@ -853,7 +853,7 @@ def uninstall(self, python_cmd): "Processed value: 15", "", import_name="annotated_types", - skip_python_version=[(3, 6), (3, 7), (3, 8)], + skip_python_version=[(3, 8)], ), ] diff --git a/tests/integration/test_debug.py b/tests/integration/test_debug.py index f5453f353fe..97c95507668 100644 --- a/tests/integration/test_debug.py +++ b/tests/integration/test_debug.py @@ -36,7 +36,6 @@ def __eq__(self, other): @pytest.mark.subprocess() def test_standard_tags(): from datetime import datetime - import sys import ddtrace from ddtrace.internal import debug @@ -75,14 +74,6 @@ def test_standard_tags(): in_venv = f.get("in_virtual_env") assert in_venv is True - lang_version = f.get("lang_version") - if sys.version_info == (3, 7, 0): - assert "3.7" in lang_version - elif sys.version_info == (3, 6, 0): - assert "3.6" in lang_version - elif sys.version_info == (2, 7, 0): - assert "2.7" in lang_version - agent_url = f.get("agent_url") assert agent_url == "http://localhost:8126" From e5055b799d9db0a5c064b52bf56c1bd3664f482f Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Wed, 5 Feb 2025 10:02:49 +0100 Subject: [PATCH 55/63] chore(iast): header source in werkzeug 3.1 (#12213) IAST taint source Header wouldn't work correctly in `werkzeug>=3.1.0` We're tainting `EnvironHeaders.__getitem__` due to get method calls to `__getitem__` https://github.com/pallets/werkzeug/blob/2.3.8/src/werkzeug/datastructures/headers.py but now the `__getitem__` and `get` methods of `EnvironHeaders` are completely differents: https://github.com/pallets/werkzeug/blob/main/src/werkzeug/datastructures/headers.py ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/appsec/_iast/_handlers.py | 19 ++++--- hatch.toml | 7 +++ .../flask_tests/test_iast_flask.py | 56 +++++++++++++++++++ 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/ddtrace/appsec/_iast/_handlers.py b/ddtrace/appsec/_iast/_handlers.py index cf60fc610be..bcd913085f4 100644 --- a/ddtrace/appsec/_iast/_handlers.py +++ b/ddtrace/appsec/_iast/_handlers.py @@ -82,23 +82,28 @@ def _on_flask_patch(flask_version): "Headers.items", functools.partial(if_iast_taint_yield_tuple_for, (OriginType.HEADER_NAME, OriginType.HEADER)), ) - _set_metric_iast_instrumented_source(OriginType.HEADER_NAME) - _set_metric_iast_instrumented_source(OriginType.HEADER) try_wrap_function_wrapper( "werkzeug.datastructures", - "ImmutableMultiDict.__getitem__", - functools.partial(if_iast_taint_returned_object_for, OriginType.PARAMETER), + "EnvironHeaders.__getitem__", + functools.partial(if_iast_taint_returned_object_for, OriginType.HEADER), ) - _set_metric_iast_instrumented_source(OriginType.PARAMETER) - + # Since werkzeug 3.1.0 get doesn't call to __getitem__ try_wrap_function_wrapper( "werkzeug.datastructures", - "EnvironHeaders.__getitem__", + "EnvironHeaders.get", functools.partial(if_iast_taint_returned_object_for, OriginType.HEADER), ) + _set_metric_iast_instrumented_source(OriginType.HEADER_NAME) _set_metric_iast_instrumented_source(OriginType.HEADER) + try_wrap_function_wrapper( + "werkzeug.datastructures", + "ImmutableMultiDict.__getitem__", + functools.partial(if_iast_taint_returned_object_for, OriginType.PARAMETER), + ) + _set_metric_iast_instrumented_source(OriginType.PARAMETER) + if flask_version >= (2, 0, 0): # instance.query_string: raising an error on werkzeug/_internal.py "AttributeError: read only property" try_wrap_function_wrapper("werkzeug.wrappers.request", "Request.__init__", _on_request_init) diff --git a/hatch.toml b/hatch.toml index 3e80f24a5e7..74dcba41602 100644 --- a/hatch.toml +++ b/hatch.toml @@ -399,6 +399,13 @@ flask = ["~=2.2"] python = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] flask = ["~=3.0"] +[[envs.appsec_integrations_flask.matrix]] +# werkzeug 3.1 drops support for py3.8 +python = ["3.11", "3.12", "3.13"] +flask = ["~=3.1"] +werkzeug = ["~=3.1"] + +## ASM appsec_integrations_fastapi [envs.appsec_integrations_fastapi] template = "appsec_integrations_fastapi" diff --git a/tests/appsec/integrations/flask_tests/test_iast_flask.py b/tests/appsec/integrations/flask_tests/test_iast_flask.py index 0c84326e60f..0d8f7c5b4ad 100644 --- a/tests/appsec/integrations/flask_tests/test_iast_flask.py +++ b/tests/appsec/integrations/flask_tests/test_iast_flask.py @@ -166,6 +166,62 @@ def sqli_2(param_str): assert vulnerability["location"]["path"] == TEST_FILE_PATH assert vulnerability["hash"] == hash_value + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") + def test_flask_iast_enabled_http_request_header_get(self): + @self.app.route("/sqli//", methods=["GET", "POST"]) + def sqli_2(param_str): + import sqlite3 + + from flask import request + + from ddtrace.appsec._iast._taint_tracking.aspects import add_aspect + + con = sqlite3.connect(":memory:") + cur = con.cursor() + # label test_flask_iast_enabled_http_request_header_get + cur.execute(add_aspect("SELECT 1 FROM ", request.headers.get("User-Agent"))) + + return "OK", 200 + + with override_global_config( + dict( + _iast_enabled=True, + _iast_deduplication_enabled=False, + ) + ): + resp = self.client.post( + "/sqli/sqlite_master/", data={"name": "test"}, headers={"User-Agent": "sqlite_master"} + ) + assert resp.status_code == 200 + + root_span = self.pop_spans()[0] + assert root_span.get_metric(IAST.ENABLED) == 1.0 + + loaded = json.loads(root_span.get_tag(IAST.JSON)) + assert loaded["sources"] == [ + {"origin": "http.request.header", "name": "User-Agent", "value": "sqlite_master"} + ] + + line, hash_value = get_line_and_hash( + "test_flask_iast_enabled_http_request_header_get", + VULN_SQL_INJECTION, + filename=TEST_FILE_PATH, + ) + vulnerability = loaded["vulnerabilities"][0] + + assert vulnerability["type"] == VULN_SQL_INJECTION + assert vulnerability["evidence"] == { + "valueParts": [ + {"value": "SELECT "}, + {"redacted": True}, + {"value": " FROM "}, + {"value": "sqlite_master", "source": 0}, + ] + } + assert vulnerability["location"]["line"] == line + assert vulnerability["location"]["path"] == TEST_FILE_PATH + assert vulnerability["hash"] == hash_value + @pytest.mark.skipif(not asm_config._iast_supported, reason="Python version not supported by IAST") def test_flask_full_sqli_iast_enabled_http_request_header_name_keys(self): @self.app.route("/sqli//", methods=["GET", "POST"]) From b17990b86c2db95ebba364fd9ed54d3d25616d18 Mon Sep 17 00:00:00 2001 From: kyle Date: Wed, 5 Feb 2025 09:53:02 -0500 Subject: [PATCH 56/63] chore(llmobs): [MLOB-1944] generalize helper for extracting token metrics (#12223) [applying https://github.com/DataDog/dd-trace-py/pull/12026 to 3.x-staging] This PR generalizes the helper method used to extract token metrics from an APM span to be attached to an LLMObs span. Before, Anthropic, Bedrock, and Open AI had specific methods on each of their integration classes to accomplish this. Now, there is one get_llmobs_metrics_tags utils function adapted from the google-specific get_llmobs_metrics_tags_google function that gets reused across these integrations as well as Vertex AI and Gemini. The Langchain integration was excluded from this change since its logic for extracting token metrics varies significantly compared to the other integrations. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Nicole Cybul --- ddtrace/llmobs/_integrations/anthropic.py | 21 ++----------------- ddtrace/llmobs/_integrations/bedrock.py | 17 ++------------- ddtrace/llmobs/_integrations/gemini.py | 4 ++-- ddtrace/llmobs/_integrations/openai.py | 11 ++-------- ddtrace/llmobs/_integrations/utils.py | 25 ++++++++++++++++++++--- ddtrace/llmobs/_integrations/vertexai.py | 4 ++-- 6 files changed, 32 insertions(+), 50 deletions(-) diff --git a/ddtrace/llmobs/_integrations/anthropic.py b/ddtrace/llmobs/_integrations/anthropic.py index a3224a083cd..bb4f96e7814 100644 --- a/ddtrace/llmobs/_integrations/anthropic.py +++ b/ddtrace/llmobs/_integrations/anthropic.py @@ -7,16 +7,14 @@ from ddtrace.internal.logger import get_logger from ddtrace.llmobs._constants import INPUT_MESSAGES -from ddtrace.llmobs._constants import INPUT_TOKENS_METRIC_KEY from ddtrace.llmobs._constants import METADATA from ddtrace.llmobs._constants import METRICS from ddtrace.llmobs._constants import MODEL_NAME from ddtrace.llmobs._constants import MODEL_PROVIDER from ddtrace.llmobs._constants import OUTPUT_MESSAGES -from ddtrace.llmobs._constants import OUTPUT_TOKENS_METRIC_KEY from ddtrace.llmobs._constants import SPAN_KIND -from ddtrace.llmobs._constants import TOTAL_TOKENS_METRIC_KEY from ddtrace.llmobs._integrations.base import BaseLLMIntegration +from ddtrace.llmobs._integrations.utils import get_llmobs_metrics_tags from ddtrace.llmobs._utils import _get_attr from ddtrace.trace import Span @@ -77,7 +75,7 @@ def _llmobs_set_tags( INPUT_MESSAGES: input_messages, METADATA: parameters, OUTPUT_MESSAGES: output_messages, - METRICS: self._get_llmobs_metrics_tags(span), + METRICS: get_llmobs_metrics_tags("anthropic", span), } ) @@ -188,18 +186,3 @@ def record_usage(self, span: Span, usage: Dict[str, Any]) -> None: span.set_metric("anthropic.response.usage.output_tokens", output_tokens) if input_tokens is not None and output_tokens is not None: span.set_metric("anthropic.response.usage.total_tokens", input_tokens + output_tokens) - - @staticmethod - def _get_llmobs_metrics_tags(span): - usage = {} - input_tokens = span.get_metric("anthropic.response.usage.input_tokens") - output_tokens = span.get_metric("anthropic.response.usage.output_tokens") - total_tokens = span.get_metric("anthropic.response.usage.total_tokens") - - if input_tokens is not None: - usage[INPUT_TOKENS_METRIC_KEY] = input_tokens - if output_tokens is not None: - usage[OUTPUT_TOKENS_METRIC_KEY] = output_tokens - if total_tokens is not None: - usage[TOTAL_TOKENS_METRIC_KEY] = total_tokens - return usage diff --git a/ddtrace/llmobs/_integrations/bedrock.py b/ddtrace/llmobs/_integrations/bedrock.py index ac6092cbe1a..cbc1456fc24 100644 --- a/ddtrace/llmobs/_integrations/bedrock.py +++ b/ddtrace/llmobs/_integrations/bedrock.py @@ -5,18 +5,16 @@ from ddtrace.internal.logger import get_logger from ddtrace.llmobs._constants import INPUT_MESSAGES -from ddtrace.llmobs._constants import INPUT_TOKENS_METRIC_KEY from ddtrace.llmobs._constants import METADATA from ddtrace.llmobs._constants import METRICS from ddtrace.llmobs._constants import MODEL_NAME from ddtrace.llmobs._constants import MODEL_PROVIDER from ddtrace.llmobs._constants import OUTPUT_MESSAGES -from ddtrace.llmobs._constants import OUTPUT_TOKENS_METRIC_KEY from ddtrace.llmobs._constants import PARENT_ID_KEY from ddtrace.llmobs._constants import PROPAGATED_PARENT_ID_KEY from ddtrace.llmobs._constants import SPAN_KIND -from ddtrace.llmobs._constants import TOTAL_TOKENS_METRIC_KEY from ddtrace.llmobs._integrations import BaseLLMIntegration +from ddtrace.llmobs._integrations.utils import get_llmobs_metrics_tags from ddtrace.llmobs._utils import _get_llmobs_parent_id from ddtrace.trace import Span @@ -57,22 +55,11 @@ def _llmobs_set_tags( MODEL_PROVIDER: span.get_tag("bedrock.request.model_provider") or "", INPUT_MESSAGES: input_messages, METADATA: parameters, - METRICS: self._llmobs_metrics(span, response), + METRICS: get_llmobs_metrics_tags("bedrock", span), OUTPUT_MESSAGES: output_messages, } ) - @staticmethod - def _llmobs_metrics(span: Span, response: Optional[Dict[str, Any]]) -> Dict[str, Any]: - metrics = {} - if response and response.get("text"): - prompt_tokens = int(span.get_tag("bedrock.usage.prompt_tokens") or 0) - completion_tokens = int(span.get_tag("bedrock.usage.completion_tokens") or 0) - metrics[INPUT_TOKENS_METRIC_KEY] = prompt_tokens - metrics[OUTPUT_TOKENS_METRIC_KEY] = completion_tokens - metrics[TOTAL_TOKENS_METRIC_KEY] = prompt_tokens + completion_tokens - return metrics - @staticmethod def _extract_input_message(prompt): """Extract input messages from the stored prompt. diff --git a/ddtrace/llmobs/_integrations/gemini.py b/ddtrace/llmobs/_integrations/gemini.py index ecec71e0645..0407ec7188b 100644 --- a/ddtrace/llmobs/_integrations/gemini.py +++ b/ddtrace/llmobs/_integrations/gemini.py @@ -14,7 +14,7 @@ from ddtrace.llmobs._constants import SPAN_KIND from ddtrace.llmobs._integrations.base import BaseLLMIntegration from ddtrace.llmobs._integrations.utils import extract_message_from_part_google -from ddtrace.llmobs._integrations.utils import get_llmobs_metrics_tags_google +from ddtrace.llmobs._integrations.utils import get_llmobs_metrics_tags from ddtrace.llmobs._integrations.utils import get_system_instructions_from_google_model from ddtrace.llmobs._integrations.utils import llmobs_get_metadata_google from ddtrace.llmobs._utils import _get_attr @@ -59,7 +59,7 @@ def _llmobs_set_tags( METADATA: metadata, INPUT_MESSAGES: input_messages, OUTPUT_MESSAGES: output_messages, - METRICS: get_llmobs_metrics_tags_google("google_generativeai", span), + METRICS: get_llmobs_metrics_tags("google_generativeai", span), } ) diff --git a/ddtrace/llmobs/_integrations/openai.py b/ddtrace/llmobs/_integrations/openai.py index 86b46123057..eb01a679191 100644 --- a/ddtrace/llmobs/_integrations/openai.py +++ b/ddtrace/llmobs/_integrations/openai.py @@ -20,6 +20,7 @@ from ddtrace.llmobs._constants import SPAN_KIND from ddtrace.llmobs._constants import TOTAL_TOKENS_METRIC_KEY from ddtrace.llmobs._integrations.base import BaseLLMIntegration +from ddtrace.llmobs._integrations.utils import get_llmobs_metrics_tags from ddtrace.llmobs._utils import _get_attr from ddtrace.llmobs.utils import Document from ddtrace.trace import Pin @@ -234,12 +235,4 @@ def _extract_llmobs_metrics_tags(span: Span, resp: Any) -> Dict[str, Any]: OUTPUT_TOKENS_METRIC_KEY: completion_tokens, TOTAL_TOKENS_METRIC_KEY: prompt_tokens + completion_tokens, } - prompt_tokens = span.get_metric("openai.response.usage.prompt_tokens") - completion_tokens = span.get_metric("openai.response.usage.completion_tokens") - if prompt_tokens is None or completion_tokens is None: - return {} - return { - INPUT_TOKENS_METRIC_KEY: prompt_tokens, - OUTPUT_TOKENS_METRIC_KEY: completion_tokens, - TOTAL_TOKENS_METRIC_KEY: prompt_tokens + completion_tokens, - } + return get_llmobs_metrics_tags("openai", span) diff --git a/ddtrace/llmobs/_integrations/utils.py b/ddtrace/llmobs/_integrations/utils.py index f180e0c1820..331b4e3062d 100644 --- a/ddtrace/llmobs/_integrations/utils.py +++ b/ddtrace/llmobs/_integrations/utils.py @@ -118,10 +118,29 @@ def extract_message_from_part_google(part, role=None): return message -def get_llmobs_metrics_tags_google(integration_name, span): +def get_llmobs_metrics_tags(integration_name, span): usage = {} - input_tokens = span.get_metric("%s.response.usage.prompt_tokens" % integration_name) - output_tokens = span.get_metric("%s.response.usage.completion_tokens" % integration_name) + + # bedrock integration tags usage under meta instead of metrics + if integration_name == "bedrock": + input_tokens = int(span.get_tag("bedrock.usage.prompt_tokens") or 0) + output_tokens = int(span.get_tag("bedrock.usage.completion_tokens") or 0) + total_tokens = input_tokens + output_tokens + if input_tokens: + usage[INPUT_TOKENS_METRIC_KEY] = input_tokens + if output_tokens: + usage[OUTPUT_TOKENS_METRIC_KEY] = output_tokens + if total_tokens: + usage[TOTAL_TOKENS_METRIC_KEY] = total_tokens + return usage + + # check for both prompt / completion or input / output tokens + input_tokens = span.get_metric("%s.response.usage.prompt_tokens" % integration_name) or span.get_metric( + "%s.response.usage.input_tokens" % integration_name + ) + output_tokens = span.get_metric("%s.response.usage.completion_tokens" % integration_name) or span.get_metric( + "%s.response.usage.output_tokens" % integration_name + ) total_tokens = span.get_metric("%s.response.usage.total_tokens" % integration_name) if input_tokens is not None: diff --git a/ddtrace/llmobs/_integrations/vertexai.py b/ddtrace/llmobs/_integrations/vertexai.py index 88d38f1975e..db40ac15b19 100644 --- a/ddtrace/llmobs/_integrations/vertexai.py +++ b/ddtrace/llmobs/_integrations/vertexai.py @@ -15,7 +15,7 @@ from ddtrace.llmobs._constants import SPAN_KIND from ddtrace.llmobs._integrations.base import BaseLLMIntegration from ddtrace.llmobs._integrations.utils import extract_message_from_part_google -from ddtrace.llmobs._integrations.utils import get_llmobs_metrics_tags_google +from ddtrace.llmobs._integrations.utils import get_llmobs_metrics_tags from ddtrace.llmobs._integrations.utils import get_system_instructions_from_google_model from ddtrace.llmobs._integrations.utils import llmobs_get_metadata_google from ddtrace.llmobs._utils import _get_attr @@ -65,7 +65,7 @@ def _llmobs_set_tags( METADATA: metadata, INPUT_MESSAGES: input_messages, OUTPUT_MESSAGES: output_messages, - METRICS: get_llmobs_metrics_tags_google("vertexai", span), + METRICS: get_llmobs_metrics_tags("vertexai", span), } ) From 5b422923c2f4fbfae5eeb46704e2e9cf8a161bb7 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 5 Feb 2025 10:34:24 -0500 Subject: [PATCH 57/63] chore(tracing): make ddtrace.trace.Tracer a singleton (#12209) This PR ensures an error is logged when more than one instance of the Tracer is initialized in a process. In all scenarios the global tracer must be used to trace an application. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/_trace/tracer.py | 12 +- ...-multitracer-support-ec109486f71c9c62.yaml | 4 + tests/ci_visibility/test_ci_visibility.py | 7 +- tests/ci_visibility/util.py | 3 +- tests/contrib/aiomysql/test_aiomysql.py | 8 +- tests/contrib/flask_cache/test_utils.py | 8 +- tests/contrib/tornado/test_config.py | 25 +- tests/integration/test_debug.py | 50 +-- tests/integration/test_encoding.py | 6 +- tests/integration/test_integration.py | 4 +- .../test_integration_civisibility.py | 6 +- .../integration/test_integration_snapshots.py | 2 - tests/integration/test_priority_sampling.py | 24 +- tests/integration/utils.py | 5 +- tests/profiling/collector/conftest.py | 7 +- tests/profiling_v2/collector/conftest.py | 2 +- tests/tracer/test_correlation_log_context.py | 21 +- tests/tracer/test_gitmetadata.py | 39 ++- tests/tracer/test_memory_leak.py | 58 +++- tests/tracer/test_processors.py | 22 +- .../tracer/test_single_span_sampling_rules.py | 11 +- tests/tracer/test_trace_utils.py | 25 +- tests/tracer/test_tracer.py | 304 ++++++------------ tests/utils.py | 5 +- 24 files changed, 267 insertions(+), 391 deletions(-) create mode 100644 releasenotes/notes/drop-multitracer-support-ec109486f71c9c62.yaml diff --git a/ddtrace/_trace/tracer.py b/ddtrace/_trace/tracer.py index 7030ec823d6..c8e2c96df8d 100644 --- a/ddtrace/_trace/tracer.py +++ b/ddtrace/_trace/tracer.py @@ -217,16 +217,8 @@ def __init__( if Tracer._instance is None: Tracer._instance = self else: - # ddtrace library does not support context propagation for multiple tracers. - # All instances of ddtrace ContextProviders share the same ContextVars. This means that - # if you create multiple instances of Tracer, spans will be shared between them creating a - # broken experience. - # TODO(mabdinur): Convert this warning to an ValueError in 3.0.0 - deprecate( - "Support for multiple Tracer instances is deprecated", - ". Use ddtrace.tracer instead.", - category=DDTraceDeprecationWarning, - removal_version="3.0.0", + log.error( + "Multiple Tracer instances can not be initialized. Use ``ddtrace.trace.tracer`` instead.", ) self._user_trace_processors: List[TraceProcessor] = [] diff --git a/releasenotes/notes/drop-multitracer-support-ec109486f71c9c62.yaml b/releasenotes/notes/drop-multitracer-support-ec109486f71c9c62.yaml new file mode 100644 index 00000000000..79a86b59d05 --- /dev/null +++ b/releasenotes/notes/drop-multitracer-support-ec109486f71c9c62.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + tracing: Drops support for multiple Tracer instances in the same process. Use ``ddtrace.trace.tracer`` to access the global tracer instance. \ No newline at end of file diff --git a/tests/ci_visibility/test_ci_visibility.py b/tests/ci_visibility/test_ci_visibility.py index 1db4f068c7a..778568f544e 100644 --- a/tests/ci_visibility/test_ci_visibility.py +++ b/tests/ci_visibility/test_ci_visibility.py @@ -28,6 +28,7 @@ from ddtrace.internal.ci_visibility.git_client import METADATA_UPLOAD_STATUS from ddtrace.internal.ci_visibility.git_client import CIVisibilityGitClient from ddtrace.internal.ci_visibility.git_client import CIVisibilityGitClientSerializerV1 +from ddtrace.internal.ci_visibility.recorder import CIVisibilityTracer from ddtrace.internal.ci_visibility.recorder import _extract_repository_name_from_url import ddtrace.internal.test_visibility._internal_item_ids from ddtrace.internal.utils.http import Response @@ -685,7 +686,7 @@ def test_civisibilitywriter_evp_proxy_url(self): ), mock.patch( "ddtrace.internal.agent.get_trace_url", return_value="http://evpproxy.bar:1234" ), mock.patch("ddtrace.settings._config.Config", _get_default_civisibility_ddconfig()), mock.patch( - "ddtrace.tracer", ddtrace.trace.Tracer() + "ddtrace.tracer", CIVisibilityTracer() ), mock.patch( "ddtrace.internal.ci_visibility.recorder.CIVisibility._agent_evp_proxy_is_available", return_value=True ), _dummy_noop_git_client(), mock.patch( @@ -705,7 +706,7 @@ def test_civisibilitywriter_only_traces(self): ) ), mock.patch( "ddtrace.internal.agent.get_trace_url", return_value="http://onlytraces:1234" - ), mock.patch("ddtrace.tracer", ddtrace.trace.Tracer()), mock.patch( + ), mock.patch("ddtrace.tracer", CIVisibilityTracer()), mock.patch( "ddtrace.internal.ci_visibility.recorder.CIVisibility._agent_evp_proxy_is_available", return_value=False ), mock.patch( "ddtrace.internal.ci_visibility.writer.config", ddtrace.settings.Config() @@ -1119,7 +1120,7 @@ def test_civisibility_enable_respects_passed_in_tracer(): ), _dummy_noop_git_client(), mock.patch( "ddtrace.internal.ci_visibility.recorder.ddconfig", _get_default_civisibility_ddconfig() ), mock.patch("ddtrace.internal.ci_visibility.writer.config", ddtrace.settings.Config()): - tracer = ddtrace.trace.Tracer() + tracer = CIVisibilityTracer() tracer._configure(partial_flush_enabled=False, partial_flush_min_spans=100) CIVisibility.enable(tracer=tracer) assert CIVisibility._instance.tracer._partial_flush_enabled is False diff --git a/tests/ci_visibility/util.py b/tests/ci_visibility/util.py index dc0b886ca64..f1911e20e93 100644 --- a/tests/ci_visibility/util.py +++ b/tests/ci_visibility/util.py @@ -12,6 +12,7 @@ from ddtrace.internal.ci_visibility.git_client import METADATA_UPLOAD_STATUS from ddtrace.internal.ci_visibility.git_client import CIVisibilityGitClient from ddtrace.internal.ci_visibility.recorder import CIVisibility +from ddtrace.internal.ci_visibility.recorder import CIVisibilityTracer from ddtrace.internal.test_visibility._internal_item_ids import InternalTestId from tests.utils import DummyCIVisibilityWriter from tests.utils import override_env @@ -209,5 +210,5 @@ def _ci_override_env( new_vars: t.Optional[t.Dict[str, str]] = None, mock_ci_env=False, replace_os_env=True, full_clear=False ): env_vars = _get_default_ci_env_vars(new_vars, mock_ci_env, full_clear) - with override_env(env_vars, replace_os_env=replace_os_env), mock.patch("ddtrace.tracer", ddtrace.trace.Tracer()): + with override_env(env_vars, replace_os_env=replace_os_env), mock.patch("ddtrace.tracer", CIVisibilityTracer()): yield diff --git a/tests/contrib/aiomysql/test_aiomysql.py b/tests/contrib/aiomysql/test_aiomysql.py index 8199b5c16a1..8c923b9e292 100644 --- a/tests/contrib/aiomysql/test_aiomysql.py +++ b/tests/contrib/aiomysql/test_aiomysql.py @@ -9,7 +9,6 @@ from ddtrace.contrib.internal.aiomysql.patch import unpatch from ddtrace.internal.schema import DEFAULT_SPAN_SERVICE_NAME from ddtrace.trace import Pin -from ddtrace.trace import Tracer from tests.contrib import shared_tests_async as shared_tests from tests.contrib.asyncio.utils import AsyncioTestCase from tests.contrib.asyncio.utils import mark_asyncio @@ -31,19 +30,16 @@ def patch_aiomysql(): @pytest.fixture async def patched_conn(tracer): conn = await aiomysql.connect(**AIOMYSQL_CONFIG) - Pin.get_from(conn).clone(tracer=tracer).onto(conn) yield conn conn.close() @pytest.fixture() -async def snapshot_conn(): - tracer = Tracer() +async def snapshot_conn(tracer): conn = await aiomysql.connect(**AIOMYSQL_CONFIG) - Pin.get_from(conn).clone(tracer=tracer).onto(conn) yield conn conn.close() - tracer.shutdown() + tracer.flush() @pytest.mark.asyncio diff --git a/tests/contrib/flask_cache/test_utils.py b/tests/contrib/flask_cache/test_utils.py index fc5d640b5cf..6e779d21109 100644 --- a/tests/contrib/flask_cache/test_utils.py +++ b/tests/contrib/flask_cache/test_utils.py @@ -6,7 +6,7 @@ from ddtrace.contrib.internal.flask_cache.utils import _extract_client from ddtrace.contrib.internal.flask_cache.utils import _extract_conn_tags from ddtrace.contrib.internal.flask_cache.utils import _resource_from_cache_prefix -from ddtrace.trace import Tracer +from ddtrace.trace import tracer from ..config import MEMCACHED_CONFIG from ..config import REDIS_CONFIG @@ -17,7 +17,6 @@ class FlaskCacheUtilsTest(unittest.TestCase): def test_extract_redis_connection_metadata(self): # create the TracedCache instance for a Flask app - tracer = Tracer() Cache = get_traced_cache(tracer, service=self.SERVICE) app = Flask(__name__) config = { @@ -37,7 +36,6 @@ def test_extract_redis_connection_metadata(self): def test_extract_memcached_connection_metadata(self): # create the TracedCache instance for a Flask app - tracer = Tracer() Cache = get_traced_cache(tracer, service=self.SERVICE) app = Flask(__name__) config = { @@ -56,7 +54,6 @@ def test_extract_memcached_connection_metadata(self): def test_extract_memcached_multiple_connection_metadata(self): # create the TracedCache instance for a Flask app - tracer = Tracer() Cache = get_traced_cache(tracer, service=self.SERVICE) app = Flask(__name__) config = { @@ -78,7 +75,6 @@ def test_extract_memcached_multiple_connection_metadata(self): def test_resource_from_cache_with_prefix(self): # create the TracedCache instance for a Flask app - tracer = Tracer() Cache = get_traced_cache(tracer, service=self.SERVICE) app = Flask(__name__) config = { @@ -94,7 +90,6 @@ def test_resource_from_cache_with_prefix(self): def test_resource_from_cache_with_empty_prefix(self): # create the TracedCache instance for a Flask app - tracer = Tracer() Cache = get_traced_cache(tracer, service=self.SERVICE) app = Flask(__name__) config = { @@ -110,7 +105,6 @@ def test_resource_from_cache_with_empty_prefix(self): def test_resource_from_cache_without_prefix(self): # create the TracedCache instance for a Flask app - tracer = Tracer() Cache = get_traced_cache(tracer, service=self.SERVICE) app = Flask(__name__) traced_cache = Cache(app, config={"CACHE_TYPE": "redis"}) diff --git a/tests/contrib/tornado/test_config.py b/tests/contrib/tornado/test_config.py index aaa87fcb2ec..0130db034eb 100644 --- a/tests/contrib/tornado/test_config.py +++ b/tests/contrib/tornado/test_config.py @@ -1,6 +1,5 @@ from ddtrace.trace import TraceFilter -from ddtrace.trace import Tracer -from tests.utils import DummyWriter +from tests.utils import DummyTracer from .utils import TornadoTestCase @@ -19,8 +18,7 @@ class TestTornadoSettings(TornadoTestCase): """ def get_app(self): - # Override with a real tracer - self.tracer = Tracer() + self.tracer = DummyTracer() super(TestTornadoSettings, self).get_app() def get_settings(self): @@ -40,25 +38,6 @@ def get_settings(self): }, } - def test_tracer_is_properly_configured(self): - # the tracer must be properly configured - assert self.tracer._tags.get("env") == "production" - assert self.tracer._tags.get("debug") == "false" - assert self.tracer.enabled is False - assert self.tracer.agent_trace_url == "http://dd-agent.service.consul:8126" - - writer = DummyWriter() - self.tracer._configure(enabled=True, writer=writer) - with self.tracer.trace("keep"): - pass - spans = writer.pop() - assert len(spans) == 1 - - with self.tracer.trace("drop"): - pass - spans = writer.pop() - assert len(spans) == 0 - class TestTornadoSettingsEnabled(TornadoTestCase): def get_settings(self): diff --git a/tests/integration/test_debug.py b/tests/integration/test_debug.py index 97c95507668..b2f973b1a48 100644 --- a/tests/integration/test_debug.py +++ b/tests/integration/test_debug.py @@ -3,8 +3,6 @@ import os import re import subprocess -from typing import List -from typing import Optional import mock import pytest @@ -13,11 +11,10 @@ import ddtrace._trace.sampler from ddtrace.internal import debug from ddtrace.internal.writer import AgentWriter -from ddtrace.internal.writer import TraceWriter -from ddtrace.trace import Span from tests.integration.utils import AGENT_VERSION from tests.subprocesstest import SubprocessTestCase from tests.subprocesstest import run_in_subprocess +from tests.utils import DummyTracer pytestmark = pytest.mark.skipif(AGENT_VERSION == "testagent", reason="The test agent doesn't support startup logs.") @@ -189,13 +186,12 @@ def test_trace_agent_url(self): ) ) def test_tracer_loglevel_info_connection(self): - tracer = ddtrace.trace.Tracer() logging.basicConfig(level=logging.INFO) with mock.patch.object(logging.Logger, "log") as mock_logger: # shove an unserializable object into the config log output # regression: this used to cause an exception to be raised ddtrace.config.version = AgentWriter(agent_url="foobar") - tracer._configure() + ddtrace.trace.tracer.configure() assert mock.call(logging.INFO, re_matcher("- DATADOG TRACER CONFIGURATION - ")) in mock_logger.mock_calls @run_in_subprocess( @@ -205,10 +201,9 @@ def test_tracer_loglevel_info_connection(self): ) ) def test_tracer_loglevel_info_no_connection(self): - tracer = ddtrace.trace.Tracer() logging.basicConfig(level=logging.INFO) with mock.patch.object(logging.Logger, "log") as mock_logger: - tracer._configure() + ddtrace.trace.tracer.configure() assert mock.call(logging.INFO, re_matcher("- DATADOG TRACER CONFIGURATION - ")) in mock_logger.mock_calls assert mock.call(logging.WARNING, re_matcher("- DATADOG TRACER DIAGNOSTIC - ")) in mock_logger.mock_calls @@ -219,9 +214,8 @@ def test_tracer_loglevel_info_no_connection(self): ) ) def test_tracer_log_disabled_error(self): - tracer = ddtrace.trace.Tracer() with mock.patch.object(logging.Logger, "log") as mock_logger: - tracer._configure() + ddtrace.trace.tracer._configure() assert mock_logger.mock_calls == [] @run_in_subprocess( @@ -231,9 +225,8 @@ def test_tracer_log_disabled_error(self): ) ) def test_tracer_log_disabled(self): - tracer = ddtrace.trace.Tracer() with mock.patch.object(logging.Logger, "log") as mock_logger: - tracer._configure() + ddtrace.trace.tracer._configure() assert mock_logger.mock_calls == [] @run_in_subprocess( @@ -243,9 +236,8 @@ def test_tracer_log_disabled(self): ) def test_tracer_info_level_log(self): logging.basicConfig(level=logging.INFO) - tracer = ddtrace.trace.Tracer() with mock.patch.object(logging.Logger, "log") as mock_logger: - tracer._configure() + ddtrace.trace.tracer._configure() assert mock_logger.mock_calls == [] @@ -287,16 +279,24 @@ def test_to_json(): json.dumps(info) +@pytest.mark.subprocess(env={"AWS_LAMBDA_FUNCTION_NAME": "something"}) def test_agentless(monkeypatch): - monkeypatch.setenv("AWS_LAMBDA_FUNCTION_NAME", "something") - tracer = ddtrace.trace.Tracer() - info = debug.collect(tracer) + from ddtrace.internal import debug + from ddtrace.trace import tracer + info = debug.collect(tracer) assert info.get("agent_url") == "AGENTLESS" +@pytest.mark.subprocess() def test_custom_writer(): - tracer = ddtrace.trace.Tracer() + from typing import List + from typing import Optional + + from ddtrace.internal import debug + from ddtrace.internal.writer import TraceWriter + from ddtrace.trace import Span + from ddtrace.trace import tracer class CustomWriter(TraceWriter): def recreate(self) -> TraceWriter: @@ -317,16 +317,24 @@ def flush_queue(self) -> None: assert info.get("agent_url") == "CUSTOM" +@pytest.mark.subprocess() def test_different_samplers(): - tracer = ddtrace.trace.Tracer() + import ddtrace + from ddtrace.internal import debug + from ddtrace.trace import tracer + tracer._configure(sampler=ddtrace._trace.sampler.RateSampler()) info = debug.collect(tracer) assert info.get("sampler_type") == "RateSampler" +@pytest.mark.subprocess() def test_startup_logs_sampling_rules(): - tracer = ddtrace.trace.Tracer() + import ddtrace + from ddtrace.internal import debug + from ddtrace.trace import tracer + sampler = ddtrace._trace.sampler.DatadogSampler(rules=[ddtrace._trace.sampler.SamplingRule(sample_rate=1.0)]) tracer._configure(sampler=sampler) f = debug.collect(tracer) @@ -415,7 +423,7 @@ def test_debug_span_log(): def test_partial_flush_log(): - tracer = ddtrace.trace.Tracer() + tracer = DummyTracer() tracer._configure( partial_flush_enabled=True, diff --git a/tests/integration/test_encoding.py b/tests/integration/test_encoding.py index e3f5037e7b3..ff47679af47 100644 --- a/tests/integration/test_encoding.py +++ b/tests/integration/test_encoding.py @@ -4,7 +4,7 @@ import mock import pytest -from ddtrace.trace import Tracer +from ddtrace.trace import tracer AGENT_VERSION = os.environ.get("AGENT_VERSION") @@ -12,7 +12,6 @@ class TestTraceAcceptedByAgent: def test_simple_trace_accepted_by_agent(self): - tracer = Tracer() with mock.patch("ddtrace.internal.writer.writer.log") as log: with tracer.trace("root"): for _ in range(999): @@ -32,7 +31,6 @@ def test_simple_trace_accepted_by_agent(self): ) def test_trace_with_meta_accepted_by_agent(self, tags): """Meta tags should be text types.""" - tracer = Tracer() with mock.patch("ddtrace.internal.writer.writer.log") as log: with tracer.trace("root", service="test_encoding", resource="test_resource") as root: root.set_tags(tags) @@ -53,7 +51,6 @@ def test_trace_with_meta_accepted_by_agent(self, tags): ) def test_trace_with_metrics_accepted_by_agent(self, metrics): """Metric tags should be numeric types - i.e. int, float, long (py3), and str numbers.""" - tracer = Tracer() with mock.patch("ddtrace.internal.writer.writer.log") as log: with tracer.trace("root") as root: root.set_metrics(metrics) @@ -72,7 +69,6 @@ def test_trace_with_metrics_accepted_by_agent(self, metrics): ) def test_trace_with_links_accepted_by_agent(self, span_links_kwargs): """Links should not break things.""" - tracer = Tracer() with mock.patch("ddtrace.internal.writer.writer.log") as log: with tracer.trace("root", service="test_encoding", resource="test_resource") as root: root.set_link(**span_links_kwargs) diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index 70cc84cdbfa..fd29cc18231 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -9,10 +9,10 @@ from ddtrace.internal.atexit import register_on_exit_signal from ddtrace.internal.runtime import container -from ddtrace.trace import Tracer from tests.integration.utils import import_ddtrace_in_subprocess from tests.integration.utils import parametrize_with_all_encodings from tests.integration.utils import skip_if_testagent +from tests.utils import DummyTracer from tests.utils import call_program @@ -37,7 +37,7 @@ def test_configure_keeps_api_hostname_and_port(): @mock.patch("signal.getsignal") def test_shutdown_on_exit_signal(mock_get_signal, mock_signal): mock_get_signal.return_value = None - tracer = Tracer() + tracer = DummyTracer() register_on_exit_signal(tracer._atexit) assert mock_signal.call_count == 2 assert mock_signal.call_args_list[0][0][0] == signal.SIGTERM diff --git a/tests/integration/test_integration_civisibility.py b/tests/integration/test_integration_civisibility.py index cc633d12018..9e01d47b756 100644 --- a/tests/integration/test_integration_civisibility.py +++ b/tests/integration/test_integration_civisibility.py @@ -10,7 +10,7 @@ from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_ENDPOINT from ddtrace.internal.ci_visibility.constants import EVP_SUBDOMAIN_HEADER_EVENT_VALUE from ddtrace.internal.ci_visibility.constants import EVP_SUBDOMAIN_HEADER_NAME -from ddtrace.internal.ci_visibility.recorder import CIVisibilityTracer as Tracer +from ddtrace.internal.ci_visibility.recorder import CIVisibilityTracer from tests.ci_visibility.util import _get_default_civisibility_ddconfig from tests.utils import override_env @@ -36,7 +36,7 @@ def test_civisibility_intake_with_evp_available(): with override_env( dict(DD_API_KEY="foobar.baz", DD_SITE="foo.bar", DD_CIVISIBILITY_AGENTLESS_ENABLED="0") ), mock.patch("ddtrace.internal.ci_visibility.recorder.ddconfig", _get_default_civisibility_ddconfig()): - t = Tracer() + t = CIVisibilityTracer() CIVisibility.enable(tracer=t) assert CIVisibility._instance.tracer._writer._endpoint == EVP_PROXY_AGENT_ENDPOINT assert CIVisibility._instance.tracer._writer.intake_url == agent.get_trace_url() @@ -64,7 +64,7 @@ def test_civisibility_intake_with_apikey(): with override_env( dict(DD_API_KEY="foobar.baz", DD_SITE="foo.bar", DD_CIVISIBILITY_AGENTLESS_ENABLED="1") ), mock.patch("ddtrace.internal.ci_visibility.recorder.ddconfig", _get_default_civisibility_ddconfig()): - t = Tracer() + t = CIVisibilityTracer() CIVisibility.enable(tracer=t) assert CIVisibility._instance.tracer._writer._endpoint == AGENTLESS_ENDPOINT assert CIVisibility._instance.tracer._writer.intake_url == "https://citestcycle-intake.foo.bar" diff --git a/tests/integration/test_integration_snapshots.py b/tests/integration/test_integration_snapshots.py index 0ba978fa260..eab323bf319 100644 --- a/tests/integration/test_integration_snapshots.py +++ b/tests/integration/test_integration_snapshots.py @@ -5,7 +5,6 @@ import mock import pytest -from ddtrace.trace import Tracer from ddtrace.trace import tracer from tests.integration.utils import AGENT_VERSION from tests.integration.utils import mark_snapshot @@ -214,7 +213,6 @@ def test_trace_with_wrong_meta_types_not_sent(encoding, meta, monkeypatch): def test_trace_with_wrong_metrics_types_not_sent(encoding, metrics, monkeypatch): """Wrong metric types should raise TypeErrors during encoding and fail to send to the agent.""" with override_global_config(dict(_trace_api=encoding)): - tracer = Tracer() with mock.patch("ddtrace._trace.span.log") as log: with tracer.trace("root") as root: root._metrics = metrics diff --git a/tests/integration/test_priority_sampling.py b/tests/integration/test_priority_sampling.py index 57b64a2fe5c..32fc4e0dcee 100644 --- a/tests/integration/test_priority_sampling.py +++ b/tests/integration/test_priority_sampling.py @@ -8,7 +8,7 @@ from ddtrace.internal.encoding import JSONEncoder from ddtrace.internal.encoding import MsgpackEncoderV04 as Encoder from ddtrace.internal.writer import AgentWriter -from ddtrace.trace import Tracer +from ddtrace.trace import tracer as ddtracer from tests.integration.utils import AGENT_VERSION from tests.integration.utils import parametrize_with_all_encodings from tests.integration.utils import skip_if_testagent @@ -115,18 +115,16 @@ def test_priority_sampling_response(): @pytest.mark.snapshot(agent_sample_rate_by_service={"service:test,env:": 0.9999}) def test_agent_sample_rate_keep(): """Ensure that the agent sample rate is respected when a trace is auto sampled.""" - tracer = Tracer() - # First trace won't actually have the sample rate applied since the response has not yet been received. - with tracer.trace(""): + with ddtracer.trace(""): pass # Force a flush to get the response back. - tracer.flush() + ddtracer.flush() # Subsequent traces should have the rate applied. - with tracer.trace("test", service="test") as span: + with ddtracer.trace("test", service="test") as span: pass - tracer.flush() + ddtracer.flush() assert span.get_metric("_dd.agent_psr") == pytest.approx(0.9999) assert span.get_metric("_sampling_priority_v1") == AUTO_KEEP assert span.get_tag("_dd.p.dm") == "-1" @@ -136,21 +134,17 @@ def test_agent_sample_rate_keep(): @pytest.mark.snapshot(agent_sample_rate_by_service={"service:test,env:": 0.0001}) def test_agent_sample_rate_reject(): """Ensure that the agent sample rate is respected when a trace is auto rejected.""" - from ddtrace.trace import Tracer - - tracer = Tracer() - # First trace won't actually have the sample rate applied since the response has not yet been received. - with tracer.trace(""): + with ddtracer.trace(""): pass # Force a flush to get the response back. - tracer.flush() + ddtracer.flush() # Subsequent traces should have the rate applied. - with tracer.trace("test", service="test") as span: + with ddtracer.trace("test", service="test") as span: pass - tracer.flush() + ddtracer.flush() assert span.get_metric("_dd.agent_psr") == pytest.approx(0.0001) assert span.get_metric("_sampling_priority_v1") == AUTO_REJECT assert span.get_tag("_dd.p.dm") == "-1" diff --git a/tests/integration/utils.py b/tests/integration/utils.py index 5b87161e2d0..53640d82b57 100644 --- a/tests/integration/utils.py +++ b/tests/integration/utils.py @@ -5,8 +5,6 @@ import mock import pytest -from ddtrace.trace import Tracer - AGENT_VERSION = os.environ.get("AGENT_VERSION") @@ -28,7 +26,8 @@ def encode_traces(self, traces): def send_invalid_payload_and_get_logs(encoder_cls=BadEncoder): - t = Tracer() + from ddtrace.trace import tracer as t + for client in t._writer._clients: client.encoder = encoder_cls() with mock.patch("ddtrace.internal.writer.writer.log") as log: diff --git a/tests/profiling/collector/conftest.py b/tests/profiling/collector/conftest.py index a774b20f7da..a53ac79bcad 100644 --- a/tests/profiling/collector/conftest.py +++ b/tests/profiling/collector/conftest.py @@ -2,12 +2,13 @@ import ddtrace from ddtrace.profiling import Profiler +from tests.utils import override_global_config @pytest.fixture -def tracer(monkeypatch): - monkeypatch.setenv("DD_TRACE_STARTUP_LOGS", "0") - return ddtrace.trace.Tracer() +def tracer(): + with override_global_config(dict(_startup_logs_enabled=False)): + yield ddtrace.trace.tracer @pytest.fixture diff --git a/tests/profiling_v2/collector/conftest.py b/tests/profiling_v2/collector/conftest.py index 311c286c11e..7dc1d816091 100644 --- a/tests/profiling_v2/collector/conftest.py +++ b/tests/profiling_v2/collector/conftest.py @@ -5,4 +5,4 @@ @pytest.fixture def tracer(): - return ddtrace.trace.Tracer() + return ddtrace.trace.tracer diff --git a/tests/tracer/test_correlation_log_context.py b/tests/tracer/test_correlation_log_context.py index b7200b8b38f..e2e5dda6b37 100644 --- a/tests/tracer/test_correlation_log_context.py +++ b/tests/tracer/test_correlation_log_context.py @@ -1,8 +1,8 @@ import pytest from ddtrace import config -from ddtrace.trace import Tracer from ddtrace.trace import tracer +from tests.utils import DummyTracer def global_config(config): @@ -10,7 +10,7 @@ def global_config(config): config.env = "test-env" config.version = "test-version" global tracer - tracer = Tracer() + tracer = DummyTracer() yield config.service = config.env = config.version = None @@ -33,9 +33,9 @@ def format_trace_id(span): @pytest.mark.subprocess() def test_get_log_correlation_service(): """Ensure expected DDLogRecord service is generated via get_correlation_log_record.""" - from ddtrace.trace import Tracer from ddtrace.trace import tracer from tests.tracer.test_correlation_log_context import format_trace_id + from tests.utils import DummyTracer from tests.utils import override_global_config with override_global_config(dict(service="test-service", env="test-env", version="test-version")): @@ -49,7 +49,7 @@ def test_get_log_correlation_service(): "version": "test-version", } - test_tracer = Tracer() + test_tracer = DummyTracer() with test_tracer.trace("test-span-2", service="span-service") as span2: dd_log_record = test_tracer.get_log_correlation_context() assert dd_log_record == { @@ -65,12 +65,12 @@ def test_get_log_correlation_service(): def test_get_log_correlation_context_basic(): """Ensure expected DDLogRecord is generated via get_correlation_log_record.""" from ddtrace.trace import Context - from ddtrace.trace import Tracer from tests.tracer.test_correlation_log_context import format_trace_id + from tests.utils import DummyTracer from tests.utils import override_global_config with override_global_config(dict(service="test-service", env="test-env", version="test-version")): - tracer = Tracer() + tracer = DummyTracer() with tracer.trace("test-span-1") as span1: dd_log_record = tracer.get_log_correlation_context() assert dd_log_record == { @@ -80,7 +80,7 @@ def test_get_log_correlation_context_basic(): "env": "test-env", "version": "test-version", }, dd_log_record - test_tracer = Tracer() + test_tracer = DummyTracer() with test_tracer.trace("test-span-2") as span2: dd_log_record = test_tracer.get_log_correlation_context() assert dd_log_record == { @@ -130,9 +130,9 @@ def test_get_log_correlation_context_opentracer(): @pytest.mark.subprocess() def test_get_log_correlation_context_no_active_span(): """Ensure empty DDLogRecord generated if no active span.""" - from ddtrace.trace import Tracer + from tests.utils import DummyTracer - tracer = Tracer() + tracer = DummyTracer() dd_log_record = tracer.get_log_correlation_context() assert dd_log_record == { "span_id": "0", @@ -146,9 +146,8 @@ def test_get_log_correlation_context_no_active_span(): @pytest.mark.subprocess() def test_get_log_correlation_context_disabled_tracer(): """Ensure get_correlation_log_record returns None if tracer is disabled.""" - from ddtrace.trace import Tracer + from ddtrace.trace import tracer - tracer = Tracer() tracer.enabled = False with tracer.trace("test-span"): dd_log_record = tracer.get_log_correlation_context() diff --git a/tests/tracer/test_gitmetadata.py b/tests/tracer/test_gitmetadata.py index cb03d59f7e2..d6c35a2de0c 100644 --- a/tests/tracer/test_gitmetadata.py +++ b/tests/tracer/test_gitmetadata.py @@ -8,10 +8,9 @@ import pytest -import ddtrace from ddtrace.internal import gitmetadata from tests.subprocesstest import run_in_subprocess -from tests.utils import DummyWriter +from tests.utils import DummyTracer from tests.utils import TracerTestCase @@ -44,8 +43,8 @@ class GitMetadataTestCase(TracerTestCase): ) ) def test_gitmetadata_from_package(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -59,8 +58,8 @@ def test_gitmetadata_from_package(self): ) ) def test_gitmetadata_from_DD_TAGS(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -80,8 +79,8 @@ def test_gitmetadata_from_DD_TAGS(self): ) ) def test_gitmetadata_from_ENV(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -104,8 +103,8 @@ def test_gitmetadata_from_ENV(self): ) ) def test_gitmetadata_disabled(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -123,8 +122,8 @@ def test_gitmetadata_disabled(self): ) ) def test_gitmetadata_package_without_metadata(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -143,8 +142,8 @@ def test_gitmetadata_package_without_metadata(self): ) ) def test_gitmetadata_from_env_filtering_https(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -163,8 +162,8 @@ def test_gitmetadata_from_env_filtering_https(self): ) ) def test_gitmetadata_from_ddtags_filtering_https(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -184,8 +183,8 @@ def test_gitmetadata_from_ddtags_filtering_https(self): ) ) def test_gitmetadata_from_env_filtering_ssh(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass @@ -204,8 +203,8 @@ def test_gitmetadata_from_env_filtering_ssh(self): ) ) def test_gitmetadata_from_ddtags_filtering_ssh(self): - tracer = ddtrace.trace.Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() + with tracer.trace("span") as s: pass diff --git a/tests/tracer/test_memory_leak.py b/tests/tracer/test_memory_leak.py index 7fdcd7589f6..b13cc0ec4ee 100644 --- a/tests/tracer/test_memory_leak.py +++ b/tests/tracer/test_memory_leak.py @@ -1,28 +1,21 @@ """ Variety of test cases ensuring that ddtrace does not leak memory. """ - -import gc -from threading import Thread -from typing import TYPE_CHECKING from weakref import WeakValueDictionary import pytest +from ddtrace.trace import Span from ddtrace.trace import Tracer - - -if TYPE_CHECKING: # pragma: no cover - from ddtrace.trace import Span # noqa:F401 +from tests.utils import DummyTracer @pytest.fixture -def tracer() -> Tracer: - return Tracer() +def tracer() -> DummyTracer: + return DummyTracer() -def trace(weakdict: WeakValueDictionary, tracer: Tracer, *args, **kwargs): - # type: (...) -> Span +def trace(weakdict: WeakValueDictionary, tracer: Tracer, *args, **kwargs) -> Span: """Return a span created from ``tracer`` and add it to the given weak dictionary. @@ -34,7 +27,14 @@ def trace(weakdict: WeakValueDictionary, tracer: Tracer, *args, **kwargs): return s -def test_leak(tracer): +@pytest.mark.subprocess +def test_leak(): + import gc + from weakref import WeakValueDictionary + + from ddtrace.trace import tracer + from tests.tracer.test_memory_leak import trace + wd = WeakValueDictionary() with trace(wd, tracer, "span1") as span: with trace(wd, tracer, "span2") as span2: @@ -44,15 +44,23 @@ def test_leak(tracer): # The spans are still open and referenced so they should not be gc'd gc.collect() assert len(wd) == 2 + tracer.flush() del span, span2 gc.collect() assert len(wd) == 0 -def test_single_thread_single_trace(tracer): +@pytest.mark.subprocess +def test_single_thread_single_trace(): """ Ensure a simple trace doesn't leak span objects. """ + import gc + from weakref import WeakValueDictionary + + from ddtrace.trace import tracer + from tests.tracer.test_memory_leak import trace + wd = WeakValueDictionary() with trace(wd, tracer, "span1"): with trace(wd, tracer, "span2"): @@ -64,10 +72,17 @@ def test_single_thread_single_trace(tracer): assert len(wd) == 0 -def test_single_thread_multi_trace(tracer): +@pytest.mark.subprocess +def test_single_thread_multi_trace(): """ Ensure a trace in a thread is properly garbage collected. """ + import gc + from weakref import WeakValueDictionary + + from ddtrace.trace import tracer + from tests.tracer.test_memory_leak import trace + wd = WeakValueDictionary() for _ in range(1000): with trace(wd, tracer, "span1"): @@ -75,17 +90,25 @@ def test_single_thread_multi_trace(tracer): pass with trace(wd, tracer, "span3"): pass - + tracer.flush() # Once these references are deleted then the spans should no longer be # referenced by anything and should be gc'd. gc.collect() assert len(wd) == 0 -def test_multithread_trace(tracer): +@pytest.mark.subprocess +def test_multithread_trace(): """ Ensure a trace that crosses thread boundaries is properly garbage collected. """ + import gc + from threading import Thread + from weakref import WeakValueDictionary + + from ddtrace.trace import tracer + from tests.tracer.test_memory_leak import trace + wd = WeakValueDictionary() state = [] @@ -102,6 +125,7 @@ def _target(ctx): # Ensure thread finished successfully assert state == [1] + tracer.flush() del span gc.collect() assert len(wd) == 0 diff --git a/tests/tracer/test_processors.py b/tests/tracer/test_processors.py index ff19453555b..8c9955f9ffd 100644 --- a/tests/tracer/test_processors.py +++ b/tests/tracer/test_processors.py @@ -26,7 +26,6 @@ from ddtrace.internal.telemetry.constants import TELEMETRY_NAMESPACE from ddtrace.trace import Context from ddtrace.trace import Span -from ddtrace.trace import Tracer from tests.utils import DummyTracer from tests.utils import DummyWriter from tests.utils import override_global_config @@ -244,7 +243,7 @@ def test_aggregator_partial_flush_2_spans(): def test_trace_top_level_span_processor_partial_flushing(): """Parent span and child span have the same service name""" - tracer = Tracer() + tracer = DummyTracer() tracer._configure( partial_flush_enabled=True, partial_flush_min_spans=2, @@ -271,8 +270,7 @@ def test_trace_top_level_span_processor_partial_flushing(): def test_trace_top_level_span_processor_same_service_name(): """Parent span and child span have the same service name""" - tracer = Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() with tracer.trace("parent", service="top_level_test") as parent: with tracer.trace("child") as child: @@ -285,8 +283,7 @@ def test_trace_top_level_span_processor_same_service_name(): def test_trace_top_level_span_processor_different_service_name(): """Parent span and child span have the different service names""" - tracer = Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() with tracer.trace("parent", service="top_level_test_service") as parent: with tracer.trace("child", service="top_level_test_service2") as child: @@ -299,8 +296,7 @@ def test_trace_top_level_span_processor_different_service_name(): def test_trace_top_level_span_processor_orphan_span(): """Trace chuck does not contain parent span""" - tracer = Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() with tracer.trace("parent") as parent: pass @@ -388,7 +384,7 @@ def test_span_creation_metrics(): def test_changing_tracer_sampler_changes_tracesamplingprocessor_sampler(): """Changing the tracer sampler should change the sampling processor's sampler""" - tracer = Tracer() + tracer = DummyTracer() # get processor for aggregator in tracer._deferred_processors: if type(aggregator) is SpanAggregator: @@ -632,9 +628,8 @@ def test_endpoint_call_counter_processor_disabled(): def test_endpoint_call_counter_processor_real_tracer(): - tracer = Tracer() + tracer = DummyTracer() tracer._endpoint_call_counter_span_processor.enable() - tracer._configure(writer=DummyWriter()) with tracer.trace("parent", service="top_level_test_service", resource="a", span_type=SpanTypes.WEB): with tracer.trace("child", service="top_level_test_service2"): @@ -656,8 +651,7 @@ def test_endpoint_call_counter_processor_real_tracer(): def test_trace_tag_processor_adds_chunk_root_tags(): - tracer = Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() with tracer.trace("parent") as parent: with tracer.trace("child") as child: @@ -679,7 +673,7 @@ def on_span_finish(self, span): tp = TestProcessor() tp.register() - tracer = Tracer() + tracer = DummyTracer() with tracer.trace("test") as span: assert span.get_tag("on_start") == "ok" diff --git a/tests/tracer/test_single_span_sampling_rules.py b/tests/tracer/test_single_span_sampling_rules.py index ef33ecfd619..7fcd0ef7a54 100644 --- a/tests/tracer/test_single_span_sampling_rules.py +++ b/tests/tracer/test_single_span_sampling_rules.py @@ -10,9 +10,7 @@ from ddtrace.internal.sampling import SpanSamplingRule from ddtrace.internal.sampling import _get_file_json from ddtrace.internal.sampling import get_span_sampling_rules -from ddtrace.trace import Tracer from tests.utils import DummyTracer -from tests.utils import DummyWriter from ..utils import override_global_config @@ -129,8 +127,7 @@ def test_env_rules_cause_matching_span_to_be_sampled(): sampling_rules = get_span_sampling_rules() assert sampling_rules[0]._service_matcher.pattern == "test_service" assert sampling_rules[0]._name_matcher.pattern == "test_name" - tracer = Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() span = traced_function(sampling_rules[0], tracer=tracer) assert_sampling_decision_tags(span) @@ -141,8 +138,7 @@ def test_env_rules_dont_cause_non_matching_span_to_be_sampled(): sampling_rules = get_span_sampling_rules() assert sampling_rules[0]._service_matcher.pattern == "test_ser" assert sampling_rules[0]._name_matcher.pattern == "test_na" - tracer = Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() span = traced_function(sampling_rules[0], tracer=tracer) assert_sampling_decision_tags(span, sample_rate=None, mechanism=None, limit=None) @@ -153,8 +149,7 @@ def test_single_span_rules_not_applied_when_span_sampled_by_trace_sampling(): sampling_rules = get_span_sampling_rules() assert sampling_rules[0]._service_matcher.pattern == "test_service" assert sampling_rules[0]._name_matcher.pattern == "test_name" - tracer = Tracer() - tracer._configure(writer=DummyWriter()) + tracer = DummyTracer() span = traced_function(sampling_rules[0], tracer=tracer, trace_sampling=True) assert sampling_rules[0].match(span) is True assert_sampling_decision_tags(span, sample_rate=None, mechanism=None, limit=None, trace_sampling=True) diff --git a/tests/tracer/test_trace_utils.py b/tests/tracer/test_trace_utils.py index ca564cac394..6820b0c4d76 100644 --- a/tests/tracer/test_trace_utils.py +++ b/tests/tracer/test_trace_utils.py @@ -28,7 +28,6 @@ from ddtrace.trace import Context from ddtrace.trace import Pin from ddtrace.trace import Span -from ddtrace.trace import Tracer from tests.appsec.utils import asm_context from tests.utils import override_global_config @@ -277,9 +276,8 @@ def test_int_service(int_config, pin, config_val, default, global_service, expec assert trace_utils.int_service(pin, int_config.myint, default) == expected -def test_int_service_integration(int_config): +def test_int_service_integration(int_config, tracer): pin = Pin() - tracer = Tracer() assert trace_utils.int_service(pin, int_config.myint) == "tests.tracer" with override_global_config(dict(service="global-svc")): @@ -905,8 +903,7 @@ def test_distributed_tracing_enabled(int_config, props, default, expected): assert trace_utils.distributed_tracing_enabled(int_config.myint, **kwargs) == expected, (props, default, expected) -def test_activate_distributed_headers_enabled(int_config): - tracer = Tracer() +def test_activate_distributed_headers_enabled(int_config, tracer): int_config.myint["distributed_tracing_enabled"] = True headers = { HTTP_HEADER_PARENT_ID: "12345", @@ -925,8 +922,7 @@ def test_activate_distributed_headers_enabled(int_config): assert context.span_id == 12345 -def test_activate_distributed_headers_disabled(int_config): - tracer = Tracer() +def test_activate_distributed_headers_disabled(int_config, tracer): int_config.myint["distributed_tracing_enabled"] = False headers = { HTTP_HEADER_PARENT_ID: "12345", @@ -941,16 +937,14 @@ def test_activate_distributed_headers_disabled(int_config): assert tracer.context_provider.active() is None -def test_activate_distributed_headers_no_headers(int_config): - tracer = Tracer() +def test_activate_distributed_headers_no_headers(int_config, tracer): int_config.myint["distributed_tracing_enabled"] = True trace_utils.activate_distributed_headers(tracer, int_config=int_config.myint, request_headers=None) assert tracer.context_provider.active() is None -def test_activate_distributed_headers_override_true(int_config): - tracer = Tracer() +def test_activate_distributed_headers_override_true(int_config, tracer): int_config.myint["distributed_tracing_enabled"] = False headers = { HTTP_HEADER_PARENT_ID: "12345", @@ -964,8 +958,7 @@ def test_activate_distributed_headers_override_true(int_config): assert context.span_id == 12345 -def test_activate_distributed_headers_override_false(int_config): - tracer = Tracer() +def test_activate_distributed_headers_override_false(int_config, tracer): int_config.myint["distributed_tracing_enabled"] = True headers = { HTTP_HEADER_PARENT_ID: "12345", @@ -977,8 +970,7 @@ def test_activate_distributed_headers_override_false(int_config): assert tracer.context_provider.active() is None -def test_activate_distributed_headers_existing_context(int_config): - tracer = Tracer() +def test_activate_distributed_headers_existing_context(int_config, tracer): int_config.myint["distributed_tracing_enabled"] = True headers = { @@ -993,8 +985,7 @@ def test_activate_distributed_headers_existing_context(int_config): assert tracer.context_provider.active() == ctx -def test_activate_distributed_headers_existing_context_different_trace_id(int_config): - tracer = Tracer() +def test_activate_distributed_headers_existing_context_different_trace_id(int_config, tracer): int_config.myint["distributed_tracing_enabled"] = True headers = { diff --git a/tests/tracer/test_tracer.py b/tests/tracer/test_tracer.py index 1aa1c42bf1d..85d8be52a36 100644 --- a/tests/tracer/test_tracer.py +++ b/tests/tracer/test_tracer.py @@ -9,7 +9,6 @@ from os import getpid import threading from unittest.case import SkipTest -import weakref import mock import pytest @@ -30,8 +29,7 @@ from ddtrace.constants import VERSION_KEY from ddtrace.contrib.internal.trace_utils import set_user from ddtrace.ext import user -from ddtrace.internal._encoding import MsgpackEncoderV04 -from ddtrace.internal._encoding import MsgpackEncoderV05 +import ddtrace.internal from ddtrace.internal.compat import PYTHON_VERSION_INFO from ddtrace.internal.rate_limiter import RateLimiter from ddtrace.internal.serverless import has_aws_lambda_agent_extension @@ -40,8 +38,9 @@ from ddtrace.internal.writer import LogWriter from ddtrace.settings import Config from ddtrace.trace import Context -from ddtrace.trace import Tracer +from ddtrace.trace import tracer as global_tracer from tests.subprocesstest import run_in_subprocess +from tests.utils import DummyTracer from tests.utils import TracerTestCase from tests.utils import override_global_config @@ -485,32 +484,6 @@ def test_adding_mapped_services(self): pass assert self.tracer._services == set(["one", "three"]) - def test_configure_dogstatsd_url_host_port(self): - tracer = Tracer() - tracer._configure(dogstatsd_url="foo:1234") - assert tracer._writer.dogstatsd.host == "foo" - assert tracer._writer.dogstatsd.port == 1234 - - tracer = Tracer() - writer = AgentWriter("http://localhost:8126") - tracer._configure(writer=writer, dogstatsd_url="foo:1234") - assert tracer._writer.dogstatsd.host == "foo" - assert tracer._writer.dogstatsd.port == 1234 - - def test_configure_dogstatsd_url_socket(self): - tracer = Tracer() - tracer._configure(dogstatsd_url="unix:///foo.sock") - assert tracer._writer.dogstatsd.host is None - assert tracer._writer.dogstatsd.port is None - assert tracer._writer.dogstatsd.socket_path == "/foo.sock" - - tracer = Tracer() - writer = AgentWriter("http://localhost:8126") - tracer._configure(writer=writer, dogstatsd_url="unix:///foo.sock") - assert tracer._writer.dogstatsd.host is None - assert tracer._writer.dogstatsd.port is None - assert tracer._writer.dogstatsd.socket_path == "/foo.sock" - def test_tracer_set_user(self): with self.trace("fake_span") as span: set_user( @@ -637,34 +610,17 @@ def test_tracer_set_user_propagation_string_error(self): @pytest.mark.subprocess(env=dict(DD_AGENT_PORT="", DD_AGENT_HOST="", DD_TRACE_AGENT_URL="")) def test_tracer_url(): - import pytest - import ddtrace - t = ddtrace.trace.Tracer() - assert t._writer.agent_url == "http://localhost:8126" - - t = ddtrace.trace.Tracer(url="http://foobar:12") - assert t._writer.agent_url == "http://foobar:12" - - t = ddtrace.trace.Tracer(url="unix:///foobar") - assert t._writer.agent_url == "unix:///foobar" - - t = ddtrace.trace.Tracer(url="http://localhost") - assert t._writer.agent_url == "http://localhost" - - t = ddtrace.trace.Tracer(url="https://localhost") - assert t._writer.agent_url == "https://localhost" - - with pytest.raises(ValueError) as e: - ddtrace.trace.Tracer(url="foo://foobar:12") - assert ( - str(e.value) == "Unsupported protocol 'foo' in intake URL 'foo://foobar:12'. Must be one of: http, https, unix" - ) + assert ddtrace.trace.tracer._writer.agent_url == "http://localhost:8126" +@pytest.mark.subprocess() def test_tracer_shutdown_no_timeout(): - t = ddtrace.trace.Tracer() + import mock + + from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer as t with mock.patch.object(AgentWriter, "stop") as mock_stop: with mock.patch.object(AgentWriter, "join") as mock_join: @@ -674,8 +630,12 @@ def test_tracer_shutdown_no_timeout(): mock_join.assert_not_called() +@pytest.mark.subprocess() def test_tracer_configure_writer_stop_unstarted(): - t = ddtrace.trace.Tracer() + import mock + + from ddtrace.trace import tracer as t + t._writer = mock.Mock(wraps=t._writer) orig_writer = t._writer @@ -684,8 +644,12 @@ def test_tracer_configure_writer_stop_unstarted(): assert orig_writer.stop.called +@pytest.mark.subprocess() def test_tracer_configure_writer_stop_started(): - t = ddtrace.trace.Tracer() + import mock + + from ddtrace.trace import tracer as t + t._writer = mock.Mock(wraps=t._writer) orig_writer = t._writer @@ -697,8 +661,12 @@ def test_tracer_configure_writer_stop_started(): orig_writer.stop.assert_called_once_with() +@pytest.mark.subprocess() def test_tracer_shutdown_timeout(): - t = ddtrace.trace.Tracer() + import mock + + from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer as t with mock.patch.object(AgentWriter, "stop") as mock_stop: with t.trace("something"): @@ -709,7 +677,11 @@ def test_tracer_shutdown_timeout(): def test_tracer_shutdown(): - t = ddtrace.trace.Tracer() + import mock + + from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer as t + t.shutdown() with mock.patch.object(AgentWriter, "write") as mock_write: @@ -720,7 +692,12 @@ def test_tracer_shutdown(): def test_tracer_shutdown_warning(): - t = ddtrace.trace.Tracer() + import logging + + import mock + + from ddtrace.trace import tracer as t + t.shutdown() with mock.patch.object(logging.Logger, "warning") as mock_logger: @@ -734,30 +711,6 @@ def test_tracer_shutdown_warning(): ) -def test_tracer_dogstatsd_url(): - t = ddtrace.trace.Tracer() - assert t._writer.dogstatsd.host == "localhost" - assert t._writer.dogstatsd.port == 8125 - - t = ddtrace.trace.Tracer(dogstatsd_url="foobar:12") - assert t._writer.dogstatsd.host == "foobar" - assert t._writer.dogstatsd.port == 12 - - t = ddtrace.trace.Tracer(dogstatsd_url="udp://foobar:12") - assert t._writer.dogstatsd.host == "foobar" - assert t._writer.dogstatsd.port == 12 - - t = ddtrace.trace.Tracer(dogstatsd_url="/var/run/statsd.sock") - assert t._writer.dogstatsd.socket_path == "/var/run/statsd.sock" - - t = ddtrace.trace.Tracer(dogstatsd_url="unix:///var/run/statsd.sock") - assert t._writer.dogstatsd.socket_path == "/var/run/statsd.sock" - - with pytest.raises(ValueError) as e: - t = ddtrace.trace.Tracer(dogstatsd_url="foo://foobar:12") - assert str(e) == "Unknown url format for `foo://foobar:12`" - - @pytest.mark.skip(reason="Fails to Pickle RateLimiter in the Tracer") @pytest.mark.subprocess def test_tracer_fork(): @@ -811,7 +764,7 @@ def task(t, errors): def test_tracer_with_version(): - t = ddtrace.trace.Tracer() + t = DummyTracer() # With global `config.version` defined with override_global_config(dict(version="1.2.3")): @@ -838,7 +791,7 @@ def test_tracer_with_version(): def test_tracer_with_env(): - t = ddtrace.trace.Tracer() + t = DummyTracer() # With global `config.env` defined with override_global_config(dict(env="prod")): @@ -960,33 +913,13 @@ def test_version_service_mapping(self): def test_detect_agentless_env_with_lambda(self): assert in_aws_lambda() assert not has_aws_lambda_agent_extension() - tracer = Tracer() - assert isinstance(tracer._writer, LogWriter) - tracer._configure(enabled=True) - assert isinstance(tracer._writer, LogWriter) - - @run_in_subprocess(env_overrides=dict(AWS_LAMBDA_FUNCTION_NAME="my-func")) - def test_detect_agent_config_with_lambda_extension(self): - def mock_os_path_exists(path): - return path == "/opt/extensions/datadog-agent" - - assert in_aws_lambda() - - with mock.patch("os.path.exists", side_effect=mock_os_path_exists): - assert has_aws_lambda_agent_extension() - - tracer = Tracer() - assert isinstance(tracer._writer, AgentWriter) - assert tracer._writer._sync_mode - - tracer._configure(enabled=False) - assert isinstance(tracer._writer, AgentWriter) - assert tracer._writer._sync_mode + assert isinstance(ddtrace.tracer._writer, LogWriter) + ddtrace.tracer._configure(enabled=True) + assert isinstance(ddtrace.tracer._writer, LogWriter) @run_in_subprocess(env_overrides=dict(AWS_LAMBDA_FUNCTION_NAME="my-func", DD_AGENT_HOST="localhost")) def test_detect_agent_config(self): - tracer = Tracer() - assert isinstance(tracer._writer, AgentWriter) + assert isinstance(global_tracer._writer, AgentWriter) @run_in_subprocess(env_overrides=dict(DD_TAGS="key1:value1,key2:value2")) def test_dd_tags(self): @@ -1001,7 +934,7 @@ def test_dd_tags_invalid(self): @run_in_subprocess(env_overrides=dict(DD_TAGS="service:mysvc,env:myenv,version:myvers")) def test_tags_from_DD_TAGS(self): - t = ddtrace.trace.Tracer() + t = DummyTracer() with t.trace("test") as s: assert s.service == "mysvc" assert s.get_tag("env") == "myenv" @@ -1016,33 +949,29 @@ def test_tags_from_DD_TAGS(self): ) ) def test_tags_from_DD_TAGS_precedence(self): - t = ddtrace.trace.Tracer() - with t.trace("test") as s: + with global_tracer.trace("test") as s: assert s.service == "svc" assert s.get_tag("env") == "env" assert s.get_tag("version") == "0.123" @run_in_subprocess(env_overrides=dict(DD_TAGS="service:mysvc,env:myenv,version:myvers")) def test_tags_from_DD_TAGS_override(self): - t = ddtrace.trace.Tracer() ddtrace.config.env = "env" ddtrace.config.service = "service" ddtrace.config.version = "0.123" - with t.trace("test") as s: + with global_tracer.trace("test") as s: assert s.service == "service" assert s.get_tag("env") == "env" assert s.get_tag("version") == "0.123" def test_tracer_set_runtime_tags(): - t = ddtrace.trace.Tracer() - with t.start_span("foobar") as span: + with global_tracer.start_span("foobar") as span: pass assert len(span.get_tag("runtime-id")) - t2 = ddtrace.trace.Tracer() - with t2.start_span("foobaz") as span2: + with global_tracer.start_span("foobaz") as span2: pass assert span.get_tag("runtime-id") == span2.get_tag("runtime-id") @@ -1084,7 +1013,7 @@ def test_tracer_runtime_tags_cross_execution(tracer): def test_start_span_hooks(): - t = ddtrace.trace.Tracer() + t = DummyTracer() result = {} @@ -1099,7 +1028,7 @@ def store_span(span): def test_deregister_start_span_hooks(): - t = ddtrace.trace.Tracer() + t = DummyTracer() result = {} @@ -1119,9 +1048,8 @@ def store_span(span): def test_enable(): import os - import ddtrace + from ddtrace.trace import tracer as t2 - t2 = ddtrace.trace.Tracer() if os.environ["DD_TRACE_ENABLED"] == "true": assert t2.enabled else: @@ -1170,7 +1098,7 @@ def thread_target(): def test_runtime_id_parent_only(): - tracer = ddtrace.trace.Tracer() + tracer = DummyTracer() # Parent spans should have runtime-id with tracer.trace("test") as s: @@ -1221,18 +1149,6 @@ def test_runtime_id_fork(): assert exit_code == 12 -def test_multiple_tracer_ctx(): - t1 = ddtrace.trace.Tracer() - t2 = ddtrace.trace.Tracer() - - with t1.trace("") as s1: - with t2.trace("") as s2: - pass - - assert s2.parent_id == s1.span_id - assert s2.trace_id == s1.trace_id - - def test_filters(tracer, test_spans): class FilterAll(object): def process_trace(self, trace): @@ -1413,12 +1329,10 @@ def _test_partial_flush(self): def test_unicode_config_vals(): - t = ddtrace.trace.Tracer() - with override_global_config(dict(version="😇", env="😇")): - with t.trace("1"): + with global_tracer.trace("1"): pass - t.shutdown() + global_tracer.flush() def test_ctx(tracer, test_spans): @@ -1664,45 +1578,25 @@ def override_service_mapping(service_mapping): ddtrace.config.service_mapping = {} # Test single mapping - with override_service_mapping("foo:bar"), ddtrace.trace.Tracer().trace("renaming", service="foo") as span: + with override_service_mapping("foo:bar"), global_tracer.trace("renaming", service="foo") as span: assert span.service == "bar" # Test multiple mappings - with override_service_mapping("foo:bar,sna:fu"), ddtrace.trace.Tracer().trace("renaming", service="sna") as span: + with override_service_mapping("foo:bar,sna:fu"), global_tracer.trace("renaming", service="sna") as span: assert span.service == "fu" # Test colliding mappings - with override_service_mapping("foo:bar,foo:foobar"), ddtrace.trace.Tracer().trace( - "renaming", service="foo" - ) as span: + with override_service_mapping("foo:bar,foo:foobar"), global_tracer.trace("renaming", service="foo") as span: assert span.service == "foobar" # Test invalid service mapping with override_service_mapping("foo;bar,sna:fu"): - with ddtrace.trace.Tracer().trace("passthru", service="foo") as _: + with global_tracer.trace("passthru", service="foo") as _: assert _.service == "foo" - with ddtrace.trace.Tracer().trace("renaming", "sna") as _: + with global_tracer.trace("renaming", "sna") as _: assert _.service == "fu" -@pytest.mark.subprocess(env=dict(DD_AGENT_PORT="", DD_AGENT_HOST="", DD_TRACE_AGENT_URL="")) -def test_configure_url_partial(): - import ddtrace - - tracer = ddtrace.trace.Tracer() - tracer._configure(hostname="abc") - assert tracer._writer.agent_url == "http://abc:8126" - tracer._configure(port=123) - assert tracer._writer.agent_url == "http://abc:123" - - tracer = ddtrace.trace.Tracer(url="http://abc") - assert tracer._writer.agent_url == "http://abc" - tracer._configure(port=123) - assert tracer._writer.agent_url == "http://abc:123" - tracer._configure(port=431) - assert tracer._writer.agent_url == "http://abc:431" - - @pytest.mark.subprocess(env={"DD_TRACE_AGENT_URL": "bad://localhost:1234"}) def test_bad_agent_url(): import pytest @@ -1910,16 +1804,16 @@ def test_fork_pid(): assert exit_code == 12 +@pytest.mark.subprocess def test_tracer_api_version(): - t = Tracer() - assert isinstance(t._writer._encoder, MsgpackEncoderV05) + from ddtrace.internal.encoding import MsgpackEncoderV05 + from ddtrace.trace import tracer as t - t._configure(api_version="v0.4") - assert isinstance(t._writer._encoder, MsgpackEncoderV04) + assert isinstance(t._writer._encoder, MsgpackEncoderV05) -@pytest.mark.parametrize("enabled", [True, False]) -def test_tracer_memory_leak_span_processors(enabled): +@pytest.mark.subprocess(parametrize={"DD_TRACE_ENABLED": ["true", "false"]}) +def test_tracer_memory_leak_span_processors(): """ Test whether the tracer or span processors will hold onto span references after the trace is complete. @@ -1927,16 +1821,20 @@ def test_tracer_memory_leak_span_processors(enabled): This is a regression test for the tracer not calling on_span_finish of SpanAggregator when the tracer was disabled and traces leaking. """ + import gc + import weakref + + from ddtrace.trace import TraceFilter + from ddtrace.trace import tracer as t + spans = weakref.WeakSet() # Filter to ensure we don't send the traces to the writer - class DropAllFilter: + class DropAllFilter(TraceFilter): def process_trace(self, trace): return None - t = Tracer() - t.enabled = enabled - t._configure(trace_processors=[DropAllFilter()]) + t.configure(trace_processors=[DropAllFilter()]) for _ in range(5): with t.trace("test") as span: @@ -1944,6 +1842,7 @@ def process_trace(self, trace): # Be sure to dereference the last Span held by the local variable `span` span = None + t.flush() # Force gc gc.collect() @@ -1984,11 +1883,9 @@ def test_finish_span_with_ancestors(tracer): assert span3.finished -def test_ctx_api(): +def test_ctx_api(tracer): from ddtrace.internal import core - tracer = Tracer() - assert core.get_item("key") is None with tracer.trace("root") as span: @@ -2019,7 +1916,7 @@ def test_asm_standalone_configuration(sca_enabled, appsec_enabled, iast_enabled) with override_env({"DD_APPSEC_SCA_ENABLED": sca_enabled}): ddtrace.config._reset() - tracer = ddtrace.trace.Tracer() + tracer = DummyTracer() tracer._configure(appsec_enabled=appsec_enabled, iast_enabled=iast_enabled, appsec_standalone_enabled=True) if sca_enabled == "true": assert bool(ddtrace.config._sca_enabled) is True @@ -2038,10 +1935,9 @@ def test_asm_standalone_configuration(sca_enabled, appsec_enabled, iast_enabled) def test_gc_not_used_on_root_spans(): - tracer = ddtrace.trace.Tracer() gc.freeze() - with tracer.trace("test-event"): + with ddtrace.tracer.trace("test-event"): pass # There should be no more span objects lingering around. @@ -2057,25 +1953,39 @@ def test_gc_not_used_on_root_spans(): # print("--------------------") +@pytest.mark.subprocess(env=dict(AWS_LAMBDA_FUNCTION_NAME="my-func")) +def test_detect_agent_config_with_lambda_extension(): + import mock + + def mock_os_path_exists(path): + return path == "/opt/extensions/datadog-agent" + + with mock.patch("os.path.exists", side_effect=mock_os_path_exists): + import ddtrace + from ddtrace.internal.writer import AgentWriter + from ddtrace.trace import tracer + + assert ddtrace.internal.serverless.in_aws_lambda() + + assert ddtrace.internal.serverless.has_aws_lambda_agent_extension() + + assert isinstance(tracer._writer, AgentWriter) + assert tracer._writer._sync_mode + + tracer._configure(enabled=False) + assert isinstance(tracer._writer, AgentWriter) + assert tracer._writer._sync_mode + + @pytest.mark.subprocess() def test_multiple_tracer_instances(): - import warnings + import mock - with warnings.catch_warnings(record=True) as warns: - warnings.simplefilter("always") - import ddtrace + import ddtrace - assert ddtrace.tracer is not None - for w in warns: - # Ensure the warning is not about multiple tracer instances is not logged when importing ddtrace - assert "Support for multiple Tracer instances is deprecated" not in str(w.message) - - warns.clear() - t = ddtrace.trace.Tracer() - # TODO: Update this assertion when the deprecation is removed and the tracer becomes a singleton - assert t is not ddtrace.tracer - assert len(warns) == 1 - assert ( - str(warns[0].message) == "Support for multiple Tracer instances is deprecated and will be " - "removed in version '3.0.0'. Use ddtrace.tracer instead." - ) + assert ddtrace.trace.tracer is not None + with mock.patch("ddtrace._trace.tracer.log") as log: + ddtrace.trace.Tracer() + log.error.assert_called_once_with( + "Multiple Tracer instances can not be initialized. " "Use ``ddtrace.trace.tracer`` instead." + ) diff --git a/tests/utils.py b/tests/utils.py index bc7acd68b84..5d94598ec4b 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -127,6 +127,7 @@ def override_global_config(values): "_x_datadog_tags_max_length", "_128_bit_trace_id_enabled", "_x_datadog_tags_enabled", + "_startup_logs_enabled", "_propagate_service", "env", "version", @@ -649,8 +650,8 @@ def configure(self, *args, **kwargs): self._configure(*args, **kwargs) def _configure(self, *args, **kwargs): - assert "writer" not in kwargs or isinstance( - kwargs["writer"], DummyWriterMixin + assert isinstance( + kwargs.get("writer"), (DummyWriterMixin, type(None)) ), "cannot configure writer of DummyTracer" if not kwargs.get("writer"): From 8f8aebe2e4387f4d9ab26d5f6e38563149ab2541 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Wed, 5 Feb 2025 16:46:13 +0100 Subject: [PATCH 58/63] chore(iast): update xss release note (#12228) An update in the XSS release note ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml b/releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml index db470196b36..c29e9f49936 100644 --- a/releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml +++ b/releasenotes/notes/iast-feat-xss-django-6781a8b9a4092832.yaml @@ -1,6 +1,6 @@ --- features: - | - Code Security (IAST): XSS detection for Django applications, + Code Security (IAST): XSS detection for Django applications and Jinja2 (Flask and FastAPI applications), which will be displayed on your DataDog Vulnerability Explorer dashboard. See the `Application Vulnerability Management `_ documentation for more information about this feature. From 135ae7ce157dba342640384b8833d1c0bc17516b Mon Sep 17 00:00:00 2001 From: Zachary Groves <32471391+ZStriker19@users.noreply.github.com> Date: Wed, 5 Feb 2025 15:20:27 -0500 Subject: [PATCH 59/63] feat: add valkey instrumentation support (#12060) **This PR is the work of [AhmadMasry](https://github.com/AhmadMasry)** Moving from https://github.com/DataDog/dd-trace-py/pull/12003 since we have issues running certain tests on forked repos. The Valkey instrumentation is based on the current implementation of the Redis instrumentation, but keeping into consideration that the two projects may deviate and lose compatibility, the Valkey instrumentation is created as a separated module. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: AhmadMasry Co-authored-by: Ahmad Al-Masry <33571825+AhmadMasry@users.noreply.github.com> Co-authored-by: Munir Abdinur --- .github/COMMIT_TEMPLATE.txt | 2 +- .gitlab/services.yml | 6 + .riot/requirements/11ac941.txt | 26 + .riot/requirements/1e98e9b.txt | 26 + .riot/requirements/4aa2a2a.txt | 22 + .riot/requirements/7219cf4.txt | 21 + .riot/requirements/b96b665.txt | 21 + .riot/requirements/dd68acc.txt | 24 + ddtrace/_monkey.py | 1 + ddtrace/_trace/trace_handlers.py | 8 + ddtrace/_trace/utils_valkey.py | 96 +++ .../contrib/internal/valkey/asyncio_patch.py | 36 + ddtrace/contrib/internal/valkey/patch.py | 223 +++++++ ddtrace/contrib/internal/valkey_utils.py | 84 +++ ddtrace/contrib/valkey/__init__.py | 68 ++ ddtrace/ext/__init__.py | 2 + ddtrace/ext/valkey.py | 14 + docker-compose.yml | 18 + docs/index.rst | 2 + docs/integrations.rst | 7 + docs/spelling_wordlist.txt | 1 + min_compatible_versions.csv | 1 + .../add-valkey-support-6cc9f41351dc0cd9.yaml | 3 + riotfile.py | 10 + supported_versions_output.json | 6 + supported_versions_table.csv | 1 + tests/contrib/config.py | 10 + tests/contrib/suitespec.yml | 21 + tests/contrib/valkey/__init__.py | 0 tests/contrib/valkey/test_valkey.py | 615 ++++++++++++++++++ tests/contrib/valkey/test_valkey_asyncio.py | 221 +++++++ tests/contrib/valkey/test_valkey_cluster.py | 209 ++++++ .../valkey/test_valkey_cluster_asyncio.py | 457 +++++++++++++ tests/contrib/valkey/test_valkey_patch.py | 31 + ....test_valkey.test_analytics_with_rate.json | 38 ++ ...st_valkey.test_analytics_without_rate.json | 38 ++ ...ontrib.valkey.test_valkey.test_basics.json | 37 ++ ...ey.test_valkey.test_custom_cmd_length.json | 37 ++ ...est_valkey.test_custom_cmd_length_env.json | 37 ++ ...est_env_user_specified_valkey_service.json | 74 +++ ....test_full_command_in_resource_config.json | 71 ++ ...key.test_full_command_in_resource_env.json | 71 ++ ....valkey.test_valkey.test_long_command.json | 37 ++ ...valkey.test_valkey.test_meta_override.json | 38 ++ ...b.valkey.test_valkey.test_opentracing.json | 56 ++ ...y.test_valkey.test_pipeline_immediate.json | 72 ++ ...lkey.test_valkey.test_pipeline_traced.json | 36 + ...y.test_valkey.test_service_precedence.json | 37 ++ ...ntrib.valkey.test_valkey.test_unicode.json | 37 ++ ...st_valkey.test_user_specified_service.json | 37 ++ ...est_valkey_asyncio.test_basic_request.json | 37 ++ ....test_valkey_asyncio.test_client_name.json | 57 ++ ..._valkey_asyncio.test_connection_error.json | 40 ++ ...y_asyncio.test_decoding_non_utf8_args.json | 73 +++ ....test_decoding_non_utf8_pipeline_args.json | 36 + ...test_valkey_asyncio.test_long_command.json | 37 ++ ...ey_asyncio.test_override_service_name.json | 110 ++++ ...ey.test_valkey_asyncio.test_parenting.json | 85 +++ ...b.valkey.test_valkey_asyncio.test_pin.json | 37 ++ ...t_valkey_asyncio.test_pipeline_traced.json | 36 + ...ne_traced_context_manager_transaction.json | 36 + ...key_asyncio.test_two_traced_pipelines.json | 84 +++ ...t_valkey_asyncio.test_unicode_request.json | 37 ++ 63 files changed, 3750 insertions(+), 1 deletion(-) create mode 100644 .riot/requirements/11ac941.txt create mode 100644 .riot/requirements/1e98e9b.txt create mode 100644 .riot/requirements/4aa2a2a.txt create mode 100644 .riot/requirements/7219cf4.txt create mode 100644 .riot/requirements/b96b665.txt create mode 100644 .riot/requirements/dd68acc.txt create mode 100644 ddtrace/_trace/utils_valkey.py create mode 100644 ddtrace/contrib/internal/valkey/asyncio_patch.py create mode 100644 ddtrace/contrib/internal/valkey/patch.py create mode 100644 ddtrace/contrib/internal/valkey_utils.py create mode 100644 ddtrace/contrib/valkey/__init__.py create mode 100644 ddtrace/ext/valkey.py create mode 100644 releasenotes/notes/add-valkey-support-6cc9f41351dc0cd9.yaml create mode 100644 tests/contrib/valkey/__init__.py create mode 100644 tests/contrib/valkey/test_valkey.py create mode 100644 tests/contrib/valkey/test_valkey_asyncio.py create mode 100644 tests/contrib/valkey/test_valkey_cluster.py create mode 100644 tests/contrib/valkey/test_valkey_cluster_asyncio.py create mode 100644 tests/contrib/valkey/test_valkey_patch.py create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_with_rate.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_without_rate.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_basics.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length_env.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_env_user_specified_valkey_service.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_config.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_env.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_long_command.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_meta_override.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_opentracing.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_immediate.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_traced.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_service_precedence.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_unicode.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey.test_user_specified_service.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_basic_request.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_client_name.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_connection_error.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_args.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_pipeline_args.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_long_command.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_override_service_name.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_parenting.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pin.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced_context_manager_transaction.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_two_traced_pipelines.json create mode 100644 tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_unicode_request.json diff --git a/.github/COMMIT_TEMPLATE.txt b/.github/COMMIT_TEMPLATE.txt index f6e418cc2e8..55dc46d5378 100644 --- a/.github/COMMIT_TEMPLATE.txt +++ b/.github/COMMIT_TEMPLATE.txt @@ -29,5 +29,5 @@ feat/fix/docs/refactor/ci(xxx): commit title here # mysqlpython, openai, opentelemetry, opentracer, profile, psycopg, pylibmc, pymemcache, # pymongo, pymysql, pynamodb, pyodbc, pyramid, pytest, redis, rediscluster, requests, rq, # sanic, snowflake, sourcecode, sqlalchemy, starlette, stdlib, structlog, subprocess, -# telemetry, test_logging, tornado, tracer, unittest, urllib3, vendor, vertica, wsgi, +# telemetry, test_logging, tornado, tracer, unittest, urllib3, valkey, vendor, vertica, wsgi, # yaaredis diff --git a/.gitlab/services.yml b/.gitlab/services.yml index 0282dd9e9d0..3eb29af107a 100644 --- a/.gitlab/services.yml +++ b/.gitlab/services.yml @@ -28,6 +28,9 @@ redis: name: registry.ddbuild.io/redis:7.0.7 alias: redis + valkey: + name: registry.ddbuild.io/images/mirror/valkey:8.0-alpine + alias: valkey kafka: name: registry.ddbuild.io/images/mirror/apache/kafka:3.8.0 alias: kafka @@ -54,6 +57,9 @@ rediscluster: name: registry.ddbuild.io/images/mirror/grokzen/redis-cluster:6.2.0 alias: rediscluster + valkeycluster: + name: registry.ddbuild.io/images/mirror/grokzen/redis-cluster:6.2.0 + alias: valkeycluster elasticsearch: name: registry.ddbuild.io/images/mirror/library/elasticsearch:7.17.23 alias: elasticsearch diff --git a/.riot/requirements/11ac941.txt b/.riot/requirements/11ac941.txt new file mode 100644 index 00000000000..92df617ba6e --- /dev/null +++ b/.riot/requirements/11ac941.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/11ac941.in +# +async-timeout==5.0.1 +attrs==24.3.0 +coverage[toml]==7.6.1 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 +pytest-asyncio==0.23.7 +pytest-cov==5.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.15.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +valkey==6.0.2 +zipp==3.20.2 diff --git a/.riot/requirements/1e98e9b.txt b/.riot/requirements/1e98e9b.txt new file mode 100644 index 00000000000..6e2d11413c3 --- /dev/null +++ b/.riot/requirements/1e98e9b.txt @@ -0,0 +1,26 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/1e98e9b.in +# +async-timeout==5.0.1 +attrs==24.3.0 +coverage[toml]==7.6.10 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +importlib-metadata==8.5.0 +iniconfig==2.0.0 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 +pytest-asyncio==0.23.7 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +valkey==6.0.2 +zipp==3.21.0 diff --git a/.riot/requirements/4aa2a2a.txt b/.riot/requirements/4aa2a2a.txt new file mode 100644 index 00000000000..6bc72515b3f --- /dev/null +++ b/.riot/requirements/4aa2a2a.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/4aa2a2a.in +# +async-timeout==5.0.1 +attrs==24.3.0 +coverage[toml]==7.6.10 +hypothesis==6.45.0 +iniconfig==2.0.0 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 +pytest-asyncio==0.23.7 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +valkey==6.0.2 diff --git a/.riot/requirements/7219cf4.txt b/.riot/requirements/7219cf4.txt new file mode 100644 index 00000000000..ffb631b7bcb --- /dev/null +++ b/.riot/requirements/7219cf4.txt @@ -0,0 +1,21 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/7219cf4.in +# +attrs==24.3.0 +coverage[toml]==7.6.10 +hypothesis==6.45.0 +iniconfig==2.0.0 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 +pytest-asyncio==0.23.7 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +valkey==6.0.2 diff --git a/.riot/requirements/b96b665.txt b/.riot/requirements/b96b665.txt new file mode 100644 index 00000000000..8b14d5cb8ec --- /dev/null +++ b/.riot/requirements/b96b665.txt @@ -0,0 +1,21 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/b96b665.in +# +attrs==24.3.0 +coverage[toml]==7.6.10 +hypothesis==6.45.0 +iniconfig==2.0.0 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 +pytest-asyncio==0.23.7 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +valkey==6.0.2 diff --git a/.riot/requirements/dd68acc.txt b/.riot/requirements/dd68acc.txt new file mode 100644 index 00000000000..8eda9971324 --- /dev/null +++ b/.riot/requirements/dd68acc.txt @@ -0,0 +1,24 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --no-annotate .riot/requirements/dd68acc.in +# +async-timeout==5.0.1 +attrs==24.3.0 +coverage[toml]==7.6.10 +exceptiongroup==1.2.2 +hypothesis==6.45.0 +iniconfig==2.0.0 +mock==5.1.0 +opentracing==2.4.0 +packaging==24.2 +pluggy==1.5.0 +pytest==8.3.4 +pytest-asyncio==0.23.7 +pytest-cov==6.0.0 +pytest-mock==3.14.0 +pytest-randomly==3.16.0 +sortedcontainers==2.4.0 +tomli==2.2.1 +valkey==6.0.2 diff --git a/ddtrace/_monkey.py b/ddtrace/_monkey.py index fad8c8f4d2b..9261af555d7 100644 --- a/ddtrace/_monkey.py +++ b/ddtrace/_monkey.py @@ -105,6 +105,7 @@ "unittest": True, "coverage": False, "selenium": True, + "valkey": True, } diff --git a/ddtrace/_trace/trace_handlers.py b/ddtrace/_trace/trace_handlers.py index e0d99c0d020..d636a89c187 100644 --- a/ddtrace/_trace/trace_handlers.py +++ b/ddtrace/_trace/trace_handlers.py @@ -688,6 +688,11 @@ def _on_redis_command_post(ctx: core.ExecutionContext, rowcount): ctx.span.set_metric(db.ROWCOUNT, rowcount) +def _on_valkey_command_post(ctx: core.ExecutionContext, rowcount): + if rowcount is not None: + ctx.span.set_metric(db.ROWCOUNT, rowcount) + + def _on_test_visibility_enable(config) -> None: from ddtrace.internal.ci_visibility import CIVisibility @@ -797,6 +802,8 @@ def listen(): core.on("botocore.kinesis.GetRecords.post", _on_botocore_kinesis_getrecords_post) core.on("redis.async_command.post", _on_redis_command_post) core.on("redis.command.post", _on_redis_command_post) + core.on("valkey.async_command.post", _on_valkey_command_post) + core.on("valkey.command.post", _on_valkey_command_post) core.on("azure.functions.request_call_modifier", _on_azure_functions_request_span_modifier) core.on("azure.functions.start_response", _on_azure_functions_start_response) @@ -838,6 +845,7 @@ def listen(): "botocore.patched_stepfunctions_api_call", "botocore.patched_bedrock_api_call", "redis.command", + "valkey.command", "rq.queue.enqueue_job", "rq.traced_queue_fetch_job", "rq.worker.perform_job", diff --git a/ddtrace/_trace/utils_valkey.py b/ddtrace/_trace/utils_valkey.py new file mode 100644 index 00000000000..ed996e885a3 --- /dev/null +++ b/ddtrace/_trace/utils_valkey.py @@ -0,0 +1,96 @@ +""" +Some utils used by the dogtrace valkey integration +""" + +from contextlib import contextmanager +from typing import List +from typing import Optional + +from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY +from ddtrace.constants import _SPAN_MEASURED_KEY +from ddtrace.constants import SPAN_KIND +from ddtrace.contrib import trace_utils +from ddtrace.contrib.internal.valkey_utils import _extract_conn_tags +from ddtrace.ext import SpanKind +from ddtrace.ext import SpanTypes +from ddtrace.ext import db +from ddtrace.ext import valkey as valkeyx +from ddtrace.internal import core +from ddtrace.internal.constants import COMPONENT +from ddtrace.internal.schema import schematize_cache_operation +from ddtrace.internal.utils.formats import stringify_cache_args + + +format_command_args = stringify_cache_args + + +def _set_span_tags( + span, pin, config_integration, args: Optional[List], instance, query: Optional[List], is_cluster: bool = False +): + span.set_tag_str(SPAN_KIND, SpanKind.CLIENT) + span.set_tag_str(COMPONENT, config_integration.integration_name) + span.set_tag_str(db.SYSTEM, valkeyx.APP) + span.set_tag(_SPAN_MEASURED_KEY) + if query is not None: + span_name = schematize_cache_operation(valkeyx.RAWCMD, cache_provider=valkeyx.APP) # type: ignore[operator] + span.set_tag_str(span_name, query) + if pin.tags: + span.set_tags(pin.tags) + # some valkey clients do not have a connection_pool attribute (ex. aiovalkey v1.3) + if not is_cluster and hasattr(instance, "connection_pool"): + span.set_tags(_extract_conn_tags(instance.connection_pool.connection_kwargs)) + if args is not None: + span.set_metric(valkeyx.ARGS_LEN, len(args)) + else: + for attr in ("command_stack", "_command_stack"): + if hasattr(instance, attr): + span.set_metric(valkeyx.PIPELINE_LEN, len(getattr(instance, attr))) + # set analytics sample rate if enabled + span.set_tag(_ANALYTICS_SAMPLE_RATE_KEY, config_integration.get_analytics_sample_rate()) + + +@contextmanager +def _instrument_valkey_cmd(pin, config_integration, instance, args): + query = stringify_cache_args(args, cmd_max_len=config_integration.cmd_max_length) + with core.context_with_data( + "valkey.command", + span_name=schematize_cache_operation(valkeyx.CMD, cache_provider=valkeyx.APP), + pin=pin, + service=trace_utils.ext_service(pin, config_integration), + span_type=SpanTypes.VALKEY, + resource=query.split(" ")[0] if config_integration.resource_only_command else query, + ) as ctx, ctx.span as span: + _set_span_tags(span, pin, config_integration, args, instance, query) + yield ctx + + +@contextmanager +def _instrument_valkey_execute_pipeline(pin, config_integration, cmds, instance, is_cluster=False): + cmd_string = resource = "\n".join(cmds) + if config_integration.resource_only_command: + resource = "\n".join([cmd.split(" ")[0] for cmd in cmds]) + + with pin.tracer.trace( + schematize_cache_operation(valkeyx.CMD, cache_provider=valkeyx.APP), + resource=resource, + service=trace_utils.ext_service(pin, config_integration), + span_type=SpanTypes.VALKEY, + ) as span: + _set_span_tags(span, pin, config_integration, None, instance, cmd_string) + yield span + + +@contextmanager +def _instrument_valkey_execute_async_cluster_pipeline(pin, config_integration, cmds, instance): + cmd_string = resource = "\n".join(cmds) + if config_integration.resource_only_command: + resource = "\n".join([cmd.split(" ")[0] for cmd in cmds]) + + with pin.tracer.trace( + schematize_cache_operation(valkeyx.CMD, cache_provider=valkeyx.APP), + resource=resource, + service=trace_utils.ext_service(pin, config_integration), + span_type=SpanTypes.VALKEY, + ) as span: + _set_span_tags(span, pin, config_integration, None, instance, cmd_string) + yield span diff --git a/ddtrace/contrib/internal/valkey/asyncio_patch.py b/ddtrace/contrib/internal/valkey/asyncio_patch.py new file mode 100644 index 00000000000..b8d15a7c603 --- /dev/null +++ b/ddtrace/contrib/internal/valkey/asyncio_patch.py @@ -0,0 +1,36 @@ +from ddtrace import config +from ddtrace._trace.utils_valkey import _instrument_valkey_cmd +from ddtrace._trace.utils_valkey import _instrument_valkey_execute_async_cluster_pipeline +from ddtrace._trace.utils_valkey import _instrument_valkey_execute_pipeline +from ddtrace.contrib.internal.valkey_utils import _run_valkey_command_async +from ddtrace.internal.utils.formats import stringify_cache_args +from ddtrace.trace import Pin + + +async def instrumented_async_execute_command(func, instance, args, kwargs): + pin = Pin.get_from(instance) + if not pin or not pin.enabled(): + return await func(*args, **kwargs) + + with _instrument_valkey_cmd(pin, config.valkey, instance, args) as ctx: + return await _run_valkey_command_async(ctx=ctx, func=func, args=args, kwargs=kwargs) + + +async def instrumented_async_execute_pipeline(func, instance, args, kwargs): + pin = Pin.get_from(instance) + if not pin or not pin.enabled(): + return await func(*args, **kwargs) + + cmds = [stringify_cache_args(c, cmd_max_len=config.valkey.cmd_max_length) for c, _ in instance.command_stack] + with _instrument_valkey_execute_pipeline(pin, config.valkey, cmds, instance): + return await func(*args, **kwargs) + + +async def instrumented_async_execute_cluster_pipeline(func, instance, args, kwargs): + pin = Pin.get_from(instance) + if not pin or not pin.enabled(): + return await func(*args, **kwargs) + + cmds = [stringify_cache_args(c.args, cmd_max_len=config.valkey.cmd_max_length) for c in instance._command_stack] + with _instrument_valkey_execute_async_cluster_pipeline(pin, config.valkey, cmds, instance): + return await func(*args, **kwargs) diff --git a/ddtrace/contrib/internal/valkey/patch.py b/ddtrace/contrib/internal/valkey/patch.py new file mode 100644 index 00000000000..7de63f947c1 --- /dev/null +++ b/ddtrace/contrib/internal/valkey/patch.py @@ -0,0 +1,223 @@ +""" +The valkey integration traces valkey requests. + + +Enabling +~~~~~~~~ + +The valkey integration is enabled automatically when using +:ref:`ddtrace-run` or :ref:`import ddtrace.auto`. + +Or use :func:`patch()` to manually enable the integration:: + + from ddtrace import patch + patch(valkey=True) + + +Global Configuration +~~~~~~~~~~~~~~~~~~~~ + +.. py:data:: ddtrace.config.valkey["service"] + + The service name reported by default for valkey traces. + + This option can also be set with the ``DD_VALKEY_SERVICE`` environment + variable. + + Default: ``"valkey"`` + + +.. py:data:: ddtrace.config.valkey["cmd_max_length"] + + Max allowable size for the valkey command span tag. + Anything beyond the max length will be replaced with ``"..."``. + + This option can also be set with the ``DD_VALKEY_CMD_MAX_LENGTH`` environment + variable. + + Default: ``1000`` + + +.. py:data:: ddtrace.config.valkey["resource_only_command"] + + The span resource will only include the command executed. To include all + arguments in the span resource, set this value to ``False``. + + This option can also be set with the ``DD_VALKEY_RESOURCE_ONLY_COMMAND`` environment + variable. + + Default: ``True`` + + +Instance Configuration +~~~~~~~~~~~~~~~~~~~~~~ + +To configure particular valkey instances use the :class:`Pin ` API:: + + import valkey + from ddtrace.trace import Pin + + client = valkey.StrictValkey(host="localhost", port=6379) + + # Override service name for this instance + Pin.override(client, service="my-custom-queue") + + # Traces reported for this client will now have "my-custom-queue" + # as the service name. + client.get("my-key") +""" +import os + +import valkey +import wrapt + +from ddtrace import config +from ddtrace._trace.utils_valkey import _instrument_valkey_cmd +from ddtrace._trace.utils_valkey import _instrument_valkey_execute_pipeline +from ddtrace.contrib.internal.valkey_utils import ROW_RETURNING_COMMANDS +from ddtrace.contrib.internal.valkey_utils import determine_row_count +from ddtrace.contrib.trace_utils import unwrap +from ddtrace.internal import core +from ddtrace.internal.schema import schematize_service_name +from ddtrace.internal.utils.formats import CMD_MAX_LEN +from ddtrace.internal.utils.formats import asbool +from ddtrace.internal.utils.formats import stringify_cache_args +from ddtrace.trace import Pin + + +config._add( + "valkey", + { + "_default_service": schematize_service_name("valkey"), + "cmd_max_length": int(os.getenv("DD_VALKEY_CMD_MAX_LENGTH", CMD_MAX_LEN)), + "resource_only_command": asbool(os.getenv("DD_VALKEY_RESOURCE_ONLY_COMMAND", True)), + }, +) + + +def get_version(): + # type: () -> str + return getattr(valkey, "__version__", "") + + +def patch(): + """Patch the instrumented methods + + This duplicated doesn't look nice. The nicer alternative is to use an ObjectProxy on top + of Valkey and StrictValkey. However, it means that any "import valkey.Valkey" won't be instrumented. + """ + if getattr(valkey, "_datadog_patch", False): + return + valkey._datadog_patch = True + + _w = wrapt.wrap_function_wrapper + + from .asyncio_patch import instrumented_async_execute_cluster_pipeline + from .asyncio_patch import instrumented_async_execute_command + from .asyncio_patch import instrumented_async_execute_pipeline + + _w("valkey", "Valkey.execute_command", instrumented_execute_command(config.valkey)) + _w("valkey", "Valkey.pipeline", instrumented_pipeline) + _w("valkey.client", "Pipeline.execute", instrumented_execute_pipeline(config.valkey, False)) + _w("valkey.client", "Pipeline.immediate_execute_command", instrumented_execute_command(config.valkey)) + _w("valkey.cluster", "ValkeyCluster.execute_command", instrumented_execute_command(config.valkey)) + _w("valkey.cluster", "ValkeyCluster.pipeline", instrumented_pipeline) + _w("valkey.cluster", "ClusterPipeline.execute", instrumented_execute_pipeline(config.valkey, True)) + Pin(service=None).onto(valkey.cluster.ValkeyCluster) + + _w("valkey.asyncio.client", "Valkey.execute_command", instrumented_async_execute_command) + _w("valkey.asyncio.client", "Valkey.pipeline", instrumented_pipeline) + _w("valkey.asyncio.client", "Pipeline.execute", instrumented_async_execute_pipeline) + _w("valkey.asyncio.client", "Pipeline.immediate_execute_command", instrumented_async_execute_command) + Pin(service=None).onto(valkey.asyncio.Valkey) + + _w("valkey.asyncio.cluster", "ValkeyCluster.execute_command", instrumented_async_execute_command) + _w("valkey.asyncio.cluster", "ValkeyCluster.pipeline", instrumented_pipeline) + _w("valkey.asyncio.cluster", "ClusterPipeline.execute", instrumented_async_execute_cluster_pipeline) + Pin(service=None).onto(valkey.asyncio.ValkeyCluster) + + Pin(service=None).onto(valkey.StrictValkey) + + +def unpatch(): + if getattr(valkey, "_datadog_patch", False): + valkey._datadog_patch = False + + unwrap(valkey.Valkey, "execute_command") + unwrap(valkey.Valkey, "pipeline") + unwrap(valkey.client.Pipeline, "execute") + unwrap(valkey.client.Pipeline, "immediate_execute_command") + unwrap(valkey.cluster.ValkeyCluster, "execute_command") + unwrap(valkey.cluster.ValkeyCluster, "pipeline") + unwrap(valkey.cluster.ClusterPipeline, "execute") + unwrap(valkey.asyncio.client.Valkey, "execute_command") + unwrap(valkey.asyncio.client.Valkey, "pipeline") + unwrap(valkey.asyncio.client.Pipeline, "execute") + unwrap(valkey.asyncio.client.Pipeline, "immediate_execute_command") + unwrap(valkey.asyncio.cluster.ValkeyCluster, "execute_command") + unwrap(valkey.asyncio.cluster.ValkeyCluster, "pipeline") + unwrap(valkey.asyncio.cluster.ClusterPipeline, "execute") + + +def _run_valkey_command(ctx: core.ExecutionContext, func, args, kwargs): + parsed_command = stringify_cache_args(args) + valkey_command = parsed_command.split(" ")[0] + rowcount = None + result = None + try: + result = func(*args, **kwargs) + return result + except Exception: + rowcount = 0 + raise + finally: + if rowcount is None: + rowcount = determine_row_count(valkey_command=valkey_command, result=result) + if valkey_command not in ROW_RETURNING_COMMANDS: + rowcount = None + core.dispatch("valkey.command.post", [ctx, rowcount]) + + +# +# tracing functions +# +def instrumented_execute_command(integration_config): + def _instrumented_execute_command(func, instance, args, kwargs): + pin = Pin.get_from(instance) + if not pin or not pin.enabled(): + return func(*args, **kwargs) + + with _instrument_valkey_cmd(pin, integration_config, instance, args) as ctx: + return _run_valkey_command(ctx=ctx, func=func, args=args, kwargs=kwargs) + + return _instrumented_execute_command + + +def instrumented_pipeline(func, instance, args, kwargs): + pipeline = func(*args, **kwargs) + pin = Pin.get_from(instance) + if pin: + pin.onto(pipeline) + return pipeline + + +def instrumented_execute_pipeline(integration_config, is_cluster=False): + def _instrumented_execute_pipeline(func, instance, args, kwargs): + pin = Pin.get_from(instance) + if not pin or not pin.enabled(): + return func(*args, **kwargs) + + if is_cluster: + cmds = [ + stringify_cache_args(c.args, cmd_max_len=integration_config.cmd_max_length) + for c in instance.command_stack + ] + else: + cmds = [ + stringify_cache_args(c, cmd_max_len=integration_config.cmd_max_length) + for c, _ in instance.command_stack + ] + with _instrument_valkey_execute_pipeline(pin, integration_config, cmds, instance, is_cluster): + return func(*args, **kwargs) + + return _instrumented_execute_pipeline diff --git a/ddtrace/contrib/internal/valkey_utils.py b/ddtrace/contrib/internal/valkey_utils.py new file mode 100644 index 00000000000..8518dbe648a --- /dev/null +++ b/ddtrace/contrib/internal/valkey_utils.py @@ -0,0 +1,84 @@ +from typing import Dict +from typing import List +from typing import Optional +from typing import Union + +from ddtrace.ext import net +from ddtrace.ext import valkey as valkeyx +from ddtrace.internal import core +from ddtrace.internal.utils.formats import stringify_cache_args + + +SINGLE_KEY_COMMANDS = [ + "GET", + "GETDEL", + "GETEX", + "GETRANGE", + "GETSET", + "LINDEX", + "LRANGE", + "RPOP", + "LPOP", + "HGET", + "HGETALL", + "HKEYS", + "HMGET", + "HRANDFIELD", + "HVALS", +] +MULTI_KEY_COMMANDS = ["MGET"] +ROW_RETURNING_COMMANDS = SINGLE_KEY_COMMANDS + MULTI_KEY_COMMANDS + + +def _extract_conn_tags(conn_kwargs): + """Transform valkey conn info into dogtrace metas""" + try: + conn_tags = { + net.TARGET_HOST: conn_kwargs["host"], + net.TARGET_PORT: conn_kwargs["port"], + net.SERVER_ADDRESS: conn_kwargs["host"], + valkeyx.DB: conn_kwargs.get("db") or 0, + } + client_name = conn_kwargs.get("client_name") + if client_name: + conn_tags[valkeyx.CLIENT_NAME] = client_name + return conn_tags + except Exception: + return {} + + +def determine_row_count(valkey_command: str, result: Optional[Union[List, Dict, str]]) -> int: + empty_results = [b"", [], {}, None] + # result can be an empty list / dict / string + if result not in empty_results: + if valkey_command == "MGET": + # only include valid key results within count + result = [x for x in result if x not in empty_results] + return len(result) + elif valkey_command == "HMGET": + # only include valid key results within count + result = [x for x in result if x not in empty_results] + return 1 if len(result) > 0 else 0 + else: + return 1 + else: + return 0 + + +async def _run_valkey_command_async(ctx: core.ExecutionContext, func, args, kwargs): + parsed_command = stringify_cache_args(args) + valkey_command = parsed_command.split(" ")[0] + rowcount = None + result = None + try: + result = await func(*args, **kwargs) + return result + except BaseException: + rowcount = 0 + raise + finally: + if rowcount is None: + rowcount = determine_row_count(valkey_command=valkey_command, result=result) + if valkey_command not in ROW_RETURNING_COMMANDS: + rowcount = None + core.dispatch("valkey.async_command.post", [ctx, rowcount]) diff --git a/ddtrace/contrib/valkey/__init__.py b/ddtrace/contrib/valkey/__init__.py new file mode 100644 index 00000000000..c898aff012d --- /dev/null +++ b/ddtrace/contrib/valkey/__init__.py @@ -0,0 +1,68 @@ +""" +The valkey integration traces valkey requests. + + +Enabling +~~~~~~~~ + +The valkey integration is enabled automatically when using +:ref:`ddtrace-run` or :ref:`import ddtrace.auto`. + +Or use :func:`patch()` to manually enable the integration:: + + from ddtrace import patch + patch(valkey=True) + + +Global Configuration +~~~~~~~~~~~~~~~~~~~~ + +.. py:data:: ddtrace.config.valkey["service"] + + The service name reported by default for valkey traces. + + This option can also be set with the ``DD_VALKEY_SERVICE`` environment + variable. + + Default: ``"valkey"`` + + +.. py:data:: ddtrace.config.valkey["cmd_max_length"] + + Max allowable size for the valkey command span tag. + Anything beyond the max length will be replaced with ``"..."``. + + This option can also be set with the ``DD_VALKEY_CMD_MAX_LENGTH`` environment + variable. + + Default: ``1000`` + + +.. py:data:: ddtrace.config.valkey["resource_only_command"] + + The span resource will only include the command executed. To include all + arguments in the span resource, set this value to ``False``. + + This option can also be set with the ``DD_VALKEY_RESOURCE_ONLY_COMMAND`` environment + variable. + + Default: ``True`` + + +Instance Configuration +~~~~~~~~~~~~~~~~~~~~~~ + +To configure particular valkey instances use the :class:`Pin ` API:: + + import valkey + from ddtrace.trace import Pin + + client = valkey.StrictValkey(host="localhost", port=6379) + + # Override service name for this instance + Pin.override(client, service="my-custom-queue") + + # Traces reported for this client will now have "my-custom-queue" + # as the service name. + client.get("my-key") +""" diff --git a/ddtrace/ext/__init__.py b/ddtrace/ext/__init__.py index 965dd04f43f..98cc5226100 100644 --- a/ddtrace/ext/__init__.py +++ b/ddtrace/ext/__init__.py @@ -16,6 +16,7 @@ class SpanTypes(object): AUTH = "auth" SYSTEM = "system" LLM = "llm" + VALKEY = "valkey" class SpanKind(object): @@ -35,5 +36,6 @@ class SpanKind(object): SpanTypes.REDIS, SpanTypes.SQL, SpanTypes.WORKER, + SpanTypes.VALKEY, } ) diff --git a/ddtrace/ext/valkey.py b/ddtrace/ext/valkey.py new file mode 100644 index 00000000000..3246af841f6 --- /dev/null +++ b/ddtrace/ext/valkey.py @@ -0,0 +1,14 @@ +# defaults +APP = "valkey" +DEFAULT_SERVICE = "valkey" + +# net extension +DB = "out.valkey_db" + +# standard tags +RAWCMD = "valkey.raw_command" +CMD = "valkey.command" +ARGS_LEN = "valkey.args_length" +PIPELINE_LEN = "valkey.pipeline_length" +PIPELINE_AGE = "valkey.pipeline_age" +CLIENT_NAME = "valkey.client_name" diff --git a/docker-compose.yml b/docker-compose.yml index dfcee9a54ce..642575a19d7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -206,5 +206,23 @@ services: - DD_TRACE_AGENT_URL=http://testagent:8126 - DD_IAST_DEDUPLICATION_ENABLED=false + valkey: + image: valkey/valkey:8.0-alpine + ports: + - "127.0.0.1:6379:6379" + + valkeycluster: + platform: linux/amd64 + image: grokzen/redis-cluster:6.2.0 + environment: + - IP=0.0.0.0 + ports: + - "127.0.0.1:7000:7000" + - "127.0.0.1:7001:7001" + - "127.0.0.1:7002:7002" + - "127.0.0.1:7003:7003" + - "127.0.0.1:7004:7004" + - "127.0.0.1:7005:7005" + volumes: ddagent: diff --git a/docs/index.rst b/docs/index.rst index dbe0d61bb7d..d71419dc03e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -174,6 +174,8 @@ contacting support. +--------------------------------------------------+---------------+----------------+ | :ref:`urllib3` | >= 1.25.8 | No | +--------------------------------------------------+---------------+----------------+ +| :ref:`valkey` | >= 6.0.0 | Yes | ++--------------------------------------------------+---------------+----------------+ | :ref:`vertexai` | >= 1.71.1 | Yes | +--------------------------------------------------+---------------+----------------+ | :ref:`vertica` | >= 0.6 | Yes | diff --git a/docs/integrations.rst b/docs/integrations.rst index 0566ab7fa9c..d14c03bcfb7 100644 --- a/docs/integrations.rst +++ b/docs/integrations.rst @@ -485,6 +485,13 @@ urllib3 .. automodule:: ddtrace.contrib._urllib3 +.. _valkey: + +valkey +^^^^^^ +.. automodule:: ddtrace.contrib.valkey + + .. _vertexai: vertexai diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt index ff2cfc09c6d..913ad7f8319 100644 --- a/docs/spelling_wordlist.txt +++ b/docs/spelling_wordlist.txt @@ -301,6 +301,7 @@ urls username uvicorn uWSGI +valkey vendored versioned vertexai diff --git a/min_compatible_versions.csv b/min_compatible_versions.csv index c7366036a89..382aec7fd6a 100644 --- a/min_compatible_versions.csv +++ b/min_compatible_versions.csv @@ -182,6 +182,7 @@ typing-extensions,0 typing_extensions,0 urllib3,~=1.0 uwsgi,0 +valkey,~=6.0.0 vcrpy,==4.2.1 vertexai,0 vertica-python,>=0.6.0 diff --git a/releasenotes/notes/add-valkey-support-6cc9f41351dc0cd9.yaml b/releasenotes/notes/add-valkey-support-6cc9f41351dc0cd9.yaml new file mode 100644 index 00000000000..945f8eb6ec9 --- /dev/null +++ b/releasenotes/notes/add-valkey-support-6cc9f41351dc0cd9.yaml @@ -0,0 +1,3 @@ +features: + - | + valkey: adds automatic instrumentation of the Valkey package. Thank you [AhmadMasry](https://github.com/AhmadMasry)! \ No newline at end of file diff --git a/riotfile.py b/riotfile.py index f70b53532ff..fe4aece3126 100644 --- a/riotfile.py +++ b/riotfile.py @@ -2801,6 +2801,16 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT }, pys=select_pys(min_version="3.8"), ), + Venv( + name="valkey", + command="pytest {cmdargs} tests/contrib/valkey", + pkgs={ + "valkey": latest, + "pytest-randomly": latest, + "pytest-asyncio": "==0.23.7", + }, + pys=select_pys(min_version="3.8"), + ), Venv( name="profile", # NB riot commands that use this Venv must include --pass-env to work properly diff --git a/supported_versions_output.json b/supported_versions_output.json index a51bb17bb9a..06eff37be25 100644 --- a/supported_versions_output.json +++ b/supported_versions_output.json @@ -294,6 +294,12 @@ "max_tracer_supported": "2.2.3", "auto-instrumented": false }, + { + "integration": "valkey", + "minimum_tracer_supported": "6.0.0", + "max_tracer_supported": "6.0.2", + "auto-instrumented": true + }, { "integration": "vertexai", "minimum_tracer_supported": "1.71.1", diff --git a/supported_versions_table.csv b/supported_versions_table.csv index 3f7384a0cdd..edbe73503cd 100644 --- a/supported_versions_table.csv +++ b/supported_versions_table.csv @@ -47,5 +47,6 @@ starlette,0.13.6,0.41.3,True structlog,20.2.0,24.4.0,False tornado *,4.5.3,6.4,False urllib3,1.24.3,2.2.3,False +valkey,6.0.0,6.0.2,True vertexai,1.71.1,1.71.1,True yaaredis,2.0.4,3.0.0,True diff --git a/tests/contrib/config.py b/tests/contrib/config.py index 6ed086109a2..0b5f3d2bfbb 100644 --- a/tests/contrib/config.py +++ b/tests/contrib/config.py @@ -97,3 +97,13 @@ "host": os.getenv("TEST_KAFKA_HOST", "127.0.0.1"), "port": int(os.getenv("TEST_KAFKA_PORT", 29092)), } + +VALKEY_CONFIG = { + "host": os.getenv("TEST_VALKEY_HOST", "localhost"), + "port": int(os.getenv("TEST_VALKEY_PORT", 6379)), +} + +VALKEY_CLUSTER_CONFIG = { + "host": "127.0.0.1", + "ports": os.getenv("TEST_VALKEYCLUSTER_PORTS", "7000,7001,7002,7003,7004,7005"), +} diff --git a/tests/contrib/suitespec.yml b/tests/contrib/suitespec.yml index 366e28aaaf9..c49f3e79dbf 100644 --- a/tests/contrib/suitespec.yml +++ b/tests/contrib/suitespec.yml @@ -239,6 +239,11 @@ components: urllib3: - ddtrace/contrib/_urllib3.py - ddtrace/contrib/internal/urllib3/* + valkey: + - ddtrace/contrib/internal/valkey/* + - ddtrace/contrib/internal/valkey_utils.py + - ddtrace/_trace/utils_valkey.py + - ddtrace/ext/valkey.py vertica: - ddtrace/contrib/_vertica.py - ddtrace/contrib/internal/vertica/* @@ -1176,3 +1181,19 @@ suites: services: - redis snapshot: true + valkey: + parallelism: 5 + paths: + - '@bootstrap' + - '@core' + - '@contrib' + - '@tracing' + - '@valkey' + - tests/contrib/valkey/* + - tests/snapshots/tests.contrib.valkey.* + pattern: ^valkey* + runner: riot + services: + - valkeycluster + - valkey + snapshot: true diff --git a/tests/contrib/valkey/__init__.py b/tests/contrib/valkey/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/contrib/valkey/test_valkey.py b/tests/contrib/valkey/test_valkey.py new file mode 100644 index 00000000000..d546767c09c --- /dev/null +++ b/tests/contrib/valkey/test_valkey.py @@ -0,0 +1,615 @@ +# -*- coding: utf-8 -*- +from unittest import mock + +import pytest +import valkey + +import ddtrace +from ddtrace.contrib.internal.valkey.patch import patch +from ddtrace.contrib.internal.valkey.patch import unpatch +from ddtrace.internal.schema import DEFAULT_SPAN_SERVICE_NAME +from ddtrace.trace import Pin +from tests.opentracer.utils import init_tracer +from tests.utils import DummyTracer +from tests.utils import TracerTestCase +from tests.utils import snapshot + +from ..config import VALKEY_CONFIG + + +class TestValkeyPatch(TracerTestCase): + TEST_PORT = VALKEY_CONFIG["port"] + + def setUp(self): + super(TestValkeyPatch, self).setUp() + patch() + r = valkey.Valkey(port=self.TEST_PORT) + r.flushall() + Pin.override(r, tracer=self.tracer) + self.r = r + + def tearDown(self): + unpatch() + super(TestValkeyPatch, self).tearDown() + + def command_test_rowcount(self, raw_command, row_count, expect_result=True, **kwargs): + command_args_as_list = raw_command.split(" ") + + command_name = command_args_as_list[0].lower() + + if hasattr(self.r, command_name): + func = getattr(self.r, command_name) + + try: + # try to run function with kwargs, may fail due to valkey version + result = yield func(*command_args_as_list[1:], **kwargs) + for k in kwargs.keys(): + raw_command += " " + str(kwargs[k]) + except Exception: + # try without keyword arguments + result = func(*command_args_as_list[1:]) + + if expect_result: + assert result is not None + else: + empty_result = [None, [], {}, b""] + if isinstance(result, list): + result = [x for x in result if x] + assert result in empty_result + + command_span = self.get_spans()[-1] + + assert command_span.name == "valkey.command" + assert command_span.get_tag("valkey.raw_command") == raw_command + assert command_span.get_metric("db.row_count") == row_count + + def test_long_command(self): + self.r.mget(*range(1000)) + + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + + self.assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.span_type == "valkey" + assert span.error == 0 + meta = { + "out.host": "localhost", + } + metrics = { + "network.destination.port": self.TEST_PORT, + "out.valkey_db": 0, + } + for k, v in meta.items(): + assert span.get_tag(k) == v + for k, v in metrics.items(): + assert span.get_metric(k) == v + + assert span.get_tag("valkey.raw_command").startswith("MGET 0 1 2 3") + assert span.get_tag("valkey.raw_command").endswith("...") + assert span.get_tag("component") == "valkey" + assert span.get_tag("span.kind") == "client" + assert span.get_tag("db.system") == "valkey" + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) + def test_service_name_v1(self): + us = self.r.get("cheese") + assert us is None + spans = self.get_spans() + span = spans[0] + assert span.service == DEFAULT_SPAN_SERVICE_NAME + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) + def test_operation_name_v0_schema(self): + us = self.r.get("cheese") + assert us is None + spans = self.get_spans() + span = spans[0] + assert span.name == "valkey.command" + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) + def test_operation_name_v1_schema(self): + us = self.r.get("cheese") + assert us is None + spans = self.get_spans() + span = spans[0] + assert span.name == "valkey.command" + + def test_basics(self): + us = self.r.get("cheese") + assert us is None + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + self.assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_metric("out.valkey_db") == 0 + assert span.get_tag("out.host") == "localhost" + assert span.get_tag("valkey.raw_command") == "GET cheese" + assert span.get_tag("component") == "valkey" + assert span.get_tag("span.kind") == "client" + assert span.get_tag("db.system") == "valkey" + assert span.get_metric("valkey.args_length") == 2 + assert span.resource == "GET" + + def test_connection_error(self): + with mock.patch.object( + valkey.connection.ConnectionPool, + "get_connection", + side_effect=valkey.exceptions.ConnectionError("whatever"), + ): + with pytest.raises(valkey.exceptions.ConnectionError): + self.r.get("foo") + + def test_pipeline_traced(self): + with self.r.pipeline(transaction=False) as p: + p.set("blah", 32) + p.rpush("foo", "éé") + p.hgetall("xxx") + p.execute() + + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + self.assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.resource == "SET\nRPUSH\nHGETALL" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_metric("out.valkey_db") == 0 + assert span.get_tag("out.host") == "localhost" + assert span.get_tag("valkey.raw_command") == "SET blah 32\nRPUSH foo éé\nHGETALL xxx" + assert span.get_tag("component") == "valkey" + assert span.get_tag("span.kind") == "client" + assert span.get_metric("valkey.pipeline_length") == 3 + assert span.get_metric("valkey.pipeline_length") == 3 + + def test_pipeline_immediate(self): + with self.r.pipeline() as p: + p.set("a", 1) + p.immediate_execute_command("SET", "a", 1) + p.execute() + + spans = self.get_spans() + assert len(spans) == 2 + span = spans[0] + self.assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.resource == "SET" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_metric("out.valkey_db") == 0 + assert span.get_tag("out.host") == "localhost" + assert span.get_tag("component") == "valkey" + assert span.get_tag("span.kind") == "client" + + def test_meta_override(self): + r = self.r + pin = Pin.get_from(r) + if pin: + pin.clone(tags={"cheese": "camembert"}).onto(r) + + r.get("cheese") + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + assert span.service == "valkey" + assert "cheese" in span.get_tags() and span.get_tag("cheese") == "camembert" + + def test_patch_unpatch(self): + tracer = DummyTracer() + + # Test patch idempotence + patch() + patch() + + r = valkey.Valkey(port=VALKEY_CONFIG["port"]) + Pin.get_from(r).clone(tracer=tracer).onto(r) + r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + + # Test unpatch + unpatch() + + r = valkey.Valkey(port=VALKEY_CONFIG["port"]) + r.get("key") + + spans = tracer.pop() + assert not spans, spans + + # Test patch again + patch() + + r = valkey.Valkey(port=VALKEY_CONFIG["port"]) + Pin.get_from(r).clone(tracer=tracer).onto(r) + r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + + def test_opentracing(self): + """Ensure OpenTracing works with valkey.""" + ot_tracer = init_tracer("valkey_svc", self.tracer) + + with ot_tracer.start_active_span("valkey_get"): + us = self.r.get("cheese") + assert us is None + + spans = self.get_spans() + assert len(spans) == 2 + ot_span, dd_span = spans + + # confirm the parenting + assert ot_span.parent_id is None + assert dd_span.parent_id == ot_span.span_id + + assert ot_span.name == "valkey_get" + assert ot_span.service == "valkey_svc" + + self.assert_is_measured(dd_span) + assert dd_span.service == "valkey" + assert dd_span.name == "valkey.command" + assert dd_span.span_type == "valkey" + assert dd_span.error == 0 + assert dd_span.get_metric("out.valkey_db") == 0 + assert dd_span.get_tag("out.host") == "localhost" + assert dd_span.get_tag("valkey.raw_command") == "GET cheese" + assert dd_span.get_tag("component") == "valkey" + assert dd_span.get_tag("span.kind") == "client" + assert dd_span.get_tag("db.system") == "valkey" + assert dd_span.get_metric("valkey.args_length") == 2 + assert dd_span.resource == "GET" + + def test_valkey_rowcount_all_keys_valid(self): + self.r.set("key1", "value1") + + get1 = self.r.get("key1") + + assert get1 == b"value1" + + spans = self.get_spans() + get_valid_key_span = spans[1] + + assert get_valid_key_span.name == "valkey.command" + assert get_valid_key_span.get_tag("valkey.raw_command") == "GET key1" + assert get_valid_key_span.get_metric("db.row_count") == 1 + + get_commands = ["GET key", "GETEX key", "GETRANGE key 0 2"] + list_get_commands = ["LINDEX lkey 0", "LRANGE lkey 0 3", "RPOP lkey", "LPOP lkey"] + hashing_get_commands = [ + "HGET hkey field1", + "HGETALL hkey", + "HKEYS hkey", + "HMGET hkey field1 field2", + "HRANDFIELD hkey", + "HVALS hkey", + ] + multi_key_get_commands = ["MGET key key2", "MGET key key2 key3", "MGET key key2 key3 key4"] + + for command in get_commands: + self.r.set("key", "value") + self.command_test_rowcount(command, 1) + for command in list_get_commands: + self.r.lpush("lkey", "1", "2", "3", "4", "5") + self.command_test_rowcount(command, 1) + if command == "RPOP lkey": # lets get multiple values from the set and ensure rowcount is still 1 + self.command_test_rowcount(command, 1, count=2) + for command in hashing_get_commands: + self.r.hset("hkey", "field1", "value1") + self.r.hset("hkey", "field2", "value2") + self.command_test_rowcount(command, 1) + for command in multi_key_get_commands: + self.r.mset({"key": "value", "key2": "value2", "key3": "value3", "key4": "value4"}) + self.command_test_rowcount(command, len(command.split(" ")) - 1) + + def test_valkey_rowcount_some_keys_valid(self): + self.r.mset({"key": "value", "key2": "value2"}) + + get_both_valid = self.r.mget("key", "key2") + get_one_missing = self.r.mget("key", "missing_key") + + assert get_both_valid == [b"value", b"value2"] + assert get_one_missing == [b"value", None] + + spans = self.get_spans() + get_both_valid_span = spans[1] + get_one_missing_span = spans[2] + + assert get_both_valid_span.name == "valkey.command" + assert get_both_valid_span.get_tag("valkey.raw_command") == "MGET key key2" + assert get_both_valid_span.get_metric("db.row_count") == 2 + + assert get_one_missing_span.name == "valkey.command" + assert get_one_missing_span.get_tag("valkey.raw_command") == "MGET key missing_key" + assert get_one_missing_span.get_metric("db.row_count") == 1 + + multi_key_get_commands = [ + "MGET key key2", + "MGET key missing_key", + "MGET key key2 missing_key", + "MGET key missing_key missing_key2 key2", + ] + + for command in multi_key_get_commands: + command_keys = command.split(" ")[1:] + self.command_test_rowcount(command, len([key for key in command_keys if "missing_key" not in key])) + + def test_valkey_rowcount_no_keys_valid(self): + get_missing = self.r.get("missing_key") + + assert get_missing is None + + spans = self.get_spans() + get_missing_key_span = spans[0] + + assert get_missing_key_span.name == "valkey.command" + assert get_missing_key_span.get_tag("valkey.raw_command") == "GET missing_key" + assert get_missing_key_span.get_metric("db.row_count") == 0 + + get_commands = ["GET key", "GETDEL key", "GETEX key", "GETRANGE key 0 2"] + list_get_commands = ["LINDEX lkey 0", "LRANGE lkey 0 3", "RPOP lkey", "LPOP lkey"] + hashing_get_commands = [ + "HGET hkey field1", + "HGETALL hkey", + "HKEYS hkey", + "HMGET hkey field1 field2", + "HRANDFIELD hkey", + "HVALS hkey", + ] + multi_key_get_commands = ["MGET key key2", "MGET key key2 key3", "MGET key key2 key3 key4"] + + for command in get_commands: + self.command_test_rowcount(command, 0, expect_result=False) + for command in list_get_commands: + self.command_test_rowcount(command, 0, expect_result=False) + if command == "RPOP lkey": # lets get multiple values from the set and ensure rowcount is still 1 + self.command_test_rowcount(command, 0, expect_result=False, count=2) + for command in hashing_get_commands: + self.command_test_rowcount(command, 0, expect_result=False) + for command in multi_key_get_commands: + self.command_test_rowcount(command, 0, expect_result=False) + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) + def test_user_specified_service_default(self): + from ddtrace import config + + assert config.service == "mysvc" + + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "valkey" + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) + def test_user_specified_service_v0(self): + from ddtrace import config + + assert config.service == "mysvc" + + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "valkey" + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) + def test_user_specified_service_v1(self): + from ddtrace import config + + assert config.service == "mysvc" + + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "mysvc" + + @TracerTestCase.run_in_subprocess( + env_overrides=dict(DD_VALKEY_SERVICE="myvalkey", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0") + ) + def test_env_user_specified_valkey_service_v0(self): + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "myvalkey", span.service + + self.reset() + + # Global config + with self.override_config("valkey", dict(service="cfg-valkey")): + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "cfg-valkey", span.service + + self.reset() + + # Manual override + Pin.override(self.r, service="mysvc", tracer=self.tracer) + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "mysvc", span.service + + @TracerTestCase.run_in_subprocess( + env_overrides=dict( + DD_SERVICE="app-svc", DD_VALKEY_SERVICE="env-specified-valkey-svc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0" + ) + ) + def test_service_precedence_v0(self): + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "env-specified-valkey-svc", span.service + + self.reset() + + # Do a manual override + Pin.override(self.r, service="override-valkey", tracer=self.tracer) + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "override-valkey", span.service + + +class TestValkeyPatchSnapshot(TracerTestCase): + TEST_PORT = VALKEY_CONFIG["port"] + + def setUp(self): + super(TestValkeyPatchSnapshot, self).setUp() + patch() + r = valkey.Valkey(port=self.TEST_PORT) + self.r = r + + def tearDown(self): + unpatch() + super(TestValkeyPatchSnapshot, self).tearDown() + self.r.flushall() + + @snapshot() + def test_long_command(self): + self.r.mget(*range(1000)) + + @snapshot() + def test_basics(self): + us = self.r.get("cheese") + assert us is None + + @snapshot() + def test_unicode(self): + us = self.r.get("😐") + assert us is None + + @snapshot() + def test_pipeline_traced(self): + with self.r.pipeline(transaction=False) as p: + p.set("blah", 32) + p.rpush("foo", "éé") + p.hgetall("xxx") + p.execute() + + @snapshot() + def test_pipeline_immediate(self): + with self.r.pipeline() as p: + p.set("a", 1) + p.immediate_execute_command("SET", "a", 1) + p.execute() + + @snapshot() + def test_meta_override(self): + r = self.r + pin = Pin.get_from(r) + if pin: + pin.clone(tags={"cheese": "camembert"}).onto(r) + + r.get("cheese") + + def test_patch_unpatch(self): + tracer = DummyTracer() + + # Test patch idempotence + patch() + patch() + + r = valkey.Valkey(port=VALKEY_CONFIG["port"]) + Pin.get_from(r).clone(tracer=tracer).onto(r) + r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + + # Test unpatch + unpatch() + + r = valkey.Valkey(port=VALKEY_CONFIG["port"]) + r.get("key") + + spans = tracer.pop() + assert not spans, spans + + # Test patch again + patch() + + r = valkey.Valkey(port=VALKEY_CONFIG["port"]) + Pin.get_from(r).clone(tracer=tracer).onto(r) + r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + + @snapshot() + def test_opentracing(self): + """Ensure OpenTracing works with valkey.""" + ot_tracer = init_tracer("valkey_svc", ddtrace.tracer) + + with ot_tracer.start_active_span("valkey_get"): + us = self.r.get("cheese") + assert us is None + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) + @snapshot() + def test_user_specified_service(self): + from ddtrace import config + + assert config.service == "mysvc" + + self.r.get("cheese") + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_VALKEY_SERVICE="myvalkey")) + @snapshot() + def test_env_user_specified_valkey_service(self): + self.r.get("cheese") + + self.reset() + + # Global config + with self.override_config("valkey", dict(service="cfg-valkey")): + self.r.get("cheese") + + self.reset() + + # Manual override + Pin.override(self.r, service="mysvc", tracer=self.tracer) + self.r.get("cheese") + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="app-svc", DD_VALKEY_SERVICE="env-valkey")) + @snapshot() + def test_service_precedence(self): + self.r.get("cheese") + + self.reset() + + # Do a manual override + Pin.override(self.r, service="override-valkey", tracer=self.tracer) + self.r.get("cheese") + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_VALKEY_CMD_MAX_LENGTH="10")) + @snapshot() + def test_custom_cmd_length_env(self): + self.r.get("here-is-a-long-key-name") + + @snapshot() + def test_custom_cmd_length(self): + with self.override_config("valkey", dict(cmd_max_length=7)): + self.r.get("here-is-a-long-key-name") + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_VALKEY_RESOURCE_ONLY_COMMAND="false")) + @snapshot() + def test_full_command_in_resource_env(self): + self.r.get("put_key_in_resource") + p = self.r.pipeline(transaction=False) + p.set("pipeline-cmd1", 1) + p.set("pipeline-cmd2", 2) + p.execute() + + @snapshot() + def test_full_command_in_resource_config(self): + with self.override_config("valkey", dict(resource_only_command=False)): + self.r.get("put_key_in_resource") + p = self.r.pipeline(transaction=False) + p.set("pipeline-cmd1", 1) + p.set("pipeline-cmd2", 2) + p.execute() diff --git a/tests/contrib/valkey/test_valkey_asyncio.py b/tests/contrib/valkey/test_valkey_asyncio.py new file mode 100644 index 00000000000..64743a7770b --- /dev/null +++ b/tests/contrib/valkey/test_valkey_asyncio.py @@ -0,0 +1,221 @@ +import asyncio +import typing +from unittest import mock + +import pytest +import valkey +import valkey.asyncio +from wrapt import ObjectProxy + +from ddtrace import tracer +from ddtrace.contrib.internal.valkey.patch import patch +from ddtrace.contrib.internal.valkey.patch import unpatch +from ddtrace.trace import Pin +from tests.utils import override_config + +from ..config import VALKEY_CONFIG + + +def get_valkey_instance(max_connections: int, client_name: typing.Optional[str] = None): + return valkey.asyncio.from_url( + "valkey://127.0.0.1:%s" % VALKEY_CONFIG["port"], max_connections=max_connections, client_name=client_name + ) + + +@pytest.fixture +def valkey_client(): + r = get_valkey_instance(max_connections=10) # default values + yield r + + +@pytest.fixture +def single_pool_valkey_client(): + r = get_valkey_instance(max_connections=1) + yield r + + +@pytest.fixture(autouse=True) +async def traced_valkey(valkey_client): + await valkey_client.flushall() + + patch() + try: + yield + finally: + unpatch() + await valkey_client.flushall() + + +def test_patching(): + """ + When patching valkey library + We wrap the correct methods + When unpatching valkey library + We unwrap the correct methods + """ + assert isinstance(valkey.asyncio.client.Valkey.execute_command, ObjectProxy) + assert isinstance(valkey.asyncio.client.Valkey.pipeline, ObjectProxy) + assert isinstance(valkey.asyncio.client.Pipeline.pipeline, ObjectProxy) + unpatch() + assert not isinstance(valkey.asyncio.client.Valkey.execute_command, ObjectProxy) + assert not isinstance(valkey.asyncio.client.Valkey.pipeline, ObjectProxy) + assert not isinstance(valkey.asyncio.client.Pipeline.pipeline, ObjectProxy) + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_basic_request(valkey_client): + val = await valkey_client.get("cheese") + assert val is None + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_unicode_request(valkey_client): + val = await valkey_client.get("😐") + assert val is None + + +@pytest.mark.snapshot(wait_for_num_traces=1, ignores=["meta.error.stack"]) +async def test_connection_error(valkey_client): + with mock.patch.object( + valkey.asyncio.connection.ConnectionPool, + "get_connection", + side_effect=valkey.exceptions.ConnectionError("whatever"), + ): + with pytest.raises(valkey.exceptions.ConnectionError): + await valkey_client.get("foo") + + +@pytest.mark.snapshot(wait_for_num_traces=2) +async def test_decoding_non_utf8_args(valkey_client): + await valkey_client.set(b"\x80foo", b"\x80abc") + val = await valkey_client.get(b"\x80foo") + assert val == b"\x80abc" + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_decoding_non_utf8_pipeline_args(valkey_client): + p = valkey_client.pipeline() + p.set(b"\x80blah", "boo") + p.set("foo", b"\x80abc") + p.get(b"\x80blah") + p.get("foo") + + response_list = await p.execute() + assert response_list[0] is True # response from valkey.set is OK if successfully pushed + assert response_list[1] is True + assert response_list[2].decode() == "boo" + assert response_list[3] == b"\x80abc" + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_long_command(valkey_client): + length = 1000 + val_list = await valkey_client.mget(*range(length)) + assert len(val_list) == length + for val in val_list: + assert val is None + + +@pytest.mark.snapshot(wait_for_num_traces=3) +async def test_override_service_name(valkey_client): + with override_config("valkey", dict(service_name="myvalkey")): + val = await valkey_client.get("cheese") + assert val is None + await valkey_client.set("cheese", "my-cheese") + val = await valkey_client.get("cheese") + if isinstance(val, bytes): + val = val.decode() + assert val == "my-cheese" + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_pin(valkey_client): + Pin.override(valkey_client, service="my-valkey") + val = await valkey_client.get("cheese") + assert val is None + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_pipeline_traced(valkey_client): + p = valkey_client.pipeline(transaction=False) + p.set("blah", "boo") + p.set("foo", "bar") + p.get("blah") + p.get("foo") + + response_list = await p.execute() + assert response_list[0] is True # response from valkey.set is OK if successfully pushed + assert response_list[1] is True + assert ( + response_list[2].decode() == "boo" + ) # response from hset is 'Integer reply: The number of fields that were added.' + assert response_list[3].decode() == "bar" + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_pipeline_traced_context_manager_transaction(valkey_client): + """ + Regression test for: https://github.com/DataDog/dd-trace-py/issues/3106 + + Example:: + + async def main(): + valkey = await valkey.from_url("valkey://localhost") + async with valkey.pipeline(transaction=True) as pipe: + ok1, ok2 = await (pipe.set("key1", "value1").set("key2", "value2").execute()) + assert ok1 + assert ok2 + """ + + async with valkey_client.pipeline(transaction=True) as p: + set_1, set_2, get_1, get_2 = await p.set("blah", "boo").set("foo", "bar").get("blah").get("foo").execute() + + # response from valkey.set is OK if successfully pushed + assert set_1 is True + assert set_2 is True + assert get_1.decode() == "boo" + assert get_2.decode() == "bar" + + +@pytest.mark.snapshot(wait_for_num_traces=1) +async def test_two_traced_pipelines(valkey_client): + with tracer.trace("web-request", service="test"): + p1 = await valkey_client.pipeline(transaction=False) + p2 = await valkey_client.pipeline(transaction=False) + await p1.set("blah", "boo") + await p2.set("foo", "bar") + await p1.get("blah") + await p2.get("foo") + + response_list1 = await p1.execute() + response_list2 = await p2.execute() + + assert response_list1[0] is True # response from valkey.set is OK if successfully pushed + assert response_list2[0] is True + assert ( + response_list1[1].decode() == "boo" + ) # response from hset is 'Integer reply: The number of fields that were added.' + assert response_list2[1].decode() == "bar" + + +async def test_parenting(valkey_client, snapshot_context): + with snapshot_context(wait_for_num_traces=1): + with tracer.trace("web-request", service="test"): + await valkey_client.set("blah", "boo") + await valkey_client.get("blah") + + +async def test_client_name(snapshot_context): + with snapshot_context(wait_for_num_traces=1): + with tracer.trace("web-request", service="test"): + valkey_client = get_valkey_instance(10, client_name="testing-client-name") + await valkey_client.get("blah") + + +@pytest.mark.asyncio +async def test_asyncio_task_cancelled(valkey_client): + with mock.patch.object( + valkey.asyncio.connection.ConnectionPool, "get_connection", side_effect=asyncio.CancelledError + ): + with pytest.raises(asyncio.CancelledError): + await valkey_client.get("foo") diff --git a/tests/contrib/valkey/test_valkey_cluster.py b/tests/contrib/valkey/test_valkey_cluster.py new file mode 100644 index 00000000000..3876426d25d --- /dev/null +++ b/tests/contrib/valkey/test_valkey_cluster.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +import valkey + +from ddtrace.contrib.internal.valkey.patch import patch +from ddtrace.contrib.internal.valkey.patch import unpatch +from ddtrace.internal.schema import DEFAULT_SPAN_SERVICE_NAME +from ddtrace.trace import Pin +from tests.contrib.config import VALKEY_CLUSTER_CONFIG +from tests.utils import DummyTracer +from tests.utils import TracerTestCase +from tests.utils import assert_is_measured + + +class TestValkeyClusterPatch(TracerTestCase): + TEST_HOST = VALKEY_CLUSTER_CONFIG["host"] + TEST_PORTS = VALKEY_CLUSTER_CONFIG["ports"] + + def _get_test_client(self): + startup_nodes = [valkey.cluster.ClusterNode(self.TEST_HOST, int(port)) for port in self.TEST_PORTS.split(",")] + return valkey.cluster.ValkeyCluster(startup_nodes=startup_nodes) + + def setUp(self): + super(TestValkeyClusterPatch, self).setUp() + patch() + r = self._get_test_client() + r.flushall() + Pin.override(r, tracer=self.tracer) + self.r = r + + def tearDown(self): + unpatch() + super(TestValkeyClusterPatch, self).tearDown() + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) + def test_span_service_name_v1(self): + us = self.r.get("cheese") + assert us is None + spans = self.get_spans() + span = spans[0] + assert span.service == DEFAULT_SPAN_SERVICE_NAME + + def test_basics(self): + us = self.r.get("cheese") + assert us is None + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_tag("valkey.raw_command") == "GET cheese" + assert span.get_tag("component") == "valkey" + assert span.get_tag("db.system") == "valkey" + assert span.get_metric("valkey.args_length") == 2 + assert span.resource == "GET" + + def test_unicode(self): + us = self.r.get("😐") + assert us is None + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_tag("valkey.raw_command") == "GET 😐" + assert span.get_tag("component") == "valkey" + assert span.get_tag("db.system") == "valkey" + assert span.get_metric("valkey.args_length") == 2 + assert span.resource == "GET" + + def test_pipeline(self): + with self.r.pipeline(transaction=False) as p: + p.set("blah", 32) + p.rpush("foo", "éé") + p.hgetall("xxx") + p.execute() + + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.resource == "SET\nRPUSH\nHGETALL" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_tag("valkey.raw_command") == "SET blah 32\nRPUSH foo éé\nHGETALL xxx" + assert span.get_tag("component") == "valkey" + assert span.get_metric("valkey.pipeline_length") == 3 + + def test_patch_unpatch(self): + tracer = DummyTracer() + + # Test patch idempotence + patch() + patch() + + r = self._get_test_client() + Pin.get_from(r).clone(tracer=tracer).onto(r) + r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + + # Test unpatch + unpatch() + + r = self._get_test_client() + r.get("key") + + spans = tracer.pop() + assert not spans, spans + + # Test patch again + patch() + + r = self._get_test_client() + Pin.get_from(r).clone(tracer=tracer).onto(r) + r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) + def test_user_specified_service_v0(self): + """ + When a user specifies a service for the app + The valkeycluster integration should not use it. + """ + # Ensure that the service name was configured + from ddtrace import config + + assert config.service == "mysvc" + + r = self._get_test_client() + Pin.get_from(r).clone(tracer=self.tracer).onto(r) + r.get("key") + + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + assert span.service != "mysvc" + + @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) + def test_user_specified_service_v1(self): + """ + When a user specifies a service for the app + The valkeycluster integration should use it. + """ + # Ensure that the service name was configured + from ddtrace import config + + assert config.service == "mysvc" + + r = self._get_test_client() + Pin.get_from(r).clone(tracer=self.tracer).onto(r) + r.get("key") + + spans = self.get_spans() + assert len(spans) == 1 + span = spans[0] + assert span.service == "mysvc" + + @TracerTestCase.run_in_subprocess( + env_overrides=dict(DD_VALKEY_SERVICE="myvalkeycluster", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0") + ) + def test_env_user_specified_valkeycluster_service_v0(self): + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "myvalkeycluster", span.service + + @TracerTestCase.run_in_subprocess( + env_overrides=dict(DD_VALKEY_SERVICE="myvalkeycluster", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1") + ) + def test_env_user_specified_valkeycluster_service_v1(self): + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "myvalkeycluster", span.service + + @TracerTestCase.run_in_subprocess( + env_overrides=dict( + DD_SERVICE="app-svc", DD_VALKEY_SERVICE="myvalkeycluster", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0" + ) + ) + def test_service_precedence_v0(self): + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "myvalkeycluster" + + self.reset() + + @TracerTestCase.run_in_subprocess( + env_overrides=dict( + DD_SERVICE="app-svc", DD_VALKEY_SERVICE="myvalkeycluster", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1" + ) + ) + def test_service_precedence_v1(self): + self.r.get("cheese") + span = self.get_spans()[0] + assert span.service == "myvalkeycluster" + + self.reset() diff --git a/tests/contrib/valkey/test_valkey_cluster_asyncio.py b/tests/contrib/valkey/test_valkey_cluster_asyncio.py new file mode 100644 index 00000000000..8f63aa9d542 --- /dev/null +++ b/tests/contrib/valkey/test_valkey_cluster_asyncio.py @@ -0,0 +1,457 @@ +# -*- coding: utf-8 -*- +import pytest +import valkey + +from ddtrace.contrib.internal.valkey.patch import patch +from ddtrace.contrib.internal.valkey.patch import unpatch +from ddtrace.trace import Pin +from tests.contrib.config import VALKEY_CLUSTER_CONFIG +from tests.utils import DummyTracer +from tests.utils import assert_is_measured + + +TEST_HOST = VALKEY_CLUSTER_CONFIG["host"] +TEST_PORTS = VALKEY_CLUSTER_CONFIG["ports"] + + +@pytest.mark.asyncio +@pytest.fixture +async def valkey_cluster(): + startup_nodes = [valkey.asyncio.cluster.ClusterNode(TEST_HOST, int(port)) for port in TEST_PORTS.split(",")] + yield valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + + +@pytest.mark.asyncio +@pytest.fixture +async def traced_valkey_cluster(tracer, test_spans): + patch() + startup_nodes = [valkey.asyncio.cluster.ClusterNode(TEST_HOST, int(port)) for port in TEST_PORTS.split(",")] + valkey_cluster = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + await valkey_cluster.flushall() + Pin.override(valkey_cluster, tracer=tracer) + try: + yield valkey_cluster, test_spans + finally: + unpatch() + await valkey_cluster.flushall() + + +@pytest.mark.asyncio +async def test_basics(traced_valkey_cluster): + cluster, test_spans = traced_valkey_cluster + us = await cluster.get("cheese") + assert us is None + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + + span = spans[0] + assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_tag("valkey.raw_command") == "GET cheese" + assert span.get_tag("component") == "valkey" + assert span.get_tag("db.system") == "valkey" + assert span.get_metric("valkey.args_length") == 2 + assert span.resource == "GET" + + +@pytest.mark.asyncio +async def test_unicode(traced_valkey_cluster): + cluster, test_spans = traced_valkey_cluster + us = await cluster.get("😐") + assert us is None + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + + span = spans[0] + assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_tag("valkey.raw_command") == "GET 😐" + assert span.get_tag("component") == "valkey" + assert span.get_tag("db.system") == "valkey" + assert span.get_metric("valkey.args_length") == 2 + assert span.resource == "GET" + + +@pytest.mark.asyncio +async def test_pipeline(traced_valkey_cluster): + cluster, test_spans = traced_valkey_cluster + async with cluster.pipeline(transaction=False) as p: + p.set("blah", 32) + p.rpush("foo", "éé") + p.hgetall("xxx") + await p.execute() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + + span = spans[0] + assert_is_measured(span) + assert span.service == "valkey" + assert span.name == "valkey.command" + assert span.resource == "SET\nRPUSH\nHGETALL" + assert span.span_type == "valkey" + assert span.error == 0 + assert span.get_tag("valkey.raw_command") == "SET blah 32\nRPUSH foo éé\nHGETALL xxx" + assert span.get_tag("component") == "valkey" + assert span.get_metric("valkey.pipeline_length") == 3 + + +@pytest.mark.asyncio +async def test_patch_unpatch(valkey_cluster): + tracer = DummyTracer() + + # Test patch idempotence + patch() + patch() + + r = valkey_cluster + Pin.override(r, tracer=tracer) + await r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + + # Test unpatch + unpatch() + + r = valkey_cluster + await r.get("key") + + spans = tracer.pop() + assert not spans, spans + + # Test patch again + patch() + + r = valkey_cluster + Pin.override(r, tracer=tracer) + await r.get("key") + + spans = tracer.pop() + assert spans, spans + assert len(spans) == 1 + unpatch() + + +@pytest.mark.subprocess( + env=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"), + err=None, # avoid checking stderr because of an expected deprecation warning +) +def test_default_service_name_v1(): + import asyncio + + import valkey + + from ddtrace.contrib.internal.valkey.patch import patch + from ddtrace.internal.schema import DEFAULT_SPAN_SERVICE_NAME + from ddtrace.trace import Pin + from tests.contrib.config import VALKEY_CLUSTER_CONFIG + from tests.utils import DummyTracer + from tests.utils import TracerSpanContainer + + patch() + + async def test(): + startup_nodes = [ + valkey.asyncio.cluster.ClusterNode(VALKEY_CLUSTER_CONFIG["host"], int(port)) + for port in VALKEY_CLUSTER_CONFIG["ports"].split(",") + ] + r = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + tracer = DummyTracer() + test_spans = TracerSpanContainer(tracer) + + Pin.get_from(r).clone(tracer=tracer).onto(r) + await r.get("key") + await r.close() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + span = spans[0] + assert span.service == DEFAULT_SPAN_SERVICE_NAME + + asyncio.run(test()) + + +@pytest.mark.subprocess( + env=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"), + err=None, # avoid checking stderr because of an expected deprecation warning +) +def test_user_specified_service_v0(): + """ + When a user specifies a service for the app + The valkeycluster integration should not use it. + """ + import asyncio + + import valkey + + from ddtrace import config + from ddtrace.contrib.internal.valkey.patch import patch + from ddtrace.trace import Pin + from tests.contrib.config import VALKEY_CLUSTER_CONFIG + from tests.utils import DummyTracer + from tests.utils import TracerSpanContainer + + patch() + + async def test(): + # # Ensure that the service name was configured + assert config.service == "mysvc" + + startup_nodes = [ + valkey.asyncio.cluster.ClusterNode(VALKEY_CLUSTER_CONFIG["host"], int(port)) + for port in VALKEY_CLUSTER_CONFIG["ports"].split(",") + ] + r = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + tracer = DummyTracer() + test_spans = TracerSpanContainer(tracer) + + Pin.get_from(r).clone(tracer=tracer).onto(r) + await r.get("key") + await r.close() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + span = spans[0] + assert span.service != "mysvc" + + asyncio.run(test()) + + +@pytest.mark.subprocess( + env=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"), + err=None, # avoid checking stderr because of an expected deprecation warning +) +def test_user_specified_service_v1(): + """ + When a user specifies a service for the app + The valkeycluster integration should use it. + """ + import asyncio + + import valkey + + from ddtrace import config + from ddtrace.contrib.internal.valkey.patch import patch + from ddtrace.trace import Pin + from tests.contrib.config import VALKEY_CLUSTER_CONFIG + from tests.utils import DummyTracer + from tests.utils import TracerSpanContainer + + patch() + + async def test(): + # # Ensure that the service name was configured + assert config.service == "mysvc" + + startup_nodes = [ + valkey.asyncio.cluster.ClusterNode(VALKEY_CLUSTER_CONFIG["host"], int(port)) + for port in VALKEY_CLUSTER_CONFIG["ports"].split(",") + ] + r = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + tracer = DummyTracer() + test_spans = TracerSpanContainer(tracer) + + Pin.get_from(r).clone(tracer=tracer).onto(r) + await r.get("key") + await r.close() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + span = spans[0] + assert span.service == "mysvc" + + asyncio.run(test()) + + +@pytest.mark.subprocess( + env=dict(DD_VALKEY_SERVICE="myvalkeycluster", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"), + err=None, # avoid checking stderr because of an expected deprecation warning +) +def test_env_user_specified_valkeycluster_service_v0(): + import asyncio + + import valkey + + from ddtrace.contrib.internal.valkey.patch import patch + from ddtrace.trace import Pin + from tests.contrib.config import VALKEY_CLUSTER_CONFIG + from tests.utils import DummyTracer + from tests.utils import TracerSpanContainer + + patch() + + async def test(): + startup_nodes = [ + valkey.asyncio.cluster.ClusterNode(VALKEY_CLUSTER_CONFIG["host"], int(port)) + for port in VALKEY_CLUSTER_CONFIG["ports"].split(",") + ] + r = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + tracer = DummyTracer() + test_spans = TracerSpanContainer(tracer) + + Pin.get_from(r).clone(tracer=tracer).onto(r) + await r.get("key") + await r.close() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + span = spans[0] + assert span.service == "myvalkeycluster" + + asyncio.run(test()) + + +@pytest.mark.subprocess( + env=dict(DD_VALKEY_SERVICE="myvalkeycluster", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"), + err=None, # avoid checking stderr because of an expected deprecation warning +) +def test_env_user_specified_valkeycluster_service_v1(): + import asyncio + + import valkey + + from ddtrace.contrib.internal.valkey.patch import patch + from ddtrace.trace import Pin + from tests.contrib.config import VALKEY_CLUSTER_CONFIG + from tests.utils import DummyTracer + from tests.utils import TracerSpanContainer + + patch() + + async def test(): + startup_nodes = [ + valkey.asyncio.cluster.ClusterNode(VALKEY_CLUSTER_CONFIG["host"], int(port)) + for port in VALKEY_CLUSTER_CONFIG["ports"].split(",") + ] + r = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + tracer = DummyTracer() + test_spans = TracerSpanContainer(tracer) + + Pin.get_from(r).clone(tracer=tracer).onto(r) + await r.get("key") + await r.close() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + span = spans[0] + assert span.service == "myvalkeycluster" + + asyncio.run(test()) + + +@pytest.mark.subprocess( + env=dict( + DD_SERVICE="mysvc", + DD_VALKEY_SERVICE="myvalkeycluster", + DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0", + ), + err=None, # avoid checking stderr because of an expected deprecation warning +) +def test_service_precedence_v0(): + import asyncio + + import valkey + + from ddtrace import config + from ddtrace.contrib.internal.valkey.patch import patch + from ddtrace.trace import Pin + from tests.contrib.config import VALKEY_CLUSTER_CONFIG + from tests.utils import DummyTracer + from tests.utils import TracerSpanContainer + + patch() + + async def test(): + # # Ensure that the service name was configured + assert config.service == "mysvc" + + startup_nodes = [ + valkey.asyncio.cluster.ClusterNode(VALKEY_CLUSTER_CONFIG["host"], int(port)) + for port in VALKEY_CLUSTER_CONFIG["ports"].split(",") + ] + r = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + tracer = DummyTracer() + test_spans = TracerSpanContainer(tracer) + + Pin.get_from(r).clone(tracer=tracer).onto(r) + await r.get("key") + await r.close() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + span = spans[0] + assert span.service == "myvalkeycluster" + + asyncio.run(test()) + + +@pytest.mark.subprocess( + env=dict(DD_SERVICE="mysvc", DD_VALKEY_SERVICE="myvalkeycluster", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"), + err=None, # avoid checking stderr because of an expected deprecation warning +) +def test_service_precedence_v1(): + import asyncio + + import valkey + + from ddtrace import config + from ddtrace.contrib.internal.valkey.patch import patch + from ddtrace.trace import Pin + from tests.contrib.config import VALKEY_CLUSTER_CONFIG + from tests.utils import DummyTracer + from tests.utils import TracerSpanContainer + + patch() + + async def test(): + # # Ensure that the service name was configured + assert config.service == "mysvc" + + startup_nodes = [ + valkey.asyncio.cluster.ClusterNode(VALKEY_CLUSTER_CONFIG["host"], int(port)) + for port in VALKEY_CLUSTER_CONFIG["ports"].split(",") + ] + r = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) + tracer = DummyTracer() + test_spans = TracerSpanContainer(tracer) + + Pin.get_from(r).clone(tracer=tracer).onto(r) + await r.get("key") + await r.close() + + traces = test_spans.pop_traces() + assert len(traces) == 1 + spans = traces[0] + assert len(spans) == 1 + span = spans[0] + assert span.service == "myvalkeycluster" + + asyncio.run(test()) diff --git a/tests/contrib/valkey/test_valkey_patch.py b/tests/contrib/valkey/test_valkey_patch.py new file mode 100644 index 00000000000..320d2b82b6a --- /dev/null +++ b/tests/contrib/valkey/test_valkey_patch.py @@ -0,0 +1,31 @@ +# This test script was automatically generated by the contrib-patch-tests.py +# script. If you want to make changes to it, you should make sure that you have +# removed the ``_generated`` suffix from the file name, to prevent the content +# from being overwritten by future re-generations. + +from ddtrace.contrib.internal.valkey.patch import get_version +from ddtrace.contrib.internal.valkey.patch import patch + + +try: + from ddtrace.contrib.internal.valkey.patch import unpatch +except ImportError: + unpatch = None +from tests.contrib.patch import PatchTestCase + + +class TestValkeyPatch(PatchTestCase.Base): + __integration_name__ = "valkey" + __module_name__ = "valkey" + __patch_func__ = patch + __unpatch_func__ = unpatch + __get_version__ = get_version + + def assert_module_patched(self, valkey): + pass + + def assert_not_module_patched(self, valkey): + pass + + def assert_not_module_double_patched(self, valkey): + pass diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_with_rate.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_with_rate.json new file mode 100644 index 00000000000..cdc76343f08 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_with_rate.json @@ -0,0 +1,38 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_dd1.sr.eausr": 0.5, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 516916, + "start": 1692651820581556875 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_without_rate.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_without_rate.json new file mode 100644 index 00000000000..9a2bb9f2e4f --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_analytics_without_rate.json @@ -0,0 +1,38 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_dd1.sr.eausr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 340708, + "start": 1692651820591814875 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_basics.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_basics.json new file mode 100644 index 00000000000..e6da74211bb --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_basics.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 335292, + "start": 1692651820600962708 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length.json new file mode 100644 index 00000000000..5614e912961 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET here..." + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 326167, + "start": 1692651820609597416 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length_env.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length_env.json new file mode 100644 index 00000000000..75f058f3700 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_custom_cmd_length_env.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "ea409d0295db44adbf88dda3e4806547", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET here-is..." + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 20043, + "valkey.args_length": 2 + }, + "duration": 404084, + "start": 1692651821117540958 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_env_user_specified_valkey_service.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_env_user_specified_valkey_service.json new file mode 100644 index 00000000000..f4b7d26f3a6 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_env_user_specified_valkey_service.json @@ -0,0 +1,74 @@ +[[ + { + "name": "valkey.command", + "service": "myvalkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "e263ff9ad1cd43099216a11ca5e19377", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 20046, + "valkey.args_length": 2 + }, + "duration": 501125, + "start": 1692651821692035875 + }], +[ + { + "name": "valkey.command", + "service": "cfg-valkey", + "resource": "GET", + "trace_id": 1, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "e263ff9ad1cd43099216a11ca5e19377", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 20046, + "valkey.args_length": 2 + }, + "duration": 329333, + "start": 1692651821722196292 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_config.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_config.json new file mode 100644 index 00000000000..c447412ee09 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_config.json @@ -0,0 +1,71 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET put_key_in_resource", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3a1f7ba9b1ab42f4858e5effd03877ef", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET put_key_in_resource" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 65639, + "valkey.args_length": 2 + }, + "duration": 2978000, + "start": 1698858795260743000 + }], +[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET pipeline-cmd1 1\nSET pipeline-cmd2 2", + "trace_id": 1, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3a1f7ba9b1ab42f4858e5effd03877ef", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "SET pipeline-cmd1 1\nSET pipeline-cmd2 2" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 65639, + "valkey.pipeline_length": 2 + }, + "duration": 1408000, + "start": 1698858795278553000 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_env.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_env.json new file mode 100644 index 00000000000..f7f89e8565a --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_full_command_in_resource_env.json @@ -0,0 +1,71 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET put_key_in_resource", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "", + "_dd.p.dm": "-0", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "451464ac55804a488cf355b1d96c7002", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET put_key_in_resource" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 65646, + "valkey.args_length": 2 + }, + "duration": 3112000, + "start": 1698858796156355000 + }], +[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET pipeline-cmd1 1\nSET pipeline-cmd2 2", + "trace_id": 1, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "", + "_dd.p.dm": "-0", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "451464ac55804a488cf355b1d96c7002", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "SET pipeline-cmd1 1\nSET pipeline-cmd2 2" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 65646, + "valkey.pipeline_length": 2 + }, + "duration": 1246000, + "start": 1698858796167913000 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_long_command.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_long_command.json new file mode 100644 index 00000000000..15378c706ba --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_long_command.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "MGET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "MGET 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 36..." + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 1001 + }, + "duration": 3428042, + "start": 1692651821775339875 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_meta_override.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_meta_override.json new file mode 100644 index 00000000000..5edc6b45665 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_meta_override.json @@ -0,0 +1,38 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "cheese": "camembert", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 474500, + "start": 1692651821790889125 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_opentracing.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_opentracing.json new file mode 100644 index 00000000000..749bd3d3307 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_opentracing.json @@ -0,0 +1,56 @@ +[[ + { + "name": "valkey_get", + "service": "valkey_svc", + "resource": "valkey_get", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "language": "python", + "runtime-id": "3cf1df7fb079462ab81608355e026651" + }, + "metrics": { + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "process_id": 19999 + }, + "duration": 534179, + "start": 1692651821803009280 + }, + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 2, + "parent_id": 1, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "out.host": "localhost", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "valkey.args_length": 2 + }, + "duration": 358500, + "start": 1692651821803151542 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_immediate.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_immediate.json new file mode 100644 index 00000000000..5559b6a5959 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_immediate.json @@ -0,0 +1,72 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "SET a 1" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 3 + }, + "duration": 343500, + "start": 1692651821823333917 + }], +[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET", + "trace_id": 1, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "SET a 1" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.pipeline_length": 1 + }, + "duration": 158750, + "start": 1692651821823756750 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_traced.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_traced.json new file mode 100644 index 00000000000..c5e90a181b3 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_pipeline_traced.json @@ -0,0 +1,36 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET\nRPUSH\nHGETALL", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "SET blah 32\nRPUSH foo \u00e9\u00e9\nHGETALL xxx" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.pipeline_length": 3 + }, + "duration": 589917, + "start": 1692651821833429417 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_service_precedence.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_service_precedence.json new file mode 100644 index 00000000000..27979635427 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_service_precedence.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "env-valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "app-svc", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "0f782133fa34462daf85cad95bb55fd2", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 20052, + "valkey.args_length": 2 + }, + "duration": 423750, + "start": 1692651822324419751 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_unicode.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_unicode.json new file mode 100644 index 00000000000..09f6f46fd3d --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_unicode.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET \ud83d\ude10" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 512083, + "start": 1692651822408832834 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey.test_user_specified_service.json b/tests/snapshots/tests.contrib.valkey.test_valkey.test_user_specified_service.json new file mode 100644 index 00000000000..7a91612554e --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey.test_user_specified_service.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "mysvc", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "localhost", + "runtime-id": "9d4dd102c4394715976611e15b961233", + "server.address": "localhost", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 20056, + "valkey.args_length": 2 + }, + "duration": 439500, + "start": 1692651822941153668 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_basic_request.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_basic_request.json new file mode 100644 index 00000000000..70b0e166d97 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_basic_request.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 595750, + "start": 1692651823036625793 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_client_name.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_client_name.json new file mode 100644 index 00000000000..4f7b2688d76 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_client_name.json @@ -0,0 +1,57 @@ +[[ + { + "name": "web-request", + "service": "test", + "resource": "web-request", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "language": "python", + "runtime-id": "3cf1df7fb079462ab81608355e026651" + }, + "metrics": { + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "process_id": 19999 + }, + "duration": 828125, + "start": 1692651823188535376 + }, + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 2, + "parent_id": 1, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "out.host": "127.0.0.1", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.client_name": "testing-client-name", + "valkey.raw_command": "GET blah" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "valkey.args_length": 2 + }, + "duration": 541041, + "start": 1692651823188798168 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_connection_error.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_connection_error.json new file mode 100644 index 00000000000..64609dd8614 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_connection_error.json @@ -0,0 +1,40 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 1, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "error.message": "whatever", + "error.stack": "Traceback (most recent call last):\n File \"/root/project/ddtrace/contrib/trace_utils_valkey.py\", line 117, in _trace_valkey_cmd\n yield span\n File \"/root/project/ddtrace/contrib/valkey/asyncio_patch.py\", line 22, in traced_async_execute_command\n return await _run_valkey_command_async(span=span, func=func, args=args, kwargs=kwargs)\n File \"/root/project/ddtrace/contrib/valkey/asyncio_patch.py\", line 41, in _run_valkey_command_async\n result = await func(*args, **kwargs)\n File \"/root/project/.riot/venv_py31011_mock_pytest_pytest-mock_coverage_pytest-cov_opentracing_hypothesis6451_pytest-asyncio_valkey~41/lib/python3.10/site-packages/valkey/asyncio/client.py\", line 509, in execute_command\n conn = self.connection or await pool.get_connection(command_name, **options)\n File \"/root/.pyenv/versions/3.10.11/lib/python3.10/unittest/mock.py\", line 2234, in _execute_mock_call\n raise effect\nvalkey.exceptions.ConnectionError: whatever\n", + "error.type": "valkey.exceptions.ConnectionError", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "dc59875580884b52bebd2f9c402238f8", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET foo" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 2340, + "valkey.args_length": 2 + }, + "duration": 935417, + "start": 1695409673533997174 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_args.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_args.json new file mode 100644 index 00000000000..649d89db933 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_args.json @@ -0,0 +1,73 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET \\x80foo \\x80abc" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 3 + }, + "duration": 512917, + "start": 1692651823066497751 + }], +[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 1, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET \\x80foo" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 330333, + "start": 1692651823067101001 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_pipeline_args.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_pipeline_args.json new file mode 100644 index 00000000000..c22d2347b5e --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_decoding_non_utf8_pipeline_args.json @@ -0,0 +1,36 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET\nSET\nGET\nGET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET \\x80blah boo\nSET foo \\x80abc\nGET \\x80blah\nGET foo" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.pipeline_length": 4 + }, + "duration": 404709, + "start": 1692651823079707584 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_long_command.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_long_command.json new file mode 100644 index 00000000000..9f4e40ffd1b --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_long_command.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "MGET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "MGET 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 36..." + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 1001 + }, + "duration": 5689625, + "start": 1692651823091333793 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_override_service_name.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_override_service_name.json new file mode 100644 index 00000000000..f3d0bce583a --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_override_service_name.json @@ -0,0 +1,110 @@ +[[ + { + "name": "valkey.command", + "service": "myvalkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 297666, + "start": 1692651823109161293 + }], +[ + { + "name": "valkey.command", + "service": "myvalkey", + "resource": "SET", + "trace_id": 1, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET cheese my-cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 3 + }, + "duration": 230084, + "start": 1692651823109550709 + }], +[ + { + "name": "valkey.command", + "service": "myvalkey", + "resource": "GET", + "trace_id": 2, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 160875, + "start": 1692651823109840043 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_parenting.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_parenting.json new file mode 100644 index 00000000000..c9a38d7fa31 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_parenting.json @@ -0,0 +1,85 @@ +[[ + { + "name": "web-request", + "service": "test", + "resource": "web-request", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "language": "python", + "runtime-id": "3cf1df7fb079462ab81608355e026651" + }, + "metrics": { + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "process_id": 19999 + }, + "duration": 953000, + "start": 1692651823176740209 + }, + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET", + "trace_id": 0, + "span_id": 2, + "parent_id": 1, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "out.host": "127.0.0.1", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET blah boo" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "valkey.args_length": 3 + }, + "duration": 270791, + "start": 1692651823176857918 + }, + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 3, + "parent_id": 1, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "out.host": "127.0.0.1", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET blah" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "db.row_count": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "valkey.args_length": 2 + }, + "duration": 499000, + "start": 1692651823177170168 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pin.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pin.json new file mode 100644 index 00000000000..91c995cc259 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pin.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "my-valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET cheese" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 327417, + "start": 1692651823121474251 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced.json new file mode 100644 index 00000000000..e267216e24f --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced.json @@ -0,0 +1,36 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET\nSET\nGET\nGET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET blah boo\nSET foo bar\nGET blah\nGET foo" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.pipeline_length": 4 + }, + "duration": 384125, + "start": 1692651823134602834 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced_context_manager_transaction.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced_context_manager_transaction.json new file mode 100644 index 00000000000..72633ef5e16 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_pipeline_traced_context_manager_transaction.json @@ -0,0 +1,36 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET\nSET\nGET\nGET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET blah boo\nSET foo bar\nGET blah\nGET foo" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.pipeline_length": 4 + }, + "duration": 507125, + "start": 1692651823152247501 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_two_traced_pipelines.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_two_traced_pipelines.json new file mode 100644 index 00000000000..60ff68c9b1b --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_two_traced_pipelines.json @@ -0,0 +1,84 @@ +[[ + { + "name": "web-request", + "service": "test", + "resource": "web-request", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "language": "python", + "runtime-id": "3cf1df7fb079462ab81608355e026651" + }, + "metrics": { + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "process_id": 19999 + }, + "duration": 940000, + "start": 1692651823164019209 + }, + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET\nGET", + "trace_id": 0, + "span_id": 2, + "parent_id": 1, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "out.host": "127.0.0.1", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET blah boo\nGET blah" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "valkey.pipeline_length": 2 + }, + "duration": 352833, + "start": 1692651823164207293 + }, + { + "name": "valkey.command", + "service": "valkey", + "resource": "SET\nGET", + "trace_id": 0, + "span_id": 3, + "parent_id": 1, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "out.host": "127.0.0.1", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "SET foo bar\nGET foo" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "network.destination.port": 6379, + "out.valkey_db": 0, + "valkey.pipeline_length": 2 + }, + "duration": 310042, + "start": 1692651823164624126 + }]] diff --git a/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_unicode_request.json b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_unicode_request.json new file mode 100644 index 00000000000..c6db207fd51 --- /dev/null +++ b/tests/snapshots/tests.contrib.valkey.test_valkey_asyncio.test_unicode_request.json @@ -0,0 +1,37 @@ +[[ + { + "name": "valkey.command", + "service": "valkey", + "resource": "GET", + "trace_id": 0, + "span_id": 1, + "parent_id": 0, + "type": "valkey", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.valkey", + "_dd.p.dm": "-0", + "_dd.p.tid": "654a694400000000", + "component": "valkey", + "db.system": "valkey", + "language": "python", + "out.host": "127.0.0.1", + "runtime-id": "3cf1df7fb079462ab81608355e026651", + "server.address": "127.0.0.1", + "span.kind": "client", + "valkey.raw_command": "GET \ud83d\ude10" + }, + "metrics": { + "_dd.measured": 1, + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "db.row_count": 0, + "network.destination.port": 6379, + "out.valkey_db": 0, + "process_id": 19999, + "valkey.args_length": 2 + }, + "duration": 300041, + "start": 1692651823049427543 + }]] From 33ad7b3a9554399ac3801f401c197de21af6666d Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 5 Feb 2025 15:50:44 -0500 Subject: [PATCH 60/63] ci(fix): fix failing pre-check on the tracing module (#12232) ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- ddtrace/_trace/tracer.py | 2 -- tests/tracer/test_propagation.py | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ddtrace/_trace/tracer.py b/ddtrace/_trace/tracer.py index c8e2c96df8d..9dac36c175e 100644 --- a/ddtrace/_trace/tracer.py +++ b/ddtrace/_trace/tracer.py @@ -59,7 +59,6 @@ from ddtrace.internal.serverless import in_gcp_function from ddtrace.internal.service import ServiceStatusError from ddtrace.internal.utils import _get_metas_to_propagate -from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning from ddtrace.internal.utils.formats import format_trace_id from ddtrace.internal.utils.http import verify_url from ddtrace.internal.writer import AgentResponse @@ -69,7 +68,6 @@ from ddtrace.settings import Config from ddtrace.settings.asm import config as asm_config from ddtrace.settings.peer_service import _ps_config -from ddtrace.vendor.debtcollector import deprecate log = get_logger(__name__) diff --git a/tests/tracer/test_propagation.py b/tests/tracer/test_propagation.py index e34167ce04f..f79116826d3 100644 --- a/tests/tracer/test_propagation.py +++ b/tests/tracer/test_propagation.py @@ -47,6 +47,7 @@ from tests.contrib.fastapi.conftest import test_spans as fastapi_test_spans # noqa:F401 from tests.contrib.fastapi.conftest import tracer # noqa:F401 +from ..utils import flaky from ..utils import override_env from ..utils import override_global_config @@ -836,6 +837,7 @@ def test_extract_128bit_trace_ids_tracecontext(): assert child_span.trace_id == trace_id +@flaky(1735812000, reason="FIXME: Failing due to the global tracer being used in all tests") def test_last_dd_span_id(): non_dd_remote_context = HTTPPropagator.extract( { From 25e7e2ea0294e9c658484780913bfca41e306f4b Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 5 Feb 2025 17:15:53 -0500 Subject: [PATCH 61/63] chore(pin): enforce the use of the global tracer (#12219) - Removes `tracer` parameter from `Pin.override()`, `Pin.clone()` and `Pin.__init__()`. `ddtrace.trace.Pin` can only be used with the global tracer. With this change User's can not modify integration to use custom tracers. - Introduces `Pin._tracer` and makes `Pin.tracer` an immutable property. This prevents users from modifying the tracer used by Pin objects while allowing maintainers to override the Pin._tracer in tests, - Updates tests to use `Pin._tracer`, `Pin._override()`, and `Pin._clone()`. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: erikayasuda <153395705+erikayasuda@users.noreply.github.com> --- ddtrace/_trace/pin.py | 70 ++-- ddtrace/contrib/internal/asgi/middleware.py | 8 +- ddtrace/contrib/internal/django/patch.py | 10 +- ddtrace/contrib/internal/mongoengine/trace.py | 11 +- ddtrace/contrib/internal/pylibmc/client.py | 8 +- ddtrace/contrib/internal/sqlalchemy/engine.py | 9 +- .../contrib/internal/tornado/application.py | 10 +- ...eprecations-from-pin-a700ae0cb6d51d03.yaml | 4 + .../appsec/contrib_appsec/django_app/urls.py | 2 +- .../appsec/contrib_appsec/fastapi_app/app.py | 2 +- tests/appsec/contrib_appsec/flask_app/app.py | 2 +- tests/appsec/contrib_appsec/test_flask.py | 2 +- tests/appsec/contrib_appsec/utils.py | 4 +- .../integrations/django_tests/conftest.py | 4 +- tests/contrib/aiobotocore/utils.py | 4 +- tests/contrib/aiohttp/test_aiohttp_client.py | 2 +- tests/contrib/aiohttp_jinja2/conftest.py | 4 +- .../aiohttp_jinja2/test_aiohttp_jinja2.py | 4 +- tests/contrib/aiomysql/test_aiomysql.py | 8 +- tests/contrib/aiopg/test.py | 34 +- tests/contrib/algoliasearch/test.py | 14 +- tests/contrib/anthropic/conftest.py | 2 +- tests/contrib/aredis/test_aredis.py | 4 +- tests/contrib/asyncpg/test_asyncpg.py | 6 +- tests/contrib/avro/test_avro.py | 8 +- tests/contrib/boto/test.py | 101 ++--- tests/contrib/botocore/test.py | 348 ++++++++++++------ tests/contrib/botocore/test_bedrock.py | 4 +- tests/contrib/botocore/test_bedrock_llmobs.py | 6 +- tests/contrib/cassandra/test.py | 16 +- tests/contrib/celery/base.py | 7 +- tests/contrib/celery/test_tagging.py | 4 +- tests/contrib/consul/test.py | 8 +- tests/contrib/dbapi/test_dbapi.py | 96 +++-- tests/contrib/dbapi/test_dbapi_appsec.py | 20 +- tests/contrib/dbapi_async/test_dbapi_async.py | 100 +++-- tests/contrib/django/conftest.py | 4 +- tests/contrib/django/test_django.py | 2 +- tests/contrib/django/test_django_dbm.py | 2 +- tests/contrib/dogpile_cache/test_tracing.py | 2 +- tests/contrib/dramatiq/test_integration.py | 8 +- .../elasticsearch/test_elasticsearch.py | 20 +- tests/contrib/flask/__init__.py | 2 +- tests/contrib/flask/test_blueprint.py | 10 +- .../flask_autopatch/test_flask_autopatch.py | 2 +- tests/contrib/google_generativeai/conftest.py | 2 +- tests/contrib/grpc/common.py | 4 +- tests/contrib/grpc/test_grpc.py | 10 +- tests/contrib/grpc_aio/test_grpc_aio.py | 14 +- tests/contrib/httplib/test_httplib.py | 6 +- .../httplib/test_httplib_distributed.py | 2 +- tests/contrib/httpx/test_httpx.py | 8 +- tests/contrib/httpx/test_httpx_pre_0_11.py | 6 +- tests/contrib/jinja2/test_jinja2.py | 2 +- tests/contrib/kafka/test_kafka.py | 89 ++--- tests/contrib/kombu/test.py | 16 +- tests/contrib/langchain/conftest.py | 2 +- tests/contrib/langgraph/conftest.py | 2 +- tests/contrib/mako/test_mako.py | 2 +- tests/contrib/mariadb/test_mariadb.py | 2 +- tests/contrib/molten/test_molten.py | 6 +- tests/contrib/molten/test_molten_di.py | 2 +- tests/contrib/mongoengine/test.py | 16 +- tests/contrib/mysql/test_mysql.py | 4 +- tests/contrib/mysqldb/test_mysqldb.py | 8 +- tests/contrib/openai/conftest.py | 2 +- tests/contrib/psycopg/test_psycopg.py | 6 +- tests/contrib/psycopg/test_psycopg_async.py | 2 +- tests/contrib/psycopg2/test_psycopg.py | 4 +- tests/contrib/pylibmc/test.py | 10 +- tests/contrib/pymemcache/test_client.py | 14 +- .../pymemcache/test_client_defaults.py | 2 +- tests/contrib/pymemcache/test_client_mixin.py | 2 +- tests/contrib/pymongo/test.py | 56 +-- tests/contrib/pymysql/test_pymysql.py | 6 +- tests/contrib/pynamodb/test_pynamodb.py | 6 +- tests/contrib/pyodbc/test_pyodbc.py | 6 +- tests/contrib/redis/test_redis.py | 22 +- tests/contrib/redis/test_redis_asyncio.py | 2 +- tests/contrib/redis/test_redis_cluster.py | 10 +- .../redis/test_redis_cluster_asyncio.py | 20 +- tests/contrib/rediscluster/test.py | 16 +- tests/contrib/rq/test_rq.py | 4 +- tests/contrib/shared_tests.py | 4 +- tests/contrib/shared_tests_async.py | 4 +- tests/contrib/sqlalchemy/test_patch.py | 4 +- tests/contrib/sqlite3/test_sqlite3.py | 12 +- tests/contrib/starlette/test_starlette.py | 2 +- tests/contrib/subprocess/test_subprocess.py | 24 +- tests/contrib/urllib3/test_urllib3.py | 2 +- tests/contrib/valkey/test_valkey.py | 22 +- tests/contrib/valkey/test_valkey_asyncio.py | 2 +- tests/contrib/valkey/test_valkey_cluster.py | 10 +- .../valkey/test_valkey_cluster_asyncio.py | 20 +- tests/contrib/vertexai/conftest.py | 2 +- tests/contrib/vertica/test_vertica.py | 18 +- tests/contrib/yaaredis/test_yaaredis.py | 6 +- 97 files changed, 888 insertions(+), 635 deletions(-) create mode 100644 releasenotes/notes/remove-deprecations-from-pin-a700ae0cb6d51d03.yaml diff --git a/ddtrace/_trace/pin.py b/ddtrace/_trace/pin.py index dd41a1040a1..e27640a993e 100644 --- a/ddtrace/_trace/pin.py +++ b/ddtrace/_trace/pin.py @@ -6,7 +6,6 @@ import wrapt import ddtrace -from ddtrace.vendor.debtcollector import deprecate from ..internal.logger import get_logger @@ -32,25 +31,17 @@ class Pin(object): >>> conn = sqlite.connect('/tmp/image.db') """ - __slots__ = ["tags", "tracer", "_target", "_config", "_initialized"] + __slots__ = ["tags", "_tracer", "_target", "_config", "_initialized"] def __init__( self, service=None, # type: Optional[str] tags=None, # type: Optional[Dict[str, str]] - tracer=None, _config=None, # type: Optional[Dict[str, Any]] ): # type: (...) -> None - if tracer is not None and tracer is not ddtrace.tracer: - deprecate( - "Initializing ddtrace.trace.Pin with `tracer` argument is deprecated", - message="All Pin instances should use the global tracer instance", - removal_version="3.0.0", - ) - tracer = tracer or ddtrace.tracer self.tags = tags - self.tracer = tracer + self._tracer = ddtrace.tracer self._target = None # type: Optional[int] # keep the configuration attribute internal because the # public API to access it is not the Pin class @@ -68,10 +59,14 @@ def service(self): return self._config["service_name"] def __setattr__(self, name, value): - if getattr(self, "_initialized", False) and name != "_target": + if getattr(self, "_initialized", False) and name not in ("_target", "_tracer"): raise AttributeError("can't mutate a pin, use override() or clone() instead") super(Pin, self).__setattr__(name, value) + @property + def tracer(self): + return self._tracer + def __repr__(self): return "Pin(service=%s, tags=%s, tracer=%s)" % (self.service, self.tags, self.tracer) @@ -127,7 +122,6 @@ def override( obj, # type: Any service=None, # type: Optional[str] tags=None, # type: Optional[Dict[str, str]] - tracer=None, ): # type: (...) -> None """Override an object with the given attributes. @@ -139,20 +133,32 @@ def override( >>> # Override a pin for a specific connection >>> Pin.override(conn, service='user-db') """ - if tracer is not None: - deprecate( - "Calling ddtrace.trace.Pin.override(...) with the `tracer` argument is deprecated", - message="All Pin instances should use the global tracer instance", - removal_version="3.0.0", - ) + Pin._override(obj, service=service, tags=tags) + + @classmethod + def _override( + cls, + obj, # type: Any + service=None, # type: Optional[str] + tags=None, # type: Optional[Dict[str, str]] + tracer=None, + ): + # type: (...) -> None + """ + Internal method that allows overriding the global tracer in tests + """ if not obj: return pin = cls.get_from(obj) if pin is None: - Pin(service=service, tags=tags, tracer=tracer).onto(obj) + pin = Pin(service=service, tags=tags) else: - pin.clone(service=service, tags=tags, tracer=tracer).onto(obj) + pin = pin.clone(service=service, tags=tags) + + if tracer: + pin._tracer = tracer + pin.onto(obj) def enabled(self): # type: () -> bool @@ -198,21 +204,22 @@ def clone( self, service=None, # type: Optional[str] tags=None, # type: Optional[Dict[str, str]] - tracer=None, ): # type: (...) -> Pin """Return a clone of the pin with the given attributes replaced.""" + return self._clone(service=service, tags=tags) + + def _clone( + self, + service=None, # type: Optional[str] + tags=None, # type: Optional[Dict[str, str]] + tracer=None, + ): + """Internal method that can clone the tracer from an existing Pin. This is used in tests""" # do a shallow copy of Pin dicts if not tags and self.tags: tags = self.tags.copy() - if tracer is not None: - deprecate( - "Initializing ddtrace.trace.Pin with `tracer` argument is deprecated", - message="All Pin instances should use the global tracer instance", - removal_version="3.0.0", - ) - # we use a copy instead of a deepcopy because we expect configurations # to have only a root level dictionary without nested objects. Using # deepcopy introduces a big overhead: @@ -221,9 +228,10 @@ def clone( # deepcopy: 0.2787208557128906 config = self._config.copy() - return Pin( + pin = Pin( service=service or self.service, tags=tags, - tracer=tracer or self.tracer, # do not clone the Tracer _config=config, ) + pin._tracer = tracer or self.tracer + return pin diff --git a/ddtrace/contrib/internal/asgi/middleware.py b/ddtrace/contrib/internal/asgi/middleware.py index 7da2b11b929..70b284c8882 100644 --- a/ddtrace/contrib/internal/asgi/middleware.py +++ b/ddtrace/contrib/internal/asgi/middleware.py @@ -150,12 +150,8 @@ async def __call__(self, scope, receive, send): if scope["type"] == "http": operation_name = schematize_url_operation(operation_name, direction=SpanDirection.INBOUND, protocol="http") - # Calling ddtrace.trace.Pin(...) with the `tracer` argument is deprecated - # Remove this if statement when the `tracer` argument is removed - if self.tracer is ddtrace.tracer: - pin = ddtrace.trace.Pin(service="asgi") - else: - pin = ddtrace.trace.Pin(service="asgi", tracer=self.tracer) + pin = ddtrace.trace.Pin(service="asgi") + pin._tracer = self.tracer with core.context_with_data( "asgi.__call__", diff --git a/ddtrace/contrib/internal/django/patch.py b/ddtrace/contrib/internal/django/patch.py index ba96675fef3..3fea1e9b6a0 100644 --- a/ddtrace/contrib/internal/django/patch.py +++ b/ddtrace/contrib/internal/django/patch.py @@ -17,7 +17,6 @@ import wrapt from wrapt.importer import when_imported -import ddtrace from ddtrace import config from ddtrace.appsec._utils import _UserInfoRetriever from ddtrace.constants import SPAN_KIND @@ -149,12 +148,9 @@ def cursor(django, pin, func, instance, args, kwargs): tags = {"django.db.vendor": vendor, "django.db.alias": alias} tags.update(getattr(conn, "_datadog_tags", {})) - # Calling ddtrace.pin.Pin(...) with the `tracer` argument generates a deprecation warning. - # Remove this if statement when the `tracer` argument is removed - if pin.tracer is ddtrace.tracer: - pin = Pin(service, tags=tags) - else: - pin = Pin(service, tags=tags, tracer=pin.tracer) + tracer = pin.tracer + pin = Pin(service, tags=tags) + pin._tracer = tracer cursor = func(*args, **kwargs) diff --git a/ddtrace/contrib/internal/mongoengine/trace.py b/ddtrace/contrib/internal/mongoengine/trace.py index 5539cf1d2e4..49ed5ee2590 100644 --- a/ddtrace/contrib/internal/mongoengine/trace.py +++ b/ddtrace/contrib/internal/mongoengine/trace.py @@ -29,11 +29,10 @@ def __call__(self, *args, **kwargs): client = self.__wrapped__(*args, **kwargs) pin = ddtrace.trace.Pin.get_from(self) if pin: - # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning. - # Remove this if statement when the `tracer` argument is removed - if pin.tracer is ddtrace.tracer: - ddtrace.trace.Pin(service=pin.service).onto(client) - else: - ddtrace.trace.Pin(service=pin.service, tracer=pin.tracer).onto(client) + tracer = pin.tracer + pp = ddtrace.trace.Pin(service=pin.service) + if tracer is not None: + pp._tracer = tracer + pp.onto(client) return client diff --git a/ddtrace/contrib/internal/pylibmc/client.py b/ddtrace/contrib/internal/pylibmc/client.py index 5c48e8465f8..e6b367b243b 100644 --- a/ddtrace/contrib/internal/pylibmc/client.py +++ b/ddtrace/contrib/internal/pylibmc/client.py @@ -51,12 +51,8 @@ def __init__(self, client=None, service=memcached.SERVICE, tracer=None, *args, * super(TracedClient, self).__init__(client) schematized_service = schematize_service_name(service) - # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning. - # Remove this if statement when the `tracer` argument is removed - if tracer is ddtrace.tracer: - pin = ddtrace.trace.Pin(service=schematized_service) - else: - pin = ddtrace.trace.Pin(service=schematized_service, tracer=tracer) + pin = ddtrace.trace.Pin(service=schematized_service) + pin._tracer = tracer pin.onto(self) # attempt to collect the pool of urls this client talks to diff --git a/ddtrace/contrib/internal/sqlalchemy/engine.py b/ddtrace/contrib/internal/sqlalchemy/engine.py index a3dcb324700..a20199dbcc2 100644 --- a/ddtrace/contrib/internal/sqlalchemy/engine.py +++ b/ddtrace/contrib/internal/sqlalchemy/engine.py @@ -67,12 +67,9 @@ def __init__(self, tracer, service, engine): self.name = schematize_database_operation("%s.query" % self.vendor, database_provider=self.vendor) # attach the PIN - # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning. - # Remove this if statement when the `tracer` argument is removed - if self.tracer is ddtrace.tracer: - Pin(service=self.service).onto(engine) - else: - Pin(tracer=tracer, service=self.service).onto(engine) + pin = Pin(service=self.service) + pin._tracer = self.tracer + pin.onto(engine) listen(engine, "before_cursor_execute", self._before_cur_exec) listen(engine, "after_cursor_execute", self._after_cur_exec) diff --git a/ddtrace/contrib/internal/tornado/application.py b/ddtrace/contrib/internal/tornado/application.py index f36857b81b1..587912f603b 100644 --- a/ddtrace/contrib/internal/tornado/application.py +++ b/ddtrace/contrib/internal/tornado/application.py @@ -54,10 +54,6 @@ def tracer_config(__init__, app, args, kwargs): if tags: tracer.set_tags(tags) - # configure the PIN object for template rendering - # Required for backwards compatibility. Remove the else clause when - # the `ddtrace.trace.Pin` object no longer accepts the Pin argument. - if tracer is ddtrace.tracer: - ddtrace.trace.Pin(service=service).onto(template) - else: - ddtrace.trace.Pin(service=service, tracer=tracer).onto(template) + pin = ddtrace.trace.Pin(service=service) + pin._tracer = tracer + pin.onto(template) diff --git a/releasenotes/notes/remove-deprecations-from-pin-a700ae0cb6d51d03.yaml b/releasenotes/notes/remove-deprecations-from-pin-a700ae0cb6d51d03.yaml new file mode 100644 index 00000000000..0401cdc4258 --- /dev/null +++ b/releasenotes/notes/remove-deprecations-from-pin-a700ae0cb6d51d03.yaml @@ -0,0 +1,4 @@ +--- +upgrade: + - | + tracing: Removes support for overriding the global tracer in ``ddtrace.trace.Pin`` \ No newline at end of file diff --git a/tests/appsec/contrib_appsec/django_app/urls.py b/tests/appsec/contrib_appsec/django_app/urls.py index 3ca8557c550..bb93a34ff8a 100644 --- a/tests/appsec/contrib_appsec/django_app/urls.py +++ b/tests/appsec/contrib_appsec/django_app/urls.py @@ -196,7 +196,7 @@ def login_user(request): def new_service(request, service_name: str): import ddtrace - ddtrace.trace.Pin.override(django, service=service_name, tracer=ddtrace.tracer) + ddtrace.trace.Pin._override(django, service=service_name, tracer=ddtrace.tracer) return HttpResponse(service_name, status=200) diff --git a/tests/appsec/contrib_appsec/fastapi_app/app.py b/tests/appsec/contrib_appsec/fastapi_app/app.py index c636e65b7c3..ddefe6cf33c 100644 --- a/tests/appsec/contrib_appsec/fastapi_app/app.py +++ b/tests/appsec/contrib_appsec/fastapi_app/app.py @@ -104,7 +104,7 @@ async def multi_view_no_param(request: Request): # noqa: B008 async def new_service(service_name: str, request: Request): # noqa: B008 import ddtrace - ddtrace.trace.Pin.override(app, service=service_name, tracer=ddtrace.tracer) + ddtrace.trace.Pin._override(app, service=service_name, tracer=ddtrace.tracer) return HTMLResponse(service_name, 200) async def slow_numbers(minimum, maximum): diff --git a/tests/appsec/contrib_appsec/flask_app/app.py b/tests/appsec/contrib_appsec/flask_app/app.py index 32228375f37..ef2fcb0ce2c 100644 --- a/tests/appsec/contrib_appsec/flask_app/app.py +++ b/tests/appsec/contrib_appsec/flask_app/app.py @@ -55,7 +55,7 @@ def multi_view(param_int=0, param_str=""): def new_service(service_name: str): import ddtrace - ddtrace.trace.Pin.override(Flask, service=service_name, tracer=ddtrace.tracer) + ddtrace.trace.Pin._override(Flask, service=service_name, tracer=ddtrace.tracer) return service_name diff --git a/tests/appsec/contrib_appsec/test_flask.py b/tests/appsec/contrib_appsec/test_flask.py index b497de98bf9..690b893c89f 100644 --- a/tests/appsec/contrib_appsec/test_flask.py +++ b/tests/appsec/contrib_appsec/test_flask.py @@ -37,7 +37,7 @@ def setUp(self): self.app = app self.app.test_client_class = DDFlaskTestClient self.client = self.app.test_client() - Pin.override(self.app, tracer=self.tracer) + Pin._override(self.app, tracer=self.tracer) def tearDown(self): super(BaseFlaskTestCase, self).tearDown() diff --git a/tests/appsec/contrib_appsec/utils.py b/tests/appsec/contrib_appsec/utils.py index 5cf5e1da6b1..e510ed34029 100644 --- a/tests/appsec/contrib_appsec/utils.py +++ b/tests/appsec/contrib_appsec/utils.py @@ -1568,7 +1568,7 @@ def test_tracer(): @contextmanager def post_tracer(interface): original_tracer = getattr(ddtrace.trace.Pin.get_from(interface.framework), "tracer", None) - ddtrace.trace.Pin.override(interface.framework, tracer=interface.tracer) + ddtrace.trace.Pin._override(interface.framework, tracer=interface.tracer) yield if original_tracer is not None: - ddtrace.trace.Pin.override(interface.framework, tracer=original_tracer) + ddtrace.trace.Pin._override(interface.framework, tracer=original_tracer) diff --git a/tests/appsec/integrations/django_tests/conftest.py b/tests/appsec/integrations/django_tests/conftest.py index 57bd68db6a6..d047b7acee5 100644 --- a/tests/appsec/integrations/django_tests/conftest.py +++ b/tests/appsec/integrations/django_tests/conftest.py @@ -50,7 +50,7 @@ def tracer(): # Patch Django and override tracer to be our test tracer pin = Pin.get_from(django) original_tracer = pin.tracer - Pin.override(django, tracer=tracer) + Pin._override(django, tracer=tracer) # Yield to our test yield tracer @@ -59,7 +59,7 @@ def tracer(): # Reset the tracer pinned to Django and unpatch # DEV: unable to properly unpatch and reload django app with each test # unpatch() - Pin.override(django, tracer=original_tracer) + Pin._override(django, tracer=original_tracer) @pytest.fixture diff --git a/tests/contrib/aiobotocore/utils.py b/tests/contrib/aiobotocore/utils.py index b51b6550327..e2eb56c6026 100644 --- a/tests/contrib/aiobotocore/utils.py +++ b/tests/contrib/aiobotocore/utils.py @@ -42,11 +42,11 @@ async def aiobotocore_client(service, tracer): client, aiobotocore.session.ClientCreatorContext ): async with client as client: - Pin.override(client, tracer=tracer) + Pin._override(client, tracer=tracer) await yield_(client) else: - Pin.override(client, tracer=tracer) + Pin._override(client, tracer=tracer) try: await yield_(client) finally: diff --git a/tests/contrib/aiohttp/test_aiohttp_client.py b/tests/contrib/aiohttp/test_aiohttp_client.py index 2b2b51c2650..c020b1266c6 100644 --- a/tests/contrib/aiohttp/test_aiohttp_client.py +++ b/tests/contrib/aiohttp/test_aiohttp_client.py @@ -189,7 +189,7 @@ def test_configure_service_name_pin(ddtrace_run_python_code_in_subprocess): async def test(): async with aiohttp.ClientSession() as session: - Pin.override(session, service="pin-custom-svc") + Pin._override(session, service="pin-custom-svc") async with session.get(URL_200) as resp: pass diff --git a/tests/contrib/aiohttp_jinja2/conftest.py b/tests/contrib/aiohttp_jinja2/conftest.py index a58b72f7f49..1624753a635 100644 --- a/tests/contrib/aiohttp_jinja2/conftest.py +++ b/tests/contrib/aiohttp_jinja2/conftest.py @@ -13,7 +13,7 @@ def patched_app_tracer_jinja(patched_app_tracer): # noqa: F811 app, tracer = patched_app_tracer patch() - Pin.override(aiohttp_jinja2, tracer=tracer) + Pin._override(aiohttp_jinja2, tracer=tracer) yield app, tracer unpatch() @@ -22,6 +22,6 @@ def patched_app_tracer_jinja(patched_app_tracer): # noqa: F811 def untraced_app_tracer_jinja(untraced_app_tracer): # noqa: F811 patch() app, tracer = untraced_app_tracer - Pin.override(aiohttp_jinja2, tracer=tracer) + Pin._override(aiohttp_jinja2, tracer=tracer) yield app, tracer unpatch() diff --git a/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py b/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py index 089c799ebe0..98a942b1637 100644 --- a/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py +++ b/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py @@ -35,7 +35,7 @@ async def test_template_rendering(untraced_app_tracer_jinja, aiohttp_client): async def test_template_rendering_snapshot(untraced_app_tracer_jinja, aiohttp_client, snapshot_context): app, _ = untraced_app_tracer_jinja - Pin.override(aiohttp_jinja2, tracer=tracer) + Pin._override(aiohttp_jinja2, tracer=tracer) with snapshot_context(): client = await aiohttp_client(app) # it should trace a template rendering @@ -51,7 +51,7 @@ async def test_template_rendering_snapshot_patched_server( use_global_tracer, ): app, _ = patched_app_tracer_jinja - Pin.override(aiohttp_jinja2, tracer=tracer) + Pin._override(aiohttp_jinja2, tracer=tracer) # Ignore meta.http.url tag as the port is not fixed on the server with snapshot_context(ignores=["meta.http.url", "meta.http.useragent"]): client = await aiohttp_client(app) diff --git a/tests/contrib/aiomysql/test_aiomysql.py b/tests/contrib/aiomysql/test_aiomysql.py index 8c923b9e292..06d53d4ce05 100644 --- a/tests/contrib/aiomysql/test_aiomysql.py +++ b/tests/contrib/aiomysql/test_aiomysql.py @@ -62,7 +62,7 @@ async def test_queries(snapshot_conn): @pytest.mark.asyncio @pytest.mark.snapshot async def test_pin_override(patched_conn, tracer): - Pin.override(patched_conn, service="db") + Pin._override(patched_conn, service="db") cursor = await patched_conn.cursor() await cursor.execute("SELECT 1") rows = await cursor.fetchall() @@ -78,7 +78,7 @@ async def test_patch_unpatch(tracer, test_spans): service = "fo" conn = await aiomysql.connect(**AIOMYSQL_CONFIG) - Pin.get_from(conn).clone(service=service, tracer=tracer).onto(conn) + Pin.get_from(conn)._clone(service=service, tracer=tracer).onto(conn) await (await conn.cursor()).execute("select 'dba4x4'") conn.close() @@ -100,7 +100,7 @@ async def test_patch_unpatch(tracer, test_spans): patch() conn = await aiomysql.connect(**AIOMYSQL_CONFIG) - Pin.get_from(conn).clone(service=service, tracer=tracer).onto(conn) + Pin.get_from(conn)._clone(service=service, tracer=tracer).onto(conn) await (await conn.cursor()).execute("select 'dba4x4'") conn.close() @@ -237,7 +237,7 @@ async def _get_conn_tracer(self, tags=None): assert pin # Customize the service # we have to apply it on the existing one since new one won't inherit `app` - pin.clone(tracer=self.tracer, tags={**tags, **pin.tags}).onto(self.conn) + pin._clone(tracer=self.tracer, tags={**tags, **pin.tags}).onto(self.conn) return self.conn, self.tracer diff --git a/tests/contrib/aiopg/test.py b/tests/contrib/aiopg/test.py index eb738e009d8..939aa376570 100644 --- a/tests/contrib/aiopg/test.py +++ b/tests/contrib/aiopg/test.py @@ -39,7 +39,7 @@ def tearDown(self): @pytest.mark.asyncio async def _get_conn_and_tracer(self): conn = self._conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) return conn, self.tracer @@ -159,7 +159,7 @@ async def test_connect_factory(self): services = ["db", "another"] for service in services: conn, _ = await self._get_conn_and_tracer() - Pin.get_from(conn).clone(service=service, tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(service=service, tracer=self.tracer).onto(conn) await self.assert_conn_is_traced(self.tracer, conn, service) conn.close() @@ -172,7 +172,7 @@ async def test_patch_unpatch(self): service = "fo" conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(service=service, tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(service=service, tracer=self.tracer).onto(conn) await (await conn.cursor()).execute("select 'blah'") conn.close() @@ -194,7 +194,7 @@ async def test_patch_unpatch(self): patch() conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(service=service, tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(service=service, tracer=self.tracer).onto(conn) await (await conn.cursor()).execute("select 'blah'") conn.close() @@ -218,7 +218,7 @@ async def test_user_specified_service_v0(self): assert config.service == "mysvc" conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) await (await conn.cursor()).execute("select 'blah'") conn.close() @@ -240,7 +240,7 @@ async def test_user_specified_service_v1(self): assert config.service == "mysvc" conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) await (await conn.cursor()).execute("select 'blah'") conn.close() @@ -258,7 +258,7 @@ async def test_unspecified_service_v1(self): """ # Ensure that the service name was configured conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) await (await conn.cursor()).execute("select 'blah'") conn.close() @@ -271,7 +271,7 @@ async def test_unspecified_service_v1(self): @run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) async def test_trace_span_name_v0_schema(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) await (await conn.cursor()).execute("select 'blah'") conn.close() @@ -284,7 +284,7 @@ async def test_trace_span_name_v0_schema(self): @run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) async def test_trace_span_name_v1_schema(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) await (await conn.cursor()).execute("select 'blah'") conn.close() @@ -299,7 +299,7 @@ async def test_trace_span_name_v1_schema(self): ) async def test_user_specified_service_integration_v0(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) cursor = await conn.cursor() await cursor.execute("SELECT 1") @@ -314,7 +314,7 @@ async def test_user_specified_service_integration_v0(self): ) async def test_user_specified_service_integration_v1(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) cursor = await conn.cursor() await cursor.execute("SELECT 1") @@ -327,7 +327,7 @@ async def test_user_specified_service_integration_v1(self): @AsyncioTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) async def test_user_specified_service_env_var_v0(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) cursor = await conn.cursor() await cursor.execute("SELECT 1") @@ -340,7 +340,7 @@ async def test_user_specified_service_env_var_v0(self): @AsyncioTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) async def test_user_specified_service_env_var_v1(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) cursor = await conn.cursor() await cursor.execute("SELECT 1") @@ -355,7 +355,7 @@ async def test_user_specified_service_env_var_v1(self): ) async def test_pin_override_service_v1(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer, service="override").onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer, service="override").onto(conn) cursor = await conn.cursor() await cursor.execute("SELECT 1") @@ -368,7 +368,7 @@ async def test_pin_override_service_v1(self): @AsyncioTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) async def test_span_name_v0_schema(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) cursor = await conn.cursor() await cursor.execute("SELECT 1") @@ -381,7 +381,7 @@ async def test_span_name_v0_schema(self): @AsyncioTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) async def test_span_name_v1_schema(self): conn = await aiopg.connect(**POSTGRES_CONFIG) - Pin.get_from(conn).clone(tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(tracer=self.tracer).onto(conn) cursor = await conn.cursor() await cursor.execute("SELECT 1") @@ -395,7 +395,7 @@ class AiopgAnalyticsTestCase(AiopgTestCase): async def trace_spans(self): conn, _ = await self._get_conn_and_tracer() - Pin.get_from(conn).clone(service="db", tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(service="db", tracer=self.tracer).onto(conn) cursor = await conn.cursor() await cursor.execute("select 'foobar'") diff --git a/tests/contrib/algoliasearch/test.py b/tests/contrib/algoliasearch/test.py index 87f5f7b6910..53603f47287 100644 --- a/tests/contrib/algoliasearch/test.py +++ b/tests/contrib/algoliasearch/test.py @@ -52,7 +52,7 @@ def search(self, query, args=None, request_options=None): def patch_algoliasearch(self): patch() - Pin.override(self.index, tracer=self.tracer) + Pin._override(self.index, tracer=self.tracer) def tearDown(self): super(AlgoliasearchTest, self).tearDown() @@ -157,7 +157,7 @@ def test_patch_unpatch(self): def test_patch_all_auto_enable(self): patch_all() - Pin.override(self.index, tracer=self.tracer) + Pin._override(self.index, tracer=self.tracer) self.perform_search("test search") spans = self.get_spans() @@ -179,7 +179,7 @@ def test_user_specified_service_default(self): The algoliasearch integration shouldn't use it as the service name """ patch_all() - Pin.override(self.index, tracer=self.tracer) + Pin._override(self.index, tracer=self.tracer) self.perform_search("test search") spans = self.get_spans() self.reset() @@ -195,7 +195,7 @@ def test_user_specified_service_v0(self): The algoliasearch integration shouldn't use it as the service name """ patch_all() - Pin.override(self.index, tracer=self.tracer) + Pin._override(self.index, tracer=self.tracer) self.perform_search("test search") spans = self.get_spans() self.reset() @@ -211,7 +211,7 @@ def test_user_specified_service_v1(self): so make sure that is used and not the v0 schema 'algoliasearch' """ patch_all() - Pin.override(self.index, tracer=self.tracer) + Pin._override(self.index, tracer=self.tracer) self.perform_search("test search") spans = self.get_spans() self.reset() @@ -223,7 +223,7 @@ def test_user_specified_service_v1(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_span_name_v0_schema(self): patch_all() - Pin.override(self.index, tracer=self.tracer) + Pin._override(self.index, tracer=self.tracer) self.perform_search("test search") spans = self.get_spans() self.reset() @@ -235,7 +235,7 @@ def test_span_name_v0_schema(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_span_name_v1_schema(self): patch_all() - Pin.override(self.index, tracer=self.tracer) + Pin._override(self.index, tracer=self.tracer) self.perform_search("test search") spans = self.get_spans() self.reset() diff --git a/tests/contrib/anthropic/conftest.py b/tests/contrib/anthropic/conftest.py index 3e5dac0a442..1cb600b0b82 100644 --- a/tests/contrib/anthropic/conftest.py +++ b/tests/contrib/anthropic/conftest.py @@ -36,7 +36,7 @@ def mock_tracer(ddtrace_global_config, anthropic): try: pin = Pin.get_from(anthropic) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) - pin.override(anthropic, tracer=mock_tracer) + pin._override(anthropic, tracer=mock_tracer) pin.tracer._configure() if ddtrace_global_config.get("_llmobs_enabled", False): # Have to disable and re-enable LLMObs to use to mock tracer. diff --git a/tests/contrib/aredis/test_aredis.py b/tests/contrib/aredis/test_aredis.py index e62cfa974be..298abdbf85b 100644 --- a/tests/contrib/aredis/test_aredis.py +++ b/tests/contrib/aredis/test_aredis.py @@ -122,7 +122,7 @@ async def test_meta_override(tracer, test_spans): r = aredis.StrictRedis(port=REDIS_CONFIG["port"]) pin = Pin.get_from(r) assert pin is not None - pin.clone(tags={"cheese": "camembert"}, tracer=tracer).onto(r) + pin._clone(tags={"cheese": "camembert"}, tracer=tracer).onto(r) await r.get("cheese") test_spans.assert_trace_count(1) @@ -162,7 +162,7 @@ async def test(tracer, test_spans): r = aredis.StrictRedis(port=REDIS_CONFIG["port"]) pin = Pin.get_from(r) assert pin is not None - pin.clone(tags={{"cheese": "camembert"}}, tracer=tracer).onto(r) + pin._clone(tags={{"cheese": "camembert"}}, tracer=tracer).onto(r) await r.get("cheese") test_spans.assert_trace_count(1) diff --git a/tests/contrib/asyncpg/test_asyncpg.py b/tests/contrib/asyncpg/test_asyncpg.py index 5e5b649faaf..5de995c80aa 100644 --- a/tests/contrib/asyncpg/test_asyncpg.py +++ b/tests/contrib/asyncpg/test_asyncpg.py @@ -158,7 +158,7 @@ async def test_cursor_manual(patched_conn): @pytest.mark.snapshot @pytest.mark.xfail async def test_service_override_pin(patched_conn): - Pin.override(patched_conn, service="custom-svc") + Pin._override(patched_conn, service="custom-svc") await patched_conn.execute("SELECT 1") @@ -351,7 +351,7 @@ async def _get_conn_tracer(self): assert pin # Customize the service # we have to apply it on the existing one since new one won't inherit `app` - pin.clone(tracer=self.tracer).onto(self.conn) + pin._clone(tracer=self.tracer).onto(self.conn) return self.conn, self.tracer @@ -468,7 +468,7 @@ async def test_asyncpg_dbm_propagation_comment_pin_service_name_override(self): db_name = POSTGRES_CONFIG["dbname"] conn, tracer = await self._get_conn_tracer() - Pin.override(conn, service="pin-service-name-override", tracer=tracer) + Pin._override(conn, service="pin-service-name-override", tracer=tracer) def mock_func(args, kwargs, sql_pos, sql_kw, sql_with_dbm_tags): return args, kwargs diff --git a/tests/contrib/avro/test_avro.py b/tests/contrib/avro/test_avro.py index 3db10460a23..b2db731a71e 100644 --- a/tests/contrib/avro/test_avro.py +++ b/tests/contrib/avro/test_avro.py @@ -49,7 +49,7 @@ def test_basic_schema_serialize(avro, tracer, test_spans): pin = Pin.get_from(writer) assert pin is not None - pin.clone(tags={"cheese": "camembert"}, tracer=tracer).onto(writer) + pin._clone(tags={"cheese": "camembert"}, tracer=tracer).onto(writer) with tracer.trace("basic_avro_schema.serialization") as span: span.context.sampling_priority = AUTO_KEEP @@ -82,7 +82,7 @@ def test_advanced_schema_serialize(avro, tracer, test_spans): pin = Pin.get_from(writer) assert pin is not None - pin.clone(tags={"cheese": "camembert"}, tracer=tracer).onto(writer) + pin._clone(tags={"cheese": "camembert"}, tracer=tracer).onto(writer) with tracer.trace("advanced_avro_schema.serialization") as span: span.context.sampling_priority = AUTO_KEEP @@ -128,7 +128,7 @@ def test_basic_schema_deserialize(avro, tracer, test_spans): pin = Pin.get_from(reader) assert pin is not None - pin.clone(tags={"cheese": "camembert"}, tracer=tracer).onto(reader) + pin._clone(tags={"cheese": "camembert"}, tracer=tracer).onto(reader) with tracer.trace("basic_avro_schema.deserialization") as span: span.context.sampling_priority = AUTO_KEEP @@ -160,7 +160,7 @@ def test_advanced_schema_deserialize(avro, tracer, test_spans): pin = Pin.get_from(reader) assert pin is not None - pin.clone(tags={"cheese": "camembert"}, tracer=tracer).onto(reader) + pin._clone(tags={"cheese": "camembert"}, tracer=tracer).onto(reader) with tracer.trace("advanced_avro_schema.deserialization") as span: span.context.sampling_priority = AUTO_KEEP diff --git a/tests/contrib/boto/test.py b/tests/contrib/boto/test.py index 2570ca9c65c..6da67eac9d3 100644 --- a/tests/contrib/boto/test.py +++ b/tests/contrib/boto/test.py @@ -39,7 +39,9 @@ def setUp(self): @mock_ec2 def test_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ec2) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ec2) ec2.get_all_instances() spans = self.pop_spans() @@ -77,7 +79,7 @@ def test_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_env_service_default_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -91,7 +93,7 @@ def test_schematized_env_service_default_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_env_service_v0_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -105,7 +107,7 @@ def test_schematized_env_service_v0_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_env_service_v1_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -119,7 +121,7 @@ def test_schematized_env_service_v1_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict()) def test_schematized_unspecified_service_default_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -133,7 +135,7 @@ def test_schematized_unspecified_service_default_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_unspecified_service_v0_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -147,7 +149,7 @@ def test_schematized_unspecified_service_v0_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_unspecified_service_v1_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -161,7 +163,7 @@ def test_schematized_unspecified_service_v1_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_operation_name_v0_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -175,7 +177,7 @@ def test_schematized_operation_name_v0_ec2_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_operation_name_v1_ec2_client(self): ec2 = boto.ec2.connect_to_region("us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) # Create an instance ec2.run_instances(21) @@ -188,7 +190,9 @@ def test_schematized_operation_name_v1_ec2_client(self): def _test_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) s3.get_all_buckets() spans = self.pop_spans() @@ -247,7 +251,7 @@ def _test_s3_client(self): def test_schematized_env_service_name_default_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -266,7 +270,7 @@ def test_schematized_env_service_name_default_s3_client(self): def test_schematized_env_service_name_v0_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -285,7 +289,7 @@ def test_schematized_env_service_name_v0_s3_client(self): def test_schematized_env_service_name_v1_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -304,7 +308,7 @@ def test_schematized_env_service_name_v1_s3_client(self): def test_schematized_operation_name_v0_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -323,7 +327,7 @@ def test_schematized_operation_name_v0_s3_client(self): def test_schematized_operation_name_v1_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -342,7 +346,7 @@ def test_schematized_operation_name_v1_s3_client(self): def test_schematized_unspecified_service_name_default_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -361,7 +365,7 @@ def test_schematized_unspecified_service_name_default_s3_client(self): def test_schematized_unspecified_service_name_v0_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -380,7 +384,7 @@ def test_schematized_unspecified_service_name_v0_s3_client(self): def test_schematized_unspecified_service_name_v1_s3_client(self): # DEV: To test tag params check create bucket's span s3 = boto.s3.connect_to_region("us-east-1") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) # Create the test bucket s3.create_bucket("cheese") @@ -411,7 +415,9 @@ def test_s3_client_no_params(self): @mock_s3 def test_s3_put(self): s3 = boto.s3.connect_to_region("us-east-1") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) s3.create_bucket("mybucket") bucket = s3.get_bucket("mybucket") k = boto.s3.key.Key(bucket) @@ -445,7 +451,9 @@ def test_s3_put(self): @mock_lambda def test_unpatch(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(lamb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(lamb) unpatch() # multiple calls @@ -456,11 +464,12 @@ def test_unpatch(self): @mock_s3 def test_double_patch(self): s3 = boto.s3.connect_to_region("us-east-1") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) patch() patch() - # Get the created bucket s3.create_bucket("cheese") spans = self.pop_spans() @@ -470,7 +479,9 @@ def test_double_patch(self): @mock_lambda def test_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(lamb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(lamb) # multiple calls lamb.list_functions() @@ -495,7 +506,7 @@ def test_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_env_service_name_default_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -507,7 +518,7 @@ def test_schematized_env_service_name_default_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_env_service_name_v0_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -519,7 +530,7 @@ def test_schematized_env_service_name_v0_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_env_service_name_v1_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -531,7 +542,7 @@ def test_schematized_env_service_name_v1_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_unspecified_service_name_default_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -543,7 +554,7 @@ def test_schematized_unspecified_service_name_default_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_unspecified_service_name_v0_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -555,7 +566,7 @@ def test_schematized_unspecified_service_name_v0_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_unspecified_service_name_v1_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -567,7 +578,7 @@ def test_schematized_unspecified_service_name_v1_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_operation_name_v0_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -579,7 +590,7 @@ def test_schematized_operation_name_v0_lambda_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_operation_name_v1_lambda_client(self): lamb = boto.awslambda.connect_to_region("us-east-2") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.list_functions() @@ -590,7 +601,9 @@ def test_schematized_operation_name_v1_lambda_client(self): @mock_sts def test_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sts) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sts) sts.get_federation_token(12, duration=10) @@ -610,7 +623,7 @@ def test_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_env_default_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -624,7 +637,7 @@ def test_schematized_env_default_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_env_v0_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -638,7 +651,7 @@ def test_schematized_env_v0_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_env_v1_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -652,7 +665,7 @@ def test_schematized_env_v1_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict()) def test_schematized_unspecified_service_default_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -666,7 +679,7 @@ def test_schematized_unspecified_service_default_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_unspecified_service_v0_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -680,7 +693,7 @@ def test_schematized_unspecified_service_v0_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_unspecified_service_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -694,7 +707,7 @@ def test_schematized_unspecified_service_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_operation_name_v0_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -708,7 +721,7 @@ def test_schematized_operation_name_v0_sts_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_operation_name_sts_client(self): sts = boto.sts.connect_to_region("us-west-2") - Pin.get_from(sts).clone(tracer=self.tracer).onto(sts) + Pin.get_from(sts)._clone(tracer=self.tracer).onto(sts) sts.get_federation_token(12, duration=10) @@ -727,7 +740,9 @@ def test_schematized_operation_name_sts_client(self): ) def test_elasticache_client(self): elasticache = boto.elasticache.connect_to_region("us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(elasticache) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(elasticache) elasticache.describe_cache_clusters() @@ -746,7 +761,9 @@ def test_ec2_client_ot(self): """OpenTracing compatibility check of the test_ec2_client test.""" ec2 = boto.ec2.connect_to_region("us-west-2") ot_tracer = init_tracer("my_svc", self.tracer) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ec2) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ec2) with ot_tracer.start_active_span("ot_span"): ec2.get_all_instances() diff --git a/tests/contrib/botocore/test.py b/tests/contrib/botocore/test.py index 67eaaf55fc3..cb1a06bec1c 100644 --- a/tests/contrib/botocore/test.py +++ b/tests/contrib/botocore/test.py @@ -104,7 +104,9 @@ def setUp(self): super(BotocoreTest, self).setUp() - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(botocore.parsers.ResponseParser) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(botocore.parsers.ResponseParser) # Setting the validated flag to False ensures the redaction paths configurations are re-validated # FIXME: Ensure AWSPayloadTagging._REQUEST_REDACTION_PATHS_DEFAULTS is always in sync with # config.botocore.payload_tagging_request @@ -123,7 +125,9 @@ def tearDown(self): def test_patch_submodules(self): patch_submodules(["s3"]) ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ec2) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ec2) ec2.describe_instances() @@ -131,7 +135,9 @@ def test_patch_submodules(self): assert spans == [] s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) s3.list_buckets() s3.list_buckets() @@ -142,7 +148,9 @@ def test_patch_submodules(self): @mock_ec2 def test_traced_client(self): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ec2) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ec2) ec2.describe_instances() @@ -169,7 +177,7 @@ def test_traced_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_ec2_call_default(self): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) ec2.describe_instances() @@ -182,7 +190,7 @@ def test_schematized_ec2_call_default(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_ec2_call_v0(self): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) ec2.describe_instances() @@ -195,7 +203,7 @@ def test_schematized_ec2_call_v0(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_ec2_call_v1(self): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) ec2.describe_instances() @@ -208,7 +216,7 @@ def test_schematized_ec2_call_v1(self): @TracerTestCase.run_in_subprocess(env_overrides=dict()) def test_schematized_unspecified_service_ec2_call_default(self): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) ec2.describe_instances() @@ -221,7 +229,7 @@ def test_schematized_unspecified_service_ec2_call_default(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_unspecified_service_ec2_call_v0(self): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) ec2.describe_instances() @@ -234,7 +242,7 @@ def test_schematized_unspecified_service_ec2_call_v0(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_unspecified_service_ec2_call_v1(self): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin.get_from(ec2).clone(tracer=self.tracer).onto(ec2) + Pin.get_from(ec2)._clone(tracer=self.tracer).onto(ec2) ec2.describe_instances() @@ -252,7 +260,9 @@ def test_schematized_unspecified_service_ec2_call_v1(self): @mock_dynamodb def test_dynamodb_put_get(self): ddb = self.session.create_client("dynamodb", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ddb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ddb) with self.override_config("botocore", dict(instrument_internals=True)): ddb.create_table( @@ -296,7 +306,9 @@ def test_dynamodb_put_get(self): @mock_dynamodb def test_dynamodb_put_get_with_table_primary_key_mapping(self): ddb = self.session.create_client("dynamodb", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ddb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ddb) with self.override_config( "botocore", @@ -358,7 +370,9 @@ def test_dynamodb_put_get_with_table_primary_key_mapping(self): @mock_dynamodb def test_dynamodb_put_get_with_broken_table_primary_key_mapping(self): ddb = self.session.create_client("dynamodb", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ddb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ddb) with self.override_config( "botocore", @@ -407,7 +421,9 @@ def test_dynamodb_put_get_with_broken_table_primary_key_mapping(self): @mock_s3 def test_s3_client(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) s3.list_buckets() s3.list_buckets() @@ -444,7 +460,9 @@ def test_s3_head_404_default(self): API calls with a 404 response """ s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) # We need a bucket for this test s3.create_bucket(Bucket="test", CreateBucketConfiguration=dict(LocationConstraint="us-west-2")) @@ -472,7 +490,9 @@ def test_s3_head_404_as_errors(self): we attach exception information to S3 HeadObject 404 responses """ s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) # We need a bucket for this test s3.create_bucket(Bucket="test", CreateBucketConfiguration=dict(LocationConstraint="us-west-2")) @@ -500,7 +520,9 @@ def test_s3_head_404_as_errors(self): def _test_s3_put(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) params = { "Bucket": "mybucket", "CreateBucketConfiguration": { @@ -581,7 +603,7 @@ def test_s3_put_no_params(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_BOTOCORE_SERVICE="botocore")) def test_service_name_override(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) params = { "Bucket": "mybucket", @@ -612,7 +634,7 @@ def test_service_name_override(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_s3_client_default(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) s3.list_buckets() @@ -626,7 +648,7 @@ def test_schematized_s3_client_default(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_s3_client_v0(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) s3.list_buckets() @@ -640,7 +662,7 @@ def test_schematized_s3_client_v0(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_s3_client_v1(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) s3.list_buckets() @@ -654,7 +676,7 @@ def test_schematized_s3_client_v1(self): @TracerTestCase.run_in_subprocess(env_overrides=dict()) def test_schematized_unspecified_service_s3_client_default(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) s3.list_buckets() @@ -668,7 +690,7 @@ def test_schematized_unspecified_service_s3_client_default(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_unspecified_service_s3_client_v0(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) s3.list_buckets() @@ -682,7 +704,7 @@ def test_schematized_unspecified_service_s3_client_v0(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_unspecified_service_s3_client_v1(self): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin.get_from(s3).clone(tracer=self.tracer).onto(s3) + Pin.get_from(s3)._clone(tracer=self.tracer).onto(s3) s3.list_buckets() @@ -695,7 +717,9 @@ def test_schematized_unspecified_service_s3_client_v1(self): def _test_sqs_client(self): self.sqs_client.delete_queue(QueueUrl=self.queue_name) # Delete so we can test create_queue spans - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) self.sqs_test_queue = self.sqs_client.create_queue(QueueName=self.queue_name) spans = self.get_spans() @@ -731,7 +755,9 @@ def test_sqs_client_no_params(self): @mock_sqs def test_sqs_send_message_non_url_queue(self): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) self.sqs_client.send_message(QueueUrl="Test", MessageBody="world") spans = self.get_spans() @@ -744,7 +770,9 @@ def test_sqs_send_message_non_url_queue(self): @mock_sqs def test_sqs_send_message_distributed_tracing_off(self): with self.override_config("botocore", dict(distributed_tracing=False)): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") spans = self.get_spans() @@ -774,7 +802,9 @@ def test_sqs_send_message_distributed_tracing_off(self): @mock_sqs def test_sqs_send_message_distributed_tracing_on(self): with self.override_config("botocore", dict(distributed_tracing=True, propagation_enabled=True)): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") spans = self.get_spans() @@ -851,8 +881,8 @@ def _test_distributed_tracing_sns_to_sqs(self, raw_message_delivery): AttributeValue="true", ) - Pin.get_from(sns).clone(tracer=self.tracer).onto(sns) - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(sns)._clone(tracer=self.tracer).onto(sns) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) sns.publish(TopicArn=topic_arn, Message="test") @@ -891,7 +921,9 @@ def _test_distributed_tracing_sns_to_sqs(self, raw_message_delivery): @mock_sqs def test_sqs_send_message_trace_injection_with_max_message_attributes(self): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, "two": {"DataType": "String", "StringValue": "two"}, @@ -934,7 +966,9 @@ def test_sqs_send_message_trace_injection_with_max_message_attributes(self): @mock_sqs def test_sqs_send_message_batch_trace_injection_with_no_message_attributes(self): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) entries = [ { "Id": "1", @@ -969,7 +1003,9 @@ def test_sqs_send_message_batch_trace_injection_with_no_message_attributes(self) @mock_sqs def test_sqs_send_message_batch_trace_injection_with_message_attributes(self): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) entries = [ { "Id": "1", @@ -1016,7 +1052,9 @@ def test_sqs_send_message_batch_trace_injection_with_message_attributes(self): @mock_sqs def test_sqs_send_message_batch_trace_injection_with_max_message_attributes(self): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) entries = [ { "Id": "1", @@ -1063,7 +1101,7 @@ def test_sqs_send_message_batch_trace_injection_with_max_message_attributes(self @mock_sqs @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_sqs_client_default(self): - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") self.sqs_client.send_message_batch( QueueUrl=self.sqs_test_queue["QueueUrl"], Entries=[{"Id": "1", "MessageBody": "hello"}] @@ -1085,7 +1123,7 @@ def test_schematized_sqs_client_default(self): @mock_sqs @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_sqs_client_v0(self): - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") self.sqs_client.send_message_batch( @@ -1108,7 +1146,7 @@ def test_schematized_sqs_client_v0(self): @mock_sqs @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_sqs_client_v1(self): - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") self.sqs_client.send_message_batch( @@ -1131,7 +1169,7 @@ def test_schematized_sqs_client_v1(self): @mock_sqs @TracerTestCase.run_in_subprocess(env_overrides=dict()) def test_schematized_unspecified_service_sqs_client_default(self): - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") self.sqs_client.send_message_batch( @@ -1154,7 +1192,7 @@ def test_schematized_unspecified_service_sqs_client_default(self): @mock_sqs @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_unspecified_service_sqs_client_v0(self): - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") self.sqs_client.send_message_batch( @@ -1177,7 +1215,7 @@ def test_schematized_unspecified_service_sqs_client_v0(self): @mock_sqs @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_unspecified_service_sqs_client_v1(self): - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") self.sqs_client.send_message_batch( @@ -1205,7 +1243,9 @@ def test_stepfunctions_send_start_execution_trace_injection(self): definition='{"StartAt": "HelloWorld","States": {"HelloWorld": {"Type": "Pass","End": true}}}', roleArn="arn:aws:iam::012345678901:role/DummyRole", ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sf) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sf) start_execution_dict = { "stateMachineArn": "arn:aws:states:us-west-2:000000000000:stateMachine:lincoln", "input": '{"baz": 1}', @@ -1226,7 +1266,9 @@ def test_stepfunctions_send_start_execution_trace_injection_with_array_input(sel definition='{"StartAt": "HelloWorld","States": {"HelloWorld": {"Type": "Pass","End": true}}}', roleArn="arn:aws:iam::012345678901:role/DummyRole", ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sf) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sf) sf.start_execution( stateMachineArn="arn:aws:states:us-west-2:000000000000:stateMachine:miller", input='["one", "two", "three"]' ) @@ -1245,7 +1287,9 @@ def test_stepfunctions_send_start_execution_trace_injection_with_true_input(self definition='{"StartAt": "HelloWorld","States": {"HelloWorld": {"Type": "Pass","End": true}}}', roleArn="arn:aws:iam::012345678901:role/DummyRole", ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sf) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sf) sf.start_execution(stateMachineArn="arn:aws:states:us-west-2:000000000000:stateMachine:hobart", input="true") # I've tried to find a way to make Moto show me the input to the execution, but can't get that to work. spans = self.get_spans() @@ -1264,7 +1308,9 @@ def _test_kinesis_client(self): {"Data": json.dumps({"Hello": "World"}), "PartitionKey": partition_key}, {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) client.put_records(StreamName=stream_name, Records=data) spans = self.get_spans() @@ -1335,7 +1381,9 @@ def test_kinesis_distributed_tracing_on(self): @mock_kinesis def test_unpatch(self): kinesis = self.session.create_client("kinesis", region_name="us-east-1") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(kinesis) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(kinesis) unpatch() @@ -1345,7 +1393,9 @@ def test_unpatch(self): @mock_sqs def test_double_patch(self): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) patch() patch() @@ -1402,8 +1452,8 @@ def _test_data_streams_sns_to_sqs(self, use_raw_delivery): AttributeValue="true", ) - Pin.get_from(sns).clone(tracer=self.tracer).onto(sns) - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(sns)._clone(tracer=self.tracer).onto(sns) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) sns.publish(TopicArn=topic_arn, Message="test") @@ -1478,7 +1528,9 @@ def test_data_streams_sqs(self): ): mt.return_value = 1642544540 - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, "two": {"DataType": "String", "StringValue": "two"}, @@ -1537,7 +1589,9 @@ def test_data_streams_sqs_batch(self): ): mt.return_value = 1642544540 - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, "two": {"DataType": "String", "StringValue": "two"}, @@ -1615,7 +1669,9 @@ def test_data_streams_sqs_no_header(self): ): mt.return_value = 1642544540 - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, "two": {"DataType": "String", "StringValue": "two"}, @@ -1655,7 +1711,9 @@ def test_data_streams_sqs_no_header(self): def test_lambda_client(self): # DEV: No lambda params tagged so we only check no ClientContext lamb = self.session.create_client("lambda", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(lamb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(lamb) lamb.list_functions() @@ -1691,7 +1749,9 @@ def test_lambda_invoke_distributed_tracing_off(self): MemorySize=128, ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(lamb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(lamb) lamb.invoke( FunctionName="ironmaiden", @@ -1731,7 +1791,9 @@ def test_lambda_invoke_bad_context_client(self): MemorySize=128, ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(lamb) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(lamb) lamb.invoke( FunctionName="black-sabbath", @@ -1757,7 +1819,7 @@ def test_schematized_lambda_client_default(self): # DEV: No lambda params tagged so we only check no ClientContext lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.create_function( FunctionName="guns-and-roses", Runtime="python3.8", @@ -1791,7 +1853,7 @@ def test_schematized_lambda_client_default(self): def test_schematized_lambda_client_v0(self): # DEV: No lambda params tagged so we only check no ClientContext lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.create_function( FunctionName="guns-and-roses", @@ -1822,7 +1884,7 @@ def test_schematized_lambda_client_v0(self): def test_schematized_lambda_client_v1(self): # DEV: No lambda params tagged so we only check no ClientContext lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.create_function( FunctionName="guns-and-roses", @@ -1853,7 +1915,7 @@ def test_schematized_lambda_client_v1(self): def test_schematized_unspecified_service_lambda_client_default(self): # DEV: No lambda params tagged so we only check no ClientContext lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.create_function( FunctionName="guns-and-roses", @@ -1884,7 +1946,7 @@ def test_schematized_unspecified_service_lambda_client_default(self): def test_schematized_unspecified_service_lambda_client_v0(self): # DEV: No lambda params tagged so we only check no ClientContext lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.create_function( FunctionName="guns-and-roses", @@ -1915,7 +1977,7 @@ def test_schematized_unspecified_service_lambda_client_v0(self): def test_schematized_unspecified_service_lambda_client_v1(self): # DEV: No lambda params tagged so we only check no ClientContext lamb = self.session.create_client("lambda", region_name="us-west-2", endpoint_url="http://localhost:4566") - Pin.get_from(lamb).clone(tracer=self.tracer).onto(lamb) + Pin.get_from(lamb)._clone(tracer=self.tracer).onto(lamb) lamb.create_function( FunctionName="guns-and-roses", @@ -1968,7 +2030,9 @@ def test_eventbridge_single_entry_trace_injection(self): Targets=[{"Id": "a-test-bus-rule-target", "Arn": "arn:aws:sqs:us-east-1:000000000000:Test"}], ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(bridge) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(bridge) bridge.put_events(Entries=entries) messages = self.sqs_client.receive_message(QueueUrl=queue_url, WaitTimeSeconds=2) @@ -2030,7 +2094,9 @@ def test_eventbridge_multiple_entries_trace_injection(self): Targets=[{"Id": "a-test-bus-rule-target", "Arn": "arn:aws:sqs:us-east-1:000000000000:Test"}], ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(bridge) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(bridge) bridge.put_events(Entries=entries) messages = self.sqs_client.receive_message(QueueUrl=queue_url, WaitTimeSeconds=2) @@ -2070,7 +2136,9 @@ def test_eventbridge_multiple_entries_trace_injection(self): @mock_kms def test_kms_client(self): kms = self.session.create_client("kms", region_name="us-east-1") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(kms) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(kms) kms.list_keys(Limit=21) @@ -2095,7 +2163,7 @@ def test_kms_client(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc")) def test_schematized_kms_client_default(self): kms = self.session.create_client("kms", region_name="us-east-1") - Pin.get_from(kms).clone(tracer=self.tracer).onto(kms) + Pin.get_from(kms)._clone(tracer=self.tracer).onto(kms) kms.list_keys(Limit=21) @@ -2110,7 +2178,7 @@ def test_schematized_kms_client_default(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_kms_client_v0(self): kms = self.session.create_client("kms", region_name="us-east-1") - Pin.get_from(kms).clone(tracer=self.tracer).onto(kms) + Pin.get_from(kms)._clone(tracer=self.tracer).onto(kms) kms.list_keys(Limit=21) @@ -2125,7 +2193,7 @@ def test_schematized_kms_client_v0(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_kms_client_v1(self): kms = self.session.create_client("kms", region_name="us-east-1") - Pin.get_from(kms).clone(tracer=self.tracer).onto(kms) + Pin.get_from(kms)._clone(tracer=self.tracer).onto(kms) kms.list_keys(Limit=21) @@ -2140,7 +2208,7 @@ def test_schematized_kms_client_v1(self): @TracerTestCase.run_in_subprocess(env_overrides=dict()) def test_schematized_unspecified_service_kms_client_default(self): kms = self.session.create_client("kms", region_name="us-east-1") - Pin.get_from(kms).clone(tracer=self.tracer).onto(kms) + Pin.get_from(kms)._clone(tracer=self.tracer).onto(kms) kms.list_keys(Limit=21) @@ -2155,7 +2223,7 @@ def test_schematized_unspecified_service_kms_client_default(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) def test_schematized_unspecified_service_kms_client_v0(self): kms = self.session.create_client("kms", region_name="us-east-1") - Pin.get_from(kms).clone(tracer=self.tracer).onto(kms) + Pin.get_from(kms)._clone(tracer=self.tracer).onto(kms) kms.list_keys(Limit=21) @@ -2170,7 +2238,7 @@ def test_schematized_unspecified_service_kms_client_v0(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_schematized_unspecified_service_kms_client_v1(self): kms = self.session.create_client("kms", region_name="us-east-1") - Pin.get_from(kms).clone(tracer=self.tracer).onto(kms) + Pin.get_from(kms)._clone(tracer=self.tracer).onto(kms) kms.list_keys(Limit=21) @@ -2188,7 +2256,9 @@ def test_traced_client_ot(self): with ot_tracer.start_active_span("ec2_op"): ec2 = self.session.create_client("ec2", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(ec2) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(ec2) ec2.describe_instances() spans = self.get_spans() @@ -2235,7 +2305,9 @@ def test_stubber_no_response_metadata(self): @mock_firehose def test_firehose_no_records_arg(self): firehose = self.session.create_client("firehose", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(firehose) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(firehose) stream_name = "test-stream" account_id = "test-account" @@ -2309,9 +2381,11 @@ def _test_sns(self, use_default_tracer=False): sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) if use_default_tracer: - Pin.get_from(sns).clone(tracer=self.tracer).onto(sns) + Pin.get_from(sns)._clone(tracer=self.tracer).onto(sns) else: - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) sns.publish(TopicArn=topic_arn, Message="test") spans = self.get_spans() @@ -2410,7 +2484,9 @@ def test_sns_send_message_trace_injection_with_no_message_attributes(self): sqs_arn = "arn:aws:sqs:{}:{}:{}".format("us-east-1", url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) sns.publish(TopicArn=topic_arn, Message="test") spans = self.get_spans() @@ -2469,7 +2545,9 @@ def test_sns_send_message_trace_injection_with_message_attributes(self): sqs_arn = "arn:aws:sqs:{}:{}:{}".format(region, url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, @@ -2544,7 +2622,9 @@ def test_sns_send_message_trace_injection_with_max_message_attributes(self): sqs_arn = "arn:aws:sqs:{}:{}:{}".format(region, url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, @@ -2610,8 +2690,10 @@ def test_sns_send_message_batch_trace_injection_with_no_message_attributes(self) sqs_arn = "arn:aws:sqs:{}:{}:{}".format(region, url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) - Pin.get_from(sns).clone(tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) + Pin.get_from(sns)._clone(tracer=self.tracer).onto(self.sqs_client) entries = [ { "Id": "1", @@ -2704,7 +2786,9 @@ def test_sns_send_message_batch_trace_injection_with_message_attributes(self): sqs_arn = "arn:aws:sqs:{}:{}:{}".format(region, url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, @@ -2775,7 +2859,9 @@ def test_sns_send_message_batch_trace_injection_with_max_message_attributes(self sqs_arn = "arn:aws:sqs:{}:{}:{}".format(region, url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, @@ -2902,7 +2988,9 @@ def test_kinesis_get_records_empty_poll_disabled(self): stream_name = "kinesis_get_records_empty_poll_disabled" shard_id, _ = self._kinesis_create_stream(client, stream_name) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) shard_iterator = self._kinesis_get_shard_iterator(client, stream_name, shard_id) @@ -2927,7 +3015,9 @@ def test_kinesis_get_records_empty_poll_enabled(self): stream_name = "kinesis_get_records_empty_poll_enabled" shard_id, _ = self._kinesis_create_stream(client, stream_name) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) shard_iterator = self._kinesis_get_shard_iterator(client, stream_name, shard_id) @@ -2950,7 +3040,9 @@ def test_sqs_get_records_empty_poll_disabled(self): # pop any spans created from previous operations spans = self.pop_spans() - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) response = None response = self.sqs_client.receive_message( @@ -2971,7 +3063,9 @@ def test_sqs_get_records_empty_poll_enabled(self): # pop any spans created from previous operations spans = self.pop_spans() - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) response = None response = self.sqs_client.receive_message( @@ -2994,7 +3088,9 @@ def _test_kinesis_put_record_trace_injection(self, test_name, data, client=None, partition_key = "1234" - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) if enable_stream_arn: client.put_record(StreamName=stream_name, Data=data, PartitionKey=partition_key, StreamARN=stream_arn) else: @@ -3029,7 +3125,9 @@ def _test_kinesis_put_records_trace_injection( stream_name = "kinesis_put_records_" + test_name shard_id, stream_arn = self._kinesis_create_stream(client, stream_name) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) if enable_stream_arn: client.put_records(StreamName=stream_name, Records=data, StreamARN=stream_arn) else: @@ -3328,7 +3426,9 @@ def test_kinesis_put_records_inject_data_streams_to_every_record_propagation_dis data = json.dumps({"json": "string"}) records = self._kinesis_generate_records(data, 5) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) client.put_records(StreamName=stream_name, Records=records, StreamARN=stream_arn) shard_iterator = self._kinesis_get_shard_iterator(client, stream_name, shard_id) @@ -3357,7 +3457,9 @@ def test_kinesis_put_records_inject_data_streams_to_every_record_propagation_ena data = json.dumps({"json": "string"}) records = self._kinesis_generate_records(data, 5) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) client.put_records(StreamName=stream_name, Records=records, StreamARN=stream_arn) shard_iterator = self._kinesis_get_shard_iterator(client, stream_name, shard_id) @@ -3386,7 +3488,9 @@ def test_kinesis_put_records_inject_data_streams_to_every_record_disable_all_inj data = json.dumps({"json": "string"}) records = self._kinesis_generate_records(data, 5) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) client.put_records(StreamName=stream_name, Records=records, StreamARN=stream_arn) shard_iterator = self._kinesis_get_shard_iterator(client, stream_name, shard_id) @@ -3454,7 +3558,7 @@ def test_kinesis_parenting(self): {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) with self.tracer.trace("kinesis.manual_span"): client.create_stream(StreamName=stream_name, ShardCount=1) @@ -3474,7 +3578,7 @@ def test_kinesis_parenting(self): @mock_sqs def test_sqs_parenting(self): - Pin.get_from(self.sqs_client).clone(tracer=self.tracer).onto(self.sqs_client) + Pin.get_from(self.sqs_client)._clone(tracer=self.tracer).onto(self.sqs_client) with self.tracer.trace("sqs.manual_span"): self.sqs_client.send_message(QueueUrl=self.sqs_test_queue["QueueUrl"], MessageBody="world") @@ -3510,7 +3614,7 @@ def test_schematized_kinesis_client_default(self): {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client.create_stream(StreamName=stream_name, ShardCount=1) client.put_records(StreamName=stream_name, Records=data) @@ -3531,7 +3635,7 @@ def test_schematized_kinesis_client_v0(self): {"Data": json.dumps({"Hello": "World"}), "PartitionKey": partition_key}, {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client.create_stream(StreamName=stream_name, ShardCount=1) client.put_records(StreamName=stream_name, Records=data) @@ -3552,7 +3656,7 @@ def test_schematized_kinesis_client_v1(self): {"Data": json.dumps({"Hello": "World"}), "PartitionKey": partition_key}, {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client.create_stream(StreamName=stream_name, ShardCount=1) client.put_records(StreamName=stream_name, Records=data) @@ -3573,7 +3677,7 @@ def test_schematized_unspecified_service_kinesis_client_default(self): {"Data": json.dumps({"Hello": "World"}), "PartitionKey": partition_key}, {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client.create_stream(StreamName=stream_name, ShardCount=1) client.put_records(StreamName=stream_name, Records=data) @@ -3594,7 +3698,7 @@ def test_schematized_unspecified_service_kinesis_client_v0(self): {"Data": json.dumps({"Hello": "World"}), "PartitionKey": partition_key}, {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client.create_stream(StreamName=stream_name, ShardCount=1) client.put_records(StreamName=stream_name, Records=data) @@ -3615,7 +3719,7 @@ def test_schematized_unspecified_service_kinesis_client_v1(self): {"Data": json.dumps({"Hello": "World"}), "PartitionKey": partition_key}, {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client.create_stream(StreamName=stream_name, ShardCount=1) client.put_records(StreamName=stream_name, Records=data) @@ -3630,7 +3734,9 @@ def test_secretsmanager(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) resp = client.create_secret(Name="/my/secrets", SecretString="supersecret-string") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3655,7 +3761,9 @@ def test_secretsmanager_binary(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) resp = client.create_secret(Name="/my/secrets", SecretBinary=b"supersecret-binary") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3681,7 +3789,7 @@ def test_schematized_secretsmanager_default(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) resp = client.create_secret(Name="/my/secrets", SecretString="supersecret-string") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3699,7 +3807,7 @@ def test_schematized_secretsmanager_v0(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) resp = client.create_secret(Name="/my/secrets", SecretString="supersecret-string") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3717,7 +3825,7 @@ def test_schematized_secretsmanager_v1(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) resp = client.create_secret(Name="/my/secrets", SecretString="supersecret-string") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3735,7 +3843,7 @@ def test_schematized_unspecified_service_secretsmanager_default(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) resp = client.create_secret(Name="/my/secrets", SecretString="supersecret-string") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3753,7 +3861,7 @@ def test_schematized_unspecified_service_secretsmanager_v0(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) resp = client.create_secret(Name="/my/secrets", SecretString="supersecret-string") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3771,7 +3879,7 @@ def test_schematized_unspecified_service_secretsmanager_v1(self): with mock_secretsmanager(): client = self.session.create_client("secretsmanager", region_name="us-east-1") - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) resp = client.create_secret(Name="/my/secrets", SecretString="supersecret-string") assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 @@ -3787,7 +3895,9 @@ def test_schematized_unspecified_service_secretsmanager_v1(self): @mock_sqs def test_aws_payload_tagging_sqs(self): with self.override_config("botocore", dict(payload_tagging_request="all", payload_tagging_response="all")): - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(self.sqs_client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(self.sqs_client) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, "two": {"DataType": "String", "StringValue": "two"}, @@ -3844,7 +3954,9 @@ def test_aws_payload_tagging_sns(self): sqs_arn = "arn:aws:sqs:{}:{}:{}".format(region, url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, @@ -3897,7 +4009,9 @@ def test_aws_payload_tagging_sns_valid_config(self): sqs_arn = "arn:aws:sqs:{}:{}:{}".format(region, url_parts[-2], url_parts[-1]) sns.subscribe(TopicArn=topic_arn, Protocol="sqs", Endpoint=sqs_arn) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(sns) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(sns) message_attributes = { "one": {"DataType": "String", "StringValue": "one"}, @@ -3933,7 +4047,9 @@ def test_aws_payload_tagging_sns_valid_config(self): def test_aws_payload_tagging_s3(self): with self.override_config("botocore", dict(payload_tagging_request="all", payload_tagging_response="all")): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) s3.list_buckets() s3.list_buckets() @@ -3965,7 +4081,9 @@ def test_aws_payload_tagging_s3_invalid_config(self): dict(payload_tagging_request="non_json_path", payload_tagging_response="$..Attr ibutes.PlatformCredential"), ): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) s3.list_buckets() s3.list_buckets() @@ -3983,7 +4101,9 @@ def test_aws_payload_tagging_s3_valid_config(self): "botocore", dict(payload_tagging_request="$..bucket", payload_tagging_response="$..HTTPHeaders") ): s3 = self.session.create_client("s3", region_name="us-west-2") - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(s3) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(s3) s3.list_buckets() s3.list_buckets() @@ -4028,7 +4148,9 @@ def test_aws_payload_tagging_eventbridge(self): Targets=[{"Id": "a-test-bus-rule-target", "Arn": "arn:aws:sqs:us-east-1:000000000000:Test"}], ) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(bridge) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(bridge) bridge.put_events(Entries=entries) self.sqs_client.receive_message(QueueUrl=queue_url, WaitTimeSeconds=2) @@ -4048,7 +4170,7 @@ def test_aws_payload_tagging_kinesis(self): {"Data": json.dumps({"foo": "bar"}), "PartitionKey": partition_key}, ] - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) with self.tracer.trace("kinesis.manual_span"): client.create_stream(StreamName=stream_name, ShardCount=1) diff --git a/tests/contrib/botocore/test_bedrock.py b/tests/contrib/botocore/test_bedrock.py index 1cf5618bd0e..578c34ce981 100644 --- a/tests/contrib/botocore/test_bedrock.py +++ b/tests/contrib/botocore/test_bedrock.py @@ -42,7 +42,7 @@ def aws_credentials(): def mock_tracer(ddtrace_global_config, bedrock_client): pin = Pin.get_from(bedrock_client) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) - pin.override(bedrock_client, tracer=mock_tracer) + pin._override(bedrock_client, tracer=mock_tracer) yield mock_tracer @@ -102,7 +102,7 @@ def setUp(self): self.bedrock_client = self.session.client("bedrock-runtime") self.mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) pin = Pin.get_from(self.bedrock_client) - pin.override(self.bedrock_client, tracer=self.mock_tracer) + pin._override(self.bedrock_client, tracer=self.mock_tracer) super(TestBedrockConfig, self).setUp() diff --git a/tests/contrib/botocore/test_bedrock_llmobs.py b/tests/contrib/botocore/test_bedrock_llmobs.py index 790b86f0704..711f1287f99 100644 --- a/tests/contrib/botocore/test_bedrock_llmobs.py +++ b/tests/contrib/botocore/test_bedrock_llmobs.py @@ -107,7 +107,7 @@ def expected_llmobs_span_event(span, n_output, message=False): def _test_llmobs_invoke(cls, provider, bedrock_client, mock_llmobs_span_writer, cassette_name=None, n_output=1): mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) pin = Pin.get_from(bedrock_client) - pin.override(bedrock_client, tracer=mock_tracer) + pin._override(bedrock_client, tracer=mock_tracer) # Need to disable and re-enable LLMObs service to use the mock tracer LLMObs.disable() LLMObs.enable(_tracer=mock_tracer, integrations_enabled=False) # only want botocore patched @@ -148,7 +148,7 @@ def _test_llmobs_invoke_stream( ): mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) pin = Pin.get_from(bedrock_client) - pin.override(bedrock_client, tracer=mock_tracer) + pin._override(bedrock_client, tracer=mock_tracer) # Need to disable and re-enable LLMObs service to use the mock tracer LLMObs.disable() LLMObs.enable(_tracer=mock_tracer, integrations_enabled=False) # only want botocore patched @@ -249,7 +249,7 @@ def test_llmobs_error(self, ddtrace_global_config, bedrock_client, mock_llmobs_s mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) pin = Pin.get_from(bedrock_client) - pin.override(bedrock_client, tracer=mock_tracer) + pin._override(bedrock_client, tracer=mock_tracer) # Need to disable and re-enable LLMObs service to use the mock tracer LLMObs.disable() LLMObs.enable(_tracer=mock_tracer, integrations_enabled=False) # only want botocore patched diff --git a/tests/contrib/cassandra/test.py b/tests/contrib/cassandra/test.py index 21b98d6396f..e63572076ee 100644 --- a/tests/contrib/cassandra/test.py +++ b/tests/contrib/cassandra/test.py @@ -360,7 +360,7 @@ def setUp(self): def _traced_session(self): tracer = DummyTracer() - Pin.get_from(self.cluster).clone(tracer=tracer).onto(self.cluster) + Pin.get_from(self.cluster)._clone(tracer=tracer).onto(self.cluster) return self.cluster.connect(self.TEST_KEYSPACE), tracer @@ -379,7 +379,9 @@ def setUp(self): def _traced_session(self): tracer = DummyTracer() # pin the global Cluster to test if they will conflict - Pin(service=self.TEST_SERVICE, tracer=tracer).onto(Cluster) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = tracer + pin.onto(Cluster) self.cluster = Cluster(port=CASSANDRA_CONFIG["port"]) return self.cluster.connect(self.TEST_KEYSPACE), tracer @@ -403,7 +405,9 @@ def _traced_session(self): Pin(service="not-%s" % self.TEST_SERVICE).onto(Cluster) self.cluster = Cluster(port=CASSANDRA_CONFIG["port"]) - Pin(service=self.TEST_SERVICE, tracer=tracer).onto(self.cluster) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = tracer + pin.onto(self.cluster) return self.cluster.connect(self.TEST_KEYSPACE), tracer def test_patch_unpatch(self): @@ -412,7 +416,7 @@ def test_patch_unpatch(self): patch() tracer = DummyTracer() - Pin.get_from(Cluster).clone(tracer=tracer).onto(Cluster) + Pin.get_from(Cluster)._clone(tracer=tracer).onto(Cluster) session = Cluster(port=CASSANDRA_CONFIG["port"]).connect(self.TEST_KEYSPACE) session.execute(self.TEST_QUERY) @@ -432,7 +436,7 @@ def test_patch_unpatch(self): # Test patch again patch() - Pin.get_from(Cluster).clone(tracer=tracer).onto(Cluster) + Pin.get_from(Cluster)._clone(tracer=tracer).onto(Cluster) session = Cluster(port=CASSANDRA_CONFIG["port"]).connect(self.TEST_KEYSPACE) session.execute(self.TEST_QUERY) @@ -454,7 +458,7 @@ def setUp(self): patch() self.tracer = DummyTracer() self.cluster = Cluster(port=CASSANDRA_CONFIG["port"]) - Pin.get_from(self.cluster).clone(tracer=self.tracer).onto(self.cluster) + Pin.get_from(self.cluster)._clone(tracer=self.tracer).onto(self.cluster) self.session = self.cluster.connect(self.TEST_KEYSPACE) def tearDown(self): diff --git a/tests/contrib/celery/base.py b/tests/contrib/celery/base.py index c2b7de22a54..040566ee57d 100644 --- a/tests/contrib/celery/base.py +++ b/tests/contrib/celery/base.py @@ -88,10 +88,11 @@ def celery_test_setup(self): def setUp(self): super(CeleryBaseTestCase, self).setUp() - self.pin = Pin(service="celery-unittest", tracer=self.tracer) + self.pin = Pin(service="celery-unittest") + self.pin._tracer = self.tracer # override pins to use our Dummy Tracer - Pin.override(self.app, tracer=self.tracer) - Pin.override(celery.beat.Scheduler, tracer=self.tracer) + Pin._override(self.app, tracer=self.tracer) + Pin._override(celery.beat.Scheduler, tracer=self.tracer) def tearDown(self): self.app = None diff --git a/tests/contrib/celery/test_tagging.py b/tests/contrib/celery/test_tagging.py index 6b88acf9434..d68ab3adbcb 100644 --- a/tests/contrib/celery/test_tagging.py +++ b/tests/contrib/celery/test_tagging.py @@ -61,14 +61,14 @@ def dummy_tracer(): @pytest.fixture(autouse=False) def traced_redis_celery_app(instrument_celery, dummy_tracer): Pin.get_from(redis_celery_app) - Pin.override(redis_celery_app, tracer=dummy_tracer) + Pin._override(redis_celery_app, tracer=dummy_tracer) yield redis_celery_app @pytest.fixture(autouse=False) def traced_amqp_celery_app(instrument_celery, dummy_tracer): Pin.get_from(amqp_celery_app) - Pin.override(amqp_celery_app, tracer=dummy_tracer) + Pin._override(amqp_celery_app, tracer=dummy_tracer) yield amqp_celery_app diff --git a/tests/contrib/consul/test.py b/tests/contrib/consul/test.py index 285287f9e95..71e2f0c6da0 100644 --- a/tests/contrib/consul/test.py +++ b/tests/contrib/consul/test.py @@ -22,8 +22,8 @@ def setUp(self): host=CONSUL_CONFIG["host"], port=CONSUL_CONFIG["port"], ) - Pin.override(consul.Consul, service=self.TEST_SERVICE, tracer=self.tracer) - Pin.override(consul.Consul.KV, service=self.TEST_SERVICE, tracer=self.tracer) + Pin._override(consul.Consul, service=self.TEST_SERVICE, tracer=self.tracer) + Pin._override(consul.Consul.KV, service=self.TEST_SERVICE, tracer=self.tracer) self.c = c def tearDown(self): @@ -168,8 +168,8 @@ def setUp(self): host=CONSUL_CONFIG["host"], port=CONSUL_CONFIG["port"], ) - Pin.override(consul.Consul, tracer=self.tracer) - Pin.override(consul.Consul.KV, tracer=self.tracer) + Pin._override(consul.Consul, tracer=self.tracer) + Pin._override(consul.Consul.KV, tracer=self.tracer) self.c = c def tearDown(self): diff --git a/tests/contrib/dbapi/test_dbapi.py b/tests/contrib/dbapi/test_dbapi.py index c60e49c56af..00e1dc34c56 100644 --- a/tests/contrib/dbapi/test_dbapi.py +++ b/tests/contrib/dbapi/test_dbapi.py @@ -24,7 +24,8 @@ def test_execute_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.execute.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedCursor(cursor, pin, {}) # DEV: We always pass through the result assert "__result__" == traced_cursor.execute("__query__", "arg_1", kwarg1="kwarg1") @@ -37,7 +38,9 @@ def test_dbm_propagation_not_supported(self): # By default _dbm_propagator attribute should not be set or have a value of None. # DBM context propagation should be opt in. assert getattr(cfg, "_dbm_propagator", None) is None - traced_cursor = TracedCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = TracedCursor(cursor, pin, cfg) # Ensure dbm comment is not appended to sql statement traced_cursor.execute("SELECT * FROM db;") cursor.execute.assert_called_once_with("SELECT * FROM db;") @@ -53,7 +56,9 @@ def test_dbm_propagation_not_supported(self): def test_cursor_execute_with_dbm_injection(self): cursor = self.cursor cfg = IntegrationConfig(Config(), "dbapi", service="orders-db", _dbm_propagator=_DBM_Propagator(0, "query")) - traced_cursor = TracedCursor(cursor, Pin(service="orders-db", tracer=self.tracer), cfg) + pin = Pin(service="orders-db") + pin._tracer = self.tracer + traced_cursor = TracedCursor(cursor, pin, cfg) # The following operations should generate DBM comments traced_cursor.execute("SELECT * FROM db;") @@ -73,7 +78,8 @@ def test_executemany_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.executemany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedCursor(cursor, pin, {}) # DEV: We always pass through the result assert "__result__" == traced_cursor.executemany("__query__", "arg_1", kwarg1="kwarg1") @@ -83,7 +89,8 @@ def test_fetchone_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchone.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.fetchone("arg_1", kwarg1="kwarg1") cursor.fetchone.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -92,7 +99,8 @@ def test_fetchall_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchall.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.fetchall("arg_1", kwarg1="kwarg1") cursor.fetchall.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -101,7 +109,8 @@ def test_fetchmany_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchmany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.fetchmany("arg_1", kwarg1="kwarg1") cursor.fetchmany.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -110,7 +119,8 @@ def test_correct_span_names(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 0 - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = TracedCursor(cursor, pin, {}) traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -145,7 +155,8 @@ def test_when_pin_disabled_then_no_tracing(self): cursor.executemany.return_value = "__result__" tracer.enabled = False - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = TracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -174,7 +185,8 @@ def test_span_info(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = TracedCursor(cursor, pin, {}) def method(): @@ -199,7 +211,8 @@ def test_cfg_service(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin(None, tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin(None, tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test", service="cfg-service") traced_cursor = TracedCursor(cursor, pin, cfg) @@ -214,7 +227,8 @@ def test_default_service(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin(None, tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin(None, tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = TracedCursor(cursor, pin, {}) @@ -229,7 +243,8 @@ def test_default_service_cfg(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin(None, tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin(tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test", _default_service="default-svc") traced_cursor = TracedCursor(cursor, pin, cfg) @@ -244,7 +259,8 @@ def test_service_cfg_and_pin(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin("pin-svc", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("pin-svc", tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test", _default_service="default-svc") traced_cursor = TracedCursor(cursor, pin, cfg) @@ -262,7 +278,8 @@ def test_django_traced_cursor_backward_compatibility(self): # implementation with the generic dbapi traced cursor, we had to make sure to add the tag 'sql.rows' that was # set by the legacy replaced implementation. cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test") traced_cursor = TracedCursor(cursor, pin, cfg) @@ -286,7 +303,8 @@ def test_execute_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.execute.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.execute("__query__", "arg_1", kwarg1="kwarg1") cursor.execute.assert_called_once_with("__query__", "arg_1", kwarg1="kwarg1") @@ -296,7 +314,8 @@ def test_executemany_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.executemany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.executemany("__query__", "arg_1", kwarg1="kwarg1") cursor.executemany.assert_called_once_with("__query__", "arg_1", kwarg1="kwarg1") @@ -305,7 +324,8 @@ def test_fetchone_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchone.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.fetchone("arg_1", kwarg1="kwarg1") cursor.fetchone.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -314,7 +334,8 @@ def test_fetchall_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchall.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.fetchall("arg_1", kwarg1="kwarg1") cursor.fetchall.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -323,7 +344,8 @@ def test_fetchmany_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchmany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.fetchmany("arg_1", kwarg1="kwarg1") cursor.fetchmany.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -332,7 +354,8 @@ def test_correct_span_names(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 0 - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -367,7 +390,8 @@ def test_when_pin_disabled_then_no_tracing(self): cursor.executemany.return_value = "__result__" tracer.enabled = False - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) assert "__result__" == traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -396,7 +420,8 @@ def test_span_info(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) def method(): @@ -422,7 +447,8 @@ def test_django_traced_cursor_backward_compatibility(self): # implementation with the generic dbapi traced cursor, we had to make sure to add the tag 'sql.rows' that was # set by the legacy replaced implementation. cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) def method(): @@ -440,7 +466,8 @@ class Unknown(object): cursor = self.cursor tracer = self.tracer cursor.rowcount = Unknown() - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = FetchTracedCursor(cursor, pin, {}) def method(): @@ -453,7 +480,8 @@ def method(): def test_callproc_can_handle_arbitrary_args(self): cursor = self.cursor tracer = self.tracer - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer cursor.callproc.return_value = "gme --> moon" traced_cursor = TracedCursor(cursor, pin, {}) @@ -484,7 +512,9 @@ def test_cursor_execute_fetch_with_dbm_injection(self): cursor = self.cursor dbm_propagator = _DBM_Propagator(0, "query") cfg = IntegrationConfig(Config(), "dbapi", service="dbapi_service", _dbm_propagator=dbm_propagator) - traced_cursor = FetchTracedCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = FetchTracedCursor(cursor, pin, cfg) # The following operations should not generate DBM comments traced_cursor.fetchone() @@ -517,7 +547,8 @@ def setUp(self): self.connection = mock.Mock() def test_cursor_class(self): - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer # Default traced_connection = TracedConnection(self.connection, pin=pin) @@ -537,7 +568,8 @@ def test_commit_is_traced(self): connection = self.connection tracer = self.tracer connection.commit.return_value = None - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_connection = TracedConnection(connection, pin) traced_connection.commit() assert tracer.pop()[0].name == "mock.connection.commit" @@ -547,7 +579,8 @@ def test_rollback_is_traced(self): connection = self.connection tracer = self.tracer connection.rollback.return_value = None - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_connection = TracedConnection(connection, pin) traced_connection.rollback() assert tracer.pop()[0].name == "mock.connection.rollback" @@ -588,7 +621,8 @@ def cursor(self): def commit(self): pass - pin = Pin("pin", tracer=self.tracer) + pin = Pin("pin") + pin._tracer = self.tracer conn = TracedConnection(ConnectionConnection(), pin) with conn as conn2: conn2.commit() diff --git a/tests/contrib/dbapi/test_dbapi_appsec.py b/tests/contrib/dbapi/test_dbapi_appsec.py index 062a4ca667e..f1afbdb24af 100644 --- a/tests/contrib/dbapi/test_dbapi_appsec.py +++ b/tests/contrib/dbapi/test_dbapi_appsec.py @@ -50,7 +50,9 @@ def test_tainted_query(self): cursor = self.cursor cfg = IntegrationConfig(Config(), "sqlite", service="dbapi_service") - traced_cursor = TracedCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = TracedCursor(cursor, pin, cfg) traced_cursor.execute(query) cursor.execute.assert_called_once_with(query) @@ -73,7 +75,9 @@ def test_tainted_query_args(self): cursor = self.cursor cfg = IntegrationConfig(Config(), "sqlite", service="dbapi_service") - traced_cursor = TracedCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = TracedCursor(cursor, pin, cfg) traced_cursor.execute(query, (query_arg,)) cursor.execute.assert_called_once_with(query, (query_arg,)) @@ -88,7 +92,9 @@ def test_untainted_query(self): cursor = self.cursor cfg = IntegrationConfig(Config(), "sqlite", service="dbapi_service") - traced_cursor = TracedCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = TracedCursor(cursor, pin, cfg) traced_cursor.execute(query) cursor.execute.assert_called_once_with(query) @@ -104,7 +110,9 @@ def test_untainted_query_and_args(self): cursor = self.cursor cfg = IntegrationConfig(Config(), "sqlite", service="dbapi_service") - traced_cursor = TracedCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = TracedCursor(cursor, pin, cfg) traced_cursor.execute(query, (query_arg,)) cursor.execute.assert_called_once_with(query, (query_arg,)) @@ -124,7 +132,9 @@ def test_tainted_query_iast_disabled(self): cursor = self.cursor cfg = IntegrationConfig(Config(), "sqlite", service="dbapi_service") - traced_cursor = TracedCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = TracedCursor(cursor, pin, cfg) traced_cursor.execute(query) cursor.execute.assert_called_once_with(query) diff --git a/tests/contrib/dbapi_async/test_dbapi_async.py b/tests/contrib/dbapi_async/test_dbapi_async.py index ceb2b0cf6a1..dd16b7a2e33 100644 --- a/tests/contrib/dbapi_async/test_dbapi_async.py +++ b/tests/contrib/dbapi_async/test_dbapi_async.py @@ -26,7 +26,8 @@ async def test_execute_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.execute.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) # DEV: We always pass through the result assert "__result__" == await traced_cursor.execute("__query__", "arg_1", kwarg1="kwarg1") @@ -40,7 +41,9 @@ async def test_dbm_propagation_not_supported(self): # By default _dbm_propagator attribute should not be set or have a value of None. # DBM context propagation should be opt in. assert getattr(cfg, "_dbm_propagator", None) is None - traced_cursor = TracedAsyncCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin(service="dbapi_service") + pin._tracer = self.tracer + traced_cursor = TracedAsyncCursor(cursor, pin, cfg) # Ensure dbm comment is not appended to sql statement await traced_cursor.execute("SELECT * FROM db;") cursor.execute.assert_called_once_with("SELECT * FROM db;") @@ -57,7 +60,9 @@ async def test_dbm_propagation_not_supported(self): async def test_cursor_execute_with_dbm_injection(self): cursor = self.cursor cfg = IntegrationConfig(Config(), "dbapi", service="orders-db", _dbm_propagator=_DBM_Propagator(0, "query")) - traced_cursor = TracedAsyncCursor(cursor, Pin(service="orders-db", tracer=self.tracer), cfg) + pin = Pin(service="orders-db") + pin._tracer = self.tracer + traced_cursor = TracedAsyncCursor(cursor, pin, cfg) # The following operations should generate DBM comments await traced_cursor.execute("SELECT * FROM db;") @@ -78,7 +83,8 @@ async def test_executemany_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.executemany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) # DEV: We always pass through the result assert "__result__" == await traced_cursor.executemany("__query__", "arg_1", kwarg1="kwarg1") @@ -89,7 +95,8 @@ async def test_fetchone_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchone.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.fetchone("arg_1", kwarg1="kwarg1") cursor.fetchone.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -101,7 +108,9 @@ async def test_cursor_async_connection(self): def method(): pass - async with TracedAsyncCursor(self.cursor, Pin("dbapi_service", tracer=self.tracer), {}) as cursor: + pin = Pin("dbapi_service") + pin._tracer = self.tracer + async with TracedAsyncCursor(self.cursor, pin, {}) as cursor: await cursor.execute("""select 'one' as x""") await cursor.execute("""select 'blah'""") @@ -120,7 +129,8 @@ async def test_fetchall_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchall.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.fetchall("arg_1", kwarg1="kwarg1") cursor.fetchall.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -130,7 +140,8 @@ async def test_fetchmany_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchmany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.fetchmany("arg_1", kwarg1="kwarg1") cursor.fetchmany.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -140,7 +151,8 @@ async def test_correct_span_names(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 0 - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) await traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -176,7 +188,8 @@ async def test_when_pin_disabled_then_no_tracing(self): cursor.executemany.return_value = "__result__" tracer.enabled = False - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -206,7 +219,8 @@ async def test_span_info(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) async def method(): @@ -232,7 +246,8 @@ async def test_cfg_service(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin(None, tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin(None, tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test", service="cfg-service") traced_cursor = TracedAsyncCursor(cursor, pin, cfg) @@ -248,7 +263,8 @@ async def test_default_service(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin(None, tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin(None, tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = TracedAsyncCursor(cursor, pin, {}) @@ -264,7 +280,8 @@ async def test_default_service_cfg(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin(None, tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin(None, tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test", _default_service="default-svc") traced_cursor = TracedAsyncCursor(cursor, pin, cfg) @@ -280,7 +297,8 @@ async def test_service_cfg_and_pin(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin("pin-svc", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("pin-svc", tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test", _default_service="default-svc") traced_cursor = TracedAsyncCursor(cursor, pin, cfg) @@ -299,7 +317,8 @@ async def test_django_traced_cursor_backward_compatibility(self): # implementation with the generic dbapi traced cursor, we had to make sure to add the tag 'sql.rows' that was # set by the legacy replaced implementation. cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer cfg = IntegrationConfig(Config(), "db-test") traced_cursor = TracedAsyncCursor(cursor, pin, cfg) @@ -324,7 +343,8 @@ async def test_execute_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.execute.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.execute("__query__", "arg_1", kwarg1="kwarg1") cursor.execute.assert_called_once_with("__query__", "arg_1", kwarg1="kwarg1") @@ -335,7 +355,8 @@ async def test_executemany_wrapped_is_called_and_returned(self): cursor.rowcount = 0 cursor.executemany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.executemany("__query__", "arg_1", kwarg1="kwarg1") cursor.executemany.assert_called_once_with("__query__", "arg_1", kwarg1="kwarg1") @@ -345,7 +366,8 @@ async def test_fetchone_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchone.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.fetchone("arg_1", kwarg1="kwarg1") cursor.fetchone.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -355,7 +377,8 @@ async def test_fetchall_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchall.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.fetchall("arg_1", kwarg1="kwarg1") cursor.fetchall.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -365,7 +388,8 @@ async def test_fetchmany_wrapped_is_called_and_returned(self): cursor = self.cursor cursor.rowcount = 0 cursor.fetchmany.return_value = "__result__" - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.fetchmany("arg_1", kwarg1="kwarg1") cursor.fetchmany.assert_called_once_with("arg_1", kwarg1="kwarg1") @@ -375,7 +399,8 @@ async def test_correct_span_names(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 0 - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) await traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -411,7 +436,8 @@ async def test_when_pin_disabled_then_no_tracing(self): cursor.executemany.return_value = "__result__" tracer.enabled = False - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) assert "__result__" == await traced_cursor.execute("arg_1", kwarg1="kwarg1") @@ -441,7 +467,8 @@ async def test_span_info(self): cursor = self.cursor tracer = self.tracer cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) async def method(): @@ -468,7 +495,8 @@ async def test_django_traced_cursor_backward_compatibility(self): # implementation with the generic dbapi traced cursor, we had to make sure to add the tag 'sql.rows' that was # set by the legacy replaced implementation. cursor.rowcount = 123 - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) async def method(): @@ -487,7 +515,8 @@ class Unknown(object): cursor = self.cursor tracer = self.tracer cursor.rowcount = Unknown() - pin = Pin("my_service", tracer=tracer, tags={"pin1": "value_pin1"}) + pin = Pin("my_service", tags={"pin1": "value_pin1"}) + pin._tracer = tracer traced_cursor = FetchTracedAsyncCursor(cursor, pin, {}) async def method(): @@ -501,7 +530,8 @@ async def method(): async def test_callproc_can_handle_arbitrary_args(self): cursor = self.cursor tracer = self.tracer - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer cursor.callproc.return_value = "gme --> moon" traced_cursor = TracedAsyncCursor(cursor, pin, {}) @@ -533,7 +563,9 @@ async def test_cursor_execute_fetch_with_dbm_injection(self): cursor = self.cursor dbm_propagator = _DBM_Propagator(0, "query") cfg = IntegrationConfig(Config(), "dbapi", service="dbapi_service", _dbm_propagator=dbm_propagator) - traced_cursor = FetchTracedAsyncCursor(cursor, Pin("dbapi_service", tracer=self.tracer), cfg) + pin = Pin("dbapi_service") + pin._tracer = self.tracer + traced_cursor = FetchTracedAsyncCursor(cursor, pin, cfg) # The following operations should not generate DBM comments await traced_cursor.fetchone() @@ -567,7 +599,8 @@ def setUp(self): @mark_asyncio async def test_cursor_class(self): - pin = Pin("pin_name", tracer=self.tracer) + pin = Pin("pin_name") + pin._tracer = self.tracer # Default traced_connection = TracedAsyncConnection(self.connection, pin=pin) @@ -588,7 +621,8 @@ async def test_commit_is_traced(self): connection = self.connection tracer = self.tracer connection.commit.return_value = None - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_connection = TracedAsyncConnection(connection, pin) await traced_connection.commit() assert tracer.pop()[0].name == "mock.connection.commit" @@ -599,7 +633,8 @@ async def test_rollback_is_traced(self): connection = self.connection tracer = self.tracer connection.rollback.return_value = None - pin = Pin("pin_name", tracer=tracer) + pin = Pin("pin_name") + pin._tracer = tracer traced_connection = TracedAsyncConnection(connection, pin) await traced_connection.rollback() assert tracer.pop()[0].name == "mock.connection.rollback" @@ -641,7 +676,8 @@ def cursor(self): async def commit(self): pass - pin = Pin("pin", tracer=self.tracer) + pin = Pin("pin") + pin._tracer = self.tracer conn = TracedAsyncConnection(ConnectionConnection(), pin) async with conn as conn2: await conn2.commit() diff --git a/tests/contrib/django/conftest.py b/tests/contrib/django/conftest.py index 3dd992681b4..7a398abba46 100644 --- a/tests/contrib/django/conftest.py +++ b/tests/contrib/django/conftest.py @@ -32,7 +32,7 @@ def tracer(): # Patch Django and override tracer to be our test tracer pin = Pin.get_from(django) original_tracer = pin.tracer - Pin.override(django, tracer=tracer) + Pin._override(django, tracer=tracer) # Yield to our test yield tracer @@ -41,7 +41,7 @@ def tracer(): # Reset the tracer pinned to Django and unpatch # DEV: unable to properly unpatch and reload django app with each test # unpatch() - Pin.override(django, tracer=original_tracer) + Pin._override(django, tracer=original_tracer) @pytest.fixture diff --git a/tests/contrib/django/test_django.py b/tests/contrib/django/test_django.py index 79baceb1652..03fdffeaf45 100644 --- a/tests/contrib/django/test_django.py +++ b/tests/contrib/django/test_django.py @@ -1588,7 +1588,7 @@ def test_connection(client, test_spans): span = spans[0] assert span.name == "sqlite.query" - assert span.service == "{}" + assert span.service == "{}", span.service assert span.span_type == "sql" assert span.get_tag("django.db.vendor") == "sqlite" assert span.get_tag("django.db.alias") == "default" diff --git a/tests/contrib/django/test_django_dbm.py b/tests/contrib/django/test_django_dbm.py index d44f90f3208..cd2eb436c42 100644 --- a/tests/contrib/django/test_django_dbm.py +++ b/tests/contrib/django/test_django_dbm.py @@ -21,7 +21,7 @@ def get_cursor(tracer, service=None, propagation_mode="service", tags={}): pin = Pin.get_from(cursor) assert pin is not None - pin.clone(tracer=tracer, tags={**pin.tags, **tags}).onto(cursor) + pin._clone(tracer=tracer, tags={**pin.tags, **tags}).onto(cursor) return cursor diff --git a/tests/contrib/dogpile_cache/test_tracing.py b/tests/contrib/dogpile_cache/test_tracing.py index fec78818eda..ac42a8512ac 100644 --- a/tests/contrib/dogpile_cache/test_tracing.py +++ b/tests/contrib/dogpile_cache/test_tracing.py @@ -31,7 +31,7 @@ def region(tracer): # The backend is trivial so we can use memory to simplify test setup. test_region = dogpile.cache.make_region(name="TestRegion", key_mangler=lambda x: x) test_region.configure("dogpile.cache.memory") - Pin.override(dogpile.cache, tracer=tracer) + Pin._override(dogpile.cache, tracer=tracer) return test_region diff --git a/tests/contrib/dramatiq/test_integration.py b/tests/contrib/dramatiq/test_integration.py index 526aadc3861..990bef92bdc 100644 --- a/tests/contrib/dramatiq/test_integration.py +++ b/tests/contrib/dramatiq/test_integration.py @@ -35,7 +35,9 @@ def test_idempotent_unpatch(self): unpatch() tracer = DummyTracer() - Pin(tracer=tracer).onto(dramatiq) + pin = Pin() + pin._tracer = tracer + pin.onto(dramatiq) @dramatiq.actor def fn_task(): @@ -51,7 +53,9 @@ def test_fn_task_synchronous(self): # the body of the function is not instrumented so calling it # directly doesn't create a trace tracer = DummyTracer() - Pin(tracer=tracer).onto(dramatiq) + pin = Pin() + pin._tracer = tracer + pin.onto(dramatiq) @dramatiq.actor def fn_task(): diff --git a/tests/contrib/elasticsearch/test_elasticsearch.py b/tests/contrib/elasticsearch/test_elasticsearch.py index 6e381bc1e31..f1c461f4e51 100644 --- a/tests/contrib/elasticsearch/test_elasticsearch.py +++ b/tests/contrib/elasticsearch/test_elasticsearch.py @@ -92,7 +92,9 @@ def setUp(self): # `custom_tag` is a custom tag that can be set via `Pin`. "custom_tag": "bar", } - Pin(tracer=self.tracer, tags=tags).onto(es.transport) + pin = Pin(tags=tags) + pin._tracer = self.tracer + pin.onto(es.transport) self.create_index(es) patch() @@ -225,7 +227,9 @@ def test_patch_unpatch(self): patch() es = self._get_es() - Pin(tracer=self.tracer).onto(es.transport) + pin = Pin() + pin._tracer = self.tracer + pin.onto(es.transport) # Test index creation self.create_index(es) @@ -253,7 +257,9 @@ def test_patch_unpatch(self): patch() es = self._get_es() - Pin(tracer=self.tracer).onto(es.transport) + pin = Pin() + pin._tracer = self.tracer + pin.onto(es.transport) # Test index creation self.create_index(es) @@ -286,7 +292,9 @@ def test_user_specified_service_v1(self): assert config.service == "mysvc" self.create_index(self.es) - Pin(service="es", tracer=self.tracer).onto(self.es.transport) + pin = Pin(service="es") + pin._tracer = self.tracer + pin.onto(self.es.transport) spans = self.get_spans() self.reset() assert len(spans) == 1 @@ -303,7 +311,9 @@ def test_unspecified_service_v0(self): @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")) def test_unspecified_service_v1(self): self.create_index(self.es) - Pin(service="es", tracer=self.tracer).onto(self.es.transport) + pin = Pin(service="es") + pin._tracer = self.tracer + pin.onto(self.es.transport) spans = self.get_spans() self.reset() assert len(spans) == 1 diff --git a/tests/contrib/flask/__init__.py b/tests/contrib/flask/__init__.py index a512a79f196..2a6fc49285c 100644 --- a/tests/contrib/flask/__init__.py +++ b/tests/contrib/flask/__init__.py @@ -36,7 +36,7 @@ def setUp(self): self.app = flask.Flask(__name__, template_folder="test_templates/") self.app.test_client_class = DDFlaskTestClient self.client = self.app.test_client() - Pin.override(self.app, tracer=self.tracer) + Pin._override(self.app, tracer=self.tracer) def tearDown(self): super(BaseFlaskTestCase, self).tearDown() diff --git a/tests/contrib/flask/test_blueprint.py b/tests/contrib/flask/test_blueprint.py index 96401dfa1a9..dffa959eceb 100644 --- a/tests/contrib/flask/test_blueprint.py +++ b/tests/contrib/flask/test_blueprint.py @@ -36,7 +36,9 @@ def test_blueprint_register(self): We do not use the ``flask.Flask`` app ``Pin`` """ bp = flask.Blueprint("pinned", __name__) - Pin(service="flask-bp", tracer=self.tracer).onto(bp) + pin = Pin(service="flask-bp") + pin._tracer = self.tracer + pin.onto(bp) # DEV: This is more common than calling ``flask.Blueprint.register`` directly self.app.register_blueprint(bp) @@ -58,7 +60,9 @@ def test_blueprint_add_url_rule(self): """ # When the Blueprint has a Pin attached bp = flask.Blueprint("pinned", __name__) - Pin(service="flask-bp", tracer=self.tracer).onto(bp) + pin = Pin(service="flask-bp") + pin._tracer = self.tracer + pin.onto(bp) @bp.route("/") def test_view(): @@ -113,7 +117,7 @@ def test_blueprint_request_pin_override(self): We create the expected spans """ bp = flask.Blueprint("bp", __name__) - Pin.override(bp, service="flask-bp", tracer=self.tracer) + Pin._override(bp, service="flask-bp", tracer=self.tracer) @bp.route("/") def test(): diff --git a/tests/contrib/flask_autopatch/test_flask_autopatch.py b/tests/contrib/flask_autopatch/test_flask_autopatch.py index 27c4b47e2d0..9d0bfb7820b 100644 --- a/tests/contrib/flask_autopatch/test_flask_autopatch.py +++ b/tests/contrib/flask_autopatch/test_flask_autopatch.py @@ -17,7 +17,7 @@ class FlaskAutopatchTestCase(TracerTestCase): def setUp(self): super(FlaskAutopatchTestCase, self).setUp() self.app = flask.Flask(__name__) - Pin.override(self.app, service="test-flask", tracer=self.tracer) + Pin._override(self.app, service="test-flask", tracer=self.tracer) self.client = self.app.test_client() def test_patched(self): diff --git a/tests/contrib/google_generativeai/conftest.py b/tests/contrib/google_generativeai/conftest.py index 64b2eb83d1b..69d86a7f05d 100644 --- a/tests/contrib/google_generativeai/conftest.py +++ b/tests/contrib/google_generativeai/conftest.py @@ -35,7 +35,7 @@ def mock_tracer(ddtrace_global_config, genai): try: pin = Pin.get_from(genai) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) - pin.override(genai, tracer=mock_tracer) + pin._override(genai, tracer=mock_tracer) pin.tracer._configure() if ddtrace_global_config.get("_llmobs_enabled", False): # Have to disable and re-enable LLMObs to use to mock tracer. diff --git a/tests/contrib/grpc/common.py b/tests/contrib/grpc/common.py index e67e4f32a92..bcc444a3fe2 100644 --- a/tests/contrib/grpc/common.py +++ b/tests/contrib/grpc/common.py @@ -20,8 +20,8 @@ class GrpcBaseTestCase(TracerTestCase): def setUp(self): super(GrpcBaseTestCase, self).setUp() patch() - Pin.override(constants.GRPC_PIN_MODULE_SERVER, tracer=self.tracer) - Pin.override(constants.GRPC_PIN_MODULE_CLIENT, tracer=self.tracer) + Pin._override(constants.GRPC_PIN_MODULE_SERVER, tracer=self.tracer) + Pin._override(constants.GRPC_PIN_MODULE_CLIENT, tracer=self.tracer) self._start_server() def tearDown(self): diff --git a/tests/contrib/grpc/test_grpc.py b/tests/contrib/grpc/test_grpc.py index d0559f2dff5..6164682c449 100644 --- a/tests/contrib/grpc/test_grpc.py +++ b/tests/contrib/grpc/test_grpc.py @@ -227,9 +227,9 @@ def test_pin_not_activated(self): def test_pin_tags_are_put_in_span(self): # DEV: stop and restart server to catch overridden pin self._stop_server() - Pin.override(constants.GRPC_PIN_MODULE_SERVER, service="server1") - Pin.override(constants.GRPC_PIN_MODULE_SERVER, tags={"tag1": "server"}) - Pin.override(constants.GRPC_PIN_MODULE_CLIENT, tags={"tag2": "client"}) + Pin._override(constants.GRPC_PIN_MODULE_SERVER, service="server1") + Pin._override(constants.GRPC_PIN_MODULE_SERVER, tags={"tag1": "server"}) + Pin._override(constants.GRPC_PIN_MODULE_CLIENT, tags={"tag2": "client"}) self._start_server() with grpc.insecure_channel("127.0.0.1:%d" % (_GRPC_PORT)) as channel: stub = HelloStub(channel) @@ -241,10 +241,10 @@ def test_pin_tags_are_put_in_span(self): assert spans[0].get_tag("tag2") == "client" def test_pin_can_be_defined_per_channel(self): - Pin.override(constants.GRPC_PIN_MODULE_CLIENT, service="grpc1") + Pin._override(constants.GRPC_PIN_MODULE_CLIENT, service="grpc1") channel1 = grpc.insecure_channel("127.0.0.1:%d" % (_GRPC_PORT)) - Pin.override(constants.GRPC_PIN_MODULE_CLIENT, service="grpc2") + Pin._override(constants.GRPC_PIN_MODULE_CLIENT, service="grpc2") channel2 = grpc.insecure_channel("127.0.0.1:%d" % (_GRPC_PORT)) stub1 = HelloStub(channel1) diff --git a/tests/contrib/grpc_aio/test_grpc_aio.py b/tests/contrib/grpc_aio/test_grpc_aio.py index 0606bcc3db2..e256a37a160 100644 --- a/tests/contrib/grpc_aio/test_grpc_aio.py +++ b/tests/contrib/grpc_aio/test_grpc_aio.py @@ -179,8 +179,8 @@ def patch_grpc_aio(): @pytest.fixture def tracer(): tracer = DummyTracer() - Pin.override(GRPC_AIO_PIN_MODULE_CLIENT, tracer=tracer) - Pin.override(GRPC_AIO_PIN_MODULE_SERVER, tracer=tracer) + Pin._override(GRPC_AIO_PIN_MODULE_CLIENT, tracer=tracer) + Pin._override(GRPC_AIO_PIN_MODULE_SERVER, tracer=tracer) yield tracer tracer.pop() @@ -354,13 +354,13 @@ async def test_pin_not_activated(server_info, tracer): [_CoroHelloServicer(), _SyncHelloServicer()], ) async def test_pin_tags_put_in_span(servicer, tracer): - Pin.override(GRPC_AIO_PIN_MODULE_SERVER, service="server1") - Pin.override(GRPC_AIO_PIN_MODULE_SERVER, tags={"tag1": "server"}) + Pin._override(GRPC_AIO_PIN_MODULE_SERVER, service="server1") + Pin._override(GRPC_AIO_PIN_MODULE_SERVER, tags={"tag1": "server"}) target = f"localhost:{_GRPC_PORT}" _server = _create_server(servicer, target) await _server.start() - Pin.override(GRPC_AIO_PIN_MODULE_CLIENT, tags={"tag2": "client"}) + Pin._override(GRPC_AIO_PIN_MODULE_CLIENT, tags={"tag2": "client"}) async with aio.insecure_channel(target) as channel: stub = HelloStub(channel) await stub.SayHello(HelloRequest(name="test")) @@ -383,10 +383,10 @@ async def test_pin_tags_put_in_span(servicer, tracer): @pytest.mark.parametrize("server_info", [_CoroHelloServicer(), _SyncHelloServicer()], indirect=True) async def test_pin_can_be_defined_per_channel(server_info, tracer): - Pin.override(GRPC_AIO_PIN_MODULE_CLIENT, service="grpc1") + Pin._override(GRPC_AIO_PIN_MODULE_CLIENT, service="grpc1") channel1 = aio.insecure_channel(server_info.target) - Pin.override(GRPC_AIO_PIN_MODULE_CLIENT, service="grpc2") + Pin._override(GRPC_AIO_PIN_MODULE_CLIENT, service="grpc2") channel2 = aio.insecure_channel(server_info.target) stub1 = HelloStub(channel1) diff --git a/tests/contrib/httplib/test_httplib.py b/tests/contrib/httplib/test_httplib.py index 24a5fe3f051..a57aff294a1 100644 --- a/tests/contrib/httplib/test_httplib.py +++ b/tests/contrib/httplib/test_httplib.py @@ -41,7 +41,7 @@ def setUp(self): super(HTTPLibBaseMixin, self).setUp() patch() - Pin.override(httplib, tracer=self.tracer) + Pin._override(httplib, tracer=self.tracer) def tearDown(self): unpatch() @@ -59,12 +59,12 @@ def to_str(self, value): def get_http_connection(self, *args, **kwargs): conn = httplib.HTTPConnection(*args, **kwargs) - Pin.override(conn, tracer=self.tracer) + Pin._override(conn, tracer=self.tracer) return conn def get_https_connection(self, *args, **kwargs): conn = httplib.HTTPSConnection(*args, **kwargs) - Pin.override(conn, tracer=self.tracer) + Pin._override(conn, tracer=self.tracer) return conn def test_patch(self): diff --git a/tests/contrib/httplib/test_httplib_distributed.py b/tests/contrib/httplib/test_httplib_distributed.py index 706921388bc..922f219f5ee 100644 --- a/tests/contrib/httplib/test_httplib_distributed.py +++ b/tests/contrib/httplib/test_httplib_distributed.py @@ -38,7 +38,7 @@ def headers_not_here(self, tracer): def get_http_connection(self, *args, **kwargs): conn = httplib.HTTPConnection(*args, **kwargs) - Pin.override(conn, tracer=self.tracer) + Pin._override(conn, tracer=self.tracer) return conn def request(self, conn=None): diff --git a/tests/contrib/httpx/test_httpx.py b/tests/contrib/httpx/test_httpx.py index 33ecadb825f..457c077f645 100644 --- a/tests/contrib/httpx/test_httpx.py +++ b/tests/contrib/httpx/test_httpx.py @@ -59,7 +59,7 @@ def test_httpx_service_name(tracer, test_spans): We set the span service name as a text type and not binary """ client = httpx.Client() - Pin.override(client, tracer=tracer) + Pin._override(client, tracer=tracer) with override_config("httpx", {"split_by_domain": True}): resp = client.get(get_url("/status/200")) @@ -124,15 +124,15 @@ def assert_spans(test_spans, service): # override the tracer on the default sync client # DEV: `httpx.get` will call `with Client() as client: client.get()` - Pin.override(httpx.Client, tracer=tracer) + Pin._override(httpx.Client, tracer=tracer) # sync client client = httpx.Client() - Pin.override(client, service="sync-client", tracer=tracer) + Pin._override(client, service="sync-client", tracer=tracer) # async client async_client = httpx.AsyncClient() - Pin.override(async_client, service="async-client", tracer=tracer) + Pin._override(async_client, service="async-client", tracer=tracer) resp = httpx.get(url, headers=DEFAULT_HEADERS) assert resp.status_code == 200 diff --git a/tests/contrib/httpx/test_httpx_pre_0_11.py b/tests/contrib/httpx/test_httpx_pre_0_11.py index 315c53cb29c..0f37df47ea3 100644 --- a/tests/contrib/httpx/test_httpx_pre_0_11.py +++ b/tests/contrib/httpx/test_httpx_pre_0_11.py @@ -57,7 +57,7 @@ async def test_httpx_service_name(tracer, test_spans): We set the span service name as a text type and not binary """ client = httpx.Client() - Pin.override(client, tracer=tracer) + Pin._override(client, tracer=tracer) with override_config("httpx", {"split_by_domain": True}): resp = await client.get(get_url("/status/200")) @@ -112,11 +112,11 @@ def assert_spans(test_spans, service): # override the tracer on the default sync client # DEV: `httpx.get` will call `with Client() as client: client.get()` - Pin.override(httpx.Client, tracer=tracer) + Pin._override(httpx.Client, tracer=tracer) # sync client client = httpx.Client() - Pin.override(client, service="sync-client", tracer=tracer) + Pin._override(client, service="sync-client", tracer=tracer) resp = await httpx.get(url, headers=DEFAULT_HEADERS) assert resp.status_code == 200 diff --git a/tests/contrib/jinja2/test_jinja2.py b/tests/contrib/jinja2/test_jinja2.py index ce91c7e5ed0..eac8aeffd85 100644 --- a/tests/contrib/jinja2/test_jinja2.py +++ b/tests/contrib/jinja2/test_jinja2.py @@ -26,7 +26,7 @@ def setUp(self): jinja2.environment._spontaneous_environments.clear() except AttributeError: jinja2.utils.clear_caches() - Pin.override(jinja2.environment.Environment, tracer=self.tracer) + Pin._override(jinja2.environment.Environment, tracer=self.tracer) def tearDown(self): super(Jinja2Test, self).tearDown() diff --git a/tests/contrib/kafka/test_kafka.py b/tests/contrib/kafka/test_kafka.py index c67bdd08b01..f99489595ac 100644 --- a/tests/contrib/kafka/test_kafka.py +++ b/tests/contrib/kafka/test_kafka.py @@ -22,7 +22,7 @@ from ddtrace.internal.utils.retry import fibonacci_backoff_with_jitter from ddtrace.trace import Pin from ddtrace.trace import TraceFilter -from ddtrace.trace import Tracer +from ddtrace.trace import tracer as ddtracer from tests.contrib.config import KAFKA_CONFIG from tests.datastreams.test_public_api import MockedTracer from tests.utils import DummyTracer @@ -106,16 +106,16 @@ def should_filter_empty_polls(): @pytest.fixture def tracer(should_filter_empty_polls): patch() - t = Tracer() if should_filter_empty_polls: - t._configure(trace_processors=[KafkaConsumerPollFilter()]) + ddtracer.configure(trace_processors=[KafkaConsumerPollFilter()]) # disable backoff because it makes these tests less reliable - t._writer._send_payload_with_backoff = t._writer._send_payload + previous_backoff = ddtracer._writer._send_payload_with_backoff + ddtracer._writer._send_payload_with_backoff = ddtracer._writer._send_payload try: - yield t + yield ddtracer finally: - t.flush() - t.shutdown() + ddtracer.flush() + ddtracer._writer._send_payload_with_backoff = previous_backoff unpatch() @@ -124,12 +124,14 @@ def dsm_processor(tracer): processor = tracer.data_streams_processor with mock.patch("ddtrace.internal.datastreams.data_streams_processor", return_value=processor): yield processor + # flush buckets for the next test run + processor.periodic() @pytest.fixture def producer(tracer): _producer = confluent_kafka.Producer({"bootstrap.servers": BOOTSTRAP_SERVERS}) - Pin.override(_producer, tracer=tracer) + Pin._override(_producer, tracer=tracer) return _producer @@ -146,7 +148,7 @@ def consumer(tracer, kafka_topic): tp = TopicPartition(kafka_topic, 0) tp.offset = 0 # we want to read the first message _consumer.commit(offsets=[tp]) - Pin.override(_consumer, tracer=tracer) + Pin._override(_consumer, tracer=tracer) _consumer.subscribe([kafka_topic]) yield _consumer _consumer.close() @@ -165,7 +167,7 @@ def non_auto_commit_consumer(tracer, kafka_topic): tp = TopicPartition(kafka_topic, 0) tp.offset = 0 # we want to read the first message _consumer.commit(offsets=[tp]) - Pin.override(_consumer, tracer=tracer) + Pin._override(_consumer, tracer=tracer) _consumer.subscribe([kafka_topic]) yield _consumer _consumer.close() @@ -176,7 +178,7 @@ def serializing_producer(tracer): _producer = confluent_kafka.SerializingProducer( {"bootstrap.servers": BOOTSTRAP_SERVERS, "value.serializer": lambda x, y: x} ) - Pin.override(_producer, tracer=tracer) + Pin._override(_producer, tracer=tracer) return _producer @@ -190,7 +192,7 @@ def deserializing_consumer(tracer, kafka_topic): "value.deserializer": lambda x, y: x, } ) - Pin.override(_consumer, tracer=tracer) + Pin._override(_consumer, tracer=tracer) _consumer.subscribe([kafka_topic]) yield _consumer _consumer.close() @@ -248,7 +250,7 @@ def test_producer_bootstrap_servers(config, expect_servers, tracer): def test_produce_single_server(dummy_tracer, producer, kafka_topic): - Pin.override(producer, tracer=dummy_tracer) + Pin._override(producer, tracer=dummy_tracer) producer.produce(kafka_topic, PAYLOAD, key=KEY) producer.flush() @@ -259,18 +261,18 @@ def test_produce_single_server(dummy_tracer, producer, kafka_topic): def test_produce_none_key(dummy_tracer, producer, kafka_topic): - Pin.override(producer, tracer=dummy_tracer) + Pin._override(producer, tracer=dummy_tracer) producer.produce(kafka_topic, PAYLOAD, key=None) producer.flush() traces = dummy_tracer.pop_traces() assert 1 == len(traces), "key=None does not cause produce() call to raise an exception" - Pin.override(producer, tracer=None) + Pin._override(producer, tracer=None) def test_produce_multiple_servers(dummy_tracer, kafka_topic): producer = confluent_kafka.Producer({"bootstrap.servers": ",".join([BOOTSTRAP_SERVERS] * 3)}) - Pin.override(producer, tracer=dummy_tracer) + Pin._override(producer, tracer=dummy_tracer) producer.produce(kafka_topic, PAYLOAD, key=KEY) producer.flush() @@ -278,7 +280,7 @@ def test_produce_multiple_servers(dummy_tracer, kafka_topic): assert 1 == len(traces) produce_span = traces[0][0] assert produce_span.get_tag("messaging.kafka.bootstrap.servers") == ",".join([BOOTSTRAP_SERVERS] * 3) - Pin.override(producer, tracer=None) + Pin._override(producer, tracer=None) @pytest.mark.parametrize("tombstone", [False, True]) @@ -325,6 +327,7 @@ def test_commit_with_consume_with_multiple_messages(producer, consumer, kafka_to @pytest.mark.snapshot(ignores=SNAPSHOT_IGNORES) @pytest.mark.parametrize("should_filter_empty_polls", [False]) +@pytest.mark.skip(reason="FIXME: This test requires the initialization of a new tracer. This is not supported") def test_commit_with_consume_with_error(producer, consumer, kafka_topic): producer.produce(kafka_topic, PAYLOAD, key=KEY) producer.flush() @@ -518,8 +521,8 @@ def _generate_in_subprocess(random_topic): "auto.offset.reset": "earliest", } ) - ddtrace.trace.Pin.override(producer, tracer=ddtrace.tracer) - ddtrace.trace.Pin.override(consumer, tracer=ddtrace.tracer) + ddtrace.trace.Pin._override(producer, tracer=ddtrace.tracer) + ddtrace.trace.Pin._override(consumer, tracer=ddtrace.tracer) # We run all of these commands with retry attempts because the kafka-confluent API # sys.exits on connection failures, which causes the test to fail. We want to retry @@ -750,8 +753,8 @@ def test_data_streams_default_context_propagation(consumer, producer, kafka_topi # It is not currently expected for kafka produce and consume spans to connect in a trace def test_tracing_context_is_not_propagated_by_default(dummy_tracer, consumer, producer, kafka_topic): - Pin.override(producer, tracer=dummy_tracer) - Pin.override(consumer, tracer=dummy_tracer) + Pin._override(producer, tracer=dummy_tracer) + Pin._override(consumer, tracer=dummy_tracer) test_string = "context test no propagation" test_key = "context test key no propagation" @@ -788,8 +791,8 @@ def test_tracing_context_is_not_propagated_by_default(dummy_tracer, consumer, pr # None of these spans are part of the same trace assert produce_span.trace_id != consume_span.trace_id - Pin.override(consumer, tracer=None) - Pin.override(producer, tracer=None) + Pin._override(consumer, tracer=None) + Pin._override(producer, tracer=None) # Propagation should work when enabled @@ -813,8 +816,8 @@ def test(consumer, producer, kafka_topic): patch() dummy_tracer = DummyTracer() dummy_tracer.flush() - Pin.override(producer, tracer=dummy_tracer) - Pin.override(consumer, tracer=dummy_tracer) + Pin._override(producer, tracer=dummy_tracer) + Pin._override(consumer, tracer=dummy_tracer) # use a random int in this string to prevent reading a message produced by a previous test run test_string = "context propagation enabled test " + str(random.randint(0, 1000)) @@ -851,8 +854,8 @@ def test(consumer, producer, kafka_topic): # Two of these spans are part of the same trace assert produce_span.trace_id == consume_span.trace_id - Pin.override(consumer, tracer=None) - Pin.override(producer, tracer=None) + Pin._override(consumer, tracer=None) + Pin._override(producer, tracer=None) if __name__ == "__main__": sys.exit(pytest.main(["-x", __file__])) @@ -897,7 +900,7 @@ def test_consumer_uses_active_context_when_no_valid_distributed_context_exists( producer.produce(kafka_topic, PAYLOAD, key=test_key) producer.flush() - Pin.override(consumer, tracer=dummy_tracer) + Pin._override(consumer, tracer=dummy_tracer) with dummy_tracer.trace("kafka consumer parent span") as parent_span: with override_config("kafka", dict(distributed_tracing_enabled=True)): @@ -912,12 +915,12 @@ def test_consumer_uses_active_context_when_no_valid_distributed_context_exists( assert consume_span.name == "kafka.consume" assert consume_span.parent_id == parent_span.span_id - Pin.override(consumer, tracer=None) + Pin._override(consumer, tracer=None) def test_span_has_dsm_payload_hash(dummy_tracer, consumer, producer, kafka_topic): - Pin.override(producer, tracer=dummy_tracer) - Pin.override(consumer, tracer=dummy_tracer) + Pin._override(producer, tracer=dummy_tracer) + Pin._override(consumer, tracer=dummy_tracer) test_string = "payload hash test" PAYLOAD = bytes(test_string, encoding="utf-8") @@ -943,8 +946,8 @@ def test_span_has_dsm_payload_hash(dummy_tracer, consumer, producer, kafka_topic assert consume_span.name == "kafka.consume" assert consume_span.get_tag("pathway.hash") is not None - Pin.override(consumer, tracer=None) - Pin.override(producer, tracer=None) + Pin._override(consumer, tracer=None) + Pin._override(producer, tracer=None) def test_tracing_with_serialization_works(dummy_tracer, kafka_topic): @@ -978,8 +981,8 @@ def json_deserializer(as_bytes, ctx): _consumer.commit(offsets=[tp]) _consumer.subscribe([kafka_topic]) - Pin.override(_producer, tracer=dummy_tracer) - Pin.override(_consumer, tracer=dummy_tracer) + Pin._override(_producer, tracer=dummy_tracer) + Pin._override(_consumer, tracer=dummy_tracer) test_string = "serializing_test" PAYLOAD = {"val": test_string} @@ -1004,12 +1007,12 @@ def json_deserializer(as_bytes, ctx): # a string assert consume_span.get_tag("kafka.message_key") is None - Pin.override(_consumer, tracer=None) - Pin.override(_producer, tracer=None) + Pin._override(_consumer, tracer=None) + Pin._override(_producer, tracer=None) def test_traces_empty_poll_by_default(dummy_tracer, consumer, kafka_topic): - Pin.override(consumer, tracer=dummy_tracer) + Pin._override(consumer, tracer=dummy_tracer) message = "hello" while message is not None: @@ -1029,7 +1032,7 @@ def test_traces_empty_poll_by_default(dummy_tracer, consumer, kafka_topic): assert empty_poll_span_created is True - Pin.override(consumer, tracer=None) + Pin._override(consumer, tracer=None) # Poll should not be traced when disabled @@ -1054,8 +1057,8 @@ def test(consumer, producer, kafka_topic): patch() dummy_tracer = DummyTracer() dummy_tracer.flush() - Pin.override(producer, tracer=dummy_tracer) - Pin.override(consumer, tracer=dummy_tracer) + Pin._override(producer, tracer=dummy_tracer) + Pin._override(consumer, tracer=dummy_tracer) assert config.kafka.trace_empty_poll_enabled is False @@ -1102,8 +1105,8 @@ def test(consumer, producer, kafka_topic): assert non_empty_poll_span_created is True - Pin.override(consumer, tracer=None) - Pin.override(producer, tracer=None) + Pin._override(consumer, tracer=None) + Pin._override(producer, tracer=None) if __name__ == "__main__": sys.exit(pytest.main(["-x", __file__])) diff --git a/tests/contrib/kombu/test.py b/tests/contrib/kombu/test.py index b56ecdf0d0f..949cffd5bd5 100644 --- a/tests/contrib/kombu/test.py +++ b/tests/contrib/kombu/test.py @@ -28,7 +28,7 @@ def setUp(self): conn = kombu.Connection("amqp://guest:guest@127.0.0.1:{p}//".format(p=self.TEST_PORT)) conn.connect() producer = conn.Producer() - Pin.override(producer, service=self.TEST_SERVICE, tracer=self.tracer) + Pin._override(producer, service=self.TEST_SERVICE, tracer=self.tracer) self.conn = conn self.producer = producer @@ -63,7 +63,7 @@ def process_message(body, message): ) with kombu.Consumer(self.conn, [task_queue], accept=["json"], callbacks=[process_message]) as consumer: - Pin.override(consumer, service="kombu-patch", tracer=self.tracer) + Pin._override(consumer, service="kombu-patch", tracer=self.tracer) self.conn.drain_events(timeout=2) self.assertEqual(results[0], to_publish) @@ -130,7 +130,7 @@ def setUp(self): conn = kombu.Connection("amqp://guest:guest@127.0.0.1:{p}//".format(p=RABBITMQ_CONFIG["port"])) conn.connect() producer = conn.Producer() - Pin.override(producer, tracer=self.tracer) + Pin._override(producer, tracer=self.tracer) self.conn = conn self.producer = producer @@ -151,7 +151,7 @@ def setUp(self): conn = kombu.Connection("amqp://guest:guest@127.0.0.1:{p}//".format(p=self.TEST_PORT)) conn.connect() producer = conn.Producer() - Pin.override(producer, tracer=self.tracer) + Pin._override(producer, tracer=self.tracer) self.conn = conn self.producer = producer @@ -180,7 +180,7 @@ def process_message(body, message): ) with kombu.Consumer(self.conn, [task_queue], accept=["json"], callbacks=[process_message]) as consumer: - Pin.override(consumer, tracer=self.tracer) + Pin._override(consumer, tracer=self.tracer) self.conn.drain_events(timeout=2) return self.get_spans() @@ -256,7 +256,7 @@ def process_message(body, message): ) with kombu.Consumer(self.conn, [task_queue], accept=["json"], callbacks=[process_message]) as consumer: - Pin.override(consumer, tracer=self.tracer) + Pin._override(consumer, tracer=self.tracer) self.conn.drain_events(timeout=2) spans = self.get_spans() @@ -275,7 +275,7 @@ def setUp(self): self.conn = kombu.Connection("amqp://guest:guest@127.0.0.1:{p}//".format(p=RABBITMQ_CONFIG["port"])) self.conn.connect() self.producer = self.conn.Producer() - Pin.override(self.producer, tracer=self.tracer) + Pin._override(self.producer, tracer=self.tracer) self.patcher = mock.patch( "ddtrace.internal.datastreams.data_streams_processor", return_value=self.tracer.data_streams_processor @@ -313,7 +313,7 @@ def process_message(body, message): self.producer.publish(to_publish, routing_key=task_queue.routing_key, declare=[task_queue]) with kombu.Consumer(self.conn, [task_queue], accept=["json"], callbacks=[process_message]) as consumer: - Pin.override(consumer, service="kombu-patch", tracer=self.tracer) + Pin._override(consumer, service="kombu-patch", tracer=self.tracer) self.conn.drain_events(timeout=2) queue_name = consumer.channel.queue_declare("tasks", passive=True).queue diff --git a/tests/contrib/langchain/conftest.py b/tests/contrib/langchain/conftest.py index 6c1e5816df5..be76954215c 100644 --- a/tests/contrib/langchain/conftest.py +++ b/tests/contrib/langchain/conftest.py @@ -30,7 +30,7 @@ def snapshot_tracer(langchain, mock_logs, mock_metrics): def mock_tracer(langchain): pin = Pin.get_from(langchain) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) - pin.override(langchain, tracer=mock_tracer) + pin._override(langchain, tracer=mock_tracer) pin.tracer._configure() yield mock_tracer diff --git a/tests/contrib/langgraph/conftest.py b/tests/contrib/langgraph/conftest.py index 13e1a5f9242..7c6671167bb 100644 --- a/tests/contrib/langgraph/conftest.py +++ b/tests/contrib/langgraph/conftest.py @@ -32,7 +32,7 @@ def langgraph(monkeypatch, mock_tracer): import langgraph pin = Pin.get_from(langgraph) - pin.override(langgraph, tracer=mock_tracer) + pin._override(langgraph, tracer=mock_tracer) yield langgraph unpatch() diff --git a/tests/contrib/mako/test_mako.py b/tests/contrib/mako/test_mako.py index 7e690b04a43..7b839177e0e 100644 --- a/tests/contrib/mako/test_mako.py +++ b/tests/contrib/mako/test_mako.py @@ -23,7 +23,7 @@ class MakoTest(TracerTestCase): def setUp(self): super(MakoTest, self).setUp() patch() - Pin.override(Template, tracer=self.tracer) + Pin._override(Template, tracer=self.tracer) def tearDown(self): super(MakoTest, self).tearDown() diff --git a/tests/contrib/mariadb/test_mariadb.py b/tests/contrib/mariadb/test_mariadb.py index 7ea8cd27feb..2f51f2e9b0a 100644 --- a/tests/contrib/mariadb/test_mariadb.py +++ b/tests/contrib/mariadb/test_mariadb.py @@ -39,7 +39,7 @@ def tracer(): def get_connection(tracer): connection = mariadb.connect(**MARIADB_CONFIG) - Pin.override(connection, tracer=tracer) + Pin._override(connection, tracer=tracer) return connection diff --git a/tests/contrib/molten/test_molten.py b/tests/contrib/molten/test_molten.py index cc73ceef861..74d6f1bf628 100644 --- a/tests/contrib/molten/test_molten.py +++ b/tests/contrib/molten/test_molten.py @@ -49,7 +49,7 @@ class TestMolten(TracerTestCase): def setUp(self): super(TestMolten, self).setUp() patch() - Pin.override(molten, tracer=self.tracer) + Pin._override(molten, tracer=self.tracer) self.app = molten_app() self.client = TestClient(self.app) @@ -89,7 +89,7 @@ def test_route_success(self): self.assertEqual(len(spans), 16) # test override of service name - Pin.override(molten, service=self.TEST_SERVICE) + Pin._override(molten, service=self.TEST_SERVICE) response = self.make_request() spans = self.pop_spans() self.assertEqual(spans[0].service, "molten-patch") @@ -273,7 +273,7 @@ def test_unpatch_patch(self): patch() # Need to override Pin here as we do in setUp - Pin.override(molten, tracer=self.tracer) + Pin._override(molten, tracer=self.tracer) self.assertTrue(Pin.get_from(molten) is not None) self.make_request() spans = self.pop_spans() diff --git a/tests/contrib/molten/test_molten_di.py b/tests/contrib/molten/test_molten_di.py index d360698f4cb..848517aca34 100644 --- a/tests/contrib/molten/test_molten_di.py +++ b/tests/contrib/molten/test_molten_di.py @@ -85,7 +85,7 @@ class TestMoltenDI(TracerTestCase): def setUp(self): super(TestMoltenDI, self).setUp() patch() - Pin.override(molten, tracer=self.tracer, service=self.TEST_SERVICE) + Pin._override(molten, tracer=self.tracer, service=self.TEST_SERVICE) def tearDown(self): unpatch() diff --git a/tests/contrib/mongoengine/test.py b/tests/contrib/mongoengine/test.py index b3961e3808c..51b0ff70c47 100644 --- a/tests/contrib/mongoengine/test.py +++ b/tests/contrib/mongoengine/test.py @@ -186,7 +186,7 @@ def tearDown(self): def get_tracer_and_connect(self): tracer = DummyTracer() client = mongoengine.connect(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) return tracer @@ -315,7 +315,9 @@ class TestMongoEnginePatchConnect(TestMongoEnginePatchConnectDefault): def get_tracer_and_connect(self): tracer = TestMongoEnginePatchConnectDefault.get_tracer_and_connect(self) - Pin(service=self.TEST_SERVICE, tracer=tracer).onto(mongoengine.connect) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = tracer + pin.onto(mongoengine.connect) mongoengine.connect(port=MONGO_CONFIG["port"]) return tracer @@ -337,7 +339,7 @@ def tearDown(self): def get_tracer_and_connect(self): tracer = DummyTracer() client = mongoengine.connect(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) return tracer @@ -352,7 +354,9 @@ def get_tracer_and_connect(self): # Set a connect-level service, to check that we properly override it Pin(service="not-%s" % self.TEST_SERVICE).onto(mongoengine.connect) client = mongoengine.connect(port=MONGO_CONFIG["port"]) - Pin(service=self.TEST_SERVICE, tracer=tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = tracer + pin.onto(client) return tracer @@ -364,7 +368,7 @@ def test_patch_unpatch(self): patch() client = mongoengine.connect(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) Artist.drop_collection() spans = tracer.pop() @@ -389,7 +393,7 @@ def test_patch_unpatch(self): # Test patch again patch() client = mongoengine.connect(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) Artist.drop_collection() spans = tracer.pop() diff --git a/tests/contrib/mysql/test_mysql.py b/tests/contrib/mysql/test_mysql.py index 08626890fac..ec0da0aff35 100644 --- a/tests/contrib/mysql/test_mysql.py +++ b/tests/contrib/mysql/test_mysql.py @@ -418,7 +418,7 @@ def _get_conn_tracer(self): # assert pin.service == 'mysql' # Customize the service # we have to apply it on the existing one since new one won't inherit `app` - pin.clone(tracer=self.tracer).onto(self.conn) + pin._clone(tracer=self.tracer).onto(self.conn) return self.conn, self.tracer @@ -434,7 +434,7 @@ def test_patch_unpatch(self): conn = mysql.connector.connect(**MYSQL_CONFIG) pin = Pin.get_from(conn) assert pin - pin.clone(service="pin-svc", tracer=self.tracer).onto(conn) + pin._clone(service="pin-svc", tracer=self.tracer).onto(conn) assert conn.is_connected() cursor = conn.cursor() diff --git a/tests/contrib/mysqldb/test_mysqldb.py b/tests/contrib/mysqldb/test_mysqldb.py index 5d2c98a752c..4117eb69a10 100644 --- a/tests/contrib/mysqldb/test_mysqldb.py +++ b/tests/contrib/mysqldb/test_mysqldb.py @@ -534,7 +534,7 @@ def _add_dummy_tracer_to_pinned(self, obj): assert pin # Customize the service # we have to apply it on the existing one since new one won't inherit `app` - pin.clone(tracer=self.tracer).onto(obj) + pin._clone(tracer=self.tracer).onto(obj) def _get_conn_tracer(self): if not self.conn: @@ -559,7 +559,7 @@ def _get_conn_tracer_with_positional_args(self): assert pin # Customize the service # we have to apply it on the existing one since new one won't inherit `app` - pin.clone(tracer=self.tracer).onto(self.conn) + pin._clone(tracer=self.tracer).onto(self.conn) return self.conn, self.tracer @@ -575,7 +575,7 @@ def test_patch_unpatch(self): conn = self._connect_with_kwargs() pin = Pin.get_from(conn) assert pin - pin.clone(tracer=self.tracer).onto(conn) + pin._clone(tracer=self.tracer).onto(conn) conn.ping() cursor = conn.cursor() @@ -617,7 +617,7 @@ def test_patch_unpatch(self): def test_user_pin_override(self): conn, tracer = self._get_conn_tracer() pin = Pin.get_from(conn) - pin.clone(service="pin-svc", tracer=self.tracer).onto(conn) + pin._clone(service="pin-svc", tracer=self.tracer).onto(conn) cursor = conn.cursor() cursor.execute("SELECT 1") rows = cursor.fetchall() diff --git a/tests/contrib/openai/conftest.py b/tests/contrib/openai/conftest.py index 47f258b3ed0..9cd8c998c79 100644 --- a/tests/contrib/openai/conftest.py +++ b/tests/contrib/openai/conftest.py @@ -146,7 +146,7 @@ def snapshot_tracer(openai, patch_openai): def mock_tracer(ddtrace_global_config, openai, patch_openai): pin = Pin.get_from(openai) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) - pin.override(openai, tracer=mock_tracer) + pin._override(openai, tracer=mock_tracer) pin.tracer._configure(trace_processors=[FilterOrg()]) if ddtrace_global_config.get("_llmobs_enabled", False): diff --git a/tests/contrib/psycopg/test_psycopg.py b/tests/contrib/psycopg/test_psycopg.py index 8e13ecc4128..60f640e65d3 100644 --- a/tests/contrib/psycopg/test_psycopg.py +++ b/tests/contrib/psycopg/test_psycopg.py @@ -42,7 +42,7 @@ def _get_conn(self, service=None): conn = psycopg.connect(**POSTGRES_CONFIG) pin = Pin.get_from(conn) if pin: - pin.clone(service=service, tracer=self.tracer).onto(conn) + pin._clone(service=service, tracer=self.tracer).onto(conn) return conn @@ -140,7 +140,7 @@ def test_psycopg3_connection_with_string(self): configs_arr.append("options='-c statement_timeout=1000 -c lock_timeout=250'") conn = psycopg.connect(" ".join(configs_arr)) - Pin.get_from(conn).clone(service="postgres", tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(service="postgres", tracer=self.tracer).onto(conn) self.assert_conn_is_traced(conn, "postgres") def test_opentracing_propagation(self): @@ -522,7 +522,7 @@ def test_connection_instance_method_patch(self): pin = Pin.get_from(connection) if pin: - pin.clone(service="postgres", tracer=self.tracer).onto(connection) + pin._clone(service="postgres", tracer=self.tracer).onto(connection) query = SQL("""select 'one' as x""") cur = connection.execute(query) diff --git a/tests/contrib/psycopg/test_psycopg_async.py b/tests/contrib/psycopg/test_psycopg_async.py index 7e4fbd59624..30b8ed6c2a2 100644 --- a/tests/contrib/psycopg/test_psycopg_async.py +++ b/tests/contrib/psycopg/test_psycopg_async.py @@ -36,7 +36,7 @@ async def _get_conn(self, service=None): conn = await psycopg.AsyncConnection.connect(**POSTGRES_CONFIG) pin = Pin.get_from(conn) if pin: - pin.clone(service=service, tracer=self.tracer).onto(conn) + pin._clone(service=service, tracer=self.tracer).onto(conn) return conn diff --git a/tests/contrib/psycopg2/test_psycopg.py b/tests/contrib/psycopg2/test_psycopg.py index 902d24d3c0e..fd4d8a02fbe 100644 --- a/tests/contrib/psycopg2/test_psycopg.py +++ b/tests/contrib/psycopg2/test_psycopg.py @@ -49,7 +49,7 @@ def _get_conn(self, service=None): conn = psycopg2.connect(**POSTGRES_CONFIG) pin = Pin.get_from(conn) if pin: - pin.clone(service=service, tracer=self.tracer).onto(conn) + pin._clone(service=service, tracer=self.tracer).onto(conn) return conn @@ -146,7 +146,7 @@ def test_psycopg2_connection_with_string(self): configs_arr.append("options='-c statement_timeout=1000 -c lock_timeout=250'") conn = psycopg2.connect(" ".join(configs_arr)) - Pin.get_from(conn).clone(service="postgres", tracer=self.tracer).onto(conn) + Pin.get_from(conn)._clone(service="postgres", tracer=self.tracer).onto(conn) self.assert_conn_is_traced(conn, "postgres") def test_opentracing_propagation(self): diff --git a/tests/contrib/pylibmc/test.py b/tests/contrib/pylibmc/test.py index 9de012439dc..0dd4e0102bc 100644 --- a/tests/contrib/pylibmc/test.py +++ b/tests/contrib/pylibmc/test.py @@ -316,7 +316,7 @@ def get_client(self): client = pylibmc.Client([url]) client.flush_all() - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) return client, self.tracer @@ -329,7 +329,7 @@ class TestPylibmcPatch(TestPylibmcPatchDefault): def get_client(self): client, tracer = TestPylibmcPatchDefault.get_client(self) - Pin.get_from(client).clone(service=self.TEST_SERVICE).onto(client) + Pin.get_from(client)._clone(service=self.TEST_SERVICE).onto(client) return client, tracer @@ -341,7 +341,7 @@ def test_patch_unpatch(self): patch() client = pylibmc.Client([url]) - Pin.get_from(client).clone(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) client.set("a", 1) @@ -362,7 +362,9 @@ def test_patch_unpatch(self): patch() client = pylibmc.Client([url]) - Pin(service=self.TEST_SERVICE, tracer=self.tracer).onto(client) + pin = Pin(service=self.TEST_SERVICE) + pin._tracer = self.tracer + pin.onto(client) client.set("a", 1) spans = self.pop_spans() diff --git a/tests/contrib/pymemcache/test_client.py b/tests/contrib/pymemcache/test_client.py index 19a7a93d523..09c8d33e007 100644 --- a/tests/contrib/pymemcache/test_client.py +++ b/tests/contrib/pymemcache/test_client.py @@ -263,7 +263,7 @@ def test_stats(self): def test_service_name_override(self): client = self.make_client([b"STORED\r\n", b"VALUE key 0 5\r\nvalue\r\nEND\r\n"]) - Pin.override(client, service="testsvcname") + Pin._override(client, service="testsvcname") client.set(b"key", b"value", noreply=False) result = client.get(b"key") assert _str(result) == "value" @@ -280,7 +280,7 @@ def make_client(self, mock_socket_values, **kwargs): from pymemcache.client.hash import HashClient tracer = DummyTracer() - Pin.override(pymemcache, tracer=tracer) + Pin._override(pymemcache, tracer=tracer) self.client = HashClient([(TEST_HOST, TEST_PORT)], **kwargs) class _MockClient(Client): @@ -320,7 +320,7 @@ def test_service_name_override_hashclient(self): client = self.make_client([b"STORED\r\n", b"VALUE key 0 5\r\nvalue\r\nEND\r\n"]) assert len(client.clients) == 1 for _c in client.clients.values(): - Pin.override(_c, service="testsvcname") + Pin._override(_c, service="testsvcname") client.set(b"key", b"value", noreply=False) result = client.get(b"key") assert _str(result) == "value" @@ -332,7 +332,7 @@ def test_service_name_override_hashclient(self): def test_service_name_override_hashclient_pooling(self): client = self.make_client([b""], use_pooling=True) - Pin.override(client, service="testsvcname") + Pin._override(client, service="testsvcname") client.set(b"key", b"value") assert len(client.clients) == 1 spans = self.get_spans() @@ -351,7 +351,7 @@ def tearDown(self): def make_client(self, mock_socket_values, **kwargs): tracer = DummyTracer() - Pin.override(pymemcache, tracer=tracer) + Pin._override(pymemcache, tracer=tracer) self.client = pymemcache.client.base.Client((TEST_HOST, TEST_PORT), **kwargs) self.client.sock = MockSocket(list(mock_socket_values)) return self.client @@ -365,7 +365,7 @@ def test_same_tracer(self): def test_override_parent_pin(self): """Test that the service set on `pymemcache` is used for Clients.""" - Pin.override(pymemcache, service="mysvc") + Pin._override(pymemcache, service="mysvc") client = self.make_client([b"STORED\r\n", b"VALUE key 0 5\r\nvalue\r\nEND\r\n"]) client.set(b"key", b"value", noreply=False) @@ -378,7 +378,7 @@ def test_override_parent_pin(self): def test_override_client_pin(self): """Test that the service set on `pymemcache` is used for Clients.""" client = self.make_client([b"STORED\r\n", b"VALUE key 0 5\r\nvalue\r\nEND\r\n"]) - Pin.override(client, service="mysvc2") + Pin._override(client, service="mysvc2") client.set(b"key", b"value", noreply=False) diff --git a/tests/contrib/pymemcache/test_client_defaults.py b/tests/contrib/pymemcache/test_client_defaults.py index 0b5e44aa3b0..302be1b0abd 100644 --- a/tests/contrib/pymemcache/test_client_defaults.py +++ b/tests/contrib/pymemcache/test_client_defaults.py @@ -18,7 +18,7 @@ def client(tracer): try: patch() - Pin.override(pymemcache, tracer=tracer) + Pin._override(pymemcache, tracer=tracer) with override_config("pymemcache", dict(command_enabled=False)): client = pymemcache.client.base.Client((TEST_HOST, TEST_PORT)) yield client diff --git a/tests/contrib/pymemcache/test_client_mixin.py b/tests/contrib/pymemcache/test_client_mixin.py index 2d471765e1f..b47c6d8b154 100644 --- a/tests/contrib/pymemcache/test_client_mixin.py +++ b/tests/contrib/pymemcache/test_client_mixin.py @@ -68,7 +68,7 @@ def tearDown(self): def make_client(self, mock_socket_values, **kwargs): tracer = DummyTracer() - Pin.override(pymemcache, tracer=tracer) + Pin._override(pymemcache, tracer=tracer) self.client = pymemcache.client.base.Client((TEST_HOST, TEST_PORT), **kwargs) self.client.sock = MockSocket(list(mock_socket_values)) return self.client diff --git a/tests/contrib/pymongo/test.py b/tests/contrib/pymongo/test.py index b6669d40ac0..31bd45b4674 100644 --- a/tests/contrib/pymongo/test.py +++ b/tests/contrib/pymongo/test.py @@ -420,7 +420,7 @@ def test_patch_pymongo_client_after_import(self): tracer = DummyTracer() client = MongoClient(port=MONGO_CONFIG["port"]) # Ensure the dummy tracer is used to create span in the pymongo integration - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) # Ensure that the client is traced client.server_info() spans = tracer.pop() @@ -440,7 +440,7 @@ def tearDown(self): def get_tracer_and_client(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) return tracer, client def test_host_kwarg(self): @@ -471,7 +471,9 @@ def tearDown(self): def get_tracer_and_client(self): client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin(service="pymongo", tracer=self.tracer).onto(client) + pin = Pin(service="pymongo") + pin._tracer = self.tracer + pin.onto(client) return self.tracer, client def test_patch_unpatch(self): @@ -480,7 +482,7 @@ def test_patch_unpatch(self): patch() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client["testdb"].drop_collection("whatever") spans = self.pop_spans() @@ -500,7 +502,7 @@ def test_patch_unpatch(self): patch() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=self.tracer).onto(client) + Pin.get_from(client)._clone(tracer=self.tracer).onto(client) client["testdb"].drop_collection("whatever") spans = self.pop_spans() @@ -520,7 +522,7 @@ def test_user_specified_service_default(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -539,7 +541,7 @@ def test_user_specified_service_v0(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -559,7 +561,7 @@ def test_user_specified_service_default_override(self): assert cfg.service == "new-mongo", f"service name is {cfg.service}" tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() @@ -579,7 +581,7 @@ def test_user_specified_service_v1(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -593,7 +595,7 @@ def test_unspecified_service_v0(self): """ tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -605,8 +607,10 @@ def test_unspecified_service_v0(self): def test_user_specified_pymongo_service_v0(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin(service="mypymongo", tracer=self.tracer).onto(client) - Pin.get_from(client).clone(tracer=tracer).onto(client) + pin = Pin(service="mypymongo") + pin._tracer = self.tracer + pin.onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -618,8 +622,10 @@ def test_user_specified_pymongo_service_v0(self): def test_user_specified_pymongo_service_v1(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin(service="mypymongo", tracer=self.tracer).onto(client) - Pin.get_from(client).clone(tracer=tracer).onto(client) + pin = Pin(service="mypymongo") + pin._tracer = self.tracer + pin.onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -631,8 +637,10 @@ def test_user_specified_pymongo_service_v1(self): def test_service_precedence_v0(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin(service="mypymongo", tracer=self.tracer).onto(client) - Pin.get_from(client).clone(tracer=tracer).onto(client) + pin = Pin(service="mypymongo") + pin._tracer = self.tracer + pin.onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -644,8 +652,10 @@ def test_service_precedence_v0(self): def test_service_precedence_v1(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin(service="mypymongo", tracer=self.tracer).onto(client) - Pin.get_from(client).clone(tracer=tracer).onto(client) + pin = Pin(service="mypymongo") + pin._tracer = self.tracer + pin.onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -658,7 +668,7 @@ def test_operation_name_v0_schema(self): """ tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -671,7 +681,7 @@ def test_operation_name_v1_schema(self): """ tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) client["testdb"].drop_collection("whatever") spans = tracer.pop() assert len(spans) == 2 @@ -681,7 +691,7 @@ def test_operation_name_v1_schema(self): def test_peer_service_tagging(self): tracer = DummyTracer() client = pymongo.MongoClient(port=MONGO_CONFIG["port"]) - Pin.get_from(client).clone(tracer=tracer).onto(client) + Pin.get_from(client)._clone(tracer=tracer).onto(client) db_name = "testdb" client[db_name].drop_collection("whatever") spans = tracer.pop() @@ -757,13 +767,13 @@ def setUp(self): super(TestPymongoSocketTracing, self).setUp() patch() # Override server pin's tracer with our dummy tracer - Pin.override(Server, tracer=self.tracer) + Pin._override(Server, tracer=self.tracer) # maxPoolSize controls the number of sockets that the client can instantiate # and choose from to perform classic operations. For the sake of our tests, # let's limit this number to 1 self.client = pymongo.MongoClient(port=MONGO_CONFIG["port"], maxPoolSize=1) # Override MongoClient's pin's tracer with our dummy tracer - Pin.override(self.client, tracer=self.tracer, service="testdb") + Pin._override(self.client, tracer=self.tracer, service="testdb") def tearDown(self): unpatch() diff --git a/tests/contrib/pymysql/test_pymysql.py b/tests/contrib/pymysql/test_pymysql.py index e94e03c8395..9638289e6fc 100644 --- a/tests/contrib/pymysql/test_pymysql.py +++ b/tests/contrib/pymysql/test_pymysql.py @@ -347,7 +347,7 @@ def _get_conn_tracer(self): assert pin # Customize the service # we have to apply it on the existing one since new one won't inherit `app` - pin.clone(tracer=self.tracer).onto(self.conn) + pin._clone(tracer=self.tracer).onto(self.conn) return self.conn, self.tracer @@ -363,7 +363,7 @@ def test_patch_unpatch(self): conn = pymysql.connect(**MYSQL_CONFIG) pin = Pin.get_from(conn) assert pin - pin.clone(tracer=self.tracer).onto(conn) + pin._clone(tracer=self.tracer).onto(conn) assert not conn._closed cursor = conn.cursor() @@ -396,7 +396,7 @@ def test_patch_unpatch(self): def test_user_pin_override(self): conn, tracer = self._get_conn_tracer() pin = Pin.get_from(conn) - pin.clone(service="pin-svc", tracer=self.tracer).onto(conn) + pin._clone(service="pin-svc", tracer=self.tracer).onto(conn) cursor = conn.cursor() cursor.execute("SELECT 1") rows = cursor.fetchall() diff --git a/tests/contrib/pynamodb/test_pynamodb.py b/tests/contrib/pynamodb/test_pynamodb.py index 33b4e4c2c14..d0f459011fc 100644 --- a/tests/contrib/pynamodb/test_pynamodb.py +++ b/tests/contrib/pynamodb/test_pynamodb.py @@ -22,7 +22,7 @@ def setUp(self): self.conn.session.set_credentials("aws-access-key", "aws-secret-access-key", "session-token") super(PynamodbTest, self).setUp() - Pin.override(self.conn, tracer=self.tracer) + Pin._override(self.conn, tracer=self.tracer) def tearDown(self): super(PynamodbTest, self).tearDown() @@ -268,7 +268,7 @@ def test_env_user_specified_pynamodb_service(self): # Manual override dynamodb_backend.create_table("Test", hash_key_attr="content", hash_key_type="S") - Pin.override(self.conn, service="mypynamodb", tracer=self.tracer) + Pin._override(self.conn, service="mypynamodb", tracer=self.tracer) list_result = self.conn.list_tables() span = self.get_spans()[0] assert span.service == "mypynamodb", span.service @@ -289,7 +289,7 @@ def test_service_precedence(self): # Manual override dynamodb_backend.create_table("Test", hash_key_attr="content", hash_key_type="S") - Pin.override(self.conn, service="override-pynamodb", tracer=self.tracer) + Pin._override(self.conn, service="override-pynamodb", tracer=self.tracer) list_result = self.conn.list_tables() span = self.get_spans()[0] assert span.service == "override-pynamodb", span.service diff --git a/tests/contrib/pyodbc/test_pyodbc.py b/tests/contrib/pyodbc/test_pyodbc.py index 4c965aede7b..3f78f622ef8 100644 --- a/tests/contrib/pyodbc/test_pyodbc.py +++ b/tests/contrib/pyodbc/test_pyodbc.py @@ -211,7 +211,7 @@ def _get_conn_tracer(self): assert pin # Customize the service # we have to apply it on the existing one since new one won't inherit `app` - pin.clone(tracer=self.tracer).onto(self.conn) + pin._clone(tracer=self.tracer).onto(self.conn) return self.conn, self.tracer @@ -227,7 +227,7 @@ def test_patch_unpatch(self): conn = pyodbc.connect(PYODBC_CONNECT_DSN) pin = Pin.get_from(conn) assert pin - pin.clone(tracer=self.tracer).onto(conn) + pin._clone(tracer=self.tracer).onto(conn) cursor = conn.cursor() cursor.execute("SELECT 1") @@ -256,7 +256,7 @@ def test_patch_unpatch(self): def test_user_pin_override(self): conn, tracer = self._get_conn_tracer() pin = Pin.get_from(conn) - pin.clone(service="pin-svc", tracer=self.tracer).onto(conn) + pin._clone(service="pin-svc", tracer=self.tracer).onto(conn) cursor = conn.cursor() cursor.execute("SELECT 1") rows = cursor.fetchall() diff --git a/tests/contrib/redis/test_redis.py b/tests/contrib/redis/test_redis.py index fb83f6f53fc..7a5ee5d92a0 100644 --- a/tests/contrib/redis/test_redis.py +++ b/tests/contrib/redis/test_redis.py @@ -25,7 +25,7 @@ def setUp(self): patch() r = redis.Redis(port=self.TEST_PORT) r.flushall() - Pin.override(r, tracer=self.tracer) + Pin._override(r, tracer=self.tracer) self.r = r def tearDown(self): @@ -194,7 +194,7 @@ def test_meta_override(self): r = self.r pin = Pin.get_from(r) if pin: - pin.clone(tags={"cheese": "camembert"}).onto(r) + pin._clone(tags={"cheese": "camembert"}).onto(r) r.get("cheese") spans = self.get_spans() @@ -211,7 +211,7 @@ def test_patch_unpatch(self): patch() r = redis.Redis(port=REDIS_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -231,7 +231,7 @@ def test_patch_unpatch(self): patch() r = redis.Redis(port=REDIS_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -429,7 +429,7 @@ def test_env_user_specified_redis_service_v0(self): self.reset() # Manual override - Pin.override(self.r, service="mysvc", tracer=self.tracer) + Pin._override(self.r, service="mysvc", tracer=self.tracer) self.r.get("cheese") span = self.get_spans()[0] assert span.service == "mysvc", span.service @@ -447,7 +447,7 @@ def test_service_precedence_v0(self): self.reset() # Do a manual override - Pin.override(self.r, service="override-redis", tracer=self.tracer) + Pin._override(self.r, service="override-redis", tracer=self.tracer) self.r.get("cheese") span = self.get_spans()[0] assert span.service == "override-redis", span.service @@ -501,7 +501,7 @@ def test_meta_override(self): r = self.r pin = Pin.get_from(r) if pin: - pin.clone(tags={"cheese": "camembert"}).onto(r) + pin._clone(tags={"cheese": "camembert"}).onto(r) r.get("cheese") @@ -513,7 +513,7 @@ def test_patch_unpatch(self): patch() r = redis.Redis(port=REDIS_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -533,7 +533,7 @@ def test_patch_unpatch(self): patch() r = redis.Redis(port=REDIS_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -576,7 +576,7 @@ def test_env_user_specified_redis_service(self): self.reset() # Manual override - Pin.override(self.r, service="mysvc", tracer=self.tracer) + Pin._override(self.r, service="mysvc", tracer=self.tracer) self.r.get("cheese") @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="app-svc", DD_REDIS_SERVICE="env-redis")) @@ -587,7 +587,7 @@ def test_service_precedence(self): self.reset() # Do a manual override - Pin.override(self.r, service="override-redis", tracer=self.tracer) + Pin._override(self.r, service="override-redis", tracer=self.tracer) self.r.get("cheese") @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_REDIS_CMD_MAX_LENGTH="10")) diff --git a/tests/contrib/redis/test_redis_asyncio.py b/tests/contrib/redis/test_redis_asyncio.py index b1bd5858e04..72fc0f47c63 100644 --- a/tests/contrib/redis/test_redis_asyncio.py +++ b/tests/contrib/redis/test_redis_asyncio.py @@ -130,7 +130,7 @@ async def test_override_service_name(redis_client): @pytest.mark.snapshot(wait_for_num_traces=1) async def test_pin(redis_client): - Pin.override(redis_client, service="my-redis") + Pin._override(redis_client, service="my-redis") val = await redis_client.get("cheese") assert val is None diff --git a/tests/contrib/redis/test_redis_cluster.py b/tests/contrib/redis/test_redis_cluster.py index 2731a18fcee..54fb778987a 100644 --- a/tests/contrib/redis/test_redis_cluster.py +++ b/tests/contrib/redis/test_redis_cluster.py @@ -26,7 +26,7 @@ def setUp(self): patch() r = self._get_test_client() r.flushall() - Pin.override(r, tracer=self.tracer) + Pin._override(r, tracer=self.tracer) self.r = r def tearDown(self): @@ -103,7 +103,7 @@ def test_patch_unpatch(self): patch() r = self._get_test_client() - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -123,7 +123,7 @@ def test_patch_unpatch(self): patch() r = self._get_test_client() - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -142,7 +142,7 @@ def test_user_specified_service_v0(self): assert config.service == "mysvc" r = self._get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() @@ -162,7 +162,7 @@ def test_user_specified_service_v1(self): assert config.service == "mysvc" r = self._get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() diff --git a/tests/contrib/redis/test_redis_cluster_asyncio.py b/tests/contrib/redis/test_redis_cluster_asyncio.py index b8624c533aa..65b6a2348d3 100644 --- a/tests/contrib/redis/test_redis_cluster_asyncio.py +++ b/tests/contrib/redis/test_redis_cluster_asyncio.py @@ -28,7 +28,7 @@ async def traced_redis_cluster(tracer, test_spans): startup_nodes = [redis.asyncio.cluster.ClusterNode(TEST_HOST, int(port)) for port in TEST_PORTS.split(",")] redis_cluster = redis.asyncio.cluster.RedisCluster(startup_nodes=startup_nodes) await redis_cluster.flushall() - Pin.override(redis_cluster, tracer=tracer) + Pin._override(redis_cluster, tracer=tracer) try: yield redis_cluster, test_spans finally: @@ -125,7 +125,7 @@ async def test_patch_unpatch(redis_cluster): patch() r = redis_cluster - Pin.override(r, tracer=tracer) + Pin._override(r, tracer=tracer) await r.get("key") spans = tracer.pop() @@ -145,7 +145,7 @@ async def test_patch_unpatch(redis_cluster): patch() r = redis_cluster - Pin.override(r, tracer=tracer) + Pin._override(r, tracer=tracer) await r.get("key") spans = tracer.pop() @@ -182,7 +182,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -231,7 +231,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -280,7 +280,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -321,7 +321,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -362,7 +362,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -411,7 +411,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -456,7 +456,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() diff --git a/tests/contrib/rediscluster/test.py b/tests/contrib/rediscluster/test.py index a2c5ac5c6b2..79b4c806440 100644 --- a/tests/contrib/rediscluster/test.py +++ b/tests/contrib/rediscluster/test.py @@ -43,7 +43,7 @@ def setUp(self): patch() r = _get_test_client() r.flushall() - Pin.override(r, tracer=self.tracer) + Pin._override(r, tracer=self.tracer) self.r = r def tearDown(self): @@ -115,7 +115,7 @@ def test_patch_unpatch(self): patch() r = _get_test_client() - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -135,7 +135,7 @@ def test_patch_unpatch(self): patch() r = _get_test_client() - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -154,7 +154,7 @@ def test_user_specified_service_v0(self): assert config.service == "mysvc" r = _get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() @@ -174,7 +174,7 @@ def test_user_specified_service_v1(self): assert config.service == "mysvc" r = _get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() @@ -189,7 +189,7 @@ def test_unspecified_service_v1(self): the default span service name """ r = _get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() @@ -220,7 +220,7 @@ def test_span_name_v0_schema(self): the default span service name """ r = _get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() @@ -235,7 +235,7 @@ def test_span_name_v1_schema(self): the default span service name """ r = _get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() diff --git a/tests/contrib/rq/test_rq.py b/tests/contrib/rq/test_rq.py index d72871823da..65908ac9717 100644 --- a/tests/contrib/rq/test_rq.py +++ b/tests/contrib/rq/test_rq.py @@ -117,7 +117,7 @@ def test_sync_worker_config_service(queue): @snapshot(ignores=snapshot_ignores) def test_queue_pin_service(queue): - Pin.override(queue, service="my-pin-svc") + Pin._override(queue, service="my-pin-svc") job = queue.enqueue(job_add1, 10) worker = rq.SimpleWorker([queue], connection=queue.connection) worker.work(burst=True) @@ -128,7 +128,7 @@ def test_queue_pin_service(queue): def test_sync_worker_pin_service(queue): job = queue.enqueue(job_add1, 10) worker = rq.SimpleWorker([queue], connection=queue.connection) - Pin.override(worker, service="my-pin-svc") + Pin._override(worker, service="my-pin-svc") worker.work(burst=True) assert job.result == 11 diff --git a/tests/contrib/shared_tests.py b/tests/contrib/shared_tests.py index cf647a15628..dfc3b5e6a0a 100644 --- a/tests/contrib/shared_tests.py +++ b/tests/contrib/shared_tests.py @@ -72,8 +72,8 @@ def _test_dbm_propagation_comment_pin_service_name_override( """tests if dbm comment is set in mysql""" db_name = config["db"] - Pin.override(conn, service="pin-service-name-override", tracer=tracer) - Pin.override(cursor, service="pin-service-name-override", tracer=tracer) + Pin._override(conn, service="pin-service-name-override", tracer=tracer) + Pin._override(cursor, service="pin-service-name-override", tracer=tracer) dbm_comment = ( f"/*dddb='{db_name}',dddbs='pin-service-name-override',dde='staging',ddh='127.0.0.1',ddps='orders-app'," diff --git a/tests/contrib/shared_tests_async.py b/tests/contrib/shared_tests_async.py index 0d49f09d608..f06b6d278f5 100644 --- a/tests/contrib/shared_tests_async.py +++ b/tests/contrib/shared_tests_async.py @@ -72,8 +72,8 @@ async def _test_dbm_propagation_comment_pin_service_name_override( """tests if dbm comment is set in mysql""" db_name = config["db"] - Pin.override(conn, service="pin-service-name-override", tracer=tracer) - Pin.override(cursor, service="pin-service-name-override", tracer=tracer) + Pin._override(conn, service="pin-service-name-override", tracer=tracer) + Pin._override(cursor, service="pin-service-name-override", tracer=tracer) dbm_comment = ( f"/*dddb='{db_name}',dddbs='pin-service-name-override',dde='staging',ddh='127.0.0.1',ddps='orders-app'," diff --git a/tests/contrib/sqlalchemy/test_patch.py b/tests/contrib/sqlalchemy/test_patch.py index a6f08bb5f46..35245d5a906 100644 --- a/tests/contrib/sqlalchemy/test_patch.py +++ b/tests/contrib/sqlalchemy/test_patch.py @@ -25,7 +25,7 @@ def setUp(self): patch() dsn = "postgresql://%(user)s:%(password)s@%(host)s:%(port)s/%(dbname)s" % POSTGRES_CONFIG self.engine = sqlalchemy.create_engine(dsn) - Pin.override(self.engine, tracer=self.tracer) + Pin._override(self.engine, tracer=self.tracer) # prepare a connection self.conn = self.engine.connect() @@ -57,7 +57,7 @@ def test_engine_traced(self): def test_engine_pin_service(self): # ensures that the engine service is updated with the PIN object - Pin.override(self.engine, service="replica-db") + Pin._override(self.engine, service="replica-db") rows = self.conn.execute(text("SELECT 1")).fetchall() assert len(rows) == 1 diff --git a/tests/contrib/sqlite3/test_sqlite3.py b/tests/contrib/sqlite3/test_sqlite3.py index 6101dcfa081..df1bbdbabc5 100644 --- a/tests/contrib/sqlite3/test_sqlite3.py +++ b/tests/contrib/sqlite3/test_sqlite3.py @@ -64,7 +64,7 @@ def test_sqlite(self): db = sqlite3.connect(":memory:") pin = Pin.get_from(db) assert pin - pin.clone(service=service, tracer=self.tracer).onto(db) + pin._clone(service=service, tracer=self.tracer).onto(db) # Ensure we can run a query and it's correctly traced q = "select * from sqlite_master" @@ -216,7 +216,7 @@ def test_sqlite_ot(self): db = sqlite3.connect(":memory:") pin = Pin.get_from(db) assert pin - pin.clone(tracer=self.tracer).onto(db) + pin._clone(tracer=self.tracer).onto(db) cursor = db.execute(q) rows = cursor.fetchall() assert not rows @@ -233,7 +233,7 @@ def test_sqlite_ot(self): db = sqlite3.connect(":memory:") pin = Pin.get_from(db) assert pin - pin.clone(tracer=self.tracer).onto(db) + pin._clone(tracer=self.tracer).onto(db) cursor = db.execute(q) rows = cursor.fetchall() assert not rows @@ -270,7 +270,7 @@ def test_patch_unpatch(self): db = sqlite3.connect(":memory:") pin = Pin.get_from(db) assert pin - pin.clone(tracer=self.tracer).onto(db) + pin._clone(tracer=self.tracer).onto(db) db.cursor().execute("select 'blah'").fetchall() self.assert_structure( @@ -292,7 +292,7 @@ def test_patch_unpatch(self): db = sqlite3.connect(":memory:") pin = Pin.get_from(db) assert pin - pin.clone(tracer=self.tracer).onto(db) + pin._clone(tracer=self.tracer).onto(db) db.cursor().execute("select 'blah'").fetchall() self.assert_structure( @@ -301,7 +301,7 @@ def test_patch_unpatch(self): def _given_a_traced_connection(self, tracer): db = sqlite3.connect(":memory:") - Pin.get_from(db).clone(tracer=tracer).onto(db) + Pin.get_from(db)._clone(tracer=tracer).onto(db) return db @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0")) diff --git a/tests/contrib/starlette/test_starlette.py b/tests/contrib/starlette/test_starlette.py index f290ade8ea7..78b7ac135fe 100644 --- a/tests/contrib/starlette/test_starlette.py +++ b/tests/contrib/starlette/test_starlette.py @@ -38,7 +38,7 @@ def engine(): def tracer(engine): original_tracer = ddtrace.tracer tracer = DummyTracer() - Pin.override(engine, tracer=tracer) + Pin._override(engine, tracer=tracer) ddtrace.tracer = tracer starlette_patch() yield tracer diff --git a/tests/contrib/subprocess/test_subprocess.py b/tests/contrib/subprocess/test_subprocess.py index 40e7ab67431..f9084d23db1 100644 --- a/tests/contrib/subprocess/test_subprocess.py +++ b/tests/contrib/subprocess/test_subprocess.py @@ -194,7 +194,7 @@ def test_truncation(cmdline_obj, expected_str, expected_list, truncated): def test_ossystem(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(os).clone(tracer=tracer).onto(os) + Pin.get_from(os)._clone(tracer=tracer).onto(os) with tracer.trace("ossystem_test"): ret = os.system("dir -l /") assert ret == 0 @@ -215,7 +215,7 @@ def test_ossystem(tracer): def test_fork(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(os).clone(tracer=tracer).onto(os) + Pin.get_from(os)._clone(tracer=tracer).onto(os) with tracer.trace("ossystem_test"): pid = os.fork() if pid == 0: @@ -241,7 +241,7 @@ def test_fork(tracer): def test_unpatch(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(os).clone(tracer=tracer).onto(os) + Pin.get_from(os)._clone(tracer=tracer).onto(os) with tracer.trace("os.system"): ret = os.system("dir -l /") assert ret == 0 @@ -254,7 +254,7 @@ def test_unpatch(tracer): unpatch() with override_global_config(dict(_asm_enabled=True)): - Pin.get_from(os).clone(tracer=tracer).onto(os) + Pin.get_from(os)._clone(tracer=tracer).onto(os) with tracer.trace("os.system_unpatch"): ret = os.system("dir -l /") assert ret == 0 @@ -283,7 +283,7 @@ def test_ossystem_noappsec(tracer): def test_ospopen(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(subprocess).clone(tracer=tracer).onto(subprocess) + Pin.get_from(subprocess)._clone(tracer=tracer).onto(subprocess) with tracer.trace("os.popen"): pipe = os.popen("dir -li /") content = pipe.read() @@ -330,7 +330,7 @@ def test_ospopen(tracer): def test_osspawn_variants(tracer, function, mode, arguments): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(os).clone(tracer=tracer).onto(os) + Pin.get_from(os)._clone(tracer=tracer).onto(os) if "_" in function.__name__: # wrapt changes function names when debugging @@ -369,7 +369,7 @@ def test_osspawn_variants(tracer, function, mode, arguments): def test_subprocess_init_shell_true(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(subprocess).clone(tracer=tracer).onto(subprocess) + Pin.get_from(subprocess)._clone(tracer=tracer).onto(subprocess) with tracer.trace("subprocess.Popen.init", span_type=SpanTypes.SYSTEM): subp = subprocess.Popen(["dir", "-li", "/"], shell=True) subp.wait() @@ -389,7 +389,7 @@ def test_subprocess_init_shell_true(tracer): def test_subprocess_init_shell_false(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(subprocess).clone(tracer=tracer).onto(subprocess) + Pin.get_from(subprocess)._clone(tracer=tracer).onto(subprocess) with tracer.trace("subprocess.Popen.init", span_type=SpanTypes.SYSTEM): subp = subprocess.Popen(["dir", "-li", "/"], shell=False) subp.wait() @@ -406,7 +406,7 @@ def test_subprocess_wait_shell_false(tracer): args = ["dir", "-li", "/"] with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(subprocess).clone(tracer=tracer).onto(subprocess) + Pin.get_from(subprocess)._clone(tracer=tracer).onto(subprocess) with tracer.trace("subprocess.Popen.init", span_type=SpanTypes.SYSTEM): subp = subprocess.Popen(args=args, shell=False) subp.wait() @@ -419,7 +419,7 @@ def test_subprocess_wait_shell_false(tracer): def test_subprocess_wait_shell_true(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(subprocess).clone(tracer=tracer).onto(subprocess) + Pin.get_from(subprocess)._clone(tracer=tracer).onto(subprocess) with tracer.trace("subprocess.Popen.init", span_type=SpanTypes.SYSTEM): subp = subprocess.Popen(args=["dir", "-li", "/"], shell=True) subp.wait() @@ -430,7 +430,7 @@ def test_subprocess_wait_shell_true(tracer): def test_subprocess_run(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(subprocess).clone(tracer=tracer).onto(subprocess) + Pin.get_from(subprocess)._clone(tracer=tracer).onto(subprocess) with tracer.trace("subprocess.Popen.wait"): result = subprocess.run(["dir", "-l", "/"], shell=True) assert result.returncode == 0 @@ -451,7 +451,7 @@ def test_subprocess_run(tracer): def test_subprocess_communicate(tracer): with override_global_config(dict(_asm_enabled=True)): patch() - Pin.get_from(subprocess).clone(tracer=tracer).onto(subprocess) + Pin.get_from(subprocess)._clone(tracer=tracer).onto(subprocess) with tracer.trace("subprocess.Popen.wait"): subp = subprocess.Popen(args=["dir", "-li", "/"], shell=True) subp.communicate() diff --git a/tests/contrib/urllib3/test_urllib3.py b/tests/contrib/urllib3/test_urllib3.py index 24ba7815e56..370c08c7904 100644 --- a/tests/contrib/urllib3/test_urllib3.py +++ b/tests/contrib/urllib3/test_urllib3.py @@ -35,7 +35,7 @@ def setUp(self): patch() self.http = urllib3.PoolManager() - Pin.override(urllib3.connectionpool.HTTPConnectionPool, tracer=self.tracer) + Pin._override(urllib3.connectionpool.HTTPConnectionPool, tracer=self.tracer) def tearDown(self): super(BaseUrllib3TestCase, self).tearDown() diff --git a/tests/contrib/valkey/test_valkey.py b/tests/contrib/valkey/test_valkey.py index d546767c09c..772418dcc16 100644 --- a/tests/contrib/valkey/test_valkey.py +++ b/tests/contrib/valkey/test_valkey.py @@ -25,7 +25,7 @@ def setUp(self): patch() r = valkey.Valkey(port=self.TEST_PORT) r.flushall() - Pin.override(r, tracer=self.tracer) + Pin._override(r, tracer=self.tracer) self.r = r def tearDown(self): @@ -194,7 +194,7 @@ def test_meta_override(self): r = self.r pin = Pin.get_from(r) if pin: - pin.clone(tags={"cheese": "camembert"}).onto(r) + pin._clone(tags={"cheese": "camembert"}).onto(r) r.get("cheese") spans = self.get_spans() @@ -211,7 +211,7 @@ def test_patch_unpatch(self): patch() r = valkey.Valkey(port=VALKEY_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -231,7 +231,7 @@ def test_patch_unpatch(self): patch() r = valkey.Valkey(port=VALKEY_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -429,7 +429,7 @@ def test_env_user_specified_valkey_service_v0(self): self.reset() # Manual override - Pin.override(self.r, service="mysvc", tracer=self.tracer) + Pin._override(self.r, service="mysvc", tracer=self.tracer) self.r.get("cheese") span = self.get_spans()[0] assert span.service == "mysvc", span.service @@ -447,7 +447,7 @@ def test_service_precedence_v0(self): self.reset() # Do a manual override - Pin.override(self.r, service="override-valkey", tracer=self.tracer) + Pin._override(self.r, service="override-valkey", tracer=self.tracer) self.r.get("cheese") span = self.get_spans()[0] assert span.service == "override-valkey", span.service @@ -501,7 +501,7 @@ def test_meta_override(self): r = self.r pin = Pin.get_from(r) if pin: - pin.clone(tags={"cheese": "camembert"}).onto(r) + pin._clone(tags={"cheese": "camembert"}).onto(r) r.get("cheese") @@ -513,7 +513,7 @@ def test_patch_unpatch(self): patch() r = valkey.Valkey(port=VALKEY_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -533,7 +533,7 @@ def test_patch_unpatch(self): patch() r = valkey.Valkey(port=VALKEY_CONFIG["port"]) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -572,7 +572,7 @@ def test_env_user_specified_valkey_service(self): self.reset() # Manual override - Pin.override(self.r, service="mysvc", tracer=self.tracer) + Pin._override(self.r, service="mysvc", tracer=self.tracer) self.r.get("cheese") @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="app-svc", DD_VALKEY_SERVICE="env-valkey")) @@ -583,7 +583,7 @@ def test_service_precedence(self): self.reset() # Do a manual override - Pin.override(self.r, service="override-valkey", tracer=self.tracer) + Pin._override(self.r, service="override-valkey", tracer=self.tracer) self.r.get("cheese") @TracerTestCase.run_in_subprocess(env_overrides=dict(DD_VALKEY_CMD_MAX_LENGTH="10")) diff --git a/tests/contrib/valkey/test_valkey_asyncio.py b/tests/contrib/valkey/test_valkey_asyncio.py index 64743a7770b..cce88912d65 100644 --- a/tests/contrib/valkey/test_valkey_asyncio.py +++ b/tests/contrib/valkey/test_valkey_asyncio.py @@ -130,7 +130,7 @@ async def test_override_service_name(valkey_client): @pytest.mark.snapshot(wait_for_num_traces=1) async def test_pin(valkey_client): - Pin.override(valkey_client, service="my-valkey") + Pin._override(valkey_client, service="my-valkey") val = await valkey_client.get("cheese") assert val is None diff --git a/tests/contrib/valkey/test_valkey_cluster.py b/tests/contrib/valkey/test_valkey_cluster.py index 3876426d25d..bd765dbff96 100644 --- a/tests/contrib/valkey/test_valkey_cluster.py +++ b/tests/contrib/valkey/test_valkey_cluster.py @@ -24,7 +24,7 @@ def setUp(self): patch() r = self._get_test_client() r.flushall() - Pin.override(r, tracer=self.tracer) + Pin._override(r, tracer=self.tracer) self.r = r def tearDown(self): @@ -101,7 +101,7 @@ def test_patch_unpatch(self): patch() r = self._get_test_client() - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -121,7 +121,7 @@ def test_patch_unpatch(self): patch() r = self._get_test_client() - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) r.get("key") spans = tracer.pop() @@ -140,7 +140,7 @@ def test_user_specified_service_v0(self): assert config.service == "mysvc" r = self._get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() @@ -160,7 +160,7 @@ def test_user_specified_service_v1(self): assert config.service == "mysvc" r = self._get_test_client() - Pin.get_from(r).clone(tracer=self.tracer).onto(r) + Pin.get_from(r)._clone(tracer=self.tracer).onto(r) r.get("key") spans = self.get_spans() diff --git a/tests/contrib/valkey/test_valkey_cluster_asyncio.py b/tests/contrib/valkey/test_valkey_cluster_asyncio.py index 8f63aa9d542..a5e4db415b0 100644 --- a/tests/contrib/valkey/test_valkey_cluster_asyncio.py +++ b/tests/contrib/valkey/test_valkey_cluster_asyncio.py @@ -28,7 +28,7 @@ async def traced_valkey_cluster(tracer, test_spans): startup_nodes = [valkey.asyncio.cluster.ClusterNode(TEST_HOST, int(port)) for port in TEST_PORTS.split(",")] valkey_cluster = valkey.asyncio.cluster.ValkeyCluster(startup_nodes=startup_nodes) await valkey_cluster.flushall() - Pin.override(valkey_cluster, tracer=tracer) + Pin._override(valkey_cluster, tracer=tracer) try: yield valkey_cluster, test_spans finally: @@ -119,7 +119,7 @@ async def test_patch_unpatch(valkey_cluster): patch() r = valkey_cluster - Pin.override(r, tracer=tracer) + Pin._override(r, tracer=tracer) await r.get("key") spans = tracer.pop() @@ -139,7 +139,7 @@ async def test_patch_unpatch(valkey_cluster): patch() r = valkey_cluster - Pin.override(r, tracer=tracer) + Pin._override(r, tracer=tracer) await r.get("key") spans = tracer.pop() @@ -175,7 +175,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -223,7 +223,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -271,7 +271,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -311,7 +311,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -351,7 +351,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -399,7 +399,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() @@ -443,7 +443,7 @@ async def test(): tracer = DummyTracer() test_spans = TracerSpanContainer(tracer) - Pin.get_from(r).clone(tracer=tracer).onto(r) + Pin.get_from(r)._clone(tracer=tracer).onto(r) await r.get("key") await r.close() diff --git a/tests/contrib/vertexai/conftest.py b/tests/contrib/vertexai/conftest.py index 0b2b976b610..173551a219a 100644 --- a/tests/contrib/vertexai/conftest.py +++ b/tests/contrib/vertexai/conftest.py @@ -43,7 +43,7 @@ def mock_tracer(ddtrace_global_config, vertexai): try: pin = Pin.get_from(vertexai) mock_tracer = DummyTracer(writer=DummyWriter(trace_flush_enabled=False)) - pin.override(vertexai, tracer=mock_tracer) + pin._override(vertexai, tracer=mock_tracer) pin.tracer._configure() if ddtrace_global_config.get("_llmobs_enabled", False): # Have to disable and re-enable LLMObs to use the mock tracer. diff --git a/tests/contrib/vertica/test_vertica.py b/tests/contrib/vertica/test_vertica.py index d3fb9709bea..2c0d554c01a 100644 --- a/tests/contrib/vertica/test_vertica.py +++ b/tests/contrib/vertica/test_vertica.py @@ -130,7 +130,7 @@ def test_configuration_service_name(self): conn = vertica_python.connect(**VERTICA_CONFIG) cur = conn.cursor() - Pin.override(cur, tracer=test_tracer) + Pin._override(cur, tracer=test_tracer) with conn: cur.execute("DROP TABLE IF EXISTS {}".format(TEST_TABLE)) spans = test_tracer.pop() @@ -163,7 +163,7 @@ def test_configuration_routine(self): test_tracer = DummyTracer() conn = vertica_python.connect(**VERTICA_CONFIG) - Pin.override(conn, service="mycustomservice", tracer=test_tracer) + Pin._override(conn, service="mycustomservice", tracer=test_tracer) conn.cursor() # should be traced now conn.close() spans = test_tracer.pop() @@ -175,7 +175,7 @@ def test_execute_metadata(self): """Metadata related to an `execute` call should be captured.""" conn, cur = self.test_conn - Pin.override(cur, tracer=self.test_tracer) + Pin._override(cur, tracer=self.test_tracer) with conn: cur.execute("INSERT INTO {} (a, b) VALUES (1, 'aa');".format(TEST_TABLE)) @@ -206,7 +206,7 @@ def test_cursor_override(self): """Test overriding the tracer with our own.""" conn, cur = self.test_conn - Pin.override(cur, tracer=self.test_tracer) + Pin._override(cur, tracer=self.test_tracer) with conn: cur.execute("INSERT INTO {} (a, b) VALUES (1, 'aa');".format(TEST_TABLE)) @@ -403,7 +403,7 @@ def test_user_specified_service_default(self): assert config.service == "mysvc" conn, cur = self.test_conn - Pin.override(cur, tracer=self.test_tracer) + Pin._override(cur, tracer=self.test_tracer) with conn: cur.execute("INSERT INTO {} (a, b) VALUES (1, 'aa');".format(TEST_TABLE)) cur.execute("SELECT * FROM {};".format(TEST_TABLE)) @@ -427,7 +427,7 @@ def test_user_specified_service_v0(self): assert config.service == "mysvc" conn, cur = self.test_conn - Pin.override(cur, tracer=self.test_tracer) + Pin._override(cur, tracer=self.test_tracer) with conn: cur.execute("INSERT INTO {} (a, b) VALUES (1, 'aa');".format(TEST_TABLE)) cur.execute("SELECT * FROM {};".format(TEST_TABLE)) @@ -451,7 +451,7 @@ def test_user_specified_service_v1(self): assert config.service == "mysvc" conn, cur = self.test_conn - Pin.override(cur, tracer=self.test_tracer) + Pin._override(cur, tracer=self.test_tracer) with conn: cur.execute("INSERT INTO {} (a, b) VALUES (1, 'aa');".format(TEST_TABLE)) cur.execute("SELECT * FROM {};".format(TEST_TABLE)) @@ -469,7 +469,7 @@ def test_unspecified_service_v0(self): should result in the default DD_SERVICE the span service """ conn, cur = self.test_conn - Pin.override(cur, tracer=self.test_tracer) + Pin._override(cur, tracer=self.test_tracer) with conn: cur.execute("INSERT INTO {} (a, b) VALUES (1, 'aa');".format(TEST_TABLE)) cur.execute("SELECT * FROM {};".format(TEST_TABLE)) @@ -487,7 +487,7 @@ def test_unspecified_service_v1(self): should result in the default DD_SERVICE the span service """ conn, cur = self.test_conn - Pin.override(cur, tracer=self.test_tracer) + Pin._override(cur, tracer=self.test_tracer) with conn: cur.execute("INSERT INTO {} (a, b) VALUES (1, 'aa');".format(TEST_TABLE)) cur.execute("SELECT * FROM {};".format(TEST_TABLE)) diff --git a/tests/contrib/yaaredis/test_yaaredis.py b/tests/contrib/yaaredis/test_yaaredis.py index 350b323de9c..df064817aef 100644 --- a/tests/contrib/yaaredis/test_yaaredis.py +++ b/tests/contrib/yaaredis/test_yaaredis.py @@ -115,7 +115,7 @@ async def test_pipeline_immediate(snapshot_context, traced_yaaredis): async def test_meta_override(tracer, test_spans, traced_yaaredis): pin = Pin.get_from(traced_yaaredis) assert pin is not None - pin.clone(tags={"cheese": "camembert"}, tracer=tracer).onto(traced_yaaredis) + pin._clone(tags={"cheese": "camembert"}, tracer=tracer).onto(traced_yaaredis) await traced_yaaredis.get("cheese") test_spans.assert_trace_count(1) @@ -130,7 +130,7 @@ async def test_meta_override(tracer, test_spans, traced_yaaredis): @pytest.mark.asyncio async def test_service_name(tracer, test_spans, traced_yaaredis): service = str(uuid.uuid4()) - Pin.override(traced_yaaredis, service=service, tracer=tracer) + Pin._override(traced_yaaredis, service=service, tracer=tracer) await traced_yaaredis.set("cheese", "1") test_spans.assert_trace_count(1) @@ -142,7 +142,7 @@ async def test_service_name(tracer, test_spans, traced_yaaredis): async def test_service_name_config(tracer, test_spans, traced_yaaredis): service = str(uuid.uuid4()) with override_config("yaaredis", dict(service=service)): - Pin.override(traced_yaaredis, tracer=tracer) + Pin._override(traced_yaaredis, tracer=tracer) await traced_yaaredis.set("cheese", "1") test_spans.assert_trace_count(1) test_spans.assert_span_count(1) From 9ba79f450c1e54a274a478e7e43087c4e23a4c30 Mon Sep 17 00:00:00 2001 From: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Date: Wed, 5 Feb 2025 21:20:11 -0500 Subject: [PATCH 62/63] chore(langchain): remove openai cost span metric (#12233) This PR removes the `langchain.tokens.total_cost` span metric which estimates the total cost of the llm interaction (and also by extension the wrapped chain span). This was an overly complex implementation that relied on a third party (langchain-community + tiktoken) library which is more-or-less deprecated when we can simply point users to enable LLM Observability to do the cost estimation for OpenAI spans anyway. Note that this shouldn't break anything other than the span metric tag itself, integration metrics are already disabled with 3.0. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- .../contrib/internal/langchain/constants.py | 4 --- ddtrace/contrib/internal/langchain/patch.py | 25 +------------------ ...angchain-openai-cost-042f3a04cda9d23b.yaml | 5 ++++ tests/contrib/langchain/test_langchain.py | 1 - ....test_langchain.test_lcel_chain_batch.json | 2 -- ...langchain.test_lcel_chain_complicated.json | 2 -- ...test_langchain.test_lcel_chain_nested.json | 4 --- ...test_langchain.test_lcel_chain_simple.json | 2 -- ...angchain.test_lcel_chain_simple_async.json | 2 -- ...langchain.test_lcel_with_tools_openai.json | 1 - ...test_openai_chat_model_async_generate.json | 1 - ...chat_model_sync_call_langchain_openai.json | 1 - ....test_openai_chat_model_sync_generate.json | 1 - ...est_openai_chat_model_vision_generate.json | 1 - ....test_langchain.test_openai_llm_async.json | 1 - ...n.test_langchain.test_openai_llm_sync.json | 1 - ...test_openai_llm_sync_multiple_prompts.json | 1 - 17 files changed, 6 insertions(+), 49 deletions(-) create mode 100644 releasenotes/notes/deprecate-langchain-openai-cost-042f3a04cda9d23b.yaml diff --git a/ddtrace/contrib/internal/langchain/constants.py b/ddtrace/contrib/internal/langchain/constants.py index cdc0fc47cc2..40ea9e7a993 100644 --- a/ddtrace/contrib/internal/langchain/constants.py +++ b/ddtrace/contrib/internal/langchain/constants.py @@ -80,7 +80,3 @@ } API_KEY = "langchain.request.api_key" -MODEL = "langchain.request.model" -COMPLETION_TOKENS = "langchain.tokens.completion_tokens" -PROMPT_TOKENS = "langchain.tokens.prompt_tokens" -TOTAL_COST = "langchain.tokens.total_cost" diff --git a/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py index f9681dd1302..58c635dc46f 100644 --- a/ddtrace/contrib/internal/langchain/patch.py +++ b/ddtrace/contrib/internal/langchain/patch.py @@ -41,10 +41,6 @@ from ddtrace import config from ddtrace.contrib.internal.langchain.constants import API_KEY -from ddtrace.contrib.internal.langchain.constants import COMPLETION_TOKENS -from ddtrace.contrib.internal.langchain.constants import MODEL -from ddtrace.contrib.internal.langchain.constants import PROMPT_TOKENS -from ddtrace.contrib.internal.langchain.constants import TOTAL_COST from ddtrace.contrib.internal.langchain.constants import agent_output_parser_classes from ddtrace.contrib.internal.langchain.constants import text_embedding_models from ddtrace.contrib.internal.langchain.constants import vectorstore_classes @@ -114,9 +110,7 @@ def _extract_api_key(instance: Any) -> str: return "" -def _tag_openai_token_usage( - span: Span, llm_output: Dict[str, Any], propagated_cost: int = 0, propagate: bool = False -) -> None: +def _tag_openai_token_usage(span: Span, llm_output: Dict[str, Any]) -> None: """ Extract token usage from llm_output, tag on span. Calculate the total cost for each LLM/chat_model, then propagate those values up the trace so that @@ -126,23 +120,6 @@ def _tag_openai_token_usage( current_metric_value = span.get_metric("langchain.tokens.%s_tokens" % token_type) or 0 metric_value = llm_output["token_usage"].get("%s_tokens" % token_type, 0) span.set_metric("langchain.tokens.%s_tokens" % token_type, current_metric_value + metric_value) - total_cost = span.get_metric(TOTAL_COST) or 0 - if not propagate and get_openai_token_cost_for_model: - try: - completion_cost = get_openai_token_cost_for_model( - span.get_tag(MODEL), - span.get_metric(COMPLETION_TOKENS), - is_completion=True, - ) - prompt_cost = get_openai_token_cost_for_model(span.get_tag(MODEL), span.get_metric(PROMPT_TOKENS)) - total_cost = completion_cost + prompt_cost - except ValueError: - # If not in langchain's openai model catalog, the above helpers will raise a ValueError. - log.debug("Cannot calculate token/cost as the model is not in LangChain's OpenAI model catalog.") - if get_openai_token_cost_for_model: - span.set_metric(TOTAL_COST, propagated_cost + total_cost) - if span._parent is not None: - _tag_openai_token_usage(span._parent, llm_output, propagated_cost=propagated_cost + total_cost, propagate=True) def _is_openai_llm_instance(instance): diff --git a/releasenotes/notes/deprecate-langchain-openai-cost-042f3a04cda9d23b.yaml b/releasenotes/notes/deprecate-langchain-openai-cost-042f3a04cda9d23b.yaml new file mode 100644 index 00000000000..c2c589693ab --- /dev/null +++ b/releasenotes/notes/deprecate-langchain-openai-cost-042f3a04cda9d23b.yaml @@ -0,0 +1,5 @@ +--- +upgrade: + - | + langchain: Removes the `langchain.tokens.total_cost` span metric for OpenAI calls. + For continued cost estimation of OpenAI calls, enable `LLM Observability `_. diff --git a/tests/contrib/langchain/test_langchain.py b/tests/contrib/langchain/test_langchain.py index 86a14f524d9..f26edb2bca7 100644 --- a/tests/contrib/langchain/test_langchain.py +++ b/tests/contrib/langchain/test_langchain.py @@ -23,7 +23,6 @@ "meta.langchain.request.openai.parameters.logprobs", "meta.langchain.request.openai.parameters.seed", # langchain-openai llm call now includes seed as param "meta.langchain.request.openai.parameters.logprobs", # langchain-openai llm call now includes seed as param - "metrics.langchain.tokens.total_cost", # total_cost depends on if tiktoken is installed # these are sometimes named differently "meta.langchain.request.openai.parameters.max_tokens", "meta.langchain.request.openai.parameters.max_completion_tokens", diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json index 4788830f558..1d3c08d174c 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_batch.json @@ -61,7 +61,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 16, "langchain.tokens.prompt_tokens": 14, - "langchain.tokens.total_cost": 5.3e-05, "langchain.tokens.total_tokens": 30 }, "duration": 6742000, @@ -95,7 +94,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 15, "langchain.tokens.prompt_tokens": 14, - "langchain.tokens.total_cost": 5.1000000000000006e-05, "langchain.tokens.total_tokens": 29 }, "duration": 3314000, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json index 92121180dfd..ed0c9e0f55d 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_complicated.json @@ -25,7 +25,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 19, "langchain.tokens.prompt_tokens": 53, - "langchain.tokens.total_cost": 0.0001175, "langchain.tokens.total_tokens": 72, "process_id": 82010 }, @@ -60,7 +59,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 19, "langchain.tokens.prompt_tokens": 53, - "langchain.tokens.total_cost": 0.0001175, "langchain.tokens.total_tokens": 72 }, "duration": 3680000, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json index 3910e614529..f63c58f92e3 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_nested.json @@ -25,7 +25,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 53, "langchain.tokens.prompt_tokens": 50, - "langchain.tokens.total_cost": 0.000181, "langchain.tokens.total_tokens": 103, "process_id": 82010 }, @@ -51,7 +50,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 16, "langchain.tokens.prompt_tokens": 18, - "langchain.tokens.total_cost": 5.9e-05, "langchain.tokens.total_tokens": 34 }, "duration": 63808000, @@ -85,7 +83,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 16, "langchain.tokens.prompt_tokens": 18, - "langchain.tokens.total_cost": 5.9e-05, "langchain.tokens.total_tokens": 34 }, "duration": 61552000, @@ -119,7 +116,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 37, "langchain.tokens.prompt_tokens": 32, - "langchain.tokens.total_cost": 0.000122, "langchain.tokens.total_tokens": 69 }, "duration": 3288000, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json index 9548083a9ee..66254abefd3 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple.json @@ -24,7 +24,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 101, "langchain.tokens.prompt_tokens": 20, - "langchain.tokens.total_cost": 0.000232, "langchain.tokens.total_tokens": 121, "process_id": 82010 }, @@ -61,7 +60,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 101, "langchain.tokens.prompt_tokens": 20, - "langchain.tokens.total_cost": 0.000232, "langchain.tokens.total_tokens": 121 }, "duration": 6142000, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json index a0c1a1e6c53..35d458d43f5 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_chain_simple_async.json @@ -24,7 +24,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 78, "langchain.tokens.prompt_tokens": 20, - "langchain.tokens.total_cost": 0.000186, "langchain.tokens.total_tokens": 98, "process_id": 82010 }, @@ -61,7 +60,6 @@ "_dd.measured": 1, "langchain.tokens.completion_tokens": 78, "langchain.tokens.prompt_tokens": 20, - "langchain.tokens.total_cost": 0.000186, "langchain.tokens.total_tokens": 98 }, "duration": 3399000, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json index 2b865bb7371..99c9f2d5c3e 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_lcel_with_tools_openai.json @@ -37,7 +37,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 32, "langchain.tokens.prompt_tokens": 85, - "langchain.tokens.total_cost": 9.05e-05, "langchain.tokens.total_tokens": 117, "process_id": 82010 }, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json index 57fe006a65a..55b112ca6b6 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_async_generate.json @@ -43,7 +43,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 150, "langchain.tokens.prompt_tokens": 60, - "langchain.tokens.total_cost": 0.00038999999999999994, "langchain.tokens.total_tokens": 210, "process_id": 82010 }, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json index dd9e0c392da..0d4c995aba4 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_call_langchain_openai.json @@ -35,7 +35,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 83, "langchain.tokens.prompt_tokens": 20, - "langchain.tokens.total_cost": 0.00019600000000000002, "langchain.tokens.total_tokens": 103, "process_id": 82010 }, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json index f5de86a6836..6e188b6629c 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json @@ -43,7 +43,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 110, "langchain.tokens.prompt_tokens": 60, - "langchain.tokens.total_cost": 0.00031, "langchain.tokens.total_tokens": 170, "process_id": 82010 }, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json index 38bf8bc9a95..d02c31a219a 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_vision_generate.json @@ -35,7 +35,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 56, "langchain.tokens.prompt_tokens": 1151, - "langchain.tokens.total_cost": 0, "langchain.tokens.total_tokens": 1207, "process_id": 34354 }, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json index f1a7884c2bf..5ef01923f7b 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_async.json @@ -36,7 +36,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 12, "langchain.tokens.prompt_tokens": 10, - "langchain.tokens.total_cost": 3.9e-05, "langchain.tokens.total_tokens": 22, "process_id": 82010 }, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json index a527a18d4a2..6c25e449a96 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync.json @@ -36,7 +36,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 256, "langchain.tokens.prompt_tokens": 17, - "langchain.tokens.total_cost": 0.0005375, "langchain.tokens.total_tokens": 273, "process_id": 82010 }, diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json index fb587526043..9d5f107c31b 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json @@ -40,7 +40,6 @@ "_sampling_priority_v1": 1, "langchain.tokens.completion_tokens": 271, "langchain.tokens.prompt_tokens": 23, - "langchain.tokens.total_cost": 0.0005765000000000001, "langchain.tokens.total_tokens": 294, "process_id": 82010 }, From 1247ac2d50174d7d951f82942e7783b5e03c1ed5 Mon Sep 17 00:00:00 2001 From: erikayasuda <153395705+erikayasuda@users.noreply.github.com> Date: Thu, 6 Feb 2025 13:00:07 -0500 Subject: [PATCH 63/63] chore: update `3.x-staging` with `main` (#12244) This is to ensure no commits on `main` get erased when we force-push `3.x-staging` into `main`. This is to cover the one commit that slipped: https://github.com/DataDog/dd-trace-py/pull/12036 After this is merged, `3.x-staging` should be ready to be merged into `main` safely for dd-trace-py to upgrade to 3.x ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: Yun Kim <35776586+Yun-Kim@users.noreply.github.com> Co-authored-by: Nicole Cybul Co-authored-by: Nick Ripley Co-authored-by: William Conti <58711692+wconti27@users.noreply.github.com> Co-authored-by: Christophe Papazian <114495376+christophe-papazian@users.noreply.github.com> Co-authored-by: Munir Abdinur Co-authored-by: Laplie Anderson Co-authored-by: Brett Langdon --- .gitlab/prepare-oci-package.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitlab/prepare-oci-package.sh b/.gitlab/prepare-oci-package.sh index 5958c31e731..7ee7b7d6e77 100755 --- a/.gitlab/prepare-oci-package.sh +++ b/.gitlab/prepare-oci-package.sh @@ -1,6 +1,11 @@ #!/bin/bash set -eo pipefail +if [ "$OS" != "linux" ]; then + echo "Only linux packages are supported. Exiting" + exit 0 +fi + if [ -n "$CI_COMMIT_TAG" ] && [ -z "$PYTHON_PACKAGE_VERSION" ]; then PYTHON_PACKAGE_VERSION=${CI_COMMIT_TAG##v} fi