Skip to content

Commit 7dd8c5e

Browse files
committed
also preserve the other properties
1 parent a19056a commit 7dd8c5e

3 files changed

Lines changed: 97 additions & 75 deletions

File tree

langfuse/_client/get_client.py

Lines changed: 24 additions & 14 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,13 +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-
environment=instance.environment,
102-
)
118+
return _create_client_from_instance(instance)
103119

104120
else:
105121
# Multiple clients exist but no key specified - disable tracing
@@ -127,10 +143,4 @@ def get_client(*, public_key: Optional[str] = None) -> Langfuse:
127143
)
128144

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

langfuse/_client/resource_manager.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,16 @@ def _initialize_instance(
164164
self.mask = mask
165165
self.environment = environment
166166

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
176+
167177
# OTEL Tracer
168178
if tracing_enabled:
169179
tracer_provider = tracer_provider or _init_tracer_provider(

tests/test_resource_manager.py

Lines changed: 63 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,79 @@
1-
"""Test environment setting on Langfuse get_client() function."""
1+
"""Test the LangfuseResourceManager and get_client() function."""
22

3-
import pytest
43
from langfuse import Langfuse
54
from langfuse._client.get_client import get_client
5+
from langfuse._client.resource_manager import LangfuseResourceManager
66

77

8-
def test_get_client_preserves_environment():
9-
"""Test that get_client() preserves the environment when returning existing clients."""
10-
test_env = "production-test-env"
11-
original_client = Langfuse(environment=test_env)
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()
1212

13-
# Verify the original client has the correct environment
14-
assert original_client._environment == test_env, (
15-
f"original client environment should be '{test_env}', got '{original_client._environment}'"
16-
)
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+
}
1721

18-
# call get_client() should return a client with the same environment
22+
original_client = Langfuse(**settings)
1923
retrieved_client = get_client()
2024

21-
assert retrieved_client._environment == test_env, (
22-
f"get_client() should return client with environment '{test_env}', got '{retrieved_client._environment}'"
23-
)
24-
25-
original_client.shutdown()
26-
25+
assert retrieved_client._environment == settings["environment"]
2726

28-
def test_get_client_with_multiple_environments():
29-
"""Test get_client() behavior with multiple clients having different environments."""
30-
env_a = "environment-a"
31-
env_b = "environment-b"
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"]
3233

33-
client_a = Langfuse(public_key="pk-a", secret_key="sk-a", environment=env_a)
34-
client_b = Langfuse(public_key="pk-b", secret_key="sk-b", environment=env_b)
35-
36-
# original clients should have correct environments
37-
assert client_a._environment == env_a
38-
assert client_b._environment == env_b
34+
original_client.shutdown()
3935

40-
# Get clients using get_client() with specific public keys
41-
retrieved_a = get_client(public_key="pk-a")
42-
retrieved_b = get_client(public_key="pk-b")
4336

44-
# should have the same environments as the originals
45-
assert retrieved_a._environment == env_a, (
46-
f"Expected client A environment to be '{env_a}', got '{retrieved_a._environment}'"
47-
)
48-
assert retrieved_b._environment == env_b, (
49-
f"Expected client B environment to be '{env_b}', got '{retrieved_b._environment}'"
50-
)
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"]
5177

5278
client_a.shutdown()
5379
client_b.shutdown()
54-
55-
56-
def test_get_client_single_client_environment():
57-
"""Test that get_client() preserves environment in single-client scenario."""
58-
# Clean state - ensure no existing clients
59-
from langfuse._client.resource_manager import LangfuseResourceManager
60-
61-
with LangfuseResourceManager._lock:
62-
LangfuseResourceManager._instances.clear()
63-
64-
test_env = "single-client-env"
65-
66-
client = Langfuse(environment=test_env)
67-
assert client._environment == test_env
68-
69-
# get_client() should return a client with the same environment
70-
retrieved = get_client()
71-
72-
# This assertion demonstrates the bug
73-
assert retrieved._environment == test_env, (
74-
f"Expected single client scenario to preserve environment '{test_env}', got '{retrieved._environment}'"
75-
)
76-
77-
client.shutdown()

0 commit comments

Comments
 (0)