Skip to content

Commit 0581402

Browse files
committed
configure adot sdk defaults for genesis
1 parent abe6c6b commit 0581402

File tree

5 files changed

+214
-0
lines changed

5 files changed

+214
-0
lines changed

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_utils.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,37 @@ def is_installed(req: str) -> bool:
2929
def is_agent_observability_enabled() -> bool:
3030
"""Is the Agentic AI monitoring flag set to true?"""
3131
return os.environ.get(AGENT_OBSERVABILITY_ENABLED, "false").lower() == "true"
32+
33+
34+
def get_aws_region() -> str:
35+
"""Get AWS region from environment or botocore session.
36+
37+
Returns the AWS region in the following priority order:
38+
1. AWS_REGION environment variable
39+
2. AWS_DEFAULT_REGION environment variable
40+
3. botocore session's region (if botocore is available)
41+
4. None if no region can be determined
42+
"""
43+
# Check AWS environment variables first
44+
region = os.environ.get("AWS_REGION") or os.environ.get("AWS_DEFAULT_REGION")
45+
if region:
46+
return region
47+
48+
# Try to get region from botocore if available
49+
# This will automatically check AWS CLI config, instance metadata, etc.
50+
if is_installed("botocore"):
51+
try:
52+
from botocore import session
53+
54+
botocore_session = session.Session()
55+
if botocore_session.region_name:
56+
return botocore_session.region_name
57+
except Exception:
58+
# botocore failed to determine region
59+
pass
60+
61+
_logger.warning(
62+
"AWS region not found in environment variables (AWS_REGION, AWS_DEFAULT_REGION) "
63+
"or botocore configuration. Please set AWS_REGION environment variable explicitly."
64+
)
65+
return None

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,15 @@
101101
# UDP package size is not larger than 64KB
102102
LAMBDA_SPAN_EXPORT_BATCH_SIZE = 10
103103

104+
# Agent observability defaults
105+
OTEL_TRACES_EXPORTER = "OTEL_TRACES_EXPORTER"
106+
OTEL_LOGS_EXPORTER = "OTEL_LOGS_EXPORTER"
107+
OTEL_METRICS_EXPORTER = "OTEL_METRICS_EXPORTER"
108+
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT = "OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT"
109+
OTEL_TRACES_SAMPLER = "OTEL_TRACES_SAMPLER"
110+
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS = "OTEL_PYTHON_DISABLED_INSTRUMENTATIONS"
111+
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED = "OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED"
112+
104113
_logger: Logger = getLogger(__name__)
105114

106115

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@
44
import sys
55
from logging import Logger, getLogger
66

7+
from amazon.opentelemetry.distro._utils import get_aws_region, is_agent_observability_enabled
8+
from amazon.opentelemetry.distro.aws_opentelemetry_configurator import (
9+
APPLICATION_SIGNALS_ENABLED_CONFIG,
10+
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT,
11+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
12+
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT,
13+
OTEL_LOGS_EXPORTER,
14+
OTEL_METRICS_EXPORTER,
15+
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS,
16+
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
17+
OTEL_TRACES_EXPORTER,
18+
OTEL_TRACES_SAMPLER,
19+
)
720
from amazon.opentelemetry.distro.patches._instrumentation_patch import apply_instrumentation_patches
821
from opentelemetry.distro import OpenTelemetryDistro
922
from opentelemetry.environment_variables import OTEL_PROPAGATORS, OTEL_PYTHON_ID_GENERATOR
@@ -65,5 +78,43 @@ def _configure(self, **kwargs):
6578
OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION, "base2_exponential_bucket_histogram"
6679
)
6780

81+
if is_agent_observability_enabled():
82+
# "otlp" is already native OTel default, but we set them here to be explicit
83+
# about intended configuration for agent observability
84+
os.environ.setdefault(OTEL_TRACES_EXPORTER, "otlp")
85+
os.environ.setdefault(OTEL_LOGS_EXPORTER, "otlp")
86+
os.environ.setdefault(OTEL_METRICS_EXPORTER, "awsemf")
87+
88+
# Set GenAI capture content default
89+
os.environ.setdefault(OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT, "true")
90+
91+
# Set OTLP endpoints with AWS region if not already set
92+
region = get_aws_region()
93+
if region:
94+
os.environ.setdefault(
95+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, f"https://xray.{region}.amazonaws.com/v1/traces"
96+
)
97+
os.environ.setdefault(OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, f"https://logs.{region}.amazonaws.com/v1/logs")
98+
else:
99+
_logger.warning(
100+
"AWS region could not be determined. OTLP endpoints will not be automatically configured. "
101+
"Please set AWS_REGION environment variable or configure OTLP endpoints manually."
102+
)
103+
104+
# Set sampler default
105+
os.environ.setdefault(OTEL_TRACES_SAMPLER, "parentbased_always_on")
106+
107+
# Set disabled instrumentations default
108+
os.environ.setdefault(
109+
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS,
110+
"http,sqlalchemy,psycopg2,pymysql,sqlite3,aiopg,asyncpg,mysql_connector,botocore,boto3,urllib3,requests,starlette",
111+
)
112+
113+
# Set logging auto instrumentation default
114+
os.environ.setdefault(OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "true")
115+
116+
# Disable AWS Application Signals by default
117+
os.environ.setdefault(APPLICATION_SIGNALS_ENABLED_CONFIG, "false")
118+
68119
if kwargs.get("apply_patches", True):
69120
apply_instrumentation_patches()

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
3+
import os
34
from unittest import TestCase
5+
from unittest.mock import patch
46

57
from pkg_resources import DistributionNotFound, require
68

