use opentelemetry_proto::tonic::collector::metrics::v1::ExportMetricsServiceRequest;
use otlp_arrow_library::otlp::BatchBuffer;
fn create_test_protobuf_metrics_request() -> ExportMetricsServiceRequest {
use opentelemetry_proto::tonic::collector::metrics::v1::ExportMetricsServiceRequest;
use opentelemetry_proto::tonic::common::v1::{AnyValue, KeyValue};
use opentelemetry_proto::tonic::metrics::v1::ResourceMetrics;
let resource = Some(opentelemetry_proto::tonic::resource::v1::Resource {
attributes: vec![KeyValue {
key: "service.name".to_string(),
value: Some(AnyValue {
value: Some(
opentelemetry_proto::tonic::common::v1::any_value::Value::StringValue(
"test-service".to_string(),
),
),
}),
}],
dropped_attributes_count: 0,
entity_refs: vec![],
});
let resource_metrics = ResourceMetrics {
resource,
scope_metrics: vec![],
schema_url: "".to_string(),
};
ExportMetricsServiceRequest {
resource_metrics: vec![resource_metrics],
}
}
#[tokio::test]
async fn test_batch_buffer_add_metrics_protobuf() {
let buffer = BatchBuffer::new(5, 10000, 10000);
let metrics_request = create_test_protobuf_metrics_request();
let result = buffer.add_metrics_protobuf(metrics_request).await;
assert!(result.is_ok(), "Adding protobuf metrics should succeed");
let count = buffer.metric_count().await;
assert_eq!(count, 1, "Buffer should contain 1 metric");
}
#[tokio::test]
async fn test_batch_buffer_take_metrics_protobuf() {
let buffer = BatchBuffer::new(5, 10000, 10000);
let metrics_request = create_test_protobuf_metrics_request();
buffer
.add_metrics_protobuf(metrics_request.clone())
.await
.unwrap();
let taken = buffer.take_metrics().await;
assert_eq!(taken.len(), 1, "Should take 1 metric");
let taken_request = &taken[0];
assert_eq!(
taken_request.resource_metrics.len(),
1,
"Protobuf request should contain resource metrics"
);
let count = buffer.metric_count().await;
assert_eq!(count, 0, "Buffer should be empty after take");
}
#[tokio::test]
async fn test_batch_buffer_multiple_metrics_protobuf() {
let buffer = BatchBuffer::new(5, 10000, 10000);
for i in 0..5 {
let mut request = create_test_protobuf_metrics_request();
if let Some(ref mut rm) = request.resource_metrics.first_mut()
&& let Some(ref mut resource) = rm.resource
{
resource.attributes[0].key = format!("service.name.{}", i);
}
buffer.add_metrics_protobuf(request).await.unwrap();
}
let count = buffer.metric_count().await;
assert_eq!(count, 5, "Buffer should contain 5 metrics");
let taken = buffer.take_metrics().await;
assert_eq!(taken.len(), 5, "Should take all 5 metrics");
let count = buffer.metric_count().await;
assert_eq!(count, 0, "Buffer should be empty after take");
}
#[tokio::test]
async fn test_batch_buffer_protobuf_clone_support() {
let buffer = BatchBuffer::new(5, 10000, 10000);
let metrics_request = create_test_protobuf_metrics_request();
let cloned_request = metrics_request.clone();
assert_eq!(
metrics_request.resource_metrics.len(),
cloned_request.resource_metrics.len(),
"Cloned request should have same structure"
);
buffer.add_metrics_protobuf(metrics_request).await.unwrap();
buffer.add_metrics_protobuf(cloned_request).await.unwrap();
let count = buffer.metric_count().await;
assert_eq!(
count, 2,
"Buffer should contain 2 metrics (original + cloned)"
);
}