Skip to content

Commit a8ae93e

Browse files
authored
Merge branch 'main' into issue-2446
2 parents 66f155b + 101db90 commit a8ae93e

File tree

14 files changed

+624
-131
lines changed

14 files changed

+624
-131
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
- `opentelemetry-exporter-otlp-proto-http` Add support for OTLP/HTTP log exporter
1111
([#2462](https://github.com/open-telemetry/opentelemetry-python/pull/2462))
12+
- Add missing `to_json` methods
13+
([#2722](https://github.com/open-telemetry/opentelemetry-python/pull/2722)
1214
- Fix type hints for textmap `Getter` and `Setter`
1315
([#2657](https://github.com/open-telemetry/opentelemetry-python/pull/2657))
1416
- Fix LogEmitterProvider.force_flush hanging randomly
@@ -21,8 +23,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2123
([#2726](https://github.com/open-telemetry/opentelemetry-python/pull/2726))
2224
- fix: frozenset object has no attribute items
2325
([#2727](https://github.com/open-telemetry/opentelemetry-python/pull/2727))
26+
- Support logs SDK auto instrumentation enable/disable with env
27+
([#2728](https://github.com/open-telemetry/opentelemetry-python/pull/2728))
2428
- fix: update entry point object references for metrics
2529
([#2731](https://github.com/open-telemetry/opentelemetry-python/pull/2731))
30+
- Configure auto instrumentation to support metrics
31+
([#2705](https://github.com/open-telemetry/opentelemetry-python/pull/2705))
2632

2733
## [1.12.0rc1-0.31b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0rc1-0.31b0) - 2022-05-17
2834

opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,40 @@
1818
"""
1919

2020
import logging
21+
import os
2122
from abc import ABC, abstractmethod
2223
from os import environ
2324
from typing import Dict, Optional, Sequence, Tuple, Type
2425

2526
from pkg_resources import iter_entry_points
2627

27-
from opentelemetry import trace
2828
from opentelemetry.environment_variables import (
2929
OTEL_LOGS_EXPORTER,
30+
OTEL_METRICS_EXPORTER,
3031
OTEL_PYTHON_ID_GENERATOR,
3132
OTEL_TRACES_EXPORTER,
3233
)
34+
from opentelemetry.metrics import set_meter_provider
3335
from opentelemetry.sdk._logs import (
3436
LogEmitterProvider,
3537
LoggingHandler,
3638
set_log_emitter_provider,
3739
)
3840
from opentelemetry.sdk._logs.export import BatchLogProcessor, LogExporter
41+
from opentelemetry.sdk.environment_variables import (
42+
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
43+
)
44+
from opentelemetry.sdk.metrics import MeterProvider
45+
from opentelemetry.sdk.metrics.export import (
46+
MetricExporter,
47+
PeriodicExportingMetricReader,
48+
)
3949
from opentelemetry.sdk.resources import Resource
4050
from opentelemetry.sdk.trace import TracerProvider
4151
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter
4252
from opentelemetry.sdk.trace.id_generator import IdGenerator
4353
from opentelemetry.semconv.resource import ResourceAttributes
54+
from opentelemetry.trace import set_tracer_provider
4455

4556
_EXPORTER_OTLP = "otlp"
4657
_EXPORTER_OTLP_PROTO_GRPC = "otlp_proto_grpc"
@@ -83,7 +94,7 @@ def _init_tracing(
8394
id_generator=id_generator(),
8495
resource=Resource.create(auto_resource),
8596
)
86-
trace.set_tracer_provider(provider)
97+
set_tracer_provider(provider)
8798

8899
for _, exporter_class in exporters.items():
89100
exporter_args = {}
@@ -92,6 +103,33 @@ def _init_tracing(
92103
)
93104

94105

106+
def _init_metrics(
107+
exporters: Dict[str, Type[MetricExporter]],
108+
auto_instrumentation_version: Optional[str] = None,
109+
):
110+
# if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
111+
# from the env variable else defaults to "unknown_service"
112+
auto_resource = {}
113+
# populate version if using auto-instrumentation
114+
if auto_instrumentation_version:
115+
auto_resource[
116+
ResourceAttributes.TELEMETRY_AUTO_VERSION
117+
] = auto_instrumentation_version
118+
119+
metric_readers = []
120+
121+
for _, exporter_class in exporters.items():
122+
exporter_args = {}
123+
metric_readers.append(
124+
PeriodicExportingMetricReader(exporter_class(**exporter_args))
125+
)
126+
127+
provider = MeterProvider(
128+
resource=Resource.create(auto_resource), metric_readers=metric_readers
129+
)
130+
set_meter_provider(provider)
131+
132+
95133
def _init_logging(
96134
exporters: Dict[str, Type[LogExporter]],
97135
auto_instrumentation_version: Optional[str] = None,
@@ -141,9 +179,15 @@ def _import_config_components(
141179

142180
def _import_exporters(
143181
trace_exporter_names: Sequence[str],
182+
metric_exporter_names: Sequence[str],
144183
log_exporter_names: Sequence[str],
145-
) -> Tuple[Dict[str, Type[SpanExporter]], Dict[str, Type[LogExporter]]]:
184+
) -> Tuple[
185+
Dict[str, Type[SpanExporter]],
186+
Dict[str, Type[MetricExporter]],
187+
Dict[str, Type[LogExporter]],
188+
]:
146189
trace_exporters = {}
190+
metric_exporters = {}
147191
log_exporters = {}
148192

149193
for (exporter_name, exporter_impl,) in _import_config_components(
@@ -154,6 +198,14 @@ def _import_exporters(
154198
else:
155199
raise RuntimeError(f"{exporter_name} is not a trace exporter")
156200

201+
for (exporter_name, exporter_impl,) in _import_config_components(
202+
metric_exporter_names, "opentelemetry_metrics_exporter"
203+
):
204+
if issubclass(exporter_impl, MetricExporter):
205+
metric_exporters[exporter_name] = exporter_impl
206+
else:
207+
raise RuntimeError(f"{exporter_name} is not a metric exporter")
208+
157209
for (exporter_name, exporter_impl,) in _import_config_components(
158210
log_exporter_names, "opentelemetry_logs_exporter"
159211
):
@@ -162,7 +214,7 @@ def _import_exporters(
162214
else:
163215
raise RuntimeError(f"{exporter_name} is not a log exporter")
164216

165-
return trace_exporters, log_exporters
217+
return trace_exporters, metric_exporters, log_exporters
166218

167219

168220
def _import_id_generator(id_generator_name: str) -> IdGenerator:
@@ -178,14 +230,20 @@ def _import_id_generator(id_generator_name: str) -> IdGenerator:
178230

179231

180232
def _initialize_components(auto_instrumentation_version):
181-
trace_exporters, log_exporters = _import_exporters(
233+
trace_exporters, metric_exporters, log_exporters = _import_exporters(
182234
_get_exporter_names(environ.get(OTEL_TRACES_EXPORTER)),
235+
_get_exporter_names(environ.get(OTEL_METRICS_EXPORTER)),
183236
_get_exporter_names(environ.get(OTEL_LOGS_EXPORTER)),
184237
)
185238
id_generator_name = _get_id_generator()
186239
id_generator = _import_id_generator(id_generator_name)
187240
_init_tracing(trace_exporters, id_generator, auto_instrumentation_version)
188-
_init_logging(log_exporters, auto_instrumentation_version)
241+
_init_metrics(metric_exporters, auto_instrumentation_version)
242+
logging_enabled = os.getenv(
243+
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false"
244+
)
245+
if logging_enabled.strip().lower() == "true":
246+
_init_logging(log_exporters, auto_instrumentation_version)
189247

190248

191249
class _BaseConfigurator(ABC):

opentelemetry-sdk/src/opentelemetry/sdk/_logs/export/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
from opentelemetry.context import attach, detach, set_value
2626
from opentelemetry.sdk._logs import LogData, LogProcessor, LogRecord
27+
from opentelemetry.util._once import Once
2728
from opentelemetry.util._time import _time_ns
2829

2930
_logger = logging.getLogger(__name__)
@@ -129,6 +130,9 @@ def __init__(self):
129130
self.num_log_records = 0
130131

131132

133+
_BSP_RESET_ONCE = Once()
134+
135+
132136
class BatchLogProcessor(LogProcessor):
133137
"""This is an implementation of LogProcessor which creates batches of
134138
received logs in the export-friendly LogData representation and
@@ -164,6 +168,7 @@ def __init__(
164168
os.register_at_fork(
165169
after_in_child=self._at_fork_reinit
166170
) # pylint: disable=protected-access
171+
self._pid = os.getpid()
167172

168173
def _at_fork_reinit(self):
169174
self._condition = threading.Condition(threading.Lock())
@@ -174,6 +179,7 @@ def _at_fork_reinit(self):
174179
daemon=True,
175180
)
176181
self._worker_thread.start()
182+
self._pid = os.getpid()
177183

178184
def worker(self):
179185
timeout = self._schedule_delay_millis / 1e3
@@ -293,6 +299,9 @@ def emit(self, log_data: LogData) -> None:
293299
"""
294300
if self._shutdown:
295301
return
302+
if self._pid != os.getpid():
303+
_BSP_RESET_ONCE.do_once(self._at_fork_reinit)
304+
296305
self._queue.appendleft(log_data)
297306
if len(self._queue) >= self._max_export_batch_size:
298307
with self._condition:

opentelemetry-sdk/src/opentelemetry/sdk/environment_variables.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,20 @@
407407
LogEmitterProvider is used.
408408
"""
409409

410+
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED = (
411+
"OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED"
412+
)
413+
"""
414+
.. envvar:: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
415+
416+
The :envvar:`OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED` environment variable allows users to
417+
enable/disabe the logging SDK auto instrumentation.
418+
Default: False
419+
420+
Note: Logs SDK and its related settings are experimental.
421+
"""
422+
423+
410424
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE = (
411425
"OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE"
412426
)

opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ def __init__(
105105
self,
106106
out: IO = stdout,
107107
formatter: Callable[
108-
["opentelemetry.sdk.metrics.export.Metric"], str
109-
] = lambda metric: metric.to_json()
108+
["opentelemetry.sdk.metrics.export.MetricsData"], str
109+
] = lambda metrics_data: metrics_data.to_json()
110110
+ linesep,
111111
):
112112
self.out = out

0 commit comments

Comments
 (0)