Skip to content

Commit 04e460c

Browse files
authored
fix(tracing): add vendor reporting for OTEL tracing (#64)
1 parent dd20bf0 commit 04e460c

File tree

20 files changed

+366
-124
lines changed

20 files changed

+366
-124
lines changed

src/config/validation.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,15 @@ pub fn validate_gateway_config(config: &GatewayConfig) -> Result<(), Vec<String>
5252
#[cfg(test)]
5353
mod tests {
5454
use super::*; // To import validate_gateway_config
55-
use crate::types::{ModelConfig, Pipeline, PipelineType, PluginConfig, Provider}; // For test data
55+
use crate::types::{ModelConfig, Pipeline, PipelineType, PluginConfig, Provider, ProviderType}; // For test data
5656

5757
#[test]
5858
fn test_valid_config() {
5959
let config = GatewayConfig {
6060
general: None,
6161
providers: vec![Provider {
6262
key: "p1".to_string(),
63-
r#type: "openai".to_string(),
63+
r#type: ProviderType::OpenAI,
6464
api_key: "key1".to_string(),
6565
params: Default::default(),
6666
}],
@@ -87,7 +87,7 @@ mod tests {
8787
general: None,
8888
providers: vec![Provider {
8989
key: "p1".to_string(),
90-
r#type: "openai".to_string(),
90+
r#type: ProviderType::OpenAI,
9191
api_key: "key1".to_string(),
9292
params: Default::default(),
9393
}],
@@ -112,7 +112,7 @@ mod tests {
112112
general: None,
113113
providers: vec![Provider {
114114
key: "p1".to_string(),
115-
r#type: "openai".to_string(),
115+
r#type: ProviderType::OpenAI,
116116
api_key: "key1".to_string(),
117117
params: Default::default(),
118118
}],

src/management/dto.rs

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use serde::{Deserialize, Serialize};
33
use sqlx::types::Uuid;
44
use utoipa::ToSchema;
55

6+
pub use crate::types::ProviderType;
7+
68
/// Represents different ways to store and retrieve secrets
79
#[derive(Serialize, Deserialize, Debug, ToSchema, Clone, PartialEq, Eq)]
810
#[serde(tag = "type")]
@@ -50,49 +52,6 @@ impl SecretObject {
5052
}
5153
}
5254

53-
/// Enum representing the type of LLM provider.
54-
#[derive(Serialize, Deserialize, Debug, ToSchema, Clone, Copy, PartialEq, Eq, Hash)]
55-
#[serde(rename_all = "snake_case")]
56-
pub enum ProviderType {
57-
#[serde(rename = "azure")]
58-
Azure,
59-
#[serde(rename = "openai")]
60-
OpenAI,
61-
#[serde(rename = "anthropic")]
62-
Anthropic,
63-
#[serde(rename = "bedrock")]
64-
Bedrock,
65-
#[serde(rename = "vertexai")]
66-
VertexAI,
67-
}
68-
69-
impl std::fmt::Display for ProviderType {
70-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71-
match self {
72-
ProviderType::Azure => write!(f, "azure"),
73-
ProviderType::OpenAI => write!(f, "openai"),
74-
ProviderType::Anthropic => write!(f, "anthropic"),
75-
ProviderType::Bedrock => write!(f, "bedrock"),
76-
ProviderType::VertexAI => write!(f, "vertexai"),
77-
}
78-
}
79-
}
80-
81-
impl std::str::FromStr for ProviderType {
82-
type Err = String; // Or a custom error type
83-
84-
fn from_str(s: &str) -> Result<Self, Self::Err> {
85-
match s.to_lowercase().as_str() {
86-
"azure" => Ok(ProviderType::Azure),
87-
"openai" => Ok(ProviderType::OpenAI),
88-
"anthropic" => Ok(ProviderType::Anthropic),
89-
"bedrock" => Ok(ProviderType::Bedrock),
90-
"vertexai" => Ok(ProviderType::VertexAI),
91-
_ => Err(format!("Unknown provider type: {s}")),
92-
}
93-
}
94-
}
95-
9655
/// Configuration specific to OpenAI providers.
9756
#[derive(Serialize, Deserialize, Debug, ToSchema, Clone, PartialEq, Eq)]
9857
pub struct OpenAIProviderConfig {

src/management/services/config_provider_service.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ impl ConfigProviderService {
184184

185185
Ok(Provider {
186186
key: dto.name,
187-
r#type: dto.provider_type.to_string(),
187+
r#type: dto.provider_type,
188188
api_key: api_key_from_dto.unwrap_or_default(),
189189
params,
190190
})

src/pipelines/otel.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,11 @@ impl OtelTracer {
172172
pub fn log_error(&mut self, description: String) {
173173
self.span.set_status(Status::error(description));
174174
}
175+
176+
pub fn set_vendor(&mut self, vendor: &str) {
177+
self.span
178+
.set_attribute(KeyValue::new(GEN_AI_SYSTEM, vendor.to_string()));
179+
}
175180
}
176181

177182
impl RecordSpan for ChatCompletionRequest {
@@ -385,3 +390,38 @@ impl RecordSpan for EmbeddingUsage {
385390
));
386391
}
387392
}
393+
394+
#[cfg(test)]
395+
mod tests {
396+
use super::*;
397+
use crate::providers::provider::get_vendor_name;
398+
use crate::types::ProviderType;
399+
400+
#[test]
401+
fn test_get_vendor_name_mappings() {
402+
// Test all provider type mappings to standardized vendor names
403+
assert_eq!(get_vendor_name(&ProviderType::OpenAI), "openai");
404+
assert_eq!(get_vendor_name(&ProviderType::Azure), "Azure");
405+
assert_eq!(get_vendor_name(&ProviderType::Anthropic), "Anthropic");
406+
assert_eq!(get_vendor_name(&ProviderType::Bedrock), "AWS");
407+
assert_eq!(get_vendor_name(&ProviderType::VertexAI), "Google");
408+
}
409+
410+
#[test]
411+
fn test_set_vendor_method_exists() {
412+
// Test that set_vendor method compiles and can be called
413+
// This ensures the method signature is correct
414+
let mut tracer = OtelTracer {
415+
span: opentelemetry::global::tracer("test").start("test"),
416+
accumulated_completion: None,
417+
};
418+
419+
// Call set_vendor with different vendor names - this tests the method exists and accepts strings
420+
tracer.set_vendor("OpenAI");
421+
tracer.set_vendor("Anthropic");
422+
tracer.set_vendor("Azure");
423+
424+
// If this test passes, it means set_vendor() is working without panicking
425+
assert!(true);
426+
}
427+
}

0 commit comments

Comments
 (0)