Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
bd138ef
First commit for langchain instrumentation
wrisa Jun 4, 2025
7e53e44
Merge branch 'instrumentation-genai-langchain' of github.com:wrisa/op…
wrisa Jun 16, 2025
fd75809
removed env
wrisa Jul 14, 2025
2f04b96
feat: Add decorator support in GenAI Utils SDK
91pavan Aug 3, 2025
da8e986
refactor: remove print statement
91pavan Aug 4, 2025
1c56a53
feat: reuse the telemetry client in api.py and only set the trace pro…
91pavan Aug 5, 2025
498db98
feat: call start_llm before the call is actually made
91pavan Aug 7, 2025
56a11da
feat: remove publishing conversational content as span attributes in …
91pavan Aug 8, 2025
382c3d5
added tool support and modified llm accordingly
wrisa Aug 10, 2025
4dfd7ac
Added evaluation span and event. Added log api for event
wrisa Aug 12, 2025
04d2fcb
Merge branch 'instrumentation-genai-langchain-sdk-cleaned' into instr…
91pavan Aug 12, 2025
84ed299
added deepeval metric measure
wrisa Aug 12, 2025
6cc8dbb
Merge branch 'instrumentation-genai-langchain-sdk-cleaned' of https:/…
91pavan Aug 13, 2025
00c2091
WIP initial code import
keith-decker Aug 15, 2025
40e6c48
remove references to tool types
keith-decker Aug 15, 2025
43526d6
add a simple unit test
keith-decker Aug 17, 2025
76dbd57
rename exporter to emitter.
keith-decker Aug 18, 2025
567e0a4
rename api file to client
keith-decker Aug 18, 2025
6bed2df
feat: bug fixes and improvements
91pavan Aug 19, 2025
eead667
fix merge conflict
91pavan Aug 19, 2025
fd41dfb
Merge branch 'main' into util-genai-inference
keith-decker Aug 20, 2025
4bd72aa
WIP gen_ai chat refactor
keith-decker Aug 25, 2025
59414fa
Add provider.name, rename client to handler
keith-decker Aug 25, 2025
5127c39
add message to log functions
keith-decker Aug 25, 2025
b27aaab
First commit for langchain instrumentation
wrisa Jun 4, 2025
4c2eb23
removed env
wrisa Jul 14, 2025
ddba8fc
added tool support and modified llm accordingly
wrisa Aug 10, 2025
05319b6
Added evaluation span and event. Added log api for event
wrisa Aug 12, 2025
8c3e61b
added deepeval metric measure
wrisa Aug 12, 2025
cfc1ce3
Fixing tests and adding tool call tests for langchain instrumentation
Aug 15, 2025
f015d81
Adding readme for test_langchain_llm.py
Aug 15, 2025
66e0c26
remove events, emit structured logs
keith-decker Aug 26, 2025
4346580
update documentation
keith-decker Aug 27, 2025
4be03c4
first round of cleanup for lintcheck
keith-decker Aug 27, 2025
c19e4e6
typecheck fixes
keith-decker Aug 27, 2025
11d937b
typecheck fixes
keith-decker Aug 27, 2025
fdc71a3
linting fixes
keith-decker Aug 27, 2025
04d6e97
linting fixes, refactor for complexity
keith-decker Aug 27, 2025
a2e017a
typecheck fixes
keith-decker Aug 27, 2025
60c7a00
feat: remove Otel SDK references
91pavan Aug 28, 2025
92cd5c8
update documentation
keith-decker Aug 28, 2025
770f878
rename context, update _to_semconv_dict name
keith-decker Sep 2, 2025
78bc6bf
refactor: rename emitters to generators and update method names for c…
keith-decker Sep 2, 2025
b7360f8
refactor: convert API LogRecord to SDK LogRecord, add unit test
keith-decker Sep 2, 2025
86152df
added changelog
keith-decker Sep 3, 2025
c0e03c4
Merge branch 'main' into util-genai-inference
keith-decker Sep 4, 2025
2842d97
Merge branch 'open-telemetry:main' into genai-utils-e2e-dev
keith-decker Sep 4, 2025
a03573c
Merge pull request #6 from zhirafovod/util-genai-inference
keith-decker Sep 4, 2025
f9b57f6
Merge branch 'genai-utils-e2e-dev' of https://github.com/zhirafovod/o…
91pavan Sep 5, 2025
5852a4a
feat: move decorators under util/ and rename the APIs
91pavan Sep 5, 2025
b61437f
First commit for langchain instrumentation
wrisa Jun 4, 2025
1a11630
removed env
wrisa Jul 14, 2025
4f0e86c
added tool support and modified llm accordingly
wrisa Aug 10, 2025
4e07998
Added evaluation span and event. Added log api for event
wrisa Aug 12, 2025
0847f3b
added deepeval metric measure
wrisa Aug 12, 2025
b86d793
Fixing tests and adding tool call tests for langchain instrumentation
Aug 15, 2025
89388e1
Adding readme for test_langchain_llm.py
Aug 15, 2025
b26952d
WIP initial code import
keith-decker Aug 15, 2025
8578d76
remove references to tool types
keith-decker Aug 15, 2025
765758e
add a simple unit test
keith-decker Aug 17, 2025
3dbe121
rename exporter to emitter.
keith-decker Aug 18, 2025
2743109
rename api file to client
keith-decker Aug 18, 2025
5c009b3
WIP gen_ai chat refactor
keith-decker Aug 25, 2025
2b4d96c
Add provider.name, rename client to handler
keith-decker Aug 25, 2025
5e723c4
add message to log functions
keith-decker Aug 25, 2025
4404c20
remove events, emit structured logs
keith-decker Aug 26, 2025
a9f0f64
update documentation
keith-decker Aug 27, 2025
9eb69bf
first round of cleanup for lintcheck
keith-decker Aug 27, 2025
c92fdec
typecheck fixes
keith-decker Aug 27, 2025
91b18ad
typecheck fixes
keith-decker Aug 27, 2025
09d6f4c
linting fixes
keith-decker Aug 27, 2025
840e9fd
linting fixes, refactor for complexity
keith-decker Aug 27, 2025
70e8d1d
typecheck fixes
keith-decker Aug 27, 2025
a1485d2
update documentation
keith-decker Aug 28, 2025
a734de7
rename context, update _to_semconv_dict name
keith-decker Sep 2, 2025
c5bc930
refactor: rename emitters to generators and update method names for c…
keith-decker Sep 2, 2025
ab9f170
refactor: convert API LogRecord to SDK LogRecord, add unit test
keith-decker Sep 2, 2025
521824f
added changelog
keith-decker Sep 3, 2025
0e222cb
feat: fix merge conflicts
91pavan Sep 16, 2025
d6a61e4
feat: linting fix, remove unnecessary else in decorators/__init__.py
91pavan Sep 16, 2025
13ae4e1
refactor: ruff linting fixes
91pavan Sep 16, 2025
98a5586
feat: rename type to content_type to fix ruff linter issues
91pavan Sep 16, 2025
1c68db6
feat: bug fixes, add missing files to util/ from genai-util-sdk folder
91pavan Sep 18, 2025
347356a
refactor: linting fixes
91pavan Sep 18, 2025
9db3814
Merge branch 'genai-utils-e2e-dev' into decorators-support
91pavan Sep 23, 2025
3b3f705
Update CHANGELOG.md
91pavan Sep 26, 2025
1e798df
feat: update folder structure
91pavan Sep 26, 2025
8df6fbf
Merge branch 'decorators-support' of https://github.com/zhirafovod/op…
91pavan Sep 26, 2025
079de85
feat: remove redundant examples
91pavan Sep 26, 2025
8ebf9bd
updates
91pavan Sep 30, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# Mac files
.DS_Store

