codekingpro/portable-devtools
114k
1# Copyright The OpenTelemetry Authors2#3# Licensed under the Apache License, Version 2.0 (the "License");4# you may not use this file except in compliance with the License.5# You may obtain a copy of the License at6#7# http://www.apache.org/licenses/LICENSE-2.08#9# Unless required by applicable law or agreed to in writing, software10# distributed under the License is distributed on an "AS IS" BASIS,11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12# See the License for the specific language governing permissions and13# limitations under the License.14 15from abc import ABC, abstractmethod16from logging import getLogger17from os import environ18from typing import Optional, cast19 20from typing_extensions import deprecated21 22from opentelemetry._logs import LogRecord23from opentelemetry._logs.severity import SeverityNumber24from opentelemetry.environment_variables import (25 _OTEL_PYTHON_EVENT_LOGGER_PROVIDER,26)27from opentelemetry.trace.span import TraceFlags28from opentelemetry.util._once import Once29from opentelemetry.util._providers import _load_provider30from opentelemetry.util.types import AnyValue, _ExtendedAttributes31 32_logger = getLogger(__name__)33 34 35@deprecated(36 "You should use `LogRecord` with the `event_name` field set instead. "37 "Deprecated since version 1.39.0 and will be removed in a future release."38)39class Event(LogRecord):40 def __init__(41 self,42 name: str,43 timestamp: Optional[int] = None,44 trace_id: Optional[int] = None,45 span_id: Optional[int] = None,46 trace_flags: Optional["TraceFlags"] = None,47 body: Optional[AnyValue] = None,48 severity_number: Optional[SeverityNumber] = None,49 attributes: Optional[_ExtendedAttributes] = None,50 ):51 attributes = attributes or {}52 event_attributes = {53 **attributes,54 "event.name": name,55 }56 super().__init__(57 timestamp=timestamp,58 trace_id=trace_id,59 span_id=span_id,60 trace_flags=trace_flags,61 body=body,62 severity_number=severity_number,63 attributes=event_attributes,64 )65 self.name = name66 67 68@deprecated(69 "You should use `Logger` instead. "70 "Deprecated since version 1.39.0 and will be removed in a future release."71)72class EventLogger(ABC):73 def __init__(74 self,75 name: str,76 version: Optional[str] = None,77 schema_url: Optional[str] = None,78 attributes: Optional[_ExtendedAttributes] = None,79 ):80 self._name = name81 self._version = version82 self._schema_url = schema_url83 self._attributes = attributes84 85 @abstractmethod86 def emit(self, event: "Event") -> None:87 """Emits a :class:`Event` representing an event."""88 89 90@deprecated(91 "You should use `NoOpLogger` instead. "92 "Deprecated since version 1.39.0 and will be removed in a future release."93)94class NoOpEventLogger(EventLogger):95 def emit(self, event: Event) -> None:96 pass97 98 99@deprecated(100 "You should use `ProxyLogger` instead. "101 "Deprecated since version 1.39.0 and will be removed in a future release."102)103class ProxyEventLogger(EventLogger):104 def __init__(105 self,106 name: str,107 version: Optional[str] = None,108 schema_url: Optional[str] = None,109 attributes: Optional[_ExtendedAttributes] = None,110 ):111 super().__init__(112 name=name,113 version=version,114 schema_url=schema_url,115 attributes=attributes,116 )117 self._real_event_logger: Optional[EventLogger] = None118 self._noop_event_logger = NoOpEventLogger(name)119 120 @property121 def _event_logger(self) -> EventLogger:122 if self._real_event_logger:123 return self._real_event_logger124 125 if _EVENT_LOGGER_PROVIDER:126 self._real_event_logger = _EVENT_LOGGER_PROVIDER.get_event_logger(127 self._name,128 self._version,129 self._schema_url,130 self._attributes,131 )132 return self._real_event_logger133 return self._noop_event_logger134 135 def emit(self, event: Event) -> None:136 self._event_logger.emit(event)137 138 139@deprecated(140 "You should use `LoggerProvider` instead. "141 "Deprecated since version 1.39.0 and will be removed in a future release."142)143class EventLoggerProvider(ABC):144 @abstractmethod145 def get_event_logger(146 self,147 name: str,148 version: Optional[str] = None,149 schema_url: Optional[str] = None,150 attributes: Optional[_ExtendedAttributes] = None,151 ) -> EventLogger:152 """Returns an EventLoggerProvider for use."""153 154 155@deprecated(156 "You should use `NoOpLoggerProvider` instead. "157 "Deprecated since version 1.39.0 and will be removed in a future release."158)159class NoOpEventLoggerProvider(EventLoggerProvider):160 def get_event_logger(161 self,162 name: str,163 version: Optional[str] = None,164 schema_url: Optional[str] = None,165 attributes: Optional[_ExtendedAttributes] = None,166 ) -> EventLogger:167 return NoOpEventLogger(168 name, version=version, schema_url=schema_url, attributes=attributes169 )170 171 172@deprecated(173 "You should use `ProxyLoggerProvider` instead. "174 "Deprecated since version 1.39.0 and will be removed in a future release."175)176class ProxyEventLoggerProvider(EventLoggerProvider):177 def get_event_logger(178 self,179 name: str,180 version: Optional[str] = None,181 schema_url: Optional[str] = None,182 attributes: Optional[_ExtendedAttributes] = None,183 ) -> EventLogger:184 if _EVENT_LOGGER_PROVIDER:185 return _EVENT_LOGGER_PROVIDER.get_event_logger(186 name,187 version=version,188 schema_url=schema_url,189 attributes=attributes,190 )191 return ProxyEventLogger(192 name,193 version=version,194 schema_url=schema_url,195 attributes=attributes,196 )197 198 199_EVENT_LOGGER_PROVIDER_SET_ONCE = Once()200_EVENT_LOGGER_PROVIDER: Optional[EventLoggerProvider] = None201_PROXY_EVENT_LOGGER_PROVIDER = ProxyEventLoggerProvider()202 203 204@deprecated(205 "You should use `get_logger_provider` instead. "206 "Deprecated since version 1.39.0 and will be removed in a future release."207)208def get_event_logger_provider() -> EventLoggerProvider:209 global _EVENT_LOGGER_PROVIDER # pylint: disable=global-variable-not-assigned210 if _EVENT_LOGGER_PROVIDER is None:211 if _OTEL_PYTHON_EVENT_LOGGER_PROVIDER not in environ:212 return _PROXY_EVENT_LOGGER_PROVIDER213 214 event_logger_provider: EventLoggerProvider = _load_provider( # type: ignore215 _OTEL_PYTHON_EVENT_LOGGER_PROVIDER, "event_logger_provider"216 )217 218 _set_event_logger_provider(event_logger_provider, log=False)219 220 return cast("EventLoggerProvider", _EVENT_LOGGER_PROVIDER)221 222 223def _set_event_logger_provider(224 event_logger_provider: EventLoggerProvider, log: bool225) -> None:226 def set_elp() -> None:227 global _EVENT_LOGGER_PROVIDER # pylint: disable=global-statement228 _EVENT_LOGGER_PROVIDER = event_logger_provider229 230 did_set = _EVENT_LOGGER_PROVIDER_SET_ONCE.do_once(set_elp)231 232 if log and not did_set:233 _logger.warning(234 "Overriding of current EventLoggerProvider is not allowed"235 )236 237 238@deprecated(239 "You should use `set_logger_provider` instead. "240 "Deprecated since version 1.39.0 and will be removed in a future release."241)242def set_event_logger_provider(243 event_logger_provider: EventLoggerProvider,244) -> None:245 _set_event_logger_provider(event_logger_provider, log=True)246 247 248@deprecated(249 "You should use `get_logger` instead. "250 "Deprecated since version 1.39.0 and will be removed in a future release."251)252def get_event_logger(253 name: str,254 version: Optional[str] = None,255 schema_url: Optional[str] = None,256 attributes: Optional[_ExtendedAttributes] = None,257 event_logger_provider: Optional[EventLoggerProvider] = None,258) -> "EventLogger":259 if event_logger_provider is None:260 event_logger_provider = get_event_logger_provider()261 return event_logger_provider.get_event_logger(262 name,263 version,264 schema_url,265 attributes,266 )267 