beamlit 0.0.34rc54__py3-none-any.whl → 0.0.34rc56__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,12 @@
1
+ import logging
1
2
  from typing import Any
2
3
 
3
4
  from fastapi import FastAPI
4
- from opentelemetry import metrics, trace
5
+ from opentelemetry import _logs, metrics, trace
6
+ from opentelemetry._logs import set_logger_provider
7
+ from opentelemetry.exporter.otlp.proto.grpc._log_exporter import (
8
+ OTLPLogExporter,
9
+ )
5
10
  from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import (
6
11
  OTLPMetricExporter,
7
12
  )
@@ -10,7 +15,12 @@ from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
10
15
  )
11
16
  from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
12
17
  from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
18
+ from opentelemetry.instrumentation.system_metrics import (
19
+ SystemMetricsInstrumentor,
20
+ )
13
21
  from opentelemetry.metrics import NoOpMeterProvider
22
+ from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
23
+ from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
14
24
  from opentelemetry.sdk.metrics import MeterProvider
15
25
  from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
16
26
  from opentelemetry.sdk.resources import Resource
@@ -19,22 +29,28 @@ from opentelemetry.sdk.trace.export import BatchSpanProcessor
19
29
  from opentelemetry.trace import NoOpTracerProvider
20
30
  from typing_extensions import Dict
21
31
 
32
+ from beamlit.authentication import get_authentication_headers
33
+
22
34
  from .settings import get_settings
23
35
 
24
36
  tracer: trace.Tracer | None = None
25
37
  meter: metrics.Meter | None = None
38
+ logger: LoggerProvider | None = None
26
39
 
27
40
 
28
- def get_tracer() -> trace.Tracer:
29
- if tracer is None:
30
- raise Exception("Tracer is not initialized")
31
- return tracer
41
+ def auth_headers() -> Dict[str, str]:
42
+ settings = get_settings()
43
+ headers = get_authentication_headers(settings)
44
+ return {
45
+ "x-beamlit-authorization": headers.get("X-Beamlit-Authorization", ""),
46
+ "x-beamlit-workspace": headers.get("X-Beamlit-Workspace", ""),
47
+ }
32
48
 
33
49
 
34
- def get_meter() -> metrics.Meter:
35
- if meter is None:
36
- raise Exception("Meter is not initialized")
37
- return meter
50
+ def get_logger() -> LoggerProvider:
51
+ if logger is None:
52
+ raise Exception("Logger is not initialized")
53
+ return logger
38
54
 
39
55
 
40
56
  def get_resource_attributes() -> Dict[str, Any]:
@@ -43,8 +59,6 @@ def get_resource_attributes() -> Dict[str, Any]:
43
59
  for key in resources.attributes:
44
60
  resources_dict[key] = resources.attributes[key]
45
61
  settings = get_settings()
46
- if settings is None:
47
- raise Exception("Settings are not initialized")
48
62
  resources_dict["workspace"] = settings.workspace
49
63
  resources_dict["service.name"] = settings.name
50
64
  return resources_dict
@@ -52,28 +66,29 @@ def get_resource_attributes() -> Dict[str, Any]:
52
66
 
53
67
  def get_metrics_exporter() -> OTLPMetricExporter | None:
54
68
  settings = get_settings()
55
- if settings is None:
56
- raise Exception("Settings are not initialized")
57
69
  if not settings.enable_opentelemetry:
58
- # Return None or a NoOpExporter equivalent
59
70
  return None
60
- return OTLPMetricExporter()
71
+ return OTLPMetricExporter(headers=auth_headers())
61
72
 
62
73
 
63
74
  def get_span_exporter() -> OTLPSpanExporter | None:
64
75
  settings = get_settings()
65
76
  if not settings.enable_opentelemetry:
66
77
  return None
67
- return OTLPSpanExporter()
78
+ return OTLPSpanExporter(headers=auth_headers())
79
+
80
+
81
+ def get_log_exporter() -> OTLPLogExporter | None:
82
+ settings = get_settings()
83
+ if not settings.enable_opentelemetry:
84
+ return None
85
+ return OTLPLogExporter(headers=auth_headers())
68
86
 
69
87
 
70
88
  def instrument_app(app: FastAPI):
71
89
  global tracer
72
90
  global meter
73
91
  settings = get_settings()
74
- if settings is None:
75
- raise Exception("Settings are not initialized")
76
-
77
92
  if not settings.enable_opentelemetry:
78
93
  # Use NoOp implementations to stub tracing and metrics
79
94
  trace.set_tracer_provider(NoOpTracerProvider())
@@ -111,9 +126,24 @@ def instrument_app(app: FastAPI):
111
126
  meter = meter_provider.get_meter(__name__)
112
127
  else:
113
128
  meter = metrics.get_meter(__name__)
