Skip to content

Commit cf86e00

Browse files
committed
add opentelemetry
1 parent e670785 commit cf86e00

15 files changed

+115
-51
lines changed

Cargo.lock

+4-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ It provides a static web http server with cache and hot reload.
2222
- Provide command line/npm package to deploy spa.
2323
- Multiple configs for different domain.
2424
- support Let's Encrypt
25+
- support OpenTelemetry Trace
2526
- provide JS SDK and command line client to interact with Server
2627

2728
## Document

README_CN.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
- 提供 命令行/npm包 客户端,一行命令部署
2222
- 每个域名可拥有独立的配置
2323
- 支持 Let's Encrypt
24+
- 支持 OpenTelemetry
2425
- 提供JS SDK、命令行客户端与服务器进行交互。
2526

2627
## 文档

server/Cargo.toml

+2-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ include = ["src/**/*", "Cargo.toml"]
1515

1616
[[bin]]
1717
name = "spa-server"
18-
path = "src/bin/main.rs"
18+
path = "src/main.rs"
1919

2020
[dependencies]
2121
entity = { path = "../entity" }
@@ -51,8 +51,7 @@ tracing-opentelemetry = "0.24"
5151
opentelemetry = { version = "0.23", features = ["trace", "metrics"] }
5252
opentelemetry_sdk = { version = "0.23", features = ["rt-tokio", "metrics"] }
5353
opentelemetry-otlp = { version = "0.16", features = ["default", "metrics"] }
54-
opentelemetry-stdout = { version = "0.4", features = ["trace"] }
55-
opentelemetry-resource-detectors = { version = "0.2" }
54+
#opentelemetry-resource-detectors = { version = "0.2" }
5655
opentelemetry-semantic-conventions = { version = "0.15" }
5756

5857
# tokio cron

server/examples/try_opentelemetry.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ async fn foo() {
177177
}
178178
179179
*/
180-
180+
/*
181181
use opentelemetry::{global, Key, KeyValue};
182182
use opentelemetry_otlp::{ExportConfig, Protocol, TonicExporterBuilder, WithExportConfig};
183183
use opentelemetry_resource_detectors::{OsResourceDetector, ProcessResourceDetector};
@@ -314,3 +314,4 @@ async fn test_instrument() {
314314
info!(histogram.baz = 10, "histogram example",);
315315
}
316316
317+
*/

server/src/bin/main.rs

-20
This file was deleted.

