genai-otel-instrument 0.1.4.dev0__py3-none-any.whl → 0.1.9.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of genai-otel-instrument might be problematic. Click here for more details.

@@ -1,45 +1,45 @@
1
- """Centralized logging configuration"""
2
-
3
- import logging
4
- import os
5
- import sys
6
- from logging.handlers import RotatingFileHandler
7
- from typing import Optional
8
-
9
-
10
- def setup_logging(
11
- level: Optional[str] = None, log_dir: str = "logs", log_file_name: str = "genai_otel.log"
12
- ):
13
- """Configure logging for the library with configurable log level via environment variable
14
- and log rotation.
15
- """
16
- # Determine log level from environment variable or default to INFO
17
- env_log_level = os.environ.get("GENAI_OTEL_LOG_LEVEL")
18
- log_level_str = level or env_log_level or "INFO"
19
- log_level = getattr(logging, log_level_str.upper(), logging.INFO)
20
-
21
- # Create logs directory if it doesn't exist
22
- os.makedirs(log_dir, exist_ok=True)
23
- log_file_path = os.path.join(log_dir, log_file_name)
24
-
25
- # Setup handlers
26
- handlers = [logging.StreamHandler(sys.stdout)]
27
-
28
- # Add rotating file handler
29
- file_handler = RotatingFileHandler(log_file_path, maxBytes=10 * 1024 * 1024, backupCount=10)
30
- handlers.append(file_handler)
31
-
32
- # Set library logger
33
- logger = logging.getLogger("genai_otel")
34
- logger.setLevel(log_level)
35
-
36
- # Clear existing handlers to prevent duplicates in case of multiple calls
37
- if logger.handlers:
38
- for handler in logger.handlers:
39
- handler.close()
40
- logger.handlers = []
41
-
42
- for handler in handlers:
43
- logger.addHandler(handler)
44
-
45
- return logger
1
+ """Centralized logging configuration"""
2
+
3
+ import logging
4
+ import os
5
+ import sys
6
+ from logging.handlers import RotatingFileHandler
7
+ from typing import Optional
8
+
9
+
10
+ def setup_logging(
11
+ level: Optional[str] = None, log_dir: str = "logs", log_file_name: str = "genai_otel.log"
12
+ ):
13
+ """Configure logging for the library with configurable log level via environment variable
14
+ and log rotation.
15
+ """
16
+ # Determine log level from environment variable or default to INFO
17
+ env_log_level = os.environ.get("GENAI_OTEL_LOG_LEVEL")
18
+ log_level_str = level or env_log_level or "INFO"
19
+ log_level = getattr(logging, log_level_str.upper(), logging.INFO)
20
+
21
+ # Create logs directory if it doesn't exist
22
+ os.makedirs(log_dir, exist_ok=True)
23
+ log_file_path = os.path.join(log_dir, log_file_name)
24
+
25
+ # Setup handlers
26
+ handlers = [logging.StreamHandler(sys.stdout)]
27
+
28
+ # Add rotating file handler
29
+ file_handler = RotatingFileHandler(log_file_path, maxBytes=10 * 1024 * 1024, backupCount=10)
30
+ handlers.append(file_handler)
31
+
32
+ # Set library logger
33
+ logger = logging.getLogger("genai_otel")
34
+ logger.setLevel(log_level)
35
+
36
+ # Clear existing handlers to prevent duplicates in case of multiple calls
37
+ if logger.handlers:
38
+ for handler in logger.handlers:
39
+ handler.close()
40
+ logger.handlers = []
41
+
42
+ for handler in handlers:
43
+ logger.addHandler(handler)
44
+
45
+ return logger
genai_otel/py.typed CHANGED
@@ -1,2 +1,2 @@
1
- # Marker file for PEP 561
2
- # This file indicates that the package supports type checking
1
+ # Marker file for PEP 561
2
+ # This file indicates that the package supports type checking
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: genai-otel-instrument
3
- Version: 0.1.4.dev0
3
+ Version: 0.1.9.dev0
4
4
  Summary: Comprehensive OpenTelemetry auto-instrumentation for LLM/GenAI applications
5
5
  Author-email: Kshitij Thakkar <kshitijthakkar@rocketmail.com>
