Skip to content

Commit 93aecc5

Browse files
committed
init genesis custom log behavior
1 parent b6b7cf8 commit 93aecc5

File tree

8 files changed

+665
-70
lines changed

8 files changed

+665
-70
lines changed

aws-opentelemetry-distro/pyproject.toml

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -25,61 +25,61 @@ classifiers = [
2525
]
2626

2727
dependencies = [
28-
"opentelemetry-api == 1.27.0",
29-
"opentelemetry-sdk == 1.27.0",
30-
"opentelemetry-exporter-otlp-proto-grpc == 1.27.0",
31-
"opentelemetry-exporter-otlp-proto-http == 1.27.0",
32-
"opentelemetry-propagator-b3 == 1.27.0",
33-
"opentelemetry-propagator-jaeger == 1.27.0",
34-
"opentelemetry-exporter-otlp-proto-common == 1.27.0",
35-
"opentelemetry-sdk-extension-aws == 2.0.2",
36-
"opentelemetry-propagator-aws-xray == 1.0.1",
37-
"opentelemetry-distro == 0.48b0",
38-
"opentelemetry-propagator-ot-trace == 0.48b0",
39-
"opentelemetry-instrumentation == 0.48b0",
40-
"opentelemetry-instrumentation-aws-lambda == 0.48b0",
41-
"opentelemetry-instrumentation-aio-pika == 0.48b0",
42-
"opentelemetry-instrumentation-aiohttp-client == 0.48b0",
43-
"opentelemetry-instrumentation-aiopg == 0.48b0",
44-
"opentelemetry-instrumentation-asgi == 0.48b0",
45-
"opentelemetry-instrumentation-asyncpg == 0.48b0",
46-
"opentelemetry-instrumentation-boto == 0.48b0",
47-
"opentelemetry-instrumentation-boto3sqs == 0.48b0",
48-
"opentelemetry-instrumentation-botocore == 0.48b0",
49-
"opentelemetry-instrumentation-celery == 0.48b0",
50-
"opentelemetry-instrumentation-confluent-kafka == 0.48b0",
51-
"opentelemetry-instrumentation-dbapi == 0.48b0",
52-
"opentelemetry-instrumentation-django == 0.48b0",
53-
"opentelemetry-instrumentation-elasticsearch == 0.48b0",
54-
"opentelemetry-instrumentation-falcon == 0.48b0",
55-
"opentelemetry-instrumentation-fastapi == 0.48b0",
56-
"opentelemetry-instrumentation-flask == 0.48b0",
57-
"opentelemetry-instrumentation-grpc == 0.48b0",
58-
"opentelemetry-instrumentation-httpx == 0.48b0",
59-
"opentelemetry-instrumentation-jinja2 == 0.48b0",
60-
"opentelemetry-instrumentation-kafka-python == 0.48b0",
61-
"opentelemetry-instrumentation-logging == 0.48b0",
62-
"opentelemetry-instrumentation-mysql == 0.48b0",
63-
"opentelemetry-instrumentation-mysqlclient == 0.48b0",
64-
"opentelemetry-instrumentation-pika == 0.48b0",
65-
"opentelemetry-instrumentation-psycopg2 == 0.48b0",
66-
"opentelemetry-instrumentation-pymemcache == 0.48b0",
67-
"opentelemetry-instrumentation-pymongo == 0.48b0",
68-
"opentelemetry-instrumentation-pymysql == 0.48b0",
69-
"opentelemetry-instrumentation-pyramid == 0.48b0",
70-
"opentelemetry-instrumentation-redis == 0.48b0",
71-
"opentelemetry-instrumentation-remoulade == 0.48b0",
72-
"opentelemetry-instrumentation-requests == 0.48b0",
73-
"opentelemetry-instrumentation-sqlalchemy == 0.48b0",
74-
"opentelemetry-instrumentation-sqlite3 == 0.48b0",
75-
"opentelemetry-instrumentation-starlette == 0.48b0",
76-
"opentelemetry-instrumentation-system-metrics == 0.48b0",
77-
"opentelemetry-instrumentation-tornado == 0.48b0",
78-
"opentelemetry-instrumentation-tortoiseorm == 0.48b0",
79-
"opentelemetry-instrumentation-urllib == 0.48b0",
80-
"opentelemetry-instrumentation-urllib3 == 0.48b0",
81-
"opentelemetry-instrumentation-wsgi == 0.48b0",
82-
"opentelemetry-instrumentation-cassandra == 0.48b0",
28+
"opentelemetry-api >= 1.29.0",
29+
"opentelemetry-sdk >= 1.29.0",
30+
"opentelemetry-exporter-otlp-proto-grpc >= 1.29.0",
31+
"opentelemetry-exporter-otlp-proto-http >= 1.29.0",
32+
"opentelemetry-propagator-b3 >= 1.29.0",
33+
"opentelemetry-propagator-jaeger >= 1.29.0",
34+
"opentelemetry-exporter-otlp-proto-common >= 1.29.0",
35+
"opentelemetry-sdk-extension-aws >= 2.0.2",
36+
"opentelemetry-propagator-aws-xray >= 1.0.1",
37+
"opentelemetry-distro >= 0.50b0",
38+
"opentelemetry-propagator-ot-trace >= 0.50b0",
39+
"opentelemetry-instrumentation >= 0.50b0",
40+
"opentelemetry-instrumentation-aws-lambda >= 0.50b0",
41+
"opentelemetry-instrumentation-aio-pika >= 0.50b0",
42+
"opentelemetry-instrumentation-aiohttp-client >= 0.50b0",
43+
"opentelemetry-instrumentation-aiopg >= 0.50b0",
44+
"opentelemetry-instrumentation-asgi >= 0.50b0",
45+
"opentelemetry-instrumentation-asyncpg >= 0.50b0",
46+
"opentelemetry-instrumentation-boto >= 0.50b0",
47+
"opentelemetry-instrumentation-boto3sqs >= 0.50b0",
48+
"opentelemetry-instrumentation-botocore >= 0.50b0",
49+
"opentelemetry-instrumentation-celery >= 0.50b0",
50+
"opentelemetry-instrumentation-confluent-kafka >= 0.50b0",
51+
"opentelemetry-instrumentation-dbapi >= 0.50b0",
52+
"opentelemetry-instrumentation-django >= 0.50b0",
53+
"opentelemetry-instrumentation-elasticsearch >= 0.50b0",
54+
"opentelemetry-instrumentation-falcon >= 0.50b0",
55+
"opentelemetry-instrumentation-fastapi >= 0.50b0",
56+
"opentelemetry-instrumentation-flask >= 0.50b0",
57+
"opentelemetry-instrumentation-grpc >= 0.50b0",
58+
"opentelemetry-instrumentation-httpx >= 0.50b0",
59+
"opentelemetry-instrumentation-jinja2 >= 0.50b0",
60+
"opentelemetry-instrumentation-kafka-python >= 0.50b0",
61+
"opentelemetry-instrumentation-logging >= 0.50b0",
62+
"opentelemetry-instrumentation-mysql >= 0.50b0",
63+
"opentelemetry-instrumentation-mysqlclient >= 0.50b0",
64+
"opentelemetry-instrumentation-pika >= 0.50b0",
65+
"opentelemetry-instrumentation-psycopg2 >= 0.50b0",
66+
"opentelemetry-instrumentation-pymemcache >= 0.50b0",
67+
"opentelemetry-instrumentation-pymongo >= 0.50b0",
68+
"opentelemetry-instrumentation-pymysql >= 0.50b0",
69+
"opentelemetry-instrumentation-pyramid >= 0.50b0",
70+
"opentelemetry-instrumentation-redis >= 0.50b0",
71+
"opentelemetry-instrumentation-remoulade >= 0.50b0",
72+
"opentelemetry-instrumentation-requests >= 0.50b0",
73+
"opentelemetry-instrumentation-sqlalchemy >= 0.50b0",
74+
"opentelemetry-instrumentation-sqlite3 >= 0.50b0",
75+
"opentelemetry-instrumentation-starlette >= 0.50b0",
76+
"opentelemetry-instrumentation-system-metrics >= 0.50b0",
77+
"opentelemetry-instrumentation-tornado >= 0.50b0",
78+
"opentelemetry-instrumentation-tortoiseorm >= 0.50b0",
79+
"opentelemetry-instrumentation-urllib >= 0.50b0",
80+
"opentelemetry-instrumentation-urllib3 >= 0.50b0",
81+
"opentelemetry-instrumentation-wsgi >= 0.50b0",
82+
"opentelemetry-instrumentation-cassandra >= 0.50b0",
8383
]
8484

