diff --git a/Cargo.toml b/Cargo.toml index f092164..dc0ed93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "models/files", "models/token", + "poem/opentelemetry-basic", "poem/starwars", "poem/subscription", "poem/subscription-redis", diff --git a/poem/opentelemetry-basic/Cargo.toml b/poem/opentelemetry-basic/Cargo.toml new file mode 100644 index 0000000..1e7b98d --- /dev/null +++ b/poem/opentelemetry-basic/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "poem-opentelemetry-basic" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-graphql = { path = "../../..", features = ["opentelemetry"] } +async-graphql-poem = { path = "../../../integrations/poem" } +tokio = { version = "1.8", features = ["macros", "rt-multi-thread"] } +poem = "1.3.42" +opentelemetry = { version = "0.17.0", features = ["rt-tokio"] } \ No newline at end of file diff --git a/poem/opentelemetry-basic/src/main.rs b/poem/opentelemetry-basic/src/main.rs new file mode 100644 index 0000000..625e12b --- /dev/null +++ b/poem/opentelemetry-basic/src/main.rs @@ -0,0 +1,42 @@ +use async_graphql::{ + extensions::OpenTelemetry, EmptyMutation, EmptySubscription, Object, Result, Schema, +}; +use async_graphql_poem::GraphQL; +use opentelemetry::sdk::export::trace::stdout; +use poem::{listener::TcpListener, post, EndpointExt, Route, Server}; + +struct QueryRoot; + +#[Object] +impl QueryRoot { + async fn hello(&self) -> Result { + Ok("World".to_string()) + } +} + +#[tokio::main] +async fn main() { + let tracer = stdout::new_pipeline().install_simple(); + let opentelemetry_extension = OpenTelemetry::new(tracer); + + let schema = Schema::build(QueryRoot, EmptyMutation, EmptySubscription) + .extension(opentelemetry_extension) + .finish(); + + let app = Route::new() + .at("/", post(GraphQL::new(schema.clone()))) + .data(schema); + + let example_curl = "\ + curl '0.0.0.0:8000' \ + -X POST \ + -H 'content-type: application/json' \ + --data '{ \"query\": \"{ hello }\" }'"; + + println!("Run this curl command from another terminal window to see opentelemetry output in this terminal.\n\n{example_curl}\n\n"); + + Server::new(TcpListener::bind("0.0.0.0:8000")) + .run(app) + .await + .unwrap(); +}