6
6
  License: Apache-2.0
@@ -207,8 +207,9 @@ Production-ready OpenTelemetry instrumentation for GenAI/LLM applications with z
207
207
  🚀 **Zero-Code Instrumentation** - Just install and set env vars
208
208
  🤖 **15+ LLM Providers** - OpenAI, Anthropic, Google, AWS, Azure, and more
209
209
  🔧 **MCP Tool Support** - Auto-instrument databases, APIs, caches, vector DBs
210
- 💰 **Cost Tracking** - Automatic cost calculation per request
211
- 🎮 **GPU Metrics** - Real-time GPU utilization, memory, temperature, power
210
+ 💰 **Cost Tracking** - Automatic cost calculation for both streaming and non-streaming requests
211
+ **Streaming Support** - Full observability for streaming responses with TTFT/TBT metrics and cost tracking
212
+ 🎮 **GPU Metrics** - Real-time GPU utilization, memory, temperature, power, and electricity cost tracking
212
213
  📊 **Complete Observability** - Traces, metrics, and rich span attributes
213
214
  ➕ **Service Instance ID & Environment** - Identify your services and environments
214
215
  ⏱️ **Configurable Exporter Timeout** - Set timeout for OTLP exporter
@@ -256,7 +257,8 @@ For a more comprehensive demonstration of various LLM providers and MCP tools, r
256
257
 
257
258
  ### LLM Providers (Auto-detected)
258
259
  - **With Full Cost Tracking**: OpenAI, Anthropic, Google AI, AWS Bedrock, Azure OpenAI, Cohere, Mistral AI, Together AI, Groq, Ollama, Vertex AI
259
- - **Hardware/Local Pricing**: Replicate (hardware-based $/second), HuggingFace (local execution, free)
260
+ - **Hardware/Local Pricing**: Replicate (hardware-based $/second), HuggingFace (local execution with estimated costs)
261
+ - **HuggingFace Support**: `pipeline()`, `AutoModelForCausalLM.generate()`, `AutoModelForSeq2SeqLM.generate()`, `InferenceClient` API calls
260
262
  - **Other Providers**: Anyscale
261
263
 
262
264
  ### Frameworks
@@ -306,7 +308,10 @@ The library includes comprehensive cost tracking with pricing data for **145+ mo
306
308
 
307
309
  ### Special Pricing Models
308
310
  - **Replicate**: Hardware-based pricing ($/second of GPU/CPU time) - not token-based
309
- - **HuggingFace Transformers**: Local execution - no API costs
311
+ - **HuggingFace Transformers**: Local model execution with estimated costs based on parameter count
312
+ - Supports `pipeline()`, `AutoModelForCausalLM.generate()`, `AutoModelForSeq2SeqLM.generate()`
313
+ - Cost estimation uses GPU/compute resource pricing tiers (tiny/small/medium/large)
314
+ - Automatic token counting from tensor shapes
310
315
 
311
316
  ### Pricing Features
312
317
  - **Differential Pricing**: Separate rates for prompt tokens vs. completion tokens
@@ -314,6 +319,40 @@ The library includes comprehensive cost tracking with pricing data for **145+ mo
314
319
  - **Cache Pricing**: Anthropic prompt caching costs (read/write)
315
320
  - **Granular Cost Metrics**: Per-request cost breakdown by token type
316
321
  - **Auto-Updated Pricing**: Pricing data maintained in `llm_pricing.json`
