Skip to content

Commit 5aa2d87

Browse files
authored
Enable overriding environment detection (#60)
Sometimes it would be great to override the default selected environment (e.g. to force usage of the Lambda environment outside of Lambda), which this change enables. The code is based on #26.
1 parent 8878b3b commit 5aa2d87

File tree

5 files changed

+62
-4
lines changed

5 files changed

+62
-4
lines changed

aws_embedded_metrics/config/configuration.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
# See the License for the specific language governing permissions and
1212
# limitations under the License.
1313

14+
from typing import Optional
15+
1416

1517
class Configuration:
1618
def __init__(
@@ -24,6 +26,7 @@ def __init__(
2426
ec2_metadata_endpoint: str = None,
2527
namespace: str = None,
2628
disable_metric_extraction: bool = False,
29+
environment: Optional[str] = None,
2730
):
2831
self.debug_logging_enabled = debug_logging_enabled
2932
self.service_name = service_name
@@ -34,3 +37,4 @@ def __init__(
3437
self.ec2_metadata_endpoint = ec2_metadata_endpoint
3538
self.namespace = namespace
3639
self.disable_metric_extraction = disable_metric_extraction
40+
self.environment = environment

aws_embedded_metrics/config/environment_configuration_provider.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
EC2_METADATA_ENDPOINT = "EC2_METADATA_ENDPOINT"
2626
NAMESPACE = "NAMESPACE"
2727
DISABLE_METRIC_EXTRACTION = "DISABLE_METRIC_EXTRACTION"
28+
ENVIRONMENT_OVERRIDE = "ENVIRONMENT"
2829

2930

3031
class EnvironmentConfigurationProvider:
@@ -43,6 +44,7 @@ def get_configuration(self) -> Configuration:
4344
self.__get_env_var(EC2_METADATA_ENDPOINT),
4445
self.__get_env_var(NAMESPACE),
4546
self.__get_bool_env_var(DISABLE_METRIC_EXTRACTION),
47+
self.__get_env_var(ENVIRONMENT_OVERRIDE),
4648
)
4749

4850
@staticmethod

aws_embedded_metrics/environment/environment_detector.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# limitations under the License.
1313

1414
import logging
15+
from aws_embedded_metrics import config
1516
from aws_embedded_metrics.environment import Environment
1617
from aws_embedded_metrics.environment.default_environment import DefaultEnvironment
1718
from aws_embedded_metrics.environment.lambda_environment import LambdaEnvironment
@@ -20,7 +21,11 @@
2021

2122
log = logging.getLogger(__name__)
2223

23-
environments = [LambdaEnvironment(), EC2Environment()]
24+
lambda_environment = LambdaEnvironment()
25+
ec2_environment = EC2Environment()
26+
default_environment = DefaultEnvironment()
27+
environments = [lambda_environment, ec2_environment]
28+
Config = config.get_config()
2429

2530

2631
class EnvironmentCache:
@@ -32,6 +37,19 @@ async def resolve_environment() -> Environment:
3237
log.debug("Environment resolved from cache.")
3338
return EnvironmentCache.environment
3439

40+
if Config.environment:
41+
lower_configured_enviroment = Config.environment.lower()
42+
if lower_configured_enviroment == "lambda":
43+
EnvironmentCache.environment = lambda_environment
44+
elif lower_configured_enviroment == "ec2":
45+
EnvironmentCache.environment = ec2_environment
46+
elif lower_configured_enviroment == "default":
47+
EnvironmentCache.environment = default_environment
48+
else:
49+
log.info("Failed to understand environment override: %s", Config.environment)
50+
if EnvironmentCache.environment is not None:
51+
return EnvironmentCache.environment
52+
3553
for env_under_test in environments:
3654
is_environment = False
3755
try:
@@ -49,5 +67,5 @@ async def resolve_environment() -> Environment:
4967
return env_under_test
5068

5169
log.info("No environment was detected. Using default.")
52-
EnvironmentCache.environment = DefaultEnvironment()
70+
EnvironmentCache.environment = default_environment
5371
return EnvironmentCache.environment

tests/config/test_config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def test_can_get_config_from_environment(monkeypatch):
2424
ec2_metadata_endpoint = fake.word()
2525
namespace = fake.word()
2626
disable_metric_extraction = True
27+
environment_override = fake.word()
2728

2829
monkeypatch.setenv("AWS_EMF_ENABLE_DEBUG_LOGGING", str(debug_enabled))
2930
monkeypatch.setenv("AWS_EMF_SERVICE_NAME", service_name)
@@ -34,6 +35,7 @@ def test_can_get_config_from_environment(monkeypatch):
3435
monkeypatch.setenv("AWS_EMF_EC2_METADATA_ENDPOINT", ec2_metadata_endpoint)
3536
monkeypatch.setenv("AWS_EMF_NAMESPACE", namespace)
3637
monkeypatch.setenv("AWS_EMF_DISABLE_METRIC_EXTRACTION", str(disable_metric_extraction))
38+
monkeypatch.setenv("AWS_EMF_ENVIRONMENT", environment_override)
3739

3840
# act
3941
result = get_config()
@@ -48,6 +50,7 @@ def test_can_get_config_from_environment(monkeypatch):
4850
assert result.ec2_metadata_endpoint == ec2_metadata_endpoint
4951
assert result.namespace == namespace
5052
assert result.disable_metric_extraction == disable_metric_extraction
53+
assert result.environment == environment_override
5154

5255

5356
def test_can_override_config(monkeypatch):
@@ -61,6 +64,7 @@ def test_can_override_config(monkeypatch):
6164
monkeypatch.setenv("AWS_EMF_EC2_METADATA_ENDPOINT", fake.word())
6265
monkeypatch.setenv("AWS_EMF_NAMESPACE", fake.word())
6366
monkeypatch.setenv("AWS_EMF_DISABLE_METRIC_EXTRACTION", str(True))
67+
monkeypatch.setenv("AWS_EMF_ENVIRONMENT", fake.word())
6468

6569
config = get_config()
6670

@@ -73,6 +77,7 @@ def test_can_override_config(monkeypatch):
7377
ec2_metadata_endpoint = fake.word()
7478
namespace = fake.word()
7579
disable_metric_extraction = False
80+
environment = fake.word()
7681

7782
# act
7883
config.debug_logging_enabled = debug_enabled
@@ -84,6 +89,7 @@ def test_can_override_config(monkeypatch):
8489
config.ec2_metadata_endpoint = ec2_metadata_endpoint
8590
config.namespace = namespace
8691
config.disable_metric_extraction = disable_metric_extraction
92+
config.environment = environment
8793

8894
# assert
8995
assert config.debug_logging_enabled == debug_enabled
@@ -95,3 +101,4 @@ def test_can_override_config(monkeypatch):
95101
assert config.ec2_metadata_endpoint == ec2_metadata_endpoint
96102
assert config.namespace == namespace
97103
assert config.disable_metric_extraction == disable_metric_extraction
104+
assert config.environment == environment

tests/environment/test_environment_detector.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
import pytest
44
from importlib import reload
55

6-
from aws_embedded_metrics.config import get_config
6+
from aws_embedded_metrics import config
77
from aws_embedded_metrics.environment.lambda_environment import LambdaEnvironment
88
from aws_embedded_metrics.environment.default_environment import DefaultEnvironment
99

1010
from aws_embedded_metrics.environment import ec2_environment
1111
from aws_embedded_metrics.environment import environment_detector
1212

1313
fake = Faker()
14-
Config = get_config()
1514

1615

1716
@pytest.fixture
@@ -60,3 +59,31 @@ async def test_resolve_environment_returns_default_envionment(before):
6059

6160
# assert
6261
assert isinstance(result, DefaultEnvironment)
62+
63+
64+
@pytest.mark.asyncio
65+
async def test_resolve_environment_returns_override_ec2(before, monkeypatch):
66+
# arrange
67+
monkeypatch.setenv("AWS_EMF_ENVIRONMENT", "ec2")
68+
reload(config)
69+
reload(environment_detector)
70+
71+
# act
72+
result = await environment_detector.resolve_environment()
73+
74+
# assert
75+
assert isinstance(result, ec2_environment.EC2Environment)
76+
77+
78+
@pytest.mark.asyncio
79+
async def test_resolve_environment_returns_override_lambda(before, monkeypatch):
80+
# arrange
81+
monkeypatch.setenv("AWS_EMF_ENVIRONMENT", "lambda")
82+
reload(config)
83+
reload(environment_detector)
84+
85+
# act
86+
result = await environment_detector.resolve_environment()
87+
88+
# assert
89+
assert isinstance(result, LambdaEnvironment)

0 commit comments

Comments
 (0)