From ae13079df8ca150480aa870c965c7828a80e7e22 Mon Sep 17 00:00:00 2001
From: Adrian Cole <64215+codefromthecrypt@users.noreply.github.com>
Date: Wed, 20 Nov 2024 14:48:27 +0800
Subject: [PATCH] Add OpenAI example (#3006)
---
.pylintrc | 2 +-
CHANGELOG.md | 2 +-
.../CHANGELOG.md | 2 +
.../README.rst | 8 +++-
.../example/.env | 18 +++++++++
.../example/README.rst | 39 +++++++++++++++++++
.../example/main.py | 21 ++++++++++
.../example/requirements.txt | 6 +++
8 files changed, 94 insertions(+), 4 deletions(-)
create mode 100644 instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/.env
create mode 100644 instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/README.rst
create mode 100644 instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/main.py
create mode 100644 instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/requirements.txt
diff --git a/.pylintrc b/.pylintrc
index 39ea7b5d35..bc3b25c978 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -7,7 +7,7 @@ extension-pkg-whitelist=cassandra
# Add list of files or directories to be excluded. They should be base names, not
# paths.
-ignore=CVS,gen,Dockerfile,docker-compose.yml,README.md,requirements.txt,docs
+ignore=CVS,gen,Dockerfile,docker-compose.yml,README.md,requirements.txt,docs,.venv
# Add files or directories matching the regex patterns to be excluded. The
# regex matches against base names, not paths.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 92e366402a..19a819cbe2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `opentelemetry-instrumentation-sqlalchemy` Update unit tests to run with SQLALchemy 2
([#2976](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2976))
- - Add `opentelemetry-instrumentation-openai-v2` to `opentelemetry-bootstrap`
+- Add `opentelemetry-instrumentation-openai-v2` to `opentelemetry-bootstrap`
([#2996](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2996))
- `opentelemetry-instrumentation-sqlalchemy` Add sqlcomment to `db.statement` attribute
([#2937](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2937))
diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/CHANGELOG.md b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/CHANGELOG.md
index 07b10615c1..2c10498511 100644
--- a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/CHANGELOG.md
+++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/CHANGELOG.md
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+- Add example to `opentelemetry-instrumentation-openai-v2`
+ ([#3006](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3006))
- Support for `AsyncOpenAI/AsyncCompletions` ([#2984](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2984))
## Version 2.0b0 (2024-11-08)
diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/README.rst b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/README.rst
index 85817896ff..bbd142a97e 100644
--- a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/README.rst
+++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/README.rst
@@ -6,17 +6,21 @@ OpenTelemetry OpenAI Instrumentation
.. |pypi| image:: https://badge.fury.io/py/opentelemetry-instrumentation-openai-v2.svg
:target: https://pypi.org/project/opentelemetry-instrumentation-openai-v2/
-Instrumentation with OpenAI that supports the OpenAI library and is
-specified to trace_integration using 'OpenAI'.
+This library allows tracing LLM requests and logging of messages made by the
+`OpenAI Python API library `_.
Installation
------------
+If your application is already instrumented with OpenTelemetry, add this
+package to your requirements.
::
pip install opentelemetry-instrumentation-openai-v2
+If you don't have an OpenAI application, yet, try our `example `_
+which only needs a valid OpenAI API key.
References
----------
diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/.env b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/.env
new file mode 100644
index 0000000000..d6afa66723
--- /dev/null
+++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/.env
@@ -0,0 +1,18 @@
+# Update this with your real OpenAI API key
+OPENAI_API_KEY=sk-YOUR_API_KEY
+
+# Uncomment to use Ollama instead of OpenAI
+# OPENAI_BASE_URL=http://localhost:11434/v1
+# OPENAI_API_KEY=unused
+# CHAT_MODEL=qwen2.5:0.5b
+
+OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
+OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
+OTEL_SERVICE_NAME=opentelemetry-python-openai
+
+# Change to 'false' to disable logging
+OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true
+# Change to 'console' if your OTLP endpoint doesn't support logs
+OTEL_LOGS_EXPORTER=otlp_proto_http
+# Change to 'false' to hide prompt and completion content
+OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true
diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/README.rst b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/README.rst
new file mode 100644
index 0000000000..019e141c70
--- /dev/null
+++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/README.rst
@@ -0,0 +1,39 @@
+OpenTelemetry OpenAI Instrumentation Example
+============================================
+
+This is an example of how to instrument OpenAI calls with zero code changes,
+using `opentelemetry-instrument`.
+
+When `main.py `_ is run, it exports traces and logs to an OTLP
+compatible endpoint. Traces include details such as the model used and the
+duration of the chat request. Logs capture the chat request and the generated
+response, providing a comprehensive view of the performance and behavior of
+your OpenAI requests.
+
+Setup
+-----
+
+Minimally, update the `.env <.env>`_ file with your "OPENAI_API_KEY". An
+OTLP compatible endpoint should be listening for traces and logs on
+http://localhost:4318. If not, update "OTEL_EXPORTER_OTLP_ENDPOINT" as well.
+
+Next, set up a virtual environment like this:
+
+::
+
+ python3 -m venv .venv
+ source .venv/bin/activate
+ pip install "python-dotenv[cli]"
+ pip install -r requirements.txt
+
+Run
+---
+
+Run the example like this:
+
+::
+
+ dotenv run -- opentelemetry-instrument python main.py
+
+You should see a poem generated by OpenAI while traces and logs export to your
+configured observability tool.
diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/main.py b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/main.py
new file mode 100644
index 0000000000..d41b1dd933
--- /dev/null
+++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/main.py
@@ -0,0 +1,21 @@
+import os
+
+from openai import OpenAI
+
+
+def main():
+ client = OpenAI()
+ chat_completion = client.chat.completions.create(
+ model=os.getenv("CHAT_MODEL", "gpt-4o-mini"),
+ messages=[
+ {
+ "role": "user",
+ "content": "Write a short poem on OpenTelemetry.",
+ },
+ ],
+ )
+ print(chat_completion.choices[0].message.content)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/requirements.txt b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/requirements.txt
new file mode 100644
index 0000000000..9ec9bff320
--- /dev/null
+++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/example/requirements.txt
@@ -0,0 +1,6 @@
+openai~=1.54.4
+
+opentelemetry-sdk~=1.28.2
+opentelemetry-exporter-otlp-proto-http~=1.28.2
+opentelemetry-distro~=0.49b2
+opentelemetry-instrumentation-openai-v2~=2.0b0