# Environment variables
.env

# sqlite database files
*.db
*.db-shm
*.db-wal

# PNG files
*.png

demo/

.ruff_cache

.vscode/

output/

.terraform.lock.hcl
.terraform/
foo.sh
tfplan
tfplan.txt
tfplan.json
terraform_output.json


# IntelliJ / PyCharm
.idea


*.txt

.dockerconfigjson
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import os

from dotenv import load_dotenv
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI

from opentelemetry import _events, _logs, metrics, trace
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import (
OTLPLogExporter,
)
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import (
OTLPMetricExporter,
)
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
OTLPSpanExporter,
)

# from opentelemetry.genai.sdk.decorators import llm
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.util.genai.decorators import llm

# configure tracing
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(OTLPSpanExporter())
)

metric_reader = PeriodicExportingMetricReader(OTLPMetricExporter())
metrics.set_meter_provider(MeterProvider(metric_readers=[metric_reader]))

# configure logging and events
_logs.set_logger_provider(LoggerProvider())
_logs.get_logger_provider().add_log_record_processor(
BatchLogRecordProcessor(OTLPLogExporter())
)
_events.set_event_logger_provider(EventLoggerProvider())

# Load environment variables from .env file
load_dotenv()


@llm(name="invoke_langchain_model")
def invoke_model(messages):
# Get API key from environment variable or set a placeholder
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
raise ValueError("OPENAI_API_KEY environment variable must be set")