129
+
130
+ if not isinstance(_logs.get_logger_provider(), LoggerProvider):
131
+ logger_provider = LoggerProvider()
132
+ set_logger_provider(logger_provider)
133
+ logger_provider.add_log_record_processor(
134
+ BatchLogRecordProcessor(get_log_exporter())
135
+ )
136
+ handler = LoggingHandler(
137
+ level=logging.NOTSET, logger_provider=logger_provider
138
+ )
139
+ logging.getLogger().addHandler(handler)
140
+ else:
141
+ logger_provider = _logs.get_logger_provider()
142
+
114
143
  # Only instrument the app when OpenTelemetry is enabled
115
144
  FastAPIInstrumentor.instrument_app(app)
116
145
  HTTPXClientInstrumentor().instrument()
146
+ SystemMetricsInstrumentor().instrument()
117
147
 
118
148
 
119
149
  def shutdown_instrumentation():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beamlit
3
- Version: 0.0.34rc54
3
+ Version: 0.0.34rc56
4
4
  Summary: Add your description here
5
5
  Author-email: cploujoux <ch.ploujoux@gmail.com>
6
6
  Requires-Python: >=3.12
@@ -17,6 +17,7 @@ Requires-Dist: opentelemetry-api>=1.28.2
17
17
  Requires-Dist: opentelemetry-exporter-otlp>=1.28.2
18
18
  Requires-Dist: opentelemetry-instrumentation-fastapi>=0.49b2
19
19
  Requires-Dist: opentelemetry-instrumentation-httpx>=0.49b2
20
+ Requires-Dist: opentelemetry-instrumentation-system-metrics>=0.50b0
20
21
  Requires-Dist: opentelemetry-sdk>=1.28.2
21
22
  Requires-Dist: pydantic-settings<2.7.0,>=2.6.1
22
23
  Requires-Dist: pydantic<2.11.0,>=2.10.3
@@ -130,7 +130,7 @@ beamlit/authentication/credentials.py,sha256=p_1xenabCbQuRz7BiFk7oTK4uCxAt_zoyku
130
130
  beamlit/authentication/device_mode.py,sha256=tmr22gllKOZwBRub_QjF5pYa425x-nE8tQNpZ_EGR6g,3644
131
131
  beamlit/common/__init__.py,sha256=saX5X3hRCJ9erSlXuSkZ2VGgquvpgdcofAU_9sM4bCE,354
132
132
  beamlit/common/error.py,sha256=f9oJDFxhoHK-vpjxBgEp0NwWIk0N_THPemUI7uQxVzU,270
133
- beamlit/common/instrumentation.py,sha256=snsH72EA2_RsM3E9qL9KRiuTSNYGkFKVN3NlGblRogw,4331
133
+ beamlit/common/instrumentation.py,sha256=8aR5XLLq22_vScJlDqQVxvqFG-0K4ymqJ98DUp7Lb74,5471
134
134
  beamlit/common/logger.py,sha256=nN_dSOl4bs13QU3Rod-w3e3jYOnlSrHx3_bs-ACY6Aw,1115
135
135
  beamlit/common/secrets.py,sha256=sid81bOe3LflkMKDHwBsBs9nIju8bp5-v9qU9gkyNMc,212
136
136
  beamlit/common/settings.py,sha256=b2rvby-ufG3M0AB1ReoWFM-1EzF1LaE-gbokO9HvQDI,3810
@@ -256,6 +256,6 @@ beamlit/serve/app.py,sha256=gYQvUK_S7g0Em-idND8HrVDqgg5LlIemheSGlX2Jj8U,3638
256
256
  beamlit/serve/middlewares/__init__.py,sha256=1dVmnOmhAQWvWktqHkKSIX-YoF6fmMU8xkUQuhg_rJU,148
257
257
  beamlit/serve/middlewares/accesslog.py,sha256=Mu4T4_9OvHybjA0ApzZFpgi2C8f3X1NbUk-76v634XM,631
258
258
  beamlit/serve/middlewares/processtime.py,sha256=lDAaIasZ4bwvN-HKHvZpaD9r-yrkVNZYx4abvbjbrCg,411
259
- beamlit-0.0.34rc54.dist-info/METADATA,sha256=Dio5lsBaSZ3GI-top1rPGxCQCkykLx7cgLL274ZimBo,2344
260
- beamlit-0.0.34rc54.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
261
- beamlit-0.0.34rc54.dist-info/RECORD,,
259
+ beamlit-0.0.34rc56.dist-info/METADATA,sha256=b7oOq6dqYesq2q5ivAj5ckFcfIZ_KLdOW_HUokE0Lpc,2412
260
+ beamlit-0.0.34rc56.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
261
+ beamlit-0.0.34rc56.dist-info/RECORD,,