@@ -11,3 +13,65 @@ def test_package_available(self):
1113
require(["aws-opentelemetry-distro"])
1214
except DistributionNotFound:
1315
self.fail("aws-opentelemetry-distro not installed")
16+
17+
def setUp(self):
18+
# Store original env vars for agent observability tests
19+
self.original_env = {}
20+
env_vars = [
21+
"AGENT_OBSERVABILITY_ENABLED",
22+
"OTEL_TRACES_SAMPLER",
23+
"OTEL_PYTHON_DISABLED_INSTRUMENTATIONS",
24+
"OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED",
25+
"OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
26+
]
27+
for var in env_vars:
28+
self.original_env[var] = os.environ.get(var)
29+
os.environ.pop(var, None)
30+
31+
def tearDown(self):
32+
# Restore original env vars
33+
for var, value in self.original_env.items():
34+
if value is None:
35+
os.environ.pop(var, None)
36+
else:
37+
os.environ[var] = value
38+
39+
def test_agent_observability_sets_new_defaults(self):
40+
# Set up the environment to trigger agent observability
41+
os.environ["AGENT_OBSERVABILITY_ENABLED"] = "true"
42+
43+
# Import and configure
44+
from amazon.opentelemetry.distro.aws_opentelemetry_distro import AwsOpenTelemetryDistro
45+
46+
with patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches"):
47+
with patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.get_aws_region", return_value="us-west-2"):
48+
# We need to mock the parent class to avoid its side effects
49+
with patch("opentelemetry.distro.OpenTelemetryDistro._configure"):
50+
distro = AwsOpenTelemetryDistro()
51+
distro._configure()
52+
53+
# Check the new defaults are set
54+
self.assertEqual(os.environ.get("OTEL_TRACES_SAMPLER"), "parentbased_always_on")
55+
self.assertEqual(
56+
os.environ.get("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS"),
57+
"http,sqlalchemy,psycopg2,pymysql,sqlite3,aiopg,asyncpg,mysql_connector,botocore,boto3,urllib3,requests,starlette",
58+
)
59+
self.assertEqual(os.environ.get("OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED"), "true")
60+
self.assertEqual(os.environ.get("OTEL_AWS_APPLICATION_SIGNALS_ENABLED"), "false")
61+
62+
def test_new_defaults_not_set_when_agent_observability_disabled(self):
63+
# Don't set AGENT_OBSERVABILITY_ENABLED or set it to false
64+
os.environ.pop("AGENT_OBSERVABILITY_ENABLED", None)
65+
66+
from amazon.opentelemetry.distro.aws_opentelemetry_distro import AwsOpenTelemetryDistro
67+
68+
with patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches"):
69+
with patch("opentelemetry.distro.OpenTelemetryDistro._configure"):
70+
distro = AwsOpenTelemetryDistro()
71+
distro._configure()
72+
73+
# These should not be set when agent observability is disabled
74+
self.assertNotIn("OTEL_TRACES_SAMPLER", os.environ)
75+
self.assertNotIn("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS", os.environ)
76+
self.assertNotIn("OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED", os.environ)
77+
self.assertNotIn("OTEL_AWS_APPLICATION_SIGNALS_ENABLED", os.environ)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
import os
5+
from unittest import TestCase
6+
from unittest.mock import MagicMock, patch
7+
8+
from amazon.opentelemetry.distro._utils import get_aws_region
9+
10+
11+
class TestGetAwsRegion(TestCase):
12+
def setUp(self):
13+
# Clear environment variables before each test
14+
os.environ.pop("AWS_REGION", None)
15+
os.environ.pop("AWS_DEFAULT_REGION", None)
16+
17+
def tearDown(self):
18+
# Clean up environment variables after each test
19+
os.environ.pop("AWS_REGION", None)
20+
os.environ.pop("AWS_DEFAULT_REGION", None)
21+
22+
def test_get_aws_region_from_aws_region_env(self):
23+
os.environ["AWS_REGION"] = "us-west-2"
24+
self.assertEqual(get_aws_region(), "us-west-2")
25+
26+
def test_get_aws_region_from_aws_default_region_env(self):
27+
os.environ["AWS_DEFAULT_REGION"] = "eu-central-1"
28+
self.assertEqual(get_aws_region(), "eu-central-1")
29+
30+
def test_get_aws_region_prefers_aws_region_over_default(self):
31+
os.environ["AWS_REGION"] = "us-east-1"
32+
os.environ["AWS_DEFAULT_REGION"] = "eu-west-1"
33+
self.assertEqual(get_aws_region(), "us-east-1")
34+
35+
@patch("amazon.opentelemetry.distro._utils.is_installed")
36+
@patch("botocore.session.Session")
37+
def test_get_aws_region_from_botocore_session(self, mock_session_class, mock_is_installed):
38+
mock_is_installed.return_value = True
39+
40+
mock_session = MagicMock()
41+
mock_session.region_name = "ap-southeast-1"
42+
mock_session_class.return_value = mock_session
43+
44+
result = get_aws_region()
45+
46+
self.assertEqual(result, "ap-southeast-1")
47+
48+
@patch("amazon.opentelemetry.distro._utils.is_installed")
49+
@patch("amazon.opentelemetry.distro._utils._logger")
50+
def test_get_aws_region_returns_none_when_no_region_found(self, mock_logger, mock_is_installed):
51+
mock_is_installed.return_value = False
52+
53+
result = get_aws_region()
54+
55+
self.assertIsNone(result)
56+
mock_logger.warning.assert_called_once()

0 commit comments

Comments
 (0)