llm = ChatOpenAI(model="gpt-3.5-turbo", api_key=api_key)
result = llm.invoke(messages)
return result


def main():
messages = [
SystemMessage(content="You are a helpful assistant!"),
HumanMessage(content="What is the capital of France?"),
]

result = invoke_model(messages)
print("LLM output:\n", result)


if __name__ == "__main__":
main()
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ OPENAI_API_KEY=sk-YOUR_API_KEY
# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
# OTEL_EXPORTER_OTLP_PROTOCOL=grpc

# Change to 'false' to hide prompt and completion content
OTEL_INSTRUMENTATION_LANGCHAIN_CAPTURE_MESSAGE_CONTENT=true

OTEL_SERVICE_NAME=opentelemetry-python-langchain-manual
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

OpenTelemetry Langcahin Instrumentation Example
============================================

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
OTLPSpanExporter,
)
from opentelemetry.instrumentation.langchain import LangChainInstrumentor

from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@

langchain==0.3.21
langchain_openai
opentelemetry-sdk>=1.31.0
opentelemetry-exporter-otlp-proto-grpc>=1.31.0

# Uncomment after lanchain instrumetation is released
# opentelemetry-instrumentation-langchain~=2.0b0.dev
# opentelemetry-instrumentation-langchain~=2.0b0.dev
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

OpenTelemetry Langchain Zero-Code Instrumentation Example
======================================================

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

langchain==0.3.21
langchain_openai
opentelemetry-sdk>=1.31.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
SystemMessage(content="You are a helpful assistant!"),
HumanMessage(content="What is the capital of France?"),
]

result = llm.invoke(messages)
LangChainInstrumentor().uninstrument()

Expand Down Expand Up @@ -66,7 +67,6 @@ def __init__(

def instrumentation_dependencies(self) -> Collection[str]:
return _instruments

def _instrument(self, **kwargs: Any):
"""
Enable Langchain instrumentation.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright The OpenTelemetry Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


class Config:
"""
Shared static config for LangChain OTel instrumentation.
"""

# Logger to handle exceptions during instrumentation
exception_logger = None

# Globally suppress instrumentation
_suppress_instrumentation = False

@classmethod
def suppress_instrumentation(cls, suppress: bool = True):
cls._suppress_instrumentation = suppress

@classmethod
def is_instrumentation_suppressed(cls) -> bool:
return cls._suppress_instrumentation
Loading
Loading