diff --git a/Cargo.lock b/Cargo.lock index 3769e1913a..c41aa4d8e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1986,7 +1986,7 @@ dependencies = [ "operator", "query", "rand 0.9.0", - "reqwest", + "reqwest 0.12.9", "serde", "serde_json", "servers", @@ -2124,7 +2124,7 @@ dependencies = [ "query", "rand 0.9.0", "regex", - "reqwest", + "reqwest 0.12.9", "rexpect", "serde", "serde_json", @@ -2370,7 +2370,7 @@ dependencies = [ "common-test-util", "common-version", "hyper 0.14.30", - "reqwest", + "reqwest 0.12.9", "serde", "tempfile", "tokio", @@ -3762,7 +3762,7 @@ dependencies = [ "prometheus", "prost 0.13.5", "query", - "reqwest", + "reqwest 0.12.9", "serde", "serde_json", "servers", @@ -8238,7 +8238,7 @@ dependencies = [ "prometheus", "quick-xml 0.36.2", "reqsign", - "reqwest", + "reqwest 0.12.9", "serde", "serde_json", "sha2", @@ -8310,6 +8310,19 @@ dependencies = [ "tracing", ] +[[package]] +name = "opentelemetry-http" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f51189ce8be654f9b5f7e70e49967ed894e84a06fc35c6c042e64ac1fc5399e" +dependencies = [ + "async-trait", + "bytes", + "http 0.2.12", + "opentelemetry 0.21.0", + "reqwest 0.11.27", +] + [[package]] name = "opentelemetry-otlp" version = "0.14.0" @@ -8320,10 +8333,12 @@ dependencies = [ "futures-core", "http 0.2.12", "opentelemetry 0.21.0", + "opentelemetry-http", "opentelemetry-proto 0.4.0", "opentelemetry-semantic-conventions", "opentelemetry_sdk 0.21.2", "prost 0.11.9", + "reqwest 0.11.27", "thiserror 1.0.64", "tokio", "tonic 0.9.2", @@ -10310,7 +10325,7 @@ dependencies = [ "percent-encoding", "quick-xml 0.35.0", "rand 0.8.5", - "reqwest", + "reqwest 0.12.9", "rsa", "rust-ini 0.21.1", "serde", @@ -10319,6 +10334,42 @@ dependencies = [ "sha2", ] +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "reqwest" version = "0.12.9" @@ -11234,7 +11285,7 @@ dependencies = [ "quoted-string", "rand 0.9.0", "regex", - "reqwest", + "reqwest 0.12.9", "rust-embed", "rustls", "rustls-pemfile", @@ -11678,7 +11729,7 @@ dependencies = [ "local-ip-address", "mysql", "num_cpus", - "reqwest", + "reqwest 0.12.9", "serde", "serde_json", "sha2", @@ -12328,6 +12379,27 @@ dependencies = [ "nom", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "table" version = "0.15.0" @@ -12618,7 +12690,7 @@ dependencies = [ "paste", "rand 0.9.0", "rand_chacha 0.9.0", - "reqwest", + "reqwest 0.12.9", "schemars", "serde", "serde_json", @@ -14501,6 +14573,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/config/config.md b/config/config.md index 37cd5d1bac..5369f14cd9 100644 --- a/config/config.md +++ b/config/config.md @@ -185,10 +185,11 @@ | `logging.dir` | String | `./greptimedb_data/logs` | The directory to store the log files. If set to empty, logs will not be written to files. | | `logging.level` | String | Unset | The log level. Can be `info`/`debug`/`warn`/`error`. | | `logging.enable_otlp_tracing` | Bool | `false` | Enable OTLP tracing. | -| `logging.otlp_endpoint` | String | `http://localhost:4317` | The OTLP tracing endpoint. | +| `logging.otlp_endpoint` | String | `http://localhost:4318` | The OTLP tracing endpoint. | | `logging.append_stdout` | Bool | `true` | Whether to append logs to stdout. | | `logging.log_format` | String | `text` | The log format. Can be `text`/`json`. | | `logging.max_log_files` | Integer | `720` | The maximum amount of log files. | +| `logging.otlp_export_protocol` | String | `http` | The OTLP tracing export protocol. Can be `grpc`/`http`. | | `logging.tracing_sample_ratio` | -- | -- | The percentage of tracing will be sampled and exported.
Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1.
ratio > 1 are treated as 1. Fractions < 0 are treated as 0 | | `logging.tracing_sample_ratio.default_ratio` | Float | `1.0` | -- | | `slow_query` | -- | -- | The slow query log options. | @@ -288,10 +289,11 @@ | `logging.dir` | String | `./greptimedb_data/logs` | The directory to store the log files. If set to empty, logs will not be written to files. | | `logging.level` | String | Unset | The log level. Can be `info`/`debug`/`warn`/`error`. | | `logging.enable_otlp_tracing` | Bool | `false` | Enable OTLP tracing. | -| `logging.otlp_endpoint` | String | `http://localhost:4317` | The OTLP tracing endpoint. | +| `logging.otlp_endpoint` | String | `http://localhost:4318` | The OTLP tracing endpoint. | | `logging.append_stdout` | Bool | `true` | Whether to append logs to stdout. | | `logging.log_format` | String | `text` | The log format. Can be `text`/`json`. | | `logging.max_log_files` | Integer | `720` | The maximum amount of log files. | +| `logging.otlp_export_protocol` | String | `http` | The OTLP tracing export protocol. Can be `grpc`/`http`. | | `logging.tracing_sample_ratio` | -- | -- | The percentage of tracing will be sampled and exported.
Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1.
ratio > 1 are treated as 1. Fractions < 0 are treated as 0 | | `logging.tracing_sample_ratio.default_ratio` | Float | `1.0` | -- | | `slow_query` | -- | -- | The slow query log options. | @@ -370,10 +372,11 @@ | `logging.dir` | String | `./greptimedb_data/logs` | The directory to store the log files. If set to empty, logs will not be written to files. | | `logging.level` | String | Unset | The log level. Can be `info`/`debug`/`warn`/`error`. | | `logging.enable_otlp_tracing` | Bool | `false` | Enable OTLP tracing. | -| `logging.otlp_endpoint` | String | `http://localhost:4317` | The OTLP tracing endpoint. | +| `logging.otlp_endpoint` | String | `http://localhost:4318` | The OTLP tracing endpoint. | | `logging.append_stdout` | Bool | `true` | Whether to append logs to stdout. | | `logging.log_format` | String | `text` | The log format. Can be `text`/`json`. | | `logging.max_log_files` | Integer | `720` | The maximum amount of log files. | +| `logging.otlp_export_protocol` | String | `http` | The OTLP tracing export protocol. Can be `grpc`/`http`. | | `logging.tracing_sample_ratio` | -- | -- | The percentage of tracing will be sampled and exported.
Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1.
ratio > 1 are treated as 1. Fractions < 0 are treated as 0 | | `logging.tracing_sample_ratio.default_ratio` | Float | `1.0` | -- | | `export_metrics` | -- | -- | The metasrv can export its metrics and send to Prometheus compatible service (e.g. `greptimedb` itself) from remote-write API.
This is only used for `greptimedb` to export its own metrics internally. It's different from prometheus scrape. | @@ -534,10 +537,11 @@ | `logging.dir` | String | `./greptimedb_data/logs` | The directory to store the log files. If set to empty, logs will not be written to files. | | `logging.level` | String | Unset | The log level. Can be `info`/`debug`/`warn`/`error`. | | `logging.enable_otlp_tracing` | Bool | `false` | Enable OTLP tracing. | -| `logging.otlp_endpoint` | String | `http://localhost:4317` | The OTLP tracing endpoint. | +| `logging.otlp_endpoint` | String | `http://localhost:4318` | The OTLP tracing endpoint. | | `logging.append_stdout` | Bool | `true` | Whether to append logs to stdout. | | `logging.log_format` | String | `text` | The log format. Can be `text`/`json`. | | `logging.max_log_files` | Integer | `720` | The maximum amount of log files. | +| `logging.otlp_export_protocol` | String | `http` | The OTLP tracing export protocol. Can be `grpc`/`http`. | | `logging.tracing_sample_ratio` | -- | -- | The percentage of tracing will be sampled and exported.
Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1.
ratio > 1 are treated as 1. Fractions < 0 are treated as 0 | | `logging.tracing_sample_ratio.default_ratio` | Float | `1.0` | -- | | `export_metrics` | -- | -- | The datanode can export its metrics and send to Prometheus compatible service (e.g. `greptimedb` itself) from remote-write API.
This is only used for `greptimedb` to export its own metrics internally. It's different from prometheus scrape. | @@ -584,10 +588,11 @@ | `logging.dir` | String | `./greptimedb_data/logs` | The directory to store the log files. If set to empty, logs will not be written to files. | | `logging.level` | String | Unset | The log level. Can be `info`/`debug`/`warn`/`error`. | | `logging.enable_otlp_tracing` | Bool | `false` | Enable OTLP tracing. | -| `logging.otlp_endpoint` | String | `http://localhost:4317` | The OTLP tracing endpoint. | +| `logging.otlp_endpoint` | String | `http://localhost:4318` | The OTLP tracing endpoint. | | `logging.append_stdout` | Bool | `true` | Whether to append logs to stdout. | | `logging.log_format` | String | `text` | The log format. Can be `text`/`json`. | | `logging.max_log_files` | Integer | `720` | The maximum amount of log files. | +| `logging.otlp_export_protocol` | String | `http` | The OTLP tracing export protocol. Can be `grpc`/`http`. | | `logging.tracing_sample_ratio` | -- | -- | The percentage of tracing will be sampled and exported.
Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1.
ratio > 1 are treated as 1. Fractions < 0 are treated as 0 | | `logging.tracing_sample_ratio.default_ratio` | Float | `1.0` | -- | | `tracing` | -- | -- | The tracing options. Only effect when compiled with `tokio-console` feature. | diff --git a/config/datanode.example.toml b/config/datanode.example.toml index ac9e9487f5..6cb4d8bed9 100644 --- a/config/datanode.example.toml +++ b/config/datanode.example.toml @@ -629,7 +629,7 @@ level = "info" enable_otlp_tracing = false ## The OTLP tracing endpoint. -otlp_endpoint = "http://localhost:4317" +otlp_endpoint = "http://localhost:4318" ## Whether to append logs to stdout. append_stdout = true @@ -640,6 +640,9 @@ log_format = "text" ## The maximum amount of log files. max_log_files = 720 +## The OTLP tracing export protocol. Can be `grpc`/`http`. +otlp_export_protocol = "http" + ## The percentage of tracing will be sampled and exported. ## Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1. ## ratio > 1 are treated as 1. Fractions < 0 are treated as 0 diff --git a/config/flownode.example.toml b/config/flownode.example.toml index 43c7ef1141..76ddda2540 100644 --- a/config/flownode.example.toml +++ b/config/flownode.example.toml @@ -83,7 +83,7 @@ level = "info" enable_otlp_tracing = false ## The OTLP tracing endpoint. -otlp_endpoint = "http://localhost:4317" +otlp_endpoint = "http://localhost:4318" ## Whether to append logs to stdout. append_stdout = true @@ -94,6 +94,9 @@ log_format = "text" ## The maximum amount of log files. max_log_files = 720 +## The OTLP tracing export protocol. Can be `grpc`/`http`. +otlp_export_protocol = "http" + ## The percentage of tracing will be sampled and exported. ## Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1. ## ratio > 1 are treated as 1. Fractions < 0 are treated as 0 diff --git a/config/frontend.example.toml b/config/frontend.example.toml index a6a818bcc0..ca4cfe9bcf 100644 --- a/config/frontend.example.toml +++ b/config/frontend.example.toml @@ -218,7 +218,7 @@ level = "info" enable_otlp_tracing = false ## The OTLP tracing endpoint. -otlp_endpoint = "http://localhost:4317" +otlp_endpoint = "http://localhost:4318" ## Whether to append logs to stdout. append_stdout = true @@ -229,6 +229,9 @@ log_format = "text" ## The maximum amount of log files. max_log_files = 720 +## The OTLP tracing export protocol. Can be `grpc`/`http`. +otlp_export_protocol = "http" + ## The percentage of tracing will be sampled and exported. ## Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1. ## ratio > 1 are treated as 1. Fractions < 0 are treated as 0 diff --git a/config/metasrv.example.toml b/config/metasrv.example.toml index 81213b2a12..d62ed6c115 100644 --- a/config/metasrv.example.toml +++ b/config/metasrv.example.toml @@ -220,7 +220,7 @@ level = "info" enable_otlp_tracing = false ## The OTLP tracing endpoint. -otlp_endpoint = "http://localhost:4317" +otlp_endpoint = "http://localhost:4318" ## Whether to append logs to stdout. append_stdout = true @@ -231,6 +231,9 @@ log_format = "text" ## The maximum amount of log files. max_log_files = 720 +## The OTLP tracing export protocol. Can be `grpc`/`http`. +otlp_export_protocol = "http" + ## The percentage of tracing will be sampled and exported. ## Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1. ## ratio > 1 are treated as 1. Fractions < 0 are treated as 0 diff --git a/config/standalone.example.toml b/config/standalone.example.toml index 269878b61a..42bc7c913e 100644 --- a/config/standalone.example.toml +++ b/config/standalone.example.toml @@ -720,7 +720,7 @@ level = "info" enable_otlp_tracing = false ## The OTLP tracing endpoint. -otlp_endpoint = "http://localhost:4317" +otlp_endpoint = "http://localhost:4318" ## Whether to append logs to stdout. append_stdout = true @@ -731,6 +731,9 @@ log_format = "text" ## The maximum amount of log files. max_log_files = 720 +## The OTLP tracing export protocol. Can be `grpc`/`http`. +otlp_export_protocol = "http" + ## The percentage of tracing will be sampled and exported. ## Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1. ## ratio > 1 are treated as 1. Fractions < 0 are treated as 0 diff --git a/src/cmd/tests/load_config_test.rs b/src/cmd/tests/load_config_test.rs index 53f5cdfd09..e3211aba46 100644 --- a/src/cmd/tests/load_config_test.rs +++ b/src/cmd/tests/load_config_test.rs @@ -18,7 +18,7 @@ use cmd::options::GreptimeOptions; use cmd::standalone::StandaloneOptions; use common_config::{Configurable, DEFAULT_DATA_HOME}; use common_options::datanode::{ClientOptions, DatanodeClientOptions}; -use common_telemetry::logging::{LoggingOptions, DEFAULT_LOGGING_DIR, DEFAULT_OTLP_ENDPOINT}; +use common_telemetry::logging::{LoggingOptions, DEFAULT_LOGGING_DIR, DEFAULT_OTLP_HTTP_ENDPOINT}; use common_wal::config::raft_engine::RaftEngineConfig; use common_wal::config::DatanodeWalConfig; use datanode::config::{DatanodeOptions, RegionEngineConfig, StorageConfig}; @@ -81,7 +81,7 @@ fn test_load_datanode_example_config() { logging: LoggingOptions { level: Some("info".to_string()), dir: format!("{}/{}", DEFAULT_DATA_HOME, DEFAULT_LOGGING_DIR), - otlp_endpoint: Some(DEFAULT_OTLP_ENDPOINT.to_string()), + otlp_endpoint: Some(DEFAULT_OTLP_HTTP_ENDPOINT.to_string()), tracing_sample_ratio: Some(Default::default()), ..Default::default() }, @@ -124,7 +124,7 @@ fn test_load_frontend_example_config() { logging: LoggingOptions { level: Some("info".to_string()), dir: format!("{}/{}", DEFAULT_DATA_HOME, DEFAULT_LOGGING_DIR), - otlp_endpoint: Some(DEFAULT_OTLP_ENDPOINT.to_string()), + otlp_endpoint: Some(DEFAULT_OTLP_HTTP_ENDPOINT.to_string()), tracing_sample_ratio: Some(Default::default()), ..Default::default() }, @@ -172,7 +172,7 @@ fn test_load_metasrv_example_config() { logging: LoggingOptions { dir: format!("{}/{}", DEFAULT_DATA_HOME, DEFAULT_LOGGING_DIR), level: Some("info".to_string()), - otlp_endpoint: Some(DEFAULT_OTLP_ENDPOINT.to_string()), + otlp_endpoint: Some(DEFAULT_OTLP_HTTP_ENDPOINT.to_string()), tracing_sample_ratio: Some(Default::default()), ..Default::default() }, @@ -229,7 +229,7 @@ fn test_load_standalone_example_config() { logging: LoggingOptions { level: Some("info".to_string()), dir: format!("{}/{}", DEFAULT_DATA_HOME, DEFAULT_LOGGING_DIR), - otlp_endpoint: Some(DEFAULT_OTLP_ENDPOINT.to_string()), + otlp_endpoint: Some(DEFAULT_OTLP_HTTP_ENDPOINT.to_string()), tracing_sample_ratio: Some(Default::default()), ..Default::default() }, diff --git a/src/common/telemetry/Cargo.toml b/src/common/telemetry/Cargo.toml index 1e1d2cd448..dce74e723a 100644 --- a/src/common/telemetry/Cargo.toml +++ b/src/common/telemetry/Cargo.toml @@ -22,7 +22,7 @@ once_cell.workspace = true opentelemetry = { version = "0.21.0", default-features = false, features = [ "trace", ] } -opentelemetry-otlp = { version = "0.14.0", features = ["tokio"] } +opentelemetry-otlp = { version = "0.14.0", features = ["tokio", "http-proto", "reqwest-client"] } opentelemetry-semantic-conventions = "0.13.0" opentelemetry_sdk = { version = "0.21.0", features = ["rt-tokio"] } parking_lot.workspace = true diff --git a/src/common/telemetry/src/logging.rs b/src/common/telemetry/src/logging.rs index 76d04fc418..64661db8f1 100644 --- a/src/common/telemetry/src/logging.rs +++ b/src/common/telemetry/src/logging.rs @@ -20,7 +20,7 @@ use std::time::Duration; use once_cell::sync::{Lazy, OnceCell}; use opentelemetry::{global, KeyValue}; -use opentelemetry_otlp::WithExportConfig; +use opentelemetry_otlp::{Protocol, SpanExporterBuilder, WithExportConfig}; use opentelemetry_sdk::propagation::TraceContextPropagator; use opentelemetry_sdk::trace::Sampler; use opentelemetry_semantic_conventions::resource; @@ -36,7 +36,11 @@ use tracing_subscriber::{filter, EnvFilter, Registry}; use crate::tracing_sampler::{create_sampler, TracingSampleOptions}; -pub const DEFAULT_OTLP_ENDPOINT: &str = "http://localhost:4317"; +/// The default endpoint when use gRPC exporter protocol. +pub const DEFAULT_OTLP_GRPC_ENDPOINT: &str = "http://localhost:4317"; + +/// The default endpoint when use HTTP exporter protocol. +pub const DEFAULT_OTLP_HTTP_ENDPOINT: &str = "http://localhost:4318"; /// The default logs directory. pub const DEFAULT_LOGGING_DIR: &str = "logs"; @@ -72,6 +76,20 @@ pub struct LoggingOptions { /// The tracing sample ratio. pub tracing_sample_ratio: Option, + + /// The protocol of OTLP export. + pub otlp_export_protocol: Option, +} + +/// The protocol of OTLP export. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum OtlpExportProtocol { + /// GRPC protocol. + Grpc, + + /// HTTP protocol with binary protobuf. + Http, } /// The options of slow query. @@ -147,6 +165,7 @@ impl Default for LoggingOptions { append_stdout: true, // Rotation hourly, 24 files per day, keeps info log files of 30 days max_log_files: 720, + otlp_export_protocol: None, } } } @@ -388,22 +407,9 @@ pub fn init_global_logging( KeyValue::new(resource::PROCESS_PID, std::process::id().to_string()), ])); - let exporter = opentelemetry_otlp::new_exporter().tonic().with_endpoint( - opts.otlp_endpoint - .as_ref() - .map(|e| { - if e.starts_with("http") { - e.to_string() - } else { - format!("http://{}", e) - } - }) - .unwrap_or(DEFAULT_OTLP_ENDPOINT.to_string()), - ); - let tracer = opentelemetry_otlp::new_pipeline() .tracing() - .with_exporter(exporter) + .with_exporter(build_otlp_exporter(opts)) .with_trace_config(trace_config) .install_batch(opentelemetry_sdk::runtime::Tokio) .expect("otlp tracer install failed"); @@ -421,6 +427,42 @@ pub fn init_global_logging( guards } +fn build_otlp_exporter(opts: &LoggingOptions) -> SpanExporterBuilder { + let protocol = opts + .otlp_export_protocol + .clone() + .unwrap_or(OtlpExportProtocol::Http); + + let endpoint = opts + .otlp_endpoint + .as_ref() + .map(|e| { + if e.starts_with("http") { + e.to_string() + } else { + format!("http://{}", e) + } + }) + .unwrap_or_else(|| match protocol { + OtlpExportProtocol::Grpc => DEFAULT_OTLP_GRPC_ENDPOINT.to_string(), + OtlpExportProtocol::Http => DEFAULT_OTLP_HTTP_ENDPOINT.to_string(), + }); + + match protocol { + OtlpExportProtocol::Grpc => SpanExporterBuilder::Tonic( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint(endpoint), + ), + OtlpExportProtocol::Http => SpanExporterBuilder::Http( + opentelemetry_otlp::new_exporter() + .http() + .with_endpoint(endpoint) + .with_protocol(Protocol::HttpBinary), + ), + } +} + fn build_slow_query_logger( opts: &LoggingOptions, slow_query_opts: Option<&SlowQueryOptions>,