Singleton class for managing OpenTelemetry configuration and operations.
This class provides a centralized way to initialize OpenTelemetry and control
sampling behavior at runtime.
Example usage
from glide_sync import OpenTelemetry, OpenTelemetryConfig, OpenTelemetryTracesConfig, OpenTelemetryMetricsConfig
OpenTelemetry.init(OpenTelemetryConfig(
traces=OpenTelemetryTracesConfig(
endpoint="http://localhost:4318/v1/traces",
sample_percentage=10 # Optional, defaults to 1. Can also be changed at runtime via set_sample_percentage().
),
metrics=OpenTelemetryMetricsConfig(
endpoint="http://localhost:4318/v1/metrics"
),
flush_interval_ms=1000 # Optional, defaults to 5000
))
Note
OpenTelemetry can only be initialized once per process. Subsequent calls to
init() will be ignored. This is by design, as OpenTelemetry is a global
resource that should be configured once at application startup.
Source code in doc-gen/valkey-glide/python/glide-sync/glide_sync/opentelemetry.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 | class OpenTelemetry:
"""
Singleton class for managing OpenTelemetry configuration and operations.
This class provides a centralized way to initialize OpenTelemetry and control
sampling behavior at runtime.
Example usage:
```python
from glide_sync import OpenTelemetry, OpenTelemetryConfig, OpenTelemetryTracesConfig, OpenTelemetryMetricsConfig
OpenTelemetry.init(OpenTelemetryConfig(
traces=OpenTelemetryTracesConfig(
endpoint="http://localhost:4318/v1/traces",
sample_percentage=10 # Optional, defaults to 1. Can also be changed at runtime via set_sample_percentage().
),
metrics=OpenTelemetryMetricsConfig(
endpoint="http://localhost:4318/v1/metrics"
),
flush_interval_ms=1000 # Optional, defaults to 5000
))
```
Note:
OpenTelemetry can only be initialized once per process. Subsequent calls to
init() will be ignored. This is by design, as OpenTelemetry is a global
resource that should be configured once at application startup.
"""
_instance: Optional["OpenTelemetry"] = None
_config: Optional[OpenTelemetryConfig] = None
@classmethod
def init(cls, config: OpenTelemetryConfig) -> None:
"""
Initialize the OpenTelemetry instance.
Args:
config: The OpenTelemetry configuration
Note:
OpenTelemetry can only be initialized once per process.
Subsequent calls will be ignored and a warning will be logged.
"""
if not cls._instance:
cls._config = config
ffi = GlideFFI.ffi
lib = GlideFFI.lib
# Build FFI config struct - keep string references alive
traces_ptr = ffi.NULL
traces_endpoint_cstr = None
if config.traces:
traces_endpoint_cstr = ffi.new(
"char[]", config.traces.endpoint.encode()
)
traces_config = ffi.new("OpenTelemetryTracesConfig*")
traces_config.endpoint = traces_endpoint_cstr
traces_config.has_sample_percentage = True
traces_config.sample_percentage = config.traces.sample_percentage
traces_ptr = traces_config
metrics_ptr = ffi.NULL
metrics_endpoint_cstr = None
if config.metrics:
metrics_endpoint_cstr = ffi.new(
"char[]", config.metrics.endpoint.encode()
)
metrics_config = ffi.new("OpenTelemetryMetricsConfig*")
metrics_config.endpoint = metrics_endpoint_cstr
metrics_ptr = metrics_config
otel_config = ffi.new("OpenTelemetryConfig*")
otel_config.traces = traces_ptr
otel_config.metrics = metrics_ptr
otel_config.has_flush_interval_ms = config.flush_interval_ms is not None
otel_config.flush_interval_ms = (
config.flush_interval_ms if config.flush_interval_ms else 0
)
error = lib.init_open_telemetry(otel_config)
if error != ffi.NULL:
error_msg = ffi.string(error).decode()
lib.free_c_string(error)
raise ConfigurationError(
f"Failed to initialize OpenTelemetry: {error_msg}"
)
cls._instance = OpenTelemetry()
Logger.log(
Level.INFO,
"GlideOpenTelemetry",
"OpenTelemetry initialized successfully",
)
return
Logger.log(
Level.WARN,
"GlideOpenTelemetry",
"OpenTelemetry already initialized - ignoring new configuration",
)
@classmethod
def is_initialized(cls) -> bool:
"""
Check if the OpenTelemetry instance is initialized.
Returns:
bool: True if the OpenTelemetry instance is initialized, False otherwise
"""
return cls._instance is not None
@classmethod
def get_sample_percentage(cls) -> Optional[int]:
"""
Get the sample percentage for traces.
Returns:
Optional[int]: The sample percentage for traces only if OpenTelemetry is initialized
and the traces config is set, otherwise None.
"""
if cls._config and cls._config.traces:
return cls._config.traces.sample_percentage
return None
@classmethod
def should_sample(cls) -> bool:
"""
Determines if the current request should be sampled for OpenTelemetry tracing.
Uses the configured sample percentage to randomly decide whether to create a span for this request.
Returns:
bool: True if the request should be sampled, False otherwise
"""
percentage = cls.get_sample_percentage()
return (
cls.is_initialized()
and percentage is not None
and random.random() * 100 < percentage
)
@classmethod
def set_sample_percentage(cls, percentage: int) -> None:
"""
Set the percentage of requests to be sampled and traced. Must be a value between 0 and 100.
This setting only affects traces, not metrics.
Args:
percentage: The sample percentage 0-100
Raises:
ConfigurationError: If OpenTelemetry is not initialized or traces config is not set
Remarks:
This method can be called at runtime to change the sampling percentage
without reinitializing OpenTelemetry.
"""
if not cls._config or not cls._config.traces:
raise ConfigurationError("OpenTelemetry traces not initialized")
if percentage < 0 or percentage > 100:
raise ConfigurationError("Sample percentage must be between 0 and 100")
# Update the shared config directly
cls._config.traces.sample_percentage = percentage
|
init(config)
classmethod
Initialize the OpenTelemetry instance.
Parameters:
| Name |
Type |
Description |
Default |
config
|
OpenTelemetryConfig
|
The OpenTelemetry configuration
|
required
|
Note
OpenTelemetry can only be initialized once per process.
Subsequent calls will be ignored and a warning will be logged.
Source code in doc-gen/valkey-glide/python/glide-sync/glide_sync/opentelemetry.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 | @classmethod
def init(cls, config: OpenTelemetryConfig) -> None:
"""
Initialize the OpenTelemetry instance.
Args:
config: The OpenTelemetry configuration
Note:
OpenTelemetry can only be initialized once per process.
Subsequent calls will be ignored and a warning will be logged.
"""
if not cls._instance:
cls._config = config
ffi = GlideFFI.ffi
lib = GlideFFI.lib
# Build FFI config struct - keep string references alive
traces_ptr = ffi.NULL
traces_endpoint_cstr = None
if config.traces:
traces_endpoint_cstr = ffi.new(
"char[]", config.traces.endpoint.encode()
)
traces_config = ffi.new("OpenTelemetryTracesConfig*")
traces_config.endpoint = traces_endpoint_cstr
traces_config.has_sample_percentage = True
traces_config.sample_percentage = config.traces.sample_percentage
traces_ptr = traces_config
metrics_ptr = ffi.NULL
metrics_endpoint_cstr = None
if config.metrics:
metrics_endpoint_cstr = ffi.new(
"char[]", config.metrics.endpoint.encode()
)
metrics_config = ffi.new("OpenTelemetryMetricsConfig*")
metrics_config.endpoint = metrics_endpoint_cstr
metrics_ptr = metrics_config
otel_config = ffi.new("OpenTelemetryConfig*")
otel_config.traces = traces_ptr
otel_config.metrics = metrics_ptr
otel_config.has_flush_interval_ms = config.flush_interval_ms is not None
otel_config.flush_interval_ms = (
config.flush_interval_ms if config.flush_interval_ms else 0
)
error = lib.init_open_telemetry(otel_config)
if error != ffi.NULL:
error_msg = ffi.string(error).decode()
lib.free_c_string(error)
raise ConfigurationError(
f"Failed to initialize OpenTelemetry: {error_msg}"
)
cls._instance = OpenTelemetry()
Logger.log(
Level.INFO,
"GlideOpenTelemetry",
"OpenTelemetry initialized successfully",
)
return
Logger.log(
Level.WARN,
"GlideOpenTelemetry",
"OpenTelemetry already initialized - ignoring new configuration",
)
|
is_initialized()
classmethod
Check if the OpenTelemetry instance is initialized.
Returns:
| Name | Type |
Description |
bool |
bool
|
True if the OpenTelemetry instance is initialized, False otherwise
|
Source code in doc-gen/valkey-glide/python/glide-sync/glide_sync/opentelemetry.py
125
126
127
128
129
130
131
132
133 | @classmethod
def is_initialized(cls) -> bool:
"""
Check if the OpenTelemetry instance is initialized.
Returns:
bool: True if the OpenTelemetry instance is initialized, False otherwise
"""
return cls._instance is not None
|
get_sample_percentage()
classmethod
Get the sample percentage for traces.
Returns:
| Type |
Description |
Optional[int]
|
Optional[int]: The sample percentage for traces only if OpenTelemetry is initialized
and the traces config is set, otherwise None.
|
Source code in doc-gen/valkey-glide/python/glide-sync/glide_sync/opentelemetry.py
135
136
137
138
139
140
141
142
143
144
145
146 | @classmethod
def get_sample_percentage(cls) -> Optional[int]:
"""
Get the sample percentage for traces.
Returns:
Optional[int]: The sample percentage for traces only if OpenTelemetry is initialized
and the traces config is set, otherwise None.
"""
if cls._config and cls._config.traces:
return cls._config.traces.sample_percentage
return None
|
should_sample()
classmethod
Determines if the current request should be sampled for OpenTelemetry tracing.
Uses the configured sample percentage to randomly decide whether to create a span for this request.
Returns:
| Name | Type |
Description |
bool |
bool
|
True if the request should be sampled, False otherwise
|
Source code in doc-gen/valkey-glide/python/glide-sync/glide_sync/opentelemetry.py
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162 | @classmethod
def should_sample(cls) -> bool:
"""
Determines if the current request should be sampled for OpenTelemetry tracing.
Uses the configured sample percentage to randomly decide whether to create a span for this request.
Returns:
bool: True if the request should be sampled, False otherwise
"""
percentage = cls.get_sample_percentage()
return (
cls.is_initialized()
and percentage is not None
and random.random() * 100 < percentage
)
|
set_sample_percentage(percentage)
classmethod
Set the percentage of requests to be sampled and traced. Must be a value between 0 and 100.
This setting only affects traces, not metrics.
Parameters:
| Name |
Type |
Description |
Default |
percentage
|
int
|
The sample percentage 0-100
|
required
|
Raises:
| Type |
Description |
ConfigurationError
|
If OpenTelemetry is not initialized or traces config is not set
|
Source code in doc-gen/valkey-glide/python/glide-sync/glide_sync/opentelemetry.py
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 | @classmethod
def set_sample_percentage(cls, percentage: int) -> None:
"""
Set the percentage of requests to be sampled and traced. Must be a value between 0 and 100.
This setting only affects traces, not metrics.
Args:
percentage: The sample percentage 0-100
Raises:
ConfigurationError: If OpenTelemetry is not initialized or traces config is not set
Remarks:
This method can be called at runtime to change the sampling percentage
without reinitializing OpenTelemetry.
"""
if not cls._config or not cls._config.traces:
raise ConfigurationError("OpenTelemetry traces not initialized")
if percentage < 0 or percentage > 100:
raise ConfigurationError("Sample percentage must be between 0 and 100")
# Update the shared config directly
cls._config.traces.sample_percentage = percentage
|