Skip to content

Commit bd1a5d3

Browse files
authored
fix(get_client): preserve properties on client such as environment (#1341)
* fix(get_client): preserve properties on client such as environment * also preserve the other properties
1 parent f153b59 commit bd1a5d3

File tree

3 files changed

+114
-12
lines changed

3 files changed

+114
-12
lines changed

langfuse/_client/get_client.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,28 @@ def _set_current_public_key(public_key: Optional[str]) -> Iterator[None]:
3333
_current_public_key.reset(token)
3434

3535

36+
def _create_client_from_instance(
37+
instance: "LangfuseResourceManager", public_key: Optional[str] = None
38+
) -> Langfuse:
39+
"""Create a Langfuse client from a resource manager instance with all settings preserved."""
40+
return Langfuse(
41+
public_key=public_key or instance.public_key,
42+
secret_key=instance.secret_key,
43+
host=instance.host,
44+
tracing_enabled=instance.tracing_enabled,
45+
environment=instance.environment,
46+
timeout=instance.timeout,
47+
flush_at=instance.flush_at,
48+
flush_interval=instance.flush_interval,
49+
release=instance.release,
50+
media_upload_thread_count=instance.media_upload_thread_count,
51+
sample_rate=instance.sample_rate,
52+
mask=instance.mask,
53+
blocked_instrumentation_scopes=instance.blocked_instrumentation_scopes,
54+
additional_headers=instance.additional_headers,
55+
)
56+
57+
3658
def get_client(*, public_key: Optional[str] = None) -> Langfuse:
3759
"""Get or create a Langfuse client instance.
3860
@@ -93,12 +115,7 @@ def get_client(*, public_key: Optional[str] = None) -> Langfuse:
93115
# Initialize with the credentials bound to the instance
94116
# This is important if the original instance was instantiated
95117
# via constructor arguments
96-
return Langfuse(
97-
public_key=instance.public_key,
98-
secret_key=instance.secret_key,
99-
host=instance.host,
100-
tracing_enabled=instance.tracing_enabled,
101-
)
118+
return _create_client_from_instance(instance)
102119

103120
else:
104121
# Multiple clients exist but no key specified - disable tracing
@@ -126,9 +143,4 @@ def get_client(*, public_key: Optional[str] = None) -> Langfuse:
126143
)
127144

128145
# target_instance is guaranteed to be not None at this point
129-
return Langfuse(
130-
public_key=public_key,
131-
secret_key=target_instance.secret_key,
132-
host=target_instance.host,
133-
tracing_enabled=target_instance.tracing_enabled,
134-
)
146+
return _create_client_from_instance(target_instance, public_key)

langfuse/_client/resource_manager.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,17 @@ def _initialize_instance(
162162
self.tracing_enabled = tracing_enabled
163163
self.host = host
164164
self.mask = mask
165+
self.environment = environment
166+
167+
# Store additional client settings for get_client() to use
168+
self.timeout = timeout
169+
self.flush_at = flush_at
170+
self.flush_interval = flush_interval
171+
self.release = release
172+
self.media_upload_thread_count = media_upload_thread_count
173+
self.sample_rate = sample_rate
174+
self.blocked_instrumentation_scopes = blocked_instrumentation_scopes
175+
self.additional_headers = additional_headers
165176

166177
# OTEL Tracer
167178
if tracing_enabled:

tests/test_resource_manager.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"""Test the LangfuseResourceManager and get_client() function."""
2+
3+
from langfuse import Langfuse
4+
from langfuse._client.get_client import get_client
5+
from langfuse._client.resource_manager import LangfuseResourceManager
6+
7+
8+
def test_get_client_preserves_all_settings():
9+
"""Test that get_client() preserves environment and all client settings."""
10+
with LangfuseResourceManager._lock:
11+
LangfuseResourceManager._instances.clear()
12+
13+
settings = {
14+
"environment": "test-env",
15+
"release": "v1.2.3",
16+
"timeout": 30,
17+
"flush_at": 100,
18+
"sample_rate": 0.8,
19+
"additional_headers": {"X-Custom": "value"},
20+
}
21+
22+
original_client = Langfuse(**settings)
23+
retrieved_client = get_client()
24+
25+
assert retrieved_client._environment == settings["environment"]
26+
27+
assert retrieved_client._resources is not None
28+
rm = retrieved_client._resources
29+
assert rm.environment == settings["environment"]
30+
assert rm.timeout == settings["timeout"]
31+
assert rm.sample_rate == settings["sample_rate"]
32+
assert rm.additional_headers == settings["additional_headers"]
33+
34+
original_client.shutdown()
35+
36+
37+
def test_get_client_multiple_clients_preserve_different_settings():
38+
"""Test that get_client() preserves different settings for multiple clients."""
39+
# Settings for client A
40+
settings_a = {
41+
"public_key": "pk-comprehensive-a",
42+
"secret_key": "sk-comprehensive-a",
43+
"environment": "env-a",
44+
"release": "release-a",
45+
"timeout": 10,
46+
"sample_rate": 0.5,
47+
}
48+
49+
# Settings for client B
50+
settings_b = {
51+
"public_key": "pk-comprehensive-b",
52+
"secret_key": "sk-comprehensive-b",
53+
"environment": "env-b",
54+
"release": "release-b",
55+
"timeout": 20,
56+
"sample_rate": 0.9,
57+
}
58+
59+
client_a = Langfuse(**settings_a)
60+
client_b = Langfuse(**settings_b)
61+
62+
# Get clients via get_client()
63+
retrieved_a = get_client(public_key="pk-comprehensive-a")
64+
retrieved_b = get_client(public_key="pk-comprehensive-b")
65+
66+
# Verify each client preserves its own settings
67+
assert retrieved_a._environment == settings_a["environment"]
68+
assert retrieved_b._environment == settings_b["environment"]
69+
70+
if retrieved_a._resources and retrieved_b._resources:
71+
assert retrieved_a._resources.timeout == settings_a["timeout"]
72+
assert retrieved_b._resources.timeout == settings_b["timeout"]
73+
assert retrieved_a._resources.sample_rate == settings_a["sample_rate"]
74+
assert retrieved_b._resources.sample_rate == settings_b["sample_rate"]
75+
assert retrieved_a._resources.release == settings_a["release"]
76+
assert retrieved_b._resources.release == settings_b["release"]
77+
78+
client_a.shutdown()
79+
client_b.shutdown()

0 commit comments

Comments
 (0)