Skip to content

Commit e1ab20f

Browse files
authored
chore: Add skeleton directory structure for Geneva exporter (#190)
1 parent 4646796 commit e1ab20f

File tree

11 files changed

+153
-1
lines changed

11 files changed

+153
-1
lines changed

Cargo.toml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
[workspace]
22
members = [
3-
"opentelemetry-*",
3+
"opentelemetry-aws",
4+
"opentelemetry-contrib",
5+
"opentelemetry-datadog",
6+
"opentelemetry-etw-logs",
7+
"opentelemetry-etw-metrics",
8+
"opentelemetry-resource-detectors",
9+
"opentelemetry-stackdriver",
10+
"opentelemetry-user-events-logs",
11+
"opentelemetry-user-events-metrics",
12+
"opentelemetry-zpages",
13+
"opentelemetry-exporter-geneva/geneva-uploader",
14+
"opentelemetry-exporter-geneva/geneva-uploader-ffi",
15+
"opentelemetry-exporter-geneva/opentelemetry-exporter-geneva",
416
"examples/*",
517
"stress",
618
]
19+
720
resolver = "2"
821

922
[profile.bench]
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# OpenTelemetry Geneva Exporter
2+
3+
The **OpenTelemetry Geneva Exporter** is designed for Microsoft products to send data to public-facing end-points which route to Microsoft's internal data pipeline. It is not meant to be used outside of Microsoft products and is open sourced to demonstrate best practices and to be transparent about what is being collected.
4+
5+
## Overview
6+
The **OpenTelemetry Geneva Exporter** is a set of Rust-based components designed to facilitate exporting telemetry data (logs and traces) to **Geneva**. It consists of multiple crates that handle different aspects of telemetry data processing and integration.
7+
8+
## Project Structure
9+
The repository contains the following sub-crates:
10+
11+
- **[geneva-uploader](geneva-uploader/)**: Core uploader responsible for sending telemetry data to the Geneva backend.
12+
- **[geneva-uploader-ffi](geneva-uploader-ffi/)**: FFI (Foreign Function Interface) layer for integrating with other languages.
13+
- **[opentelemetry-exporter-geneva](opentelemetry-exporter-geneva/)**: OpenTelemetry-compliant exporter for Geneva
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "geneva-uploader-ffi"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
8+
9+
[lints]
10+
workspace = true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "geneva-uploader"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
opentelemetry-proto = {workspace = true, default-features = false, features = ["logs"]}
8+
9+
[lints]
10+
workspace = true
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod uploader;
2+
pub use uploader::{create_uploader, GenevaUploader};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use opentelemetry_proto::tonic::logs::v1::ResourceLogs;
2+
use std::sync::Arc;
3+
4+
/// A basic implementation of the log uploader.
5+
pub struct GenevaUploader;
6+
7+
impl GenevaUploader {
8+
/// Upload logs to Geneva
9+
pub async fn upload_logs(&self, logs: Vec<ResourceLogs>) -> Result<(), String> {
10+
// TODO: Process and send logs to Geneva
11+
for log in &logs {
12+
println!("Processing log: {:?}", log);
13+
}
14+
15+
// Simulate successful processing
16+
Ok(())
17+
}
18+
}
19+
20+
/// Helper function to create an uploader instance.
21+
pub fn create_uploader() -> Arc<GenevaUploader> {
22+
Arc::new(GenevaUploader)
23+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[package]
2+
name = "opentelemetry-exporter-geneva"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
opentelemetry_sdk = { workspace = true, default-features = false, features = ["logs"] }
8+
opentelemetry-proto = {workspace = true, default-features = false, features = ["logs"]}
9+
geneva-uploader = {path = "../geneva-uploader/", version = "0.1.0"}
10+
11+
12+
[lints]
13+
workspace = true
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//! The OpenTelemetry Geneva exporter will enable applications to use OpenTelemetry API
2+
//! to capture the telemetry events, and write to Microsoft internal backend.
3+
4+
#![warn(missing_debug_implementations, missing_docs)]
5+
6+
mod logs;
7+
8+
pub use logs::*;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
use core::fmt;
2+
use geneva_uploader::GenevaUploader;
3+
use opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema;
4+
use opentelemetry_proto::transform::logs::tonic::group_logs_by_resource_and_scope;
5+
use opentelemetry_sdk::error::OTelSdkResult;
6+
use opentelemetry_sdk::logs::LogBatch;
7+
use std::sync::{atomic, Arc};
8+
9+
/// An OpenTelemetry exporter that writes logs to Geneva exporter
10+
pub struct GenevaExporter {
11+
resource: ResourceAttributesWithSchema,
12+
_is_shutdown: atomic::AtomicBool,
13+
uploader: Arc<GenevaUploader>,
14+
}
15+
16+
impl GenevaExporter {
17+
/// Create a new GenavaExporter
18+
pub fn new(uploader: Arc<GenevaUploader>) -> Self {
19+
Self {
20+
resource: ResourceAttributesWithSchema::default(),
21+
_is_shutdown: atomic::AtomicBool::new(false),
22+
uploader,
23+
}
24+
}
25+
}
26+
27+
impl Default for GenevaExporter {
28+
fn default() -> Self {
29+
GenevaExporter {
30+
resource: ResourceAttributesWithSchema::default(),
31+
_is_shutdown: atomic::AtomicBool::new(false),
32+
uploader: Arc::new(GenevaUploader),
33+
}
34+
}
35+
}
36+
37+
impl fmt::Debug for GenevaExporter {
38+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39+
f.write_str("Genava exporter")
40+
}
41+
}
42+
43+
impl opentelemetry_sdk::logs::LogExporter for GenevaExporter {
44+
/// Export logs to stdout
45+
async fn export(&self, _batch: LogBatch<'_>) -> OTelSdkResult {
46+
//serialize to otlp format
47+
let otlp = group_logs_by_resource_and_scope(_batch, &self.resource);
48+
//send to Geneva using geneva-uploader
49+
let _ = self.uploader.upload_logs(otlp).await;
50+
51+
Ok(())
52+
}
53+
54+
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
55+
self.resource = resource.into();
56+
}
57+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod exporter;
2+
pub use exporter::GenevaExporter;

0 commit comments

Comments
 (0)