Skip to content

Commit 8501ee0

Browse files
fix(ci-visibility): do not enable CIVisibility service in agentless m… (#6647)
…ode if DD_API_KEY is not set (#6583) Fixes the behavior of the CIVisibility service to simply not enable (instead of raising an exception) if the `DD_API_KEY` environment variable is not set when the `DD_CIVISIBILITY_AGENTLESS_ENABLE` one is set and truthy. - [x] Change(s) are motivated and described in the PR description. - [x] Testing strategy is described if automated tests are not included in the PR. - [x] Risk is outlined (performance impact, potential for breakage, maintainability, etc). - [x] Change is maintainable (easy to change, telemetry, documentation). - [x] [Library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) are followed. If no release note is required, add label `changelog/no-changelog`. - [x] Documentation is included (in-code, generated user docs, [public corp docs](https://github.com/DataDog/documentation/)). - [x] Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) - [x] Title is accurate. - [x] No unnecessary changes are introduced. - [x] Description motivates each change. - [x] Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes unless absolutely necessary. - [x] Testing strategy adequately addresses listed risk(s). - [x] Change is maintainable (easy to change, telemetry, documentation). - [x] Release note makes sense to a user of the library. - [x] Reviewer has explicitly acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment. - [x] 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 2067422) Co-authored-by: Romain Komorn <[email protected]>
1 parent cb6da60 commit 8501ee0

File tree

3 files changed

+41
-22
lines changed

3 files changed

+41
-22
lines changed

ddtrace/internal/ci_visibility/recorder.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,21 @@ def _should_skip_path(self, path, name):
338338
@classmethod
339339
def enable(cls, tracer=None, config=None, service=None):
340340
# type: (Optional[Tracer], Optional[Any], Optional[str]) -> None
341+
log.debug("Enabling %s", cls.__name__)
342+
343+
if ddconfig._ci_visibility_agentless_enabled:
344+
if not os.getenv("_CI_DD_API_KEY", os.getenv("DD_API_KEY")):
345+
log.critical(
346+
"%s disabled: environment variable DD_CIVISIBILITY_AGENTLESS_ENABLED is true but"
347+
" DD_API_KEY is not set",
348+
cls.__name__,
349+
)
350+
cls.enabled = False
351+
return
341352

342353
if cls._instance is not None:
343354
log.debug("%s already enabled", cls.__name__)
344355
return
345-
log.debug("Enabling %s", cls.__name__)
346356

347357
cls._instance = cls(tracer=tracer, config=config, service=service)
348358
cls.enabled = True
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
fixes:
3+
- |
4+
CI Visibility: fixes an issue where the CIVisibility client would raise an exception if it was started in agentless mode without the DD_API_KEY set

tests/integration/test_integration.py

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -535,34 +535,39 @@ def test_priority_sampling_rate_honored(encoding, monkeypatch):
535535

536536
@pytest.mark.skipif(AGENT_VERSION == "testagent", reason="Test agent doesn't support evp proxy.")
537537
def test_civisibility_intake_with_evp_available():
538-
with override_env(dict(DD_API_KEY="foobar.baz", DD_SITE="foo.bar")):
539-
with override_global_config({"_ci_visibility_agentless_enabled": False}):
540-
t = Tracer()
541-
CIVisibility.enable(tracer=t)
542-
assert CIVisibility._instance.tracer._writer._endpoint == EVP_PROXY_AGENT_ENDPOINT
543-
assert CIVisibility._instance.tracer._writer.intake_url == agent.get_trace_url()
544-
assert (
545-
CIVisibility._instance.tracer._writer._headers[EVP_SUBDOMAIN_HEADER_NAME]
546-
== EVP_SUBDOMAIN_HEADER_EVENT_VALUE
547-
)
548-
CIVisibility.disable()
538+
with override_env(dict(DD_API_KEY="foobar.baz", DD_SITE="foo.bar", DD_CIVISIBILITY_AGENTLESS_ENABLED="0")):
539+
ddtrace.internal.ci_visibility.recorder.ddconfig = ddtrace.settings.Config()
540+
t = Tracer()
541+
CIVisibility.enable(tracer=t)
542+
assert CIVisibility._instance.tracer._writer._endpoint == EVP_PROXY_AGENT_ENDPOINT
543+
assert CIVisibility._instance.tracer._writer.intake_url == agent.get_trace_url()
544+
assert (
545+
CIVisibility._instance.tracer._writer._headers[EVP_SUBDOMAIN_HEADER_NAME]
546+
== EVP_SUBDOMAIN_HEADER_EVENT_VALUE
547+
)
548+
CIVisibility.disable()
549549

550550

551551
def test_civisibility_intake_with_missing_apikey():
552-
with override_env(dict(DD_SITE="foobar.baz")):
553-
with override_global_config({"_ci_visibility_agentless_enabled": True}):
554-
with pytest.raises(EnvironmentError):
552+
with override_env(dict(DD_SITE="foobar.baz", DD_CIVISIBILITY_AGENTLESS_ENABLED="1")):
553+
with mock.patch.object(CIVisibility, "__init__", return_value=None) as mock_CIVisibility_init:
554+
with mock.patch.object(CIVisibility, "start") as mock_CIVisibility_start:
555+
ddtrace.internal.ci_visibility.recorder.ddconfig = ddtrace.settings.Config()
555556
CIVisibility.enable()
557+
assert CIVisibility.enabled is False
558+
assert CIVisibility._instance is None
559+
mock_CIVisibility_init.assert_not_called()
560+
mock_CIVisibility_start.assert_not_called()
556561

557562

558563
def test_civisibility_intake_with_apikey():
559-
with override_env(dict(DD_API_KEY="foobar.baz", DD_SITE="foo.bar")):
560-
with override_global_config({"_ci_visibility_agentless_enabled": True}):
561-
t = Tracer()
562-
CIVisibility.enable(tracer=t)
563-
assert CIVisibility._instance.tracer._writer._endpoint == AGENTLESS_ENDPOINT
564-
assert CIVisibility._instance.tracer._writer.intake_url == "https://citestcycle-intake.foo.bar"
565-
CIVisibility.disable()
564+
with override_env(dict(DD_API_KEY="foobar.baz", DD_SITE="foo.bar", DD_CIVISIBILITY_AGENTLESS_ENABLED="1")):
565+
ddtrace.internal.ci_visibility.recorder.ddconfig = ddtrace.settings.Config()
566+
t = Tracer()
567+
CIVisibility.enable(tracer=t)
568+
assert CIVisibility._instance.tracer._writer._endpoint == AGENTLESS_ENDPOINT
569+
assert CIVisibility._instance.tracer._writer.intake_url == "https://citestcycle-intake.foo.bar"
570+
CIVisibility.disable()
566571

567572

568573
def test_bad_endpoint():

0 commit comments

Comments
 (0)