diff --git a/ddtrace/internal/ci_visibility/_api_client.py b/ddtrace/internal/ci_visibility/_api_client.py index 2c5a9ae7738..ec945658f1a 100644 --- a/ddtrace/internal/ci_visibility/_api_client.py +++ b/ddtrace/internal/ci_visibility/_api_client.py @@ -19,9 +19,6 @@ from ddtrace.internal.ci_visibility._api_responses_cache import _write_to_cache from ddtrace.internal.ci_visibility.constants import AGENTLESS_API_KEY_HEADER_NAME from ddtrace.internal.ci_visibility.constants import AGENTLESS_DEFAULT_SITE -from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_BASE_PATH -from ddtrace.internal.ci_visibility.constants import EVP_SUBDOMAIN_HEADER_API_VALUE -from ddtrace.internal.ci_visibility.constants import EVP_SUBDOMAIN_HEADER_NAME from ddtrace.internal.ci_visibility.constants import KNOWN_TESTS_ENDPOINT from ddtrace.internal.ci_visibility.constants import REQUESTS_MODE from ddtrace.internal.ci_visibility.constants import SETTING_ENDPOINT @@ -47,6 +44,9 @@ from ddtrace.internal.ci_visibility.telemetry.test_management import record_test_management_tests_count from ddtrace.internal.ci_visibility.utils import combine_url_path from ddtrace.internal.ci_visibility.utils import fibonacci_backoff_with_jitter_on_exceptions +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH +from ddtrace.internal.evp_proxy.constants import EVP_SUBDOMAIN_HEADER_API_VALUE +from ddtrace.internal.evp_proxy.constants import EVP_SUBDOMAIN_HEADER_NAME from ddtrace.internal.logger import get_logger from ddtrace.internal.test_visibility.coverage_lines import CoverageLines from ddtrace.internal.utils.formats import asbool diff --git a/ddtrace/internal/ci_visibility/constants.py b/ddtrace/internal/ci_visibility/constants.py index 0134d6c0177..6fea21f32b1 100644 --- a/ddtrace/internal/ci_visibility/constants.py +++ b/ddtrace/internal/ci_visibility/constants.py @@ -2,6 +2,8 @@ from enum import IntEnum import re +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH + SUITE = "suite" TEST = "test" @@ -29,20 +31,11 @@ # Agentless and EVP-specific constants COVERAGE_TAG_NAME = "test.coverage" -EVP_PROXY_AGENT_BASE_PATH = "/evp_proxy/v2" -EVP_PROXY_AGENT_BASE_PATH_V4 = "/evp_proxy/v4" -EVP_PROXY_AGENT_ENDPOINT = "{}/api/v2/citestcycle".format(EVP_PROXY_AGENT_BASE_PATH) AGENTLESS_ENDPOINT = "api/v2/citestcycle" AGENTLESS_COVERAGE_ENDPOINT = "api/v2/citestcov" AGENTLESS_API_KEY_HEADER_NAME = "dd-api-key" AGENTLESS_APP_KEY_HEADER_NAME = "dd-application-key" -EVP_NEEDS_APP_KEY_HEADER_NAME = "X-Datadog-NeedsAppKey" -EVP_NEEDS_APP_KEY_HEADER_VALUE = "true" EVP_PROXY_COVERAGE_ENDPOINT = "{}/{}".format(EVP_PROXY_AGENT_BASE_PATH, AGENTLESS_COVERAGE_ENDPOINT) -EVP_SUBDOMAIN_HEADER_API_VALUE = "api" -EVP_SUBDOMAIN_HEADER_COVERAGE_VALUE = "citestcov-intake" -EVP_SUBDOMAIN_HEADER_EVENT_VALUE = "citestcycle-intake" -EVP_SUBDOMAIN_HEADER_NAME = "X-Datadog-EVP-Subdomain" AGENTLESS_BASE_URL = "https://citestcycle-intake" AGENTLESS_COVERAGE_BASE_URL = "https://citestcov-intake" AGENTLESS_DEFAULT_SITE = "datadoghq.com" diff --git a/ddtrace/internal/ci_visibility/git_client.py b/ddtrace/internal/ci_visibility/git_client.py index 86fb3ae115e..50e36879ba1 100644 --- a/ddtrace/internal/ci_visibility/git_client.py +++ b/ddtrace/internal/ci_visibility/git_client.py @@ -31,15 +31,15 @@ from ddtrace.trace import Tracer # noqa: F401 from .. import telemetry +from ..evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH +from ..evp_proxy.constants import EVP_SUBDOMAIN_HEADER_API_VALUE +from ..evp_proxy.constants import EVP_SUBDOMAIN_HEADER_NAME from ..utils.http import Response from ..utils.http import get_connection from ..utils.http import verify_url from ..utils.time import StopWatch from .constants import AGENTLESS_API_KEY_HEADER_NAME from .constants import AGENTLESS_DEFAULT_SITE -from .constants import EVP_PROXY_AGENT_BASE_PATH -from .constants import EVP_SUBDOMAIN_HEADER_API_VALUE -from .constants import EVP_SUBDOMAIN_HEADER_NAME from .constants import GIT_API_BASE_PATH from .constants import REQUESTS_MODE from .telemetry.constants import ERROR_TYPES diff --git a/ddtrace/internal/ci_visibility/recorder.py b/ddtrace/internal/ci_visibility/recorder.py index a68740fe69a..cfe213adf53 100644 --- a/ddtrace/internal/ci_visibility/recorder.py +++ b/ddtrace/internal/ci_visibility/recorder.py @@ -41,10 +41,6 @@ from ddtrace.internal.ci_visibility.api._test import TestVisibilityTest from ddtrace.internal.ci_visibility.constants import AGENTLESS_DEFAULT_SITE from ddtrace.internal.ci_visibility.constants import CUSTOM_CONFIGURATIONS_PREFIX -from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_BASE_PATH -from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_BASE_PATH_V4 -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.constants import ITR_CORRELATION_ID_TAG_NAME from ddtrace.internal.ci_visibility.constants import REQUESTS_MODE from ddtrace.internal.ci_visibility.constants import SUITE @@ -65,6 +61,10 @@ from ddtrace.internal.ci_visibility.writer import CIVisibilityEventClient from ddtrace.internal.ci_visibility.writer import CIVisibilityWriter from ddtrace.internal.codeowners import Codeowners +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH_V4 +from ddtrace.internal.evp_proxy.constants import EVP_SUBDOMAIN_HEADER_EVENT_VALUE +from ddtrace.internal.evp_proxy.constants import EVP_SUBDOMAIN_HEADER_NAME from ddtrace.internal.logger import get_logger from ddtrace.internal.service import Service from ddtrace.internal.test_visibility._atr_mixins import AutoTestRetriesSettings diff --git a/ddtrace/internal/ci_visibility/writer.py b/ddtrace/internal/ci_visibility/writer.py index 026617c9c04..fded94b47a2 100644 --- a/ddtrace/internal/ci_visibility/writer.py +++ b/ddtrace/internal/ci_visibility/writer.py @@ -17,6 +17,9 @@ from ddtrace.vendor.dogstatsd import DogStatsd # noqa:F401 from .. import service +from ..evp_proxy.constants import EVP_PROXY_AGENT_ENDPOINT +from ..evp_proxy.constants import EVP_SUBDOMAIN_HEADER_COVERAGE_VALUE +from ..evp_proxy.constants import EVP_SUBDOMAIN_HEADER_NAME from ..runtime import get_runtime_id from ..writer import HTTPWriter from ..writer import WriterClientBase @@ -25,10 +28,7 @@ from .constants import AGENTLESS_COVERAGE_ENDPOINT from .constants import AGENTLESS_DEFAULT_SITE from .constants import AGENTLESS_ENDPOINT -from .constants import EVP_PROXY_AGENT_ENDPOINT from .constants import EVP_PROXY_COVERAGE_ENDPOINT -from .constants import EVP_SUBDOMAIN_HEADER_COVERAGE_VALUE -from .constants import EVP_SUBDOMAIN_HEADER_NAME from .encoder import CIVisibilityCoverageEncoderV02 from .encoder import CIVisibilityEncoderV01 from .telemetry.payload import REQUEST_ERROR_TYPE diff --git a/ddtrace/internal/evp_proxy/constants.py b/ddtrace/internal/evp_proxy/constants.py new file mode 100644 index 00000000000..a89320f7eea --- /dev/null +++ b/ddtrace/internal/evp_proxy/constants.py @@ -0,0 +1,11 @@ +EVP_PROXY_AGENT_BASE_PATH = "/evp_proxy/v2" +EVP_PROXY_AGENT_BASE_PATH_V4 = "/evp_proxy/v4" +EVP_PROXY_AGENT_ENDPOINT = "{}/api/v2/citestcycle".format(EVP_PROXY_AGENT_BASE_PATH) +EVP_NEEDS_APP_KEY_HEADER_NAME = "X-Datadog-NeedsAppKey" +EVP_NEEDS_APP_KEY_HEADER_VALUE = "true" +EVP_SUBDOMAIN_HEADER_API_VALUE = "api" +EVP_SUBDOMAIN_HEADER_COVERAGE_VALUE = "citestcov-intake" +EVP_SUBDOMAIN_HEADER_EVENT_VALUE = "citestcycle-intake" +EVP_SUBDOMAIN_HEADER_NAME = "X-Datadog-EVP-Subdomain" +EVP_PAYLOAD_SIZE_LIMIT = 5 << 20 # 5MB (actual limit is 5.1MB) +EVP_EVENT_SIZE_LIMIT = 5_000_000 # 5MB LLM Obs event size limit diff --git a/ddtrace/llmobs/_constants.py b/ddtrace/llmobs/_constants.py index 54ec9b7e263..d7d9998e221 100644 --- a/ddtrace/llmobs/_constants.py +++ b/ddtrace/llmobs/_constants.py @@ -44,10 +44,8 @@ CACHE_READ_INPUT_TOKENS_METRIC_KEY = "cache_read_input_tokens" BILLABLE_CHARACTER_COUNT_METRIC_KEY = "billable_character_count" -EVP_PROXY_AGENT_BASE_PATH = "/evp_proxy/v2" EVAL_ENDPOINT = "/api/intake/llm-obs/v2/eval-metric" SPAN_ENDPOINT = "/api/v2/llmobs" -EVP_SUBDOMAIN_HEADER_NAME = "X-Datadog-EVP-Subdomain" SPAN_SUBDOMAIN_NAME = "llmobs-intake" EVAL_SUBDOMAIN_NAME = "api" EXP_SUBDOMAIN_NAME = "api" @@ -58,9 +56,6 @@ # from https://docs.datadoghq.com/getting_started/site/#access-the-datadog-site DD_SITES_NEEDING_APP_SUBDOMAIN = {"datadoghq.com", "datadoghq.eu", "ddog-gov.com"} -EVP_PAYLOAD_SIZE_LIMIT = 5 << 20 # 5MB (actual limit is 5.1MB) -EVP_EVENT_SIZE_LIMIT = 5_000_000 # 5MB LLM Obs event size limit - EXPERIMENT_CSV_FIELD_MAX_SIZE = 10 * 1024 * 1024 DROPPED_IO_COLLECTION_ERROR = "dropped_io" diff --git a/ddtrace/llmobs/_writer.py b/ddtrace/llmobs/_writer.py index 1f70c0c3bae..58b867d9e7d 100644 --- a/ddtrace/llmobs/_writer.py +++ b/ddtrace/llmobs/_writer.py @@ -19,6 +19,10 @@ from ddtrace import config from ddtrace.internal import agent from ddtrace.internal import forksafe +from ddtrace.internal.evp_proxy.constants import EVP_EVENT_SIZE_LIMIT +from ddtrace.internal.evp_proxy.constants import EVP_PAYLOAD_SIZE_LIMIT +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH +from ddtrace.internal.evp_proxy.constants import EVP_SUBDOMAIN_HEADER_NAME from ddtrace.internal.logger import get_logger from ddtrace.internal.periodic import PeriodicService from ddtrace.internal.utils.http import Response @@ -32,10 +36,6 @@ from ddtrace.llmobs._constants import DROPPED_VALUE_TEXT from ddtrace.llmobs._constants import EVAL_ENDPOINT from ddtrace.llmobs._constants import EVAL_SUBDOMAIN_NAME -from ddtrace.llmobs._constants import EVP_EVENT_SIZE_LIMIT -from ddtrace.llmobs._constants import EVP_PAYLOAD_SIZE_LIMIT -from ddtrace.llmobs._constants import EVP_PROXY_AGENT_BASE_PATH -from ddtrace.llmobs._constants import EVP_SUBDOMAIN_HEADER_NAME from ddtrace.llmobs._constants import EXP_SUBDOMAIN_NAME from ddtrace.llmobs._constants import SPAN_ENDPOINT from ddtrace.llmobs._constants import SPAN_SUBDOMAIN_NAME diff --git a/tests/ci_visibility/api_client/_util.py b/tests/ci_visibility/api_client/_util.py index f9277931811..a7e6d193921 100644 --- a/tests/ci_visibility/api_client/_util.py +++ b/tests/ci_visibility/api_client/_util.py @@ -13,10 +13,10 @@ from ddtrace.internal.ci_visibility import CIVisibility from ddtrace.internal.ci_visibility._api_client import AgentlessTestVisibilityAPIClient from ddtrace.internal.ci_visibility._api_client import EVPProxyTestVisibilityAPIClient -from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_BASE_PATH_V4 from ddtrace.internal.ci_visibility.constants import REQUESTS_MODE from ddtrace.internal.ci_visibility.git_client import CIVisibilityGitClient from ddtrace.internal.ci_visibility.git_data import GitData +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH_V4 from ddtrace.internal.utils.http import Response diff --git a/tests/ci_visibility/api_client/test_ci_visibility_api_client.py b/tests/ci_visibility/api_client/test_ci_visibility_api_client.py index bfb9bbb6782..0188848c20d 100644 --- a/tests/ci_visibility/api_client/test_ci_visibility_api_client.py +++ b/tests/ci_visibility/api_client/test_ci_visibility_api_client.py @@ -13,10 +13,10 @@ from ddtrace.internal.ci_visibility._api_client import EVPProxyTestVisibilityAPIClient 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 EVP_PROXY_AGENT_BASE_PATH -from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_BASE_PATH_V4 from ddtrace.internal.ci_visibility.constants import REQUESTS_MODE from ddtrace.internal.ci_visibility.git_data import GitData +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH_V4 from ddtrace.settings._config import Config from tests.ci_visibility.api_client._util import _AGENTLESS from tests.ci_visibility.api_client._util import _EVP_PROXY diff --git a/tests/ci_visibility/test_ci_visibility.py b/tests/ci_visibility/test_ci_visibility.py index fca13919b82..1b4c26b2943 100644 --- a/tests/ci_visibility/test_ci_visibility.py +++ b/tests/ci_visibility/test_ci_visibility.py @@ -21,8 +21,6 @@ from ddtrace.internal.ci_visibility import CIVisibility 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 EVP_PROXY_AGENT_BASE_PATH -from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_BASE_PATH_V4 from ddtrace.internal.ci_visibility.constants import REQUESTS_MODE from ddtrace.internal.ci_visibility.encoder import CIVisibilityEncoderV01 from ddtrace.internal.ci_visibility.filters import TraceCiVisibilityFilter @@ -32,6 +30,8 @@ from ddtrace.internal.ci_visibility.recorder import CIVisibilityTracer from ddtrace.internal.ci_visibility.recorder import _extract_repository_name_from_url from ddtrace.internal.ci_visibility.recorder import _is_item_itr_skippable +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH_V4 from ddtrace.internal.test_visibility._library_capabilities import LibraryCapabilities from ddtrace.internal.utils.http import Response from ddtrace.settings._config import Config diff --git a/tests/integration/test_integration_civisibility.py b/tests/integration/test_integration_civisibility.py index 89dedada3ed..db44d67e536 100644 --- a/tests/integration/test_integration_civisibility.py +++ b/tests/integration/test_integration_civisibility.py @@ -6,10 +6,10 @@ from ddtrace.internal.ci_visibility import CIVisibility from ddtrace.internal.ci_visibility._api_client import TestVisibilityAPISettings from ddtrace.internal.ci_visibility.constants import AGENTLESS_ENDPOINT -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 +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_ENDPOINT +from ddtrace.internal.evp_proxy.constants import EVP_SUBDOMAIN_HEADER_EVENT_VALUE +from ddtrace.internal.evp_proxy.constants import EVP_SUBDOMAIN_HEADER_NAME from ddtrace.settings._agent import config as agent_config from tests.ci_visibility.util import _get_default_civisibility_ddconfig from tests.utils import override_env diff --git a/tests/llmobs/test_llmobs_eval_metric_agent_writer.py b/tests/llmobs/test_llmobs_eval_metric_agent_writer.py index 7a80bda0cf0..fd05ec64c6f 100644 --- a/tests/llmobs/test_llmobs_eval_metric_agent_writer.py +++ b/tests/llmobs/test_llmobs_eval_metric_agent_writer.py @@ -2,8 +2,8 @@ import mock +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH from ddtrace.llmobs._constants import EVAL_ENDPOINT -from ddtrace.llmobs._constants import EVP_PROXY_AGENT_BASE_PATH from ddtrace.llmobs._writer import LLMObsEvalMetricWriter from ddtrace.settings._agent import config as agent_config from tests.llmobs.test_llmobs_eval_metric_agentless_writer import _categorical_metric_event diff --git a/tests/llmobs/test_llmobs_span_agent_writer.py b/tests/llmobs/test_llmobs_span_agent_writer.py index 564db83e0b3..ea8597e3db8 100644 --- a/tests/llmobs/test_llmobs_span_agent_writer.py +++ b/tests/llmobs/test_llmobs_span_agent_writer.py @@ -2,7 +2,7 @@ import mock -from ddtrace.internal.ci_visibility.constants import EVP_PROXY_AGENT_BASE_PATH +from ddtrace.internal.evp_proxy.constants import EVP_PROXY_AGENT_BASE_PATH from ddtrace.llmobs._constants import SPAN_ENDPOINT from ddtrace.llmobs._writer import LLMObsSpanWriter from ddtrace.settings._agent import config as agent_config diff --git a/tests/llmobs/test_llmobs_span_truncation.py b/tests/llmobs/test_llmobs_span_truncation.py index 1aac1cdf485..8a59cefb66f 100644 --- a/tests/llmobs/test_llmobs_span_truncation.py +++ b/tests/llmobs/test_llmobs_span_truncation.py @@ -1,7 +1,7 @@ import json +from ddtrace.internal.evp_proxy.constants import EVP_EVENT_SIZE_LIMIT from ddtrace.llmobs._constants import DROPPED_IO_COLLECTION_ERROR -from ddtrace.llmobs._constants import EVP_EVENT_SIZE_LIMIT from ddtrace.llmobs._writer import _truncate_span_event from tests.llmobs._utils import _oversized_llm_event from tests.llmobs._utils import _oversized_retrieval_event