8585
[project.optional-dependencies]
@@ -109,4 +109,4 @@ include = [
109109
]
110110

111111
[tool.hatch.build.targets.wheel]
112-
packages = ["src/amazon"]
112+
packages = ["src/amazon"]

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
33

4+
import os
45
import sys
56
from logging import Logger, getLogger
67

78
import pkg_resources
89

910
_logger: Logger = getLogger(__name__)
1011

12+
AGENT_OBSERVABILITY_ENABLED = "AGENT_OBSERVABILITY_ENABLED"
1113

1214
def is_installed(req: str) -> bool:
1315
"""Is the given required package installed?"""
@@ -21,3 +23,6 @@ def is_installed(req: str) -> bool:
2123
_logger.debug("Skipping instrumentation patch: package %s, exception: %s", req, exc)
2224
return False
2325
return True
26+
27+
def is_agent_observability_enabled() -> bool:
28+
return os.environ.get(AGENT_OBSERVABILITY_ENABLED, "false").lower() == "true"

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

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
# Modifications Copyright The OpenTelemetry Authors. Licensed under the Apache License 2.0 License.
44
import os
55
import re
6-
from logging import NOTSET, Logger, getLogger
6+
from logging import NOTSET, CRITICAL, Logger, getLogger
77
from typing import ClassVar, Dict, List, Type, Union
88

