Skip to content

Commit eeeca83

Browse files
committed
Increase sampling code coverage
1 parent 41dd4f0 commit eeeca83

3 files changed

Lines changed: 154 additions & 9 deletions

File tree

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/sampler/test_rule_cache.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from amazon.opentelemetry.distro.sampler._sampling_target import _SamplingTargetResponse
2424
from opentelemetry.sdk.resources import Resource
2525
from opentelemetry.sdk.trace import ReadableSpan
26+
from opentelemetry.sdk.trace.sampling import ALWAYS_ON
2627
from opentelemetry.semconv._incubating.attributes.http_attributes import HTTP_STATUS_CODE
2728
from opentelemetry.trace import TraceState
2829

@@ -209,6 +210,13 @@ def test_update_sampling_targets(self):
209210
refresh_rules, _ = rule_cache.update_sampling_targets(target_response)
210211
self.assertTrue(refresh_rules)
211212

213+
def test_should_sample_without_rules(self):
214+
rule_cache = _RuleCache(Resource.get_empty(), ALWAYS_ON, "", _Clock(), Lock())
215+
216+
with patch("amazon.opentelemetry.distro.sampler._rule_cache._logger") as mock_logger:
217+
self.assertTrue(rule_cache.should_sample(None, 0, "name").decision.is_sampled())
218+
mock_logger.debug.assert_called_once_with("No sampling rules were matched")
219+
212220
def test_should_sample_with_adaptive_sampling_config(self):
213221
sampling_rule_1 = _SamplingRule(
214222
Attributes={},

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/sampler/test_sampling_rule.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,38 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
33
from unittest import TestCase
4+
from unittest.mock import patch
45

56
from amazon.opentelemetry.distro.sampler._sampling_rule import _SamplingRateBoost, _SamplingRule
67

78

9+
class TestSamplingRateBoost(TestCase):
10+
def test_sampling_rate_boost_with_extra_fields(self):
11+
input = {
12+
"MaxRate": 0.5,
13+
"CooldownWindowMinutes": 2,
14+
"ExtraField1": "cat",
15+
"ExtraField2": 123,
16+
}
17+
with patch("amazon.opentelemetry.distro.sampler._sampling_rule._logger") as mock_logger:
18+
_SamplingRateBoost(**input)
19+
mock_logger.debug.assert_called_once_with(
20+
"Ignoring unknown fields in _SamplingRateBoost: %s", ["ExtraField1", "ExtraField2"]
21+
)
22+
23+
def test_sampling_rate_boost_equality(self):
24+
boost1 = _SamplingRateBoost(MaxRate=0.5, CooldownWindowMinutes=2)
25+
boost2 = _SamplingRateBoost(MaxRate=0.5, CooldownWindowMinutes=2)
26+
self.assertEqual(boost1, boost2)
27+
28+
boost1 = _SamplingRateBoost(MaxRate=0.5, CooldownWindowMinutes=2)
29+
boost2 = _SamplingRateBoost(MaxRate=0.5, CooldownWindowMinutes=3)
30+
self.assertNotEqual(boost1, boost2)
31+
32+
boost2 = {"other": "object"}
33+
self.assertNotEqual(boost1, boost2)
34+
35+
836
class TestSamplingRule(TestCase):
937
def test_sampling_rule_ordering(self):
1038
rule1 = _SamplingRule(Priority=1, RuleName="abcdef", Version=1)
@@ -16,6 +44,33 @@ def test_sampling_rule_ordering(self):
1644

1745
self.assertTrue(rule1 < rule2 < rule3 < rule4 < rule5 < rule6)
1846

47+
def test_sampling_rule_with_extra_fields(self):
48+
inputs = {
49+
"Attributes": {},
50+
"FixedRate": 0.1,
51+
"HTTPMethod": "GET",
52+
"Host": "localhost",
53+
"Priority": 20,
54+
"ReservoirSize": 1,
55+
"ResourceARN": "*",
56+
"RuleARN": "arn:aws:xray:us-east-1:999999999999:sampling-rule/test",
57+
"RuleName": "test",
58+
"ServiceName": "myServiceName",
59+
"ServiceType": "AWS::EKS::Container",
60+
"URLPath": "/helloworld",
61+
"Version": 1,
62+
"SamplingRateBoost": {"MaxRate": 0.5, "CooldownWindowMinutes": 2},
63+
"ExtraField1": "cat",
64+
"ExtraField2": 123,
65+
}
66+
67+
# Does not throw an error and logs debug message about unknown fields
68+
with patch("amazon.opentelemetry.distro.sampler._sampling_rule._logger") as mock_logger:
69+
_SamplingRule(**inputs)
70+
mock_logger.debug.assert_called_once_with(
71+
"Ignoring unknown fields in _SamplingRule: %s", ["ExtraField1", "ExtraField2"]
72+
)
73+
1974
def test_sampling_rule_equality(self):
2075
sampling_rule = _SamplingRule(
2176
Attributes={"abc": "123", "def": "4?6", "ghi": "*89"},
@@ -127,3 +182,6 @@ def test_sampling_rule_equality(self):
127182
)
128183

129184
self.assertFalse(sampling_rule_with_boost_1 == sampling_rule_with_boost_2)
185+
186+
# Simple inequality check between sampling rule and object of another type
187+
self.assertNotEqual(sampling_rule, {"other": "object"})

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/sampler/test_sampling_target.py

Lines changed: 88 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,75 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
33
from unittest import TestCase
4+
from unittest.mock import patch
45

5-
from amazon.opentelemetry.distro.sampler._sampling_target import _SamplingTargetResponse
6+
from amazon.opentelemetry.distro.sampler._sampling_target import (
7+
_SamplingBoost,
8+
_SamplingTarget,
9+
_SamplingTargetResponse,
10+
)
11+
12+
13+
class TestSamplingBoost(TestCase):
14+
def test_sampling_boost_with_none_inputs(self):
15+
boost = _SamplingBoost(None, None)
16+
self.assertEqual(boost.BoostRate, 0)
17+
self.assertIsNone(boost.BoostRateTTL)
18+
19+
def test_sampling_boost_with_extra_inputs(self):
20+
inputs = {
21+
"BoostRate": [{}],
22+
"BoostRateTTL": [{}],
23+
"ExtraField1": "cat",
24+
"ExtraField2": 123,
25+
}
26+
27+
with patch("amazon.opentelemetry.distro.sampler._sampling_target._logger") as mock_logger:
28+
boost = _SamplingBoost(**inputs)
29+
mock_logger.debug.assert_called_once_with(
30+
"Ignoring unknown fields in _SamplingBoost: %s", ["ExtraField1", "ExtraField2"]
31+
)
32+
33+
self.assertEqual(len(boost.BoostRate), 1)
34+
self.assertEqual(len(boost.BoostRateTTL), 1)
35+
self.assertFalse(hasattr(boost.BoostRate[0], "ExtraField1"))
36+
self.assertFalse(hasattr(boost.BoostRateTTL[0], "ExtraField2"))
637

738

839
class TestSamplingTarget(TestCase):
40+
def test_sampling_target_with_none_inputs(self):
41+
target = _SamplingTarget()
42+
self.assertEqual(target.FixedRate, 0.0)
43+
self.assertEqual(target.RuleName, "")
44+
self.assertIsNone(target.Interval)
45+
self.assertIsNone(target.ReservoirQuota)
46+
self.assertIsNone(target.ReservoirQuotaTTL)
47+
self.assertIsNone(target.SamplingBoost)
48+
49+
def test_sampling_target_with_extra_inputs(self):
50+
inputs = {
51+
"FixedRate": 1.0,
52+
"RuleName": "cat",
53+
"Interval": 123,
54+
"ReservoirQuota": 456,
55+
"ReservoirQuotaTTL": 789,
56+
"ExtraField1": "cat",
57+
"ExtraField2": 123,
58+
}
59+
60+
with patch("amazon.opentelemetry.distro.sampler._sampling_target._logger") as mock_logger:
61+
target = _SamplingTarget(**inputs)
62+
mock_logger.debug.assert_called_once_with(
63+
"Ignoring unknown fields in _SamplingTarget: %s", ["ExtraField1", "ExtraField2"]
64+
)
65+
66+
self.assertEqual(target.FixedRate, 1.0)
67+
self.assertEqual(target.RuleName, "cat")
68+
self.assertEqual(target.Interval, 123)
69+
self.assertEqual(target.ReservoirQuota, 456)
70+
self.assertEqual(target.ReservoirQuotaTTL, 789)
71+
self.assertFalse(hasattr(target, "ExtraField2"))
72+
973
def test_sampling_target_response_with_none_inputs(self):
1074
target_response = _SamplingTargetResponse(None, None, None, None)
1175
self.assertEqual(target_response.LastRuleModification, 0.0)
@@ -40,11 +104,26 @@ def test_sampling_target_response_with_invalid_inputs(self):
40104
self.assertFalse(hasattr(target_response.SamplingTargetDocuments[0], "foo"))
41105

42106
def test_sampling_target_response_with_extra_inputs(self):
43-
target_response = _SamplingTargetResponse(1.0, [{}], [{}], [{}], EXTRA_ARG="does_nothing")
44-
self.assertEqual(target_response.LastRuleModification, 1.0)
45-
self.assertEqual(len(target_response.SamplingTargetDocuments), 1)
46-
self.assertEqual(target_response.SamplingTargetDocuments[0].FixedRate, 0)
47-
self.assertEqual(target_response.SamplingTargetDocuments[0].Interval, None)
48-
self.assertEqual(target_response.SamplingTargetDocuments[0].ReservoirQuota, None)
49-
self.assertEqual(target_response.SamplingTargetDocuments[0].ReservoirQuotaTTL, None)
50-
self.assertEqual(target_response.SamplingTargetDocuments[0].RuleName, "")
107+
inputs = {
108+
"LastRuleModification": 1.0,
109+
"SamplingTargetDocuments": [{}],
110+
"UnprocessedStatistics": [{}],
111+
"UnprocessedBoostStatistics": [{}],
112+
"ExtraField1": "cat",
113+
"ExtraField2": 123,
114+
}
115+
116+
# Does not throw an error and logs debug message about unknown fields
117+
with patch("amazon.opentelemetry.distro.sampler._sampling_target._logger") as mock_logger:
118+
target_response = _SamplingTargetResponse(**inputs)
119+
mock_logger.debug.assert_called_once_with(
120+
"Ignoring unknown fields in _SamplingTargetResponse: %s", ["ExtraField1", "ExtraField2"]
121+
)
122+
123+
self.assertEqual(target_response.LastRuleModification, 1.0)
124+
self.assertEqual(len(target_response.SamplingTargetDocuments), 1)
125+
self.assertEqual(target_response.SamplingTargetDocuments[0].FixedRate, 0)
126+
self.assertEqual(target_response.SamplingTargetDocuments[0].Interval, None)
127+
self.assertEqual(target_response.SamplingTargetDocuments[0].ReservoirQuota, None)
128+
self.assertEqual(target_response.SamplingTargetDocuments[0].ReservoirQuotaTTL, None)
129+
self.assertEqual(target_response.SamplingTargetDocuments[0].RuleName, "")

0 commit comments

Comments
 (0)