322
+ - **Custom Pricing**: Add pricing for custom/proprietary models via environment variable
323
+
324
+ ### Adding Custom Model Pricing
325
+
326
+ For custom or proprietary models not in `llm_pricing.json`, you can provide custom pricing via the `GENAI_CUSTOM_PRICING_JSON` environment variable:
327
+
328
+ ```bash
329
+ # For chat models
330
+ export GENAI_CUSTOM_PRICING_JSON='{"chat":{"my-custom-model":{"promptPrice":0.001,"completionPrice":0.002}}}'
331
+
332
+ # For embeddings
333
+ export GENAI_CUSTOM_PRICING_JSON='{"embeddings":{"my-custom-embeddings":0.00005}}'
334
+
335
+ # For multiple categories
336
+ export GENAI_CUSTOM_PRICING_JSON='{
337
+ "chat": {
338
+ "my-custom-chat": {"promptPrice": 0.001, "completionPrice": 0.002}
339
+ },
340
+ "embeddings": {
341
+ "my-custom-embed": 0.00005
342
+ },
343
+ "audio": {
344
+ "my-custom-tts": 0.02
345
+ }
346
+ }'
347
+ ```
348
+
349
+ **Pricing Format:**
350
+ - **Chat models**: `{"promptPrice": <$/1k tokens>, "completionPrice": <$/1k tokens>}`
351
+ - **Embeddings**: Single number for price per 1k tokens
352
+ - **Audio**: Price per 1k characters (TTS) or per second (STT)
353
+ - **Images**: Nested structure with quality/size pricing (see `llm_pricing.json` for examples)
354
+
355
+ **Hybrid Pricing:** Custom prices are merged with default pricing from `llm_pricing.json`. If you provide custom pricing for an existing model, the custom price overrides the default.
317
356
 
318
357
  **Coverage Statistics**: As of v0.1.3, 89% test coverage with 415 passing tests, including comprehensive cost calculation validation and cost enrichment processor tests (supporting both GenAI and OpenInference semantic conventions).
319
358
 
@@ -336,7 +375,8 @@ Every LLM call, database query, API request, and vector search is traced with fu
336
375
  - `gen_ai.usage.cost.cache_write` - Cache write cost (Anthropic)
337
376
  - `gen_ai.client.errors` - Error counts by operation and type
338
377
  - `gen_ai.gpu.*` - GPU utilization, memory, temperature, power (ObservableGauges)
339
- - `gen_ai.co2.emissions` - CO2 emissions tracking (opt-in)
378
+ - `gen_ai.co2.emissions` - CO2 emissions tracking (opt-in via `GENAI_ENABLE_CO2_TRACKING`)
379
+ - `gen_ai.power.cost` - Cumulative electricity cost in USD based on GPU power consumption (configurable via `GENAI_POWER_COST_PER_KWH`)
340
380
  - `gen_ai.server.ttft` - Time to First Token for streaming responses (histogram, 1ms-10s buckets)
341
381
  - `gen_ai.server.tbt` - Time Between Tokens for streaming responses (histogram, 10ms-2.5s buckets)
342
382
 
@@ -383,7 +423,14 @@ Every LLM call, database query, API request, and vector search is traced with fu
383
423
 
384
424
  **Streaming Attributes:**
385
425
  - `gen_ai.server.ttft` - Time to First Token (seconds) for streaming responses
386
- - `gen_ai.streaming.token_count` - Total number of chunks/tokens in streaming response
426
+ - `gen_ai.streaming.token_count` - Total number of chunks in streaming response
427
+ - `gen_ai.usage.prompt_tokens` - Actual prompt tokens (extracted from final chunk)
428
+ - `gen_ai.usage.completion_tokens` - Actual completion tokens (extracted from final chunk)
429
+ - `gen_ai.usage.total_tokens` - Total tokens (extracted from final chunk)
430
+ - `gen_ai.usage.cost.total` - Total cost for streaming request
431
+ - `gen_ai.usage.cost.prompt` - Prompt tokens cost for streaming request
432
+ - `gen_ai.usage.cost.completion` - Completion tokens cost for streaming request
433
+ - All granular cost attributes (reasoning, cache_read, cache_write) also available for streaming
387
434
 
388
435
  **Content Events (opt-in):**
389
436
  - `gen_ai.prompt.{index}` events with role and content
