Skip to content

Commit 57f0e97

Browse files
authored
fix: Datadog integration not respecting use_custom_source (#6113)
1 parent a307cab commit 57f0e97

File tree

2 files changed

+66
-13
lines changed

2 files changed

+66
-13
lines changed

api/audit/signals.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import Any, Callable, Literal, Protocol, Type
2+
from typing import TYPE_CHECKING, Any, Callable, Literal, Protocol, Type
33

44
from django.conf import settings
55
from django.db.models.signals import post_save
@@ -23,6 +23,10 @@
2323
from webhooks.tasks import call_organisation_webhooks
2424
from webhooks.webhooks import WebhookEventType
2525

26+
if TYPE_CHECKING:
27+
from integrations.datadog.models import DataDogConfiguration
28+
29+
2630
logger = logging.getLogger(__name__)
2731

2832

@@ -129,14 +133,17 @@ def _track_event_async(instance, integration_client): # type: ignore[no-untyped
129133
@receiver(post_save, sender=AuditLog)
130134
@track_only_feature_related_events
131135
def send_audit_log_event_to_datadog(sender, instance, **kwargs): # type: ignore[no-untyped-def]
132-
data_dog_config = _get_integration_config(instance, "data_dog_config")
136+
data_dog_config: "DataDogConfiguration | None" = _get_integration_config(
137+
instance, "data_dog_config"
138+
)
133139

134140
if not data_dog_config:
135141
return
136142

137143
data_dog = DataDogWrapper(
138144
base_url=data_dog_config.base_url, # type: ignore[arg-type]
139145
api_key=data_dog_config.api_key,
146+
use_custom_source=data_dog_config.use_custom_source,
140147
)
141148
_track_event_async(instance, data_dog) # type: ignore[no-untyped-call]
142149

api/tests/unit/audit/test_unit_audit_models.py

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import json
2+
13
import pytest
24
from pytest_mock import MockerFixture
35

@@ -79,37 +81,81 @@ def test_data_dog_track_event_not_called_on_audit_log_saved_when_wrong(mocker, p
7981
datadog_mock.track_event_async.assert_not_called()
8082

8183

82-
def test_data_dog_track_event_called_on_audit_log_saved_when_correct_type( # type: ignore[no-untyped-def]
83-
project, mocker
84-
):
84+
@pytest.mark.parametrize(
85+
"use_custom_source, expected_additional_data",
86+
[(False, {}), (True, {"source_type_name": "flagsmith"})],
87+
)
88+
def test_data_dog_track_event_called_on_audit_log_saved_when_correct_type(
89+
project: Project,
90+
mocker: MockerFixture,
91+
use_custom_source: bool,
92+
expected_additional_data: dict[str, str],
93+
) -> None:
8594
# Given project configured for Datadog integration
86-
datadog_mock = mocker.patch(
87-
"integrations.datadog.datadog.DataDogWrapper.track_event_async"
88-
)
95+
requests_session_mock = mocker.patch(
96+
"integrations.datadog.datadog.requests.Session"
97+
).return_value
8998

9099
DataDogConfiguration.objects.create(
91-
project=project, base_url='http"//test.com', api_key="123key"
100+
project=project,
101+
base_url="http://test.com",
102+
api_key="123key",
103+
use_custom_source=use_custom_source,
92104
)
93105

94106
# When Audit logs created with correct type
95107
AuditLog.objects.create(
96108
project=project,
97-
log="Some audit log",
109+
log="Some audit log for feature",
98110
related_object_type=RelatedObjectType.FEATURE.name,
99111
)
100112
AuditLog.objects.create(
101113
project=project,
102-
log="Some audit log",
114+
log="Some audit log for feature state",
103115
related_object_type=RelatedObjectType.FEATURE_STATE.name,
104116
)
105117
AuditLog.objects.create(
106118
project=project,
107-
log="Some audit log",
119+
log="Some audit log for segment",
108120
related_object_type=RelatedObjectType.SEGMENT.name,
109121
)
110122

111123
# Then datadog track even triggered for each AuditLog
112-
assert 3 == datadog_mock.call_count
124+
assert requests_session_mock.post.call_args_list == [
125+
mocker.call(
126+
"http://test.com/api/v1/events?api_key=123key",
127+
data=json.dumps(
128+
{
129+
"text": "Some audit log for feature by user system",
130+
"title": "Flagsmith Feature Flag Event",
131+
"tags": ["env:unknown"],
132+
**expected_additional_data,
133+
}
134+
),
135+
),
136+
mocker.call(
137+
"http://test.com/api/v1/events?api_key=123key",
138+
data=json.dumps(
139+
{
140+
"text": "Some audit log for feature state by user system",
141+
"title": "Flagsmith Feature Flag Event",
142+
"tags": ["env:unknown"],
143+
**expected_additional_data,
144+
}
145+
),
146+
),
147+
mocker.call(
148+
"http://test.com/api/v1/events?api_key=123key",
149+
data=json.dumps(
150+
{
151+
"text": "Some audit log for segment by user system",
152+
"title": "Flagsmith Feature Flag Event",
153+
"tags": ["env:unknown"],
154+
**expected_additional_data,
155+
}
156+
),
157+
),
158+
]
113159

114160

115161
def test_audit_log_get_history_record_model_class(mocker): # type: ignore[no-untyped-def]

0 commit comments

Comments
 (0)