99
from importlib_metadata import version
1010
from typing_extensions import override
1111

1212
from amazon.opentelemetry.distro._aws_attribute_keys import AWS_LOCAL_SERVICE
13+
from amazon.opentelemetry.distro.exporter.otlp.aws.logs.aws_batch_log_processor import AwsBatchLogRecordProcessor
14+
from amazon.opentelemetry.distro._utils import is_agent_observability_enabled
1315
from amazon.opentelemetry.distro._aws_resource_attribute_configurator import get_service_attribute
1416
from amazon.opentelemetry.distro.always_record_sampler import AlwaysRecordSampler
1517
from amazon.opentelemetry.distro.attribute_propagating_span_processor_builder import (
@@ -27,7 +29,7 @@
2729
from amazon.opentelemetry.distro.sampler.aws_xray_remote_sampler import AwsXRayRemoteSampler
2830
from amazon.opentelemetry.distro.scope_based_exporter import ScopeBasedPeriodicExportingMetricReader
2931
from amazon.opentelemetry.distro.scope_based_filtering_view import ScopeBasedRetainingView
30-
from opentelemetry._logs import set_logger_provider
32+
from opentelemetry._logs import set_logger_provider, get_logger_provider
3133
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
3234
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter
3335
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
@@ -82,6 +84,7 @@
8284
DEPRECATED_APP_SIGNALS_EXPORTER_ENDPOINT_CONFIG = "OTEL_AWS_APP_SIGNALS_EXPORTER_ENDPOINT"
8385
APPLICATION_SIGNALS_EXPORTER_ENDPOINT_CONFIG = "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT"
8486
METRIC_EXPORT_INTERVAL_CONFIG = "OTEL_METRIC_EXPORT_INTERVAL"
87+
OTEL_LOGS_EXPORTER = "OTEL_LOGS_EXPORTER"
8588
DEFAULT_METRIC_EXPORT_INTERVAL = 60000.0
8689
AWS_LAMBDA_FUNCTION_NAME_CONFIG = "AWS_LAMBDA_FUNCTION_NAME"
8790
AWS_XRAY_DAEMON_ADDRESS_CONFIG = "AWS_XRAY_DAEMON_ADDRESS"
@@ -91,6 +94,8 @@
9194
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT"
9295
OTEL_EXPORTER_OTLP_LOGS_HEADERS = "OTEL_EXPORTER_OTLP_LOGS_HEADERS"
9396

97+
AGENT_OBSERVABILITY_ENABLED = "AGENT_OBSERVABILITY_ENABLED"
98+
9499
AWS_TRACES_OTLP_ENDPOINT_PATTERN = r"https://xray\.([a-z0-9-]+)\.amazonaws\.com/v1/traces$"
95100
AWS_LOGS_OTLP_ENDPOINT_PATTERN = r"https://logs\.([a-z0-9-]+)\.amazonaws\.com/v1/logs$"
96101

@@ -119,6 +124,24 @@ class AwsOpenTelemetryConfigurator(_OTelSDKConfigurator):
119124
# pylint: disable=no-self-use
120125
@override
121126
def _configure(self, **kwargs):
127+
128+
print(f"OTEL_EXPORTER_OTLP_LOGS_HEADERS: {os.environ.get('OTEL_EXPORTER_OTLP_LOGS_HEADERS', 'Not set')}")
129+
print(f"OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED: {os.environ.get('OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED', 'Not set')}")
130+
print(f"OTEL_METRICS_EXPORTER: {os.environ.get('OTEL_METRICS_EXPORTER', 'Not set')}")
131+
print(f"OTEL_TRACES_EXPORTER: {os.environ.get('OTEL_TRACES_EXPORTER', 'Not set')}")
132+
print(f"OTEL_LOGS_EXPORTER: {os.environ.get('OTEL_LOGS_EXPORTER', 'Not set')}")
133+
print(f"OTEL_PYTHON_DISTRO: {os.environ.get('OTEL_PYTHON_DISTRO', 'Not set')}")
134+
print(f"OTEL_PYTHON_CONFIGURATOR: {os.environ.get('OTEL_PYTHON_CONFIGURATOR', 'Not set')}")
135+
print(f"OTEL_EXPORTER_OTLP_PROTOCOL: {os.environ.get('OTEL_EXPORTER_OTLP_PROTOCOL', 'Not set')}")
136+
print(f"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: {os.environ.get('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', 'Not set')}")
137+
print(f"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT: {os.environ.get('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT', 'Not set')}")
138+
print(f"OTEL_RESOURCE_ATTRIBUTES: {os.environ.get('OTEL_RESOURCE_ATTRIBUTES', 'Not set')}")
139+
print(f"AGENT_OBSERVABILITY_ENABLED: {os.environ.get('AGENT_OBSERVABILITY_ENABLED', 'Not set')}")
140+
print(f"AWS_CLOUDWATCH_LOG_GROUP: {os.environ.get('AWS_CLOUDWATCH_LOG_GROUP', 'Not set')}")
141+
print(f"AWS_CLOUDWATCH_LOG_STREAM: {os.environ.get('AWS_CLOUDWATCH_LOG_STREAM', 'Not set')}")
142+
print(f"OTEL_PYTHON_DISABLED_INSTRUMENTATIONS: {os.environ.get('OTEL_PYTHON_DISABLED_INSTRUMENTATIONS', 'Not set')}")
143+
print(f"PYTHONPATH: {os.environ.get('PYTHONPATH', 'Not set')}")
144+
122145
if _is_defer_to_workers_enabled() and _is_wsgi_master_process():
123146
_logger.info(
124147
"Skipping ADOT initialization since deferral to worker is enabled, and this is a master process."
@@ -160,26 +183,29 @@ def _initialize_components():
160183
sampler_name = _get_sampler()
161184
sampler = _custom_import_sampler(sampler_name, resource)
162185

186+
logging_enabled = os.getenv(_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false")
187+
188+
if logging_enabled.strip().lower() == "true":
189+
_init_logging(log_exporters, resource)
190+
163191
_init_tracing(
164192
exporters=trace_exporters,
165193
id_generator=id_generator,
166194
sampler=sampler,
167195
resource=resource,
168196
)
169197
_init_metrics(metric_exporters, resource)
170-
logging_enabled = os.getenv(_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false")
171-
if logging_enabled.strip().lower() == "true":
172-
_init_logging(log_exporters, resource)
198+
173199

174200

175201
def _init_logging(
176202
exporters: Dict[str, Type[LogExporter]],
177203
resource: Resource = None,
178204
):
179205

180-
# Provides a default OTLP log exporter when none is specified.
206+
# Provides a default OTLP log exporter when the environment is not set.
181207
# This is the behavior for the logs exporters for other languages.
182-
if not exporters:
208+
if not exporters and os.environ.get(OTEL_LOGS_EXPORTER) == None:
183209
exporters = {"otlp": OTLPLogExporter}
184210

185211
provider = LoggerProvider(resource=resource)
@@ -188,7 +214,7 @@ def _init_logging(
188214
for _, exporter_class in exporters.items():
189215
exporter_args: Dict[str, any] = {}
190216
log_exporter = _customize_logs_exporter(exporter_class(**exporter_args), resource)
191-
provider.add_log_record_processor(BatchLogRecordProcessor(exporter=log_exporter))
217+
provider.add_log_record_processor(AwsBatchLogRecordProcessor(exporter=log_exporter))
192218

193219
handler = LoggingHandler(level=NOTSET, logger_provider=provider)
194220

@@ -359,7 +385,14 @@ def _customize_span_exporter(span_exporter: SpanExporter, resource: Resource) ->
359385
_logger.info("Detected using AWS OTLP Traces Endpoint.")
360386

361387
if isinstance(span_exporter, OTLPSpanExporter):
362-
span_exporter = OTLPAwsSpanExporter(endpoint=traces_endpoint)
388+
if is_agent_observability_enabled():
389+
390+
span_exporter = OTLPAwsSpanExporter(
391+
endpoint=traces_endpoint,
392+
logs_provider=get_logger_provider()
393+
)
394+
else:
395+
span_exporter = OTLPAwsSpanExporter(endpoint=traces_endpoint)
363396

364397
else:
365398
_logger.warning(
@@ -624,4 +657,4 @@ def create_exporter(self):
624657
endpoint=application_signals_endpoint, preferred_temporality=temporality_dict
625658
)
626659

627-
raise RuntimeError(f"Unsupported AWS Application Signals export protocol: {protocol} ")
660+
raise RuntimeError(f"Unsupported AWS Application Signals export protocol: {protocol} ")
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
BASE_LOG_BUFFER_BYTE_SIZE = 450000
2+
MAX_LOG_REQUEST_BYTE_SIZE = 1048576 # https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OTLPEndpoint.html

0 commit comments

Comments
 (0)