@@ -440,6 +487,181 @@ genai_otel.instrument(
440
487
 
441
488
  A `sample.env` file has been generated in the project root directory. This file contains commented-out examples of all supported environment variables, along with their default values or expected formats. You can copy this file to `.env` and uncomment/modify the variables to configure the instrumentation for your specific needs.
442
489
 
490
+ ## Advanced Features
491
+
492
+ ### Session and User Tracking
493
+
494
+ Track user sessions and identify users across multiple LLM requests for better analytics, debugging, and cost attribution.
495
+
496
+ **Configuration:**
497
+
498
+ ```python
499
+ import genai_otel
500
+ from genai_otel import OTelConfig
501
+
502
+ # Define extractor functions
503
+ def extract_session_id(instance, args, kwargs):
504
+ """Extract session ID from request metadata."""
505
+ # Option 1: From kwargs metadata
506
+ metadata = kwargs.get("metadata", {})
507
+ return metadata.get("session_id")
508
+
509
+ # Option 2: From custom headers
510
+ # headers = kwargs.get("headers", {})
511
+ # return headers.get("X-Session-ID")
512
+
513
+ # Option 3: From thread-local storage
514
+ # import threading
515
+ # return getattr(threading.current_thread(), "session_id", None)
516
+
517
+ def extract_user_id(instance, args, kwargs):
518
+ """Extract user ID from request metadata."""
519
+ metadata = kwargs.get("metadata", {})
520
+ return metadata.get("user_id")
521
+
522
+ # Configure with extractors
523
+ config = OTelConfig(
524
+ service_name="my-rag-app",
525
+ endpoint="http://localhost:4318",
526
+ session_id_extractor=extract_session_id,
527
+ user_id_extractor=extract_user_id,
528
+ )
529
+
530
+ genai_otel.instrument(config)
531
+ ```
532
+
533
+ **Usage:**
534
+
535
+ ```python
536
+ from openai import OpenAI
537
+
538
+ client = OpenAI()
539
+
540
+ # Pass session and user info via metadata
541
+ response = client.chat.completions.create(
542
+ model="gpt-3.5-turbo",
543
+ messages=[{"role": "user", "content": "What is OpenTelemetry?"}],
544
+ extra_body={"metadata": {"session_id": "sess_12345", "user_id": "user_alice"}}
545
+ )
546
+ ```
547
+
548
+ **Span Attributes Added:**
549
+ - `session.id` - Unique session identifier for tracking conversations
550
+ - `user.id` - User identifier for per-user analytics and cost tracking
551
+
552
+ **Use Cases:**
553
+ - Track multi-turn conversations across requests
554
+ - Analyze usage patterns per user
555
+ - Debug session-specific issues
556
+ - Calculate per-user costs and quotas
557
+ - Build user-specific dashboards
558
+
559
+ ### RAG and Embedding Attributes
560
+
561
+ Enhanced observability for Retrieval-Augmented Generation (RAG) workflows, including embedding generation and document retrieval.
562
+
563
+ **Helper Methods:**
564
+
565
+ The `BaseInstrumentor` provides helper methods to add RAG-specific attributes to your spans:
566
+
567
+ ```python
568
+ from opentelemetry import trace
569
+ from genai_otel.instrumentors.base import BaseInstrumentor
570
+
571
+ # Get your instrumentor instance (or create spans manually)
572
+ tracer = trace.get_tracer(__name__)
573
+
574
+ # 1. Embedding Attributes
575
+ with tracer.start_as_current_span("embedding.create") as span:
576
+ # Your embedding logic
577
+ embedding_response = client.embeddings.create(
578
+ model="text-embedding-3-small",
579
+ input="OpenTelemetry provides observability"
580
+ )
581
+
582
+ # Add embedding attributes (if using BaseInstrumentor)
583
+ # instrumentor.add_embedding_attributes(
584
+ # span,
585
+ # model="text-embedding-3-small",
586
+ # input_text="OpenTelemetry provides observability",
587
+ # vector=embedding_response.data[0].embedding
588
+ # )
589
+
590
+ # Or manually set attributes
591
+ span.set_attribute("embedding.model_name", "text-embedding-3-small")
592
+ span.set_attribute("embedding.text", "OpenTelemetry provides observability"[:500])
593
+ span.set_attribute("embedding.vector.dimension", len(embedding_response.data[0].embedding))
594
+
595
+ # 2. Retrieval Attributes
596
+ with tracer.start_as_current_span("retrieval.search") as span:
597
+ # Your retrieval logic
598
+ retrieved_docs = [
599
+ {
600
+ "id": "doc_001",
601
+ "score": 0.95,
602
+ "content": "OpenTelemetry is an observability framework...",
603
+ "metadata": {"source": "docs.opentelemetry.io", "category": "intro"}
604
+ },
605
+ # ... more documents
606
+ ]
607
+
608
+ # Add retrieval attributes (if using BaseInstrumentor)
609
+ # instrumentor.add_retrieval_attributes(
610
+ # span,
611
+ # documents=retrieved_docs,
612
+ # query="What is OpenTelemetry?",
613
+ # max_docs=5
614
+ # )
615
+
616
+ # Or manually set attributes
617
+ span.set_attribute("retrieval.query", "What is OpenTelemetry?"[:500])
618
+ span.set_attribute("retrieval.document_count", len(retrieved_docs))
619
+
620
+ for i, doc in enumerate(retrieved_docs[:5]): # Limit to 5 docs
621
+ prefix = f"retrieval.documents.{i}.document"
622
+ span.set_attribute(f"{prefix}.id", doc["id"])
623
+ span.set_attribute(f"{prefix}.score", doc["score"])
624
+ span.set_attribute(f"{prefix}.content", doc["content"][:500])
625
+
626
+ # Add metadata
627
+ for key, value in doc.get("metadata", {}).items():
628
+ span.set_attribute(f"{prefix}.metadata.{key}", str(value))
629
+ ```
630
+
631
+ **Embedding Attributes:**
632
+ - `embedding.model_name` - Embedding model used
633
+ - `embedding.text` - Input text (truncated to 500 chars)
634
+ - `embedding.vector` - Embedding vector (optional, if configured)
635
+ - `embedding.vector.dimension` - Vector dimensions
636
+
637
+ **Retrieval Attributes:**
638
+ - `retrieval.query` - Search query (truncated to 500 chars)
639
+ - `retrieval.document_count` - Number of documents retrieved
640
+ - `retrieval.documents.{i}.document.id` - Document ID
641
+ - `retrieval.documents.{i}.document.score` - Relevance score
642
+ - `retrieval.documents.{i}.document.content` - Document content (truncated to 500 chars)
643
+ - `retrieval.documents.{i}.document.metadata.*` - Custom metadata fields
644
+
645
+ **Safeguards:**
646
+ - Text content truncated to 500 characters to avoid span size explosion
647
+ - Document count limited to 5 by default (configurable via `max_docs`)
648
+ - Metadata values truncated to prevent excessive attribute counts
649
+
650
+ **Complete RAG Workflow Example:**
651
+
652
+ See `examples/phase4_session_rag_tracking.py` for a comprehensive demonstration of:
653
+ - Session and user tracking across RAG pipeline
654
+ - Embedding attribute capture
655
+ - Retrieval attribute capture
656
+ - End-to-end RAG workflow with full observability
657
+
658
+ **Use Cases:**
659
+ - Monitor retrieval quality and relevance scores
660
+ - Debug RAG pipeline performance
661
+ - Track embedding model usage
662
+ - Analyze document retrieval patterns
663
+ - Optimize vector search configurations
664
+
443
665
  ## Example: Full-Stack GenAI App
444
666
 
445
667
  ```python
@@ -622,27 +844,33 @@ genai_otel.instrument(
622
844
 
623
845
  Completing remaining items from [OTEL_SEMANTIC_GAP_ANALYSIS_AND_IMPLEMENTATION_PLAN.md](OTEL_SEMANTIC_GAP_ANALYSIS_AND_IMPLEMENTATION_PLAN.md):
624
846
 
625
- **Phase 4: Optional Enhancements**
626
- - ✅ Session & User Tracking - Track sessions and users across requests
627
- ```python
628
- genai_otel.instrument(
629
- session_id_extractor=lambda ctx: ctx.get("session_id"),
630
- user_id_extractor=lambda ctx: ctx.get("user_id")
631
- )
632
- ```
633
-
634
- - ✅ RAG/Embedding Attributes - Enhanced observability for retrieval-augmented generation
635
- - `embedding.model_name` - Embedding model used
636
- - `embedding.vector_dimensions` - Vector dimensions
637
- - `retrieval.documents.{i}.document.id` - Retrieved document IDs
638
- - `retrieval.documents.{i}.document.score` - Relevance scores
639
- - `retrieval.documents.{i}.document.content` - Document content (truncated)
640
-
641
- - Agent Workflow Tracking - Better support for agentic workflows
642
- - `agent.name` - Agent identifier
643
- - `agent.iteration` - Current iteration number
644
- - `agent.action` - Action taken
645
- - `agent.observation` - Observation received
847
+ **Phase 4: Optional Enhancements (✅ COMPLETED)**
848
+
849
+ All Phase 4 features are now available! See the [Advanced Features](#advanced-features) section for detailed documentation.
850
+
851
+ - **Session & User Tracking** - Track sessions and users across requests with custom extractor functions
852
+ - Configurable via `session_id_extractor` and `user_id_extractor` in `OTelConfig`
853
+ - Automatically adds `session.id` and `user.id` span attributes
854
+ - See [Session and User Tracking](#session-and-user-tracking) for usage examples
855
+
856
+ - ✅ **RAG/Embedding Attributes** - Enhanced observability for retrieval-augmented generation
857
+ - Helper methods: `add_embedding_attributes()` and `add_retrieval_attributes()`
858
+ - Embedding attributes: `embedding.model_name`, `embedding.text`, `embedding.vector.dimension`
859
+ - Retrieval attributes: `retrieval.query`, `retrieval.document_count`, `retrieval.documents.{i}.document.*`
860
+ - See [RAG and Embedding Attributes](#rag-and-embedding-attributes) for usage examples
861
+ - Complete example: `examples/phase4_session_rag_tracking.py`
862
+
863
+ **Note on Agent Workflow Tracking:**
864
+
865
+ Agent workflow observability is already provided by the OpenInference Smolagents instrumentor (included when `smolagents` is in `enabled_instrumentors`). This is not a new Phase 4 feature, but an existing capability:
866
+
867
+ - `openinference.span.kind: "AGENT"` - Identifies agent spans
868
+ - `agent.name` - Agent identifier (via OpenInference)
869
+ - `agent.iteration` - Current iteration number (via OpenInference)
870
+ - `agent.action` - Action taken (via OpenInference)
871
+ - `agent.observation` - Observation received (via OpenInference)
872
+
873
+ Agent tracking requires Python >= 3.10 and the `smolagents` library. See [OpenInference Integration](#openinference-optional---python-310-only) for details.
646
874
 
647
875
  #### 🔄 Migration Support
648
876
 
@@ -1,29 +1,30 @@
1
1
  genai_otel/__init__.py,sha256=OWgm1dihRkwBQU8fUPnVhE5XCZeF5f15UyH4w6LqGZU,4469
2
- genai_otel/__version__.py,sha256=tXTq07HZiURpZCu7BgCUswwpzaUPCRD2c6IN9cDtmRo,751
3
- genai_otel/auto_instrument.py,sha256=NF0Bo_sFMynSmXNh5KFxdsJQPKuPE2NI_bel1i-CtxU,16260
2
+ genai_otel/__version__.py,sha256=-7XfyoqjXB3n4CmJWgQNXd5cM7X1D0ZC3i_A8QhrN6c,751
3
+ genai_otel/auto_instrument.py,sha256=uHJGTlSI4UO-sdFtWgxSmNkhd1_GTWvr3S-rY8MQ4E4,16513
4
4
  genai_otel/cli.py,sha256=mbhaTU0WIAkvPKdIing-guIxPDjEKQftChWQUtPFzkY,3170
5
- genai_otel/config.py,sha256=hVdvUd1B1aPPUom6PHVi57BoNu-skZvzqLxy2H4mRXQ,6851
6
- genai_otel/cost_calculator.py,sha256=g5yL9fcOXVXR_zd-d0mU4C2FRV_X47mM0aies6YGaak,15293
7
- genai_otel/cost_enrichment_processor.py,sha256=iVpJYkDrtlQOm0vMXXYuwctd-p9tgi3NOmTIM3U1xBo,7314
5
+ genai_otel/config.py,sha256=2CIbZH8WKkVzr73y9AOWmscvEW-kUwMLSAyOy9BFqGI,7871
6
+ genai_otel/cost_calculator.py,sha256=BOW-TC41lJ1GcL4hIGZ4NySyV8aro4_juMOe2IqtJ-A,18115
7
+ genai_otel/cost_enriching_exporter.py,sha256=iED7njK21UBKlxRElGfqSs66gMkzDCr8fm-4ZkJBiLU,7874
8
+ genai_otel/cost_enrichment_processor.py,sha256=fQoVosBUgshD9ZRxWpwqqPWYnyhrvKBTJAW0S2H7t1E,7090
8
9
  genai_otel/exceptions.py,sha256=gIRvbI7c4V-M-PG9jS0o4ESRwHUWCm6DVihjfyJI1yg,429
9
- genai_otel/gpu_metrics.py,sha256=gHqV17mJ59VscilR_Bcd1ccBDdDiUs5w0bE1hNk7NqI,11168
10
- genai_otel/llm_pricing.json,sha256=ySmIN-tAbAdyYnOWNlyvxX-NB5nUzwq4aIDKefE7ALQ,21692
11
- genai_otel/logging_config.py,sha256=XSBeslTqeHUBBadKJV2W8JFIOXorEVZ6W0xqNKjiPlA,1463
10
+ genai_otel/gpu_metrics.py,sha256=hBawkm-NErviwiLzb7z92INstFHec2pREn945rYgrT4,13408
11
+ genai_otel/llm_pricing.json,sha256=ZQ1uILEdQ_yNzenvlPpKazo9NnYqEZgbL_tzQ6Mw2oc,20825
12
+ genai_otel/logging_config.py,sha256=S8apGf93nBjoi_Bhce-LxwTwGTaJUeduPXKiWZ5SIa8,1418
12
13
  genai_otel/metrics.py,sha256=Vngwtc1MAMAE7JVpbT_KfiCQ5TdIAKIs_0oztjJdDTg,2671
13
- genai_otel/py.typed,sha256=oe-lun16QtsTO6qa3gicjgj_F4jU7LSKCnBYLr6P5Yk,88
14
+ genai_otel/py.typed,sha256=WJtVGe64tcQSssSo4RD7zCf_3u7X2BmFCWDCroWOcaQ,88
14
15
  genai_otel/instrumentors/__init__.py,sha256=39CQZZS-AcHNn37pdt1rCOVBvX9t5RGMPY3sEulQzMA,1821
15
16
  genai_otel/instrumentors/anthropic_instrumentor.py,sha256=3koeXSJccALdZiRibavwQt8_lrXYwEhdWfA3dnCo_ng,4837
16
17
  genai_otel/instrumentors/anyscale_instrumentor.py,sha256=WUcQVDK8W76gkrAT_TLgzFd7NY42Rn6x0irT7VV2bbI,774
17
18
  genai_otel/instrumentors/aws_bedrock_instrumentor.py,sha256=W469XxNVsb6eDjerk3SkjZFZEOIzH_HkBkmqqSCRBhU,3670
18
19
  genai_otel/instrumentors/azure_openai_instrumentor.py,sha256=HumsAAtW9YzbcyBCrIGhE5KvZ6-mxSbsEoI_W0JU7xg,2428
19
- genai_otel/instrumentors/base.py,sha256=dNsJfhKgrZO8dLdEb45roh4WcwrTfFWyCNhhmWDcPnE,26187
20
- genai_otel/instrumentors/cohere_instrumentor.py,sha256=SRi2CRA1XUbup_UdE6OEgSxqlyUfVXaiVy-ULXvLZGM,5214
20
+ genai_otel/instrumentors/base.py,sha256=5N0eMDoPT49PedhoDM0EGu8NE9UvseaiWhqfb9UHTIw,38210
21
+ genai_otel/instrumentors/cohere_instrumentor.py,sha256=fsKvHaWvMRAGRbOtybVJVVz-FS_-wmgTJo3Q_F86BOY,5074
21
22
  genai_otel/instrumentors/google_ai_instrumentor.py,sha256=ExNo0_OxfCxaRpuUXYU8UZ-ClQRHRLUvf7-kMC6zdc8,2984
22
23
  genai_otel/instrumentors/groq_instrumentor.py,sha256=bCm7IDmDyvg0-XuzcCSO5xf9QvDlQGwb7bdQ_ooS6QI,3398
23
- genai_otel/instrumentors/huggingface_instrumentor.py,sha256=QiOGC09KY6fdmHHHXHidVDcZikDPC3tI63scmJ0wW9I,9136
24
- genai_otel/instrumentors/langchain_instrumentor.py,sha256=1Y_zGBQcUNrh877k146XOW4wLBXBkNtbyuEkORXFIyQ,2760
24
+ genai_otel/instrumentors/huggingface_instrumentor.py,sha256=wvolJZnq9YKfJsvNvUnoOpL1tbeGy0DuxVmmmI1_BoA,17815
25
+ genai_otel/instrumentors/langchain_instrumentor.py,sha256=002ZrKP04l7VaYxo7nAAwl-uvMVwpzVehO2oS23ed-o,2685
25
26
  genai_otel/instrumentors/llamaindex_instrumentor.py,sha256=zZ1J7W4yQo1Ur6Y5y0UXpDdEx9oDnmsqNIin5Jrv9os,1206
26
- genai_otel/instrumentors/mistralai_instrumentor.py,sha256=OU8O81wdBLTEwnkMfDQpk0oBisSpUukXlm4JYdnfEg0,12789
27
+ genai_otel/instrumentors/mistralai_instrumentor.py,sha256=Blo8X4WV-xQe-xF-jhkaGPavkgayANf1F3zCTzuhuL0,12478
27
28
  genai_otel/instrumentors/ollama_instrumentor.py,sha256=lv45qf8Cqe_HmF7BIMojZcBFK8AA13uUrCVOKAFhN0k,5286
28
29
  genai_otel/instrumentors/openai_instrumentor.py,sha256=0q2vml2oWnTRzfVTEP0_njfxqZS8b3Qek-apeecXvvs,9263
29
30
  genai_otel/instrumentors/replicate_instrumentor.py,sha256=-G_Tj0VkAfg-cOKvnk4G56eJiADjyIgv6xEgyAWlFdw,3028
@@ -37,9 +38,9 @@ genai_otel/mcp_instrumentors/kafka_instrumentor.py,sha256=QJYJC1rvo_zZAIaw-cp_Ic
37
38
  genai_otel/mcp_instrumentors/manager.py,sha256=1Pj5lkEOL8Yq1Oeud4ZExN6k6NLIVtTzKnFLNiFdJvw,5895
38
39
  genai_otel/mcp_instrumentors/redis_instrumentor.py,sha256=KUbs0dMyfMzU4T0SS8u43I5fvr09lcBBM92I3KCsYUw,943
39
40
  genai_otel/mcp_instrumentors/vector_db_instrumentor.py,sha256=2vhnk4PGpfYKr-XlRbnCIOap4BPKHOn--fh-ai2YXlM,9994
40
- genai_otel_instrument-0.1.4.dev0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
41
- genai_otel_instrument-0.1.4.dev0.dist-info/METADATA,sha256=jY6ORZ3rNiaqaygHDhgZE3t4cYEzdRb4k26GY18B29I,30063
42
- genai_otel_instrument-0.1.4.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
43
- genai_otel_instrument-0.1.4.dev0.dist-info/entry_points.txt,sha256=E9UqoHA_fq69yNGAY3SRYf5HH94sZT5DiDueiU1v0KM,57
44
- genai_otel_instrument-0.1.4.dev0.dist-info/top_level.txt,sha256=cvCm8PUwvYUSQKruk-x6S-_YuDyhOBk8gD910XICcbg,11
45
- genai_otel_instrument-0.1.4.dev0.dist-info/RECORD,,
41
+ genai_otel_instrument-0.1.9.dev0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
42
+ genai_otel_instrument-0.1.9.dev0.dist-info/METADATA,sha256=0VWI_mIy84sv8pA0Ae_WY3X3XJKpJZTdjw_7n0o9-XQ,39613
43
+ genai_otel_instrument-0.1.9.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
44
+ genai_otel_instrument-0.1.9.dev0.dist-info/entry_points.txt,sha256=E9UqoHA_fq69yNGAY3SRYf5HH94sZT5DiDueiU1v0KM,57
45
+ genai_otel_instrument-0.1.9.dev0.dist-info/top_level.txt,sha256=cvCm8PUwvYUSQKruk-x6S-_YuDyhOBk8gD910XICcbg,11
46
+ genai_otel_instrument-0.1.9.dev0.dist-info/RECORD,,