server/src/config.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub struct Config {
2525

2626
#[derive(Deserialize, Debug, Clone, PartialEq)]
2727
pub struct OpenTelemetry {
28-
endpoint: String,
28+
pub endpoint: String,
2929
}
3030

3131
//TODO: create config with lots of default value

server/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ pub mod tls;
1111

1212
mod acme;
1313
pub mod cors;
14-
mod otlp;
1514
pub mod service;
1615
pub mod static_file_filter;
1716

server/src/main.rs

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
mod otlp;
2+
3+
use tracing_core::Level;
4+
use tracing_subscriber::EnvFilter;
5+
use spa_server::config::Config;
6+
7+
8+
#[tokio::main]
9+
async fn main() -> anyhow::Result<()> {
10+
let config = Config::load()?;
11+
let open_telemetry = &config.open_telemetry;
12+
if let Some(open_telemetry) = open_telemetry.as_ref() {
13+
otlp::init_otlp(open_telemetry.endpoint.clone())?;
14+
} else {
15+
tracing_subscriber::fmt()
16+
.with_env_filter(
17+
EnvFilter::builder()
18+
.with_default_directive(Level::INFO.into())
19+
.from_env_lossy(),
20+
)
21+
.init();
22+
}
23+
24+
25+
tracing::debug!("config load:{:?}", &config);
26+
spa_server::run_server_with_config(config).await
27+
}

server/src/otlp.rs

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use opentelemetry::KeyValue;
2+
use opentelemetry_otlp::{ExportConfig, WithExportConfig};
3+
use opentelemetry_sdk::{Resource, runtime};
4+
use opentelemetry_sdk::trace::config;
5+
use opentelemetry_semantic_conventions::resource::SERVICE_NAME;
6+
use opentelemetry_semantic_conventions::trace::SERVICE_VERSION;
7+
use tracing_core::Level;
8+
use tracing_opentelemetry::OpenTelemetryLayer;
9+
use tracing_subscriber::EnvFilter;
10+
use tracing_subscriber::layer::SubscriberExt;
11+
use tracing_subscriber::util::SubscriberInitExt;
12+
13+
pub fn init_otlp(endpoint:String) -> anyhow::Result<()>{
14+
let resource = Resource::new(vec![
15+
KeyValue::new(SERVICE_NAME, "spa-server"),
16+
KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION"))
17+
]);
18+
let mut export_config = ExportConfig::default();
19+
export_config.endpoint = endpoint;
20+
let exporter = opentelemetry_otlp::new_exporter().tonic()
21+
.with_export_config(export_config);
22+
23+
let tracer = opentelemetry_otlp::new_pipeline()
24+
.tracing().with_exporter(exporter)
25+
.with_trace_config(config().with_resource(resource))
26+
.install_batch(runtime::Tokio)?;
27+
28+
let filter = EnvFilter::builder()
29+
.with_default_directive(Level::INFO.into())
30+
.from_env_lossy();
31+
tracing_subscriber::registry()
32+
.with(filter)
33+
.with(tracing_subscriber::fmt::layer().compact())
34+
.with(OpenTelemetryLayer::new(tracer))
35+
.init();
36+
Ok(())
37+
38+
}

server/src/service.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use std::collections::HashMap;
1010
use std::convert::Infallible;
1111
use std::str::FromStr;
1212
use std::sync::Arc;
13-
use tracing::warn;
13+
use tracing::{instrument, warn};
1414
use warp::fs::{ArcPath, Conditionals};
1515
use warp::http::Uri;
1616
use warp::Reply;
@@ -55,6 +55,7 @@ fn alias_redirect(uri: &Uri, https: bool, host:&str, external_port:u16) -> warp:
5555
}
5656

5757
// static file reply
58+
#[instrument(skip(uri,host,domain_storage,origin_opt))]
5859
async fn file_resp(req: &Request<Body>,uri:&Uri, host:&str, domain_storage: Arc<DomainStorage>, origin_opt: Option<Validated>) -> Result<Response<Body>, Infallible> {
5960
let path = uri.path();
6061
let mut resp = match get_cache_file(path, host, domain_storage.clone()).await {
@@ -109,7 +110,7 @@ fn get_authority(req:&Request<Body>) -> Option<Authority> {
109110
})
110111
}
111112

