From aa60ba8c3b7c3371345e6e2ecc6864d41e9ecc3a Mon Sep 17 00:00:00 2001 From: thiagobomfin-galileo Date: Wed, 13 May 2026 10:57:14 -0300 Subject: [PATCH] docs: adjust observability pages snippets Add Python (Beta) snippet siblings for the observability nav group, mirroring the experiments-pages rollout (PR #850). Beta variants demonstrate the new `LogStream` class for routing logs via `LogStream.context()` instead of `galileo_context(project=..., log_stream=...)`. --- sdk-api/logging/galileo-context.mdx | 2 + sdk-api/logging/galileo-logger.mdx | 2 + .../logging/log-decorator/log-decorator.mdx | 2 + sdk-api/logging/logging-basics.mdx | 4 + sdk-api/logging/tags-and-metadata.mdx | 4 + .../log-decorator-context-management.mdx | 14 +++ .../sdk/logging/context-get-logger.mdx | 9 ++ .../logging/create-logger-with-project.mdx | 10 +++ .../python-beta/sdk/logging/create-logger.mdx | 15 ++++ .../sdk/logging/nesting-scopes.mdx | 17 ++++ .../tags-and-metadata-py-1.mdx | 23 +++++ .../tags-and-metadata-py-7.mdx | 89 +++++++++++++++++++ 12 files changed, 191 insertions(+) create mode 100644 snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx create mode 100644 snippets/code/python-beta/sdk/logging/context-get-logger.mdx create mode 100644 snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx create mode 100644 snippets/code/python-beta/sdk/logging/create-logger.mdx create mode 100644 snippets/code/python-beta/sdk/logging/nesting-scopes.mdx create mode 100644 snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx create mode 100644 snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx diff --git a/sdk-api/logging/galileo-context.mdx b/sdk-api/logging/galileo-context.mdx index 0d4442aa9..b8e6652d6 100644 --- a/sdk-api/logging/galileo-context.mdx +++ b/sdk-api/logging/galileo-context.mdx @@ -17,6 +17,7 @@ import SnippetSdkLoggingContextSimpleWithLogPythonBeta from "/snippets/code/pyth import SnippetSdkLoggingContextSimpleWithOpenAIPython from "/snippets/code/python/sdk/logging/context-simple-with-openai.mdx"; import SnippetSdkLoggingContextSimpleWithOpenAIPythonBeta from "/snippets/code/python-beta/sdk/logging/context-simple-with-openai.mdx"; import SnippetSdkLoggingNestingScopesPython from "/snippets/code/python/sdk/logging/nesting-scopes.mdx"; +import SnippetSdkLoggingNestingScopesPythonBeta from "/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx"; import SnippetSdkLoggingContextNewSessionPython from "/snippets/code/python/sdk/logging/context-new-session.mdx"; import SnippetSdkLoggingContextNewSessionExternalIdPython from "/snippets/code/python/sdk/logging/context-new-session-external-id.mdx"; import SnippetSdkLoggingContextContinueSessionPython from "/snippets/code/python/sdk/logging/context-continue-session.mdx"; @@ -83,6 +84,7 @@ You can nest `galileo_context` calls to temporarily override the project or Log + ## Get the current logger diff --git a/sdk-api/logging/galileo-logger.mdx b/sdk-api/logging/galileo-logger.mdx index 81314146d..10979bd6e 100644 --- a/sdk-api/logging/galileo-logger.mdx +++ b/sdk-api/logging/galileo-logger.mdx @@ -9,6 +9,7 @@ import SnippetSdkLoggingGetLoggerPython from "/snippets/code/python/sdk/logging/ import SnippetSdkLoggingGetLoggerDecoratorPython from "/snippets/code/python/sdk/logging/logger-from-context-log-decorator.mdx"; import SnippetSdkLoggingBasicLoggingPython from "/snippets/code/python/sdk/logging/basic-logging.mdx"; import SnippetSdkLoggingCreateLoggerPython from "/snippets/code/python/sdk/logging/create-logger.mdx"; +import SnippetSdkLoggingCreateLoggerPythonBeta from "/snippets/code/python-beta/sdk/logging/create-logger.mdx"; import SnippetSdkLoggingStartLoggerSessionPython from "/snippets/code/python/sdk/logging/start-logger-session.mdx"; import SnippetSdkLoggingStartLoggerSessionMetadataPython from "/snippets/code/python/sdk/logging/start-logger-session-metadata.mdx"; import SnippetSdkLoggingStartLoggerSessionMetadataTypeScript from "/snippets/code/typescript/sdk/logging/start-logger-session-metadata.mdx"; @@ -109,6 +110,7 @@ This example: + diff --git a/sdk-api/logging/log-decorator/log-decorator.mdx b/sdk-api/logging/log-decorator/log-decorator.mdx index 803b37d2d..cd0b3f198 100644 --- a/sdk-api/logging/log-decorator/log-decorator.mdx +++ b/sdk-api/logging/log-decorator/log-decorator.mdx @@ -10,6 +10,7 @@ import SnippetLogDecoratorBasicUsagePython from "/snippets/code/python/sdk/decor import SnippetLogDecoratorAdditionalParamsPython from "/snippets/code/python/sdk/decorators/log-decorator-additional-params.mdx"; import SnippetLogDecoratorMetadataTagsPython from "/snippets/code/python/sdk/decorators/log-decorator-metadata-tags.mdx"; import SnippetLogDecoratorContextManagementPython from "/snippets/code/python/sdk/decorators/log-decorator-context-management.mdx"; +import SnippetLogDecoratorContextManagementPythonBeta from "/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx"; import SnippetLogDecoratorGeneratorsPython from "/snippets/code/python/sdk/decorators/log-decorator-generators.mdx"; import SnippetSdkWrappersOpenAILogDecoratorPython from "/snippets/code/python/sdk/wrappers/openai-log-decorator.mdx"; @@ -130,6 +131,7 @@ In Python, you can use the `galileo_context` to set the project and Log stream f + ## Handling generators (Python) diff --git a/sdk-api/logging/logging-basics.mdx b/sdk-api/logging/logging-basics.mdx index dce0c844f..cd731334a 100644 --- a/sdk-api/logging/logging-basics.mdx +++ b/sdk-api/logging/logging-basics.mdx @@ -8,7 +8,9 @@ description: Learn the basics of instrumenting your application with Galileo usi import SnippetSdkLoggingContextInitPython from "/snippets/code/python/sdk/logging/context-init.mdx"; import SnippetSdkLoggingContextInitPythonBeta from "/snippets/code/python-beta/sdk/logging/context-init.mdx"; import SnippetSdkLoggingCreateLoggerWithProjectPython from "/snippets/code/python/sdk/logging/create-logger-with-project.mdx"; +import SnippetSdkLoggingCreateLoggerWithProjectPythonBeta from "/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx"; import SnippetSdkLoggingContextGetLoggerPython from "/snippets/code/python/sdk/logging/context-get-logger.mdx"; +import SnippetSdkLoggingContextGetLoggerPythonBeta from "/snippets/code/python-beta/sdk/logging/context-get-logger.mdx"; import SnippetSdkLoggingContextInitTypeScript from "/snippets/code/typescript/sdk/logging/context-init.mdx"; import SnippetSdkLoggingCreateLoggerWithProjectTypeScript from "/snippets/code/typescript/sdk/logging/create-logger-with-project.mdx"; @@ -96,6 +98,7 @@ To set the project and Log stream for a single logger, you can pass it to the lo + @@ -103,6 +106,7 @@ You can also use the current context to get a logger for a particular project an + diff --git a/sdk-api/logging/tags-and-metadata.mdx b/sdk-api/logging/tags-and-metadata.mdx index 661b3589e..c98fa6340 100644 --- a/sdk-api/logging/tags-and-metadata.mdx +++ b/sdk-api/logging/tags-and-metadata.mdx @@ -7,12 +7,14 @@ description: Learn to use tags and metadata in Galileo logging and monitoring import SnippetTagsAndMetadataPython1 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-1.mdx'; +import SnippetTagsAndMetadataPythonBeta1 from '/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx'; import SnippetTagsAndMetadataPython2 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-2.mdx'; import SnippetTagsAndMetadataPython3 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-3.mdx'; import SnippetTagsAndMetadataPython4 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-4.mdx'; import SnippetTagsAndMetadataPython5 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-5.mdx'; import SnippetTagsAndMetadataPython6 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-6.mdx'; import SnippetTagsAndMetadataPython7 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-7.mdx'; +import SnippetTagsAndMetadataPythonBeta7 from '/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx'; import SnippetTagsAndMetadataPython8 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-8.mdx'; import SnippetTagsAndMetadataTypeScript1 from '/snippets/code/typescript/tags-and-metadata/tags-and-metadata-ts-1.mdx'; @@ -78,6 +80,7 @@ In this guide, we are building on top of the **finished demo application** from [Log Your First Trace](/getting-started/quickstart) guide. + @@ -156,6 +159,7 @@ Below is the **final combined application code** for the with our tags and metadata added to logged Traces and Spans. + diff --git a/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx b/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx new file mode 100644 index 000000000..2f1c3c5da --- /dev/null +++ b/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx @@ -0,0 +1,14 @@ +```python Python (Beta) +from galileo import LogStream, log + +@log +def my_function(input): + return f"Processed: {input}" + +log_stream = LogStream.get(name="my-log-stream", project_name="my-project") + +# This will log to the specified project and Log stream +with log_stream.context(): + result = my_function("test input") + print(result) +``` diff --git a/snippets/code/python-beta/sdk/logging/context-get-logger.mdx b/snippets/code/python-beta/sdk/logging/context-get-logger.mdx new file mode 100644 index 000000000..b0891fa16 --- /dev/null +++ b/snippets/code/python-beta/sdk/logging/context-get-logger.mdx @@ -0,0 +1,9 @@ +```python Python (Beta) +from galileo import LogStream, galileo_context + +log_stream = LogStream.get(name="my-log-stream", project_name="my-project") + +with log_stream.context(): + # The logger picks up the project / Log stream from the active context + logger = galileo_context.get_logger_instance() +``` diff --git a/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx b/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx new file mode 100644 index 000000000..8e6fc2d49 --- /dev/null +++ b/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx @@ -0,0 +1,10 @@ +```python Python (Beta) +from galileo import GalileoLogger, LogStream + +# Resolve (or create) the Log stream up front +log_stream = LogStream.get(name="my-log-stream", project_name="my-project") + +# Route every logger created in this scope to that Log stream +with log_stream.context(): + logger = GalileoLogger() +``` diff --git a/snippets/code/python-beta/sdk/logging/create-logger.mdx b/snippets/code/python-beta/sdk/logging/create-logger.mdx new file mode 100644 index 000000000..0fe1619e9 --- /dev/null +++ b/snippets/code/python-beta/sdk/logging/create-logger.mdx @@ -0,0 +1,15 @@ +```python Python (Beta) +from galileo import GalileoLogger, LogStream + +# Initialize with default settings (uses environment variables) +logger = GalileoLogger() + +# Or resolve a Log stream first and run logging inside its context +log_stream = LogStream.get( + name="my-log-stream", + project_name="my-project", +) + +with log_stream.context(): + logger = GalileoLogger() +``` diff --git a/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx b/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx new file mode 100644 index 000000000..31447e992 --- /dev/null +++ b/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx @@ -0,0 +1,17 @@ +```python Python (Beta) +from galileo import LogStream + +main_stream = LogStream.get(name="my-log-stream", project_name="my-project") +sub_stream = LogStream.get(name="sub-stream", project_name="my-project") + +with main_stream.context(): + # This will log to my-project/my-log-stream + operation_1() + + with sub_stream.context(): + # This will log to my-project/sub-stream + operation_2() + + # Back to logging to my-project/my-log-stream + operation_3() +``` diff --git a/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx new file mode 100644 index 000000000..8201ce4ad --- /dev/null +++ b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx @@ -0,0 +1,23 @@ +```python Python (Beta) +from datetime import datetime +from galileo import galileo_context +from galileo import GalileoLogger, LogStream +from galileo.config import GalileoPythonConfig +import openai +from dotenv import load_dotenv + +# Load environment variables from the .env file +load_dotenv() + +# Resolve (or create) the Log stream — every logger created in this +# scope is routed to MyFirstTagandMetadata / MyFirstTagandMetatdata. +log_stream = LogStream.get( + name="MyFirstTagandMetatdata", + project_name="MyFirstTagandMetadata", +) +# Or create it if it does not exist: +# log_stream = LogStream( +# name="MyFirstTagandMetatdata", +# project_name="MyFirstTagandMetadata", +# ).create() +``` diff --git a/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx new file mode 100644 index 000000000..1a283ec2d --- /dev/null +++ b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx @@ -0,0 +1,89 @@ +```python Python (Beta) +from datetime import datetime +from galileo import galileo_context +from galileo import GalileoLogger, LogStream +from galileo.config import GalileoPythonConfig +import openai +from dotenv import load_dotenv + +# Load environment variables from the .env file +load_dotenv() + +# Resolve (or create) the Log stream up front +log_stream = LogStream.get( + name="MyFirstTagandMetatdata", + project_name="MyFirstTagandMetadata", +) + +# All traces inside this block are routed to the Log stream above +with log_stream.context(): + # Get the Galileo logger instance + logger = galileo_context.get_logger_instance() + + # Start a Galileo session + logger.start_session() + + # Initialize the OpenAI client + client = openai.OpenAI() + + # Define a system prompt with guidance + system_prompt = f""" + You are a helpful assistant that wants to provide a user as much + information as possible. Avoid saying I don't know. + """ + + # Define a user prompt with a question + user_prompt = f"Explain the following topic succinctly: Newton's First Law" + + # Send a request to the LLM + response = client.chat.completions.create( + model="gpt-4o-mini", + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt}, + ], + ) + + # Print the response + print(response.choices[0].message.content.strip()) + + answer = response.choices[0].message.content.strip() + + # Define tags and metadata + tags = ["newton", "test", "new-version"] + metadata = { + "experimentNumber": "1", + "promptVersion": "0.0.1", + "field": "physics", + } + + # Initialize a new Trace and start listening for logs to add to it + trace = logger.start_trace( + input=user_prompt, + tags=tags, + metadata=metadata, + ) + + # Create a span to log LLM outputs. This is captured by the Trace. + logger.add_llm_span( + input=[{"role": "system", "content": user_prompt}], + output=response.choices[0].message.content, + model="gpt-4o", + tags=tags, + metadata=metadata, + ) + + # Close the Trace and push captured logs to it + logger.conclude(answer) + logger.flush() + + # Show Galileo information after the response + config = GalileoPythonConfig.get() + project_url = f"{config.console_url}project/{logger.project_id}" + log_stream_url = f"{project_url}/log-streams/{logger.log_stream_id}" + + print() + print("🚀 GALILEO LOG INFORMATION:") + print(f"🔗 Project : {project_url}") + print(f"📝 Log Stream: {log_stream_url}") +```