112-
113+
#[instrument(skip(service_config, domain_storage,challenge_path, external_port))]
113114
pub async fn create_http_service(
114115
req: Request<Body>,
115116
service_config: Arc<ServiceConfig>,
@@ -174,7 +175,7 @@ pub async fn create_http_service(
174175

175176
}
176177

177-
178+
#[instrument(skip(service_config, domain_storage, external_port))]
178179
pub async fn create_https_service(
179180
req: Request<Body>,
180181
service_config: Arc<ServiceConfig>,

server/src/static_file_filter.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use std::path::Path;
1414
use std::sync::Arc;
1515
use tokio::fs::File;
1616
use tokio::io;
17-
use tracing::debug;
17+
use tracing::{debug, trace};
1818
use warp::fs::{file_stream, optimal_buf_size, Cond, Conditionals};
1919
use warp::http::{Response, StatusCode};
2020

@@ -202,15 +202,15 @@ pub async fn cache_or_file_reply(
202202
//false,false => cache without content-encoding
203203
//false, true => file
204204
if !client_accept_gzip && compressed {
205-
debug!("{} hit disk", key);
205+
trace!("{} hit disk", key);
206206
Ok(file_reply(&item, path.as_ref(), range, modified).await)
207207
} else {
208208
let mut resp = cache_reply(item.as_ref(), bytes, range, modified);
209209
if client_accept_gzip && compressed {
210-
debug!("{} hit cache, compressed", key);
210+
trace!("{} hit cache, compressed", key);
211211
resp.headers_mut().typed_insert(ContentEncoding::gzip());
212212
} else {
213-
debug!("{} hit cache", key);
213+
trace!("{} hit cache", key);
214214
}
215215
Ok(resp)
216216
}
@@ -255,7 +255,7 @@ pub async fn get_cache_file(
255255
) -> Option<(String, Arc<CacheItem>)> {
256256
let _key = sanitize_path(tail)?;
257257
let key = _key[1..].to_owned();
258-
debug!("get file: {host}, tail:{_key}, fixed: {key}");
258+
//debug!("get file: {host}, tail:{_key}, fixed: {key}");
259259
if let Some(cache_item) = domain_storage.get_file(host, &key) {
260260
Some((key, cache_item))
261261
} else {

tests/Cargo.toml

+5
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,10 @@ tracing = "0.1"
1919
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
2020
anyhow = "1.0.56"
2121
console-subscriber = "0.3"
22+
opentelemetry-stdout = { version = "0.4", features = ["trace"] }
23+
tracing-opentelemetry = "0.24"
24+
opentelemetry = { version = "0.23", features = ["trace", "metrics"] }
25+
opentelemetry_sdk = { version = "0.23", features = ["rt-tokio", "metrics"] }
26+
2227
#rustls = "0.21.12" # from reqwest
2328
#rustls-pemfile = "2.1.2"

tests/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ async fn main() -> Result<()> {
1010
"SPA_CONFIG",
1111
get_test_dir().join("server_config.toml").display().to_string(),
1212
);
13+
1314
tracing_subscriber::fmt()
1415
.with_env_filter(
1516
EnvFilter::builder()

tests/tests/common.rs

+24-4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ use spa_client::api::API;
55
use std::path::{Path, PathBuf};
66
use std::sync::OnceLock;
77
use std::{env, fs, io};
8+
use opentelemetry::trace::TracerProvider as _;
9+
use opentelemetry_sdk::trace::TracerProvider;
10+
use opentelemetry_stdout::SpanExporter;
811
//use tokio::sync::oneshot;
912
use tokio::task::JoinHandle;
1013
use tracing::{debug, error};
1114
use tracing_subscriber::EnvFilter;
15+
use tracing_subscriber::layer::SubscriberExt;
16+
use tracing_subscriber::util::SubscriberInitExt;
17+
1218

1319
pub const LOCAL_HOST: &str = "local.fornetcode.com";
1420
pub const LOCAL_HOST2: &str = "local2.fornetcode.com";
@@ -67,13 +73,27 @@ pub fn run_server_with_config(config_file_name: &str) -> JoinHandle<()> {
6773
"SPA_CONFIG",
6874
get_test_dir().join(config_file_name).display().to_string(),
6975
);
70-
let _ = tracing_subscriber::fmt()
71-
.with_env_filter(
76+
let provider = TracerProvider::builder()
77+
.with_simple_exporter(SpanExporter::default())
78+
.build();
79+
let tracer = provider.tracer("spa-server");
80+
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
81+
82+
let _ = tracing_subscriber::registry()
83+
.with(
7284
EnvFilter::try_from_default_env()
7385
.unwrap_or_else(|_| "info,spa_server=debug,spa_client=debug".into()),
7486
)
75-
.with_test_writer()
76-
.try_init();
87+
.with(tracing_subscriber::fmt::layer().compact())
88+
.with(telemetry).try_init();
89+
90+
// let _ = tracing_subscriber::fmt()
91+
// .with_env_filter(
92+
// EnvFilter::try_from_default_env()
93+
// .unwrap_or_else(|_| "info,spa_server=debug,spa_client=debug".into()),
94+
// )
95+
// .with_test_writer()
96+
// .try_init();
7797
tokio::spawn(async move {
7898
let result = spa_server::run_server().await;
7999
if result.is_err() {

0 commit comments

Comments
 (0)