diff --git a/.cargo/config.toml b/.cargo/config.toml index f19bad4211..d7355bb885 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -12,3 +12,6 @@ fetch = true checkout = true list_files = true internal_use_git2 = false + +[env] +CARGO_WORKSPACE_DIR = { value = "", relative = true } diff --git a/Cargo.lock b/Cargo.lock index 80126a20ab..20141732e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1602,6 +1602,17 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbc26382d871df4b7442e3df10a9402bf3cf5e55cbd66f12be38861425f0564" +[[package]] +name = "cargo-manifest" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d8af896b707212cd0e99c112a78c9497dd32994192a463ed2f7419d29bd8c6" +dependencies = [ + "serde", + "thiserror 2.0.12", + "toml 0.8.19", +] + [[package]] name = "cast" version = "0.3.0" @@ -2692,6 +2703,7 @@ version = "0.16.0" dependencies = [ "backtrace", "common-error", + "common-version", "console-subscriber", "greptime-proto", "humantime-serde", @@ -2749,6 +2761,7 @@ name = "common-version" version = "0.16.0" dependencies = [ "build-data", + "cargo-manifest", "const_format", "serde", "shadow-rs", @@ -13177,6 +13190,7 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", diff --git a/src/cmd/src/bin/greptime.rs b/src/cmd/src/bin/greptime.rs index e57241f638..9aed5b7c37 100644 --- a/src/cmd/src/bin/greptime.rs +++ b/src/cmd/src/bin/greptime.rs @@ -20,11 +20,11 @@ use cmd::error::{InitTlsProviderSnafu, Result}; use cmd::options::GlobalOptions; use cmd::{cli, datanode, flownode, frontend, metasrv, standalone, App}; use common_base::Plugins; -use common_version::version; +use common_version::{verbose_version, version}; use servers::install_ring_crypto_provider; #[derive(Parser)] -#[command(name = "greptime", author, version, long_version = version(), about)] +#[command(name = "greptime", author, version, long_version = verbose_version(), about)] #[command(propagate_version = true)] pub(crate) struct Command { #[clap(subcommand)] @@ -143,10 +143,8 @@ async fn start(cli: Command) -> Result<()> { } fn setup_human_panic() { - human_panic::setup_panic!( - human_panic::Metadata::new("GreptimeDB", env!("CARGO_PKG_VERSION")) - .homepage("https://github.com/GreptimeTeam/greptimedb/discussions") - ); + human_panic::setup_panic!(human_panic::Metadata::new("GreptimeDB", version()) + .homepage("https://github.com/GreptimeTeam/greptimedb/discussions")); common_telemetry::set_panic_hook(); } diff --git a/src/cmd/src/datanode/builder.rs b/src/cmd/src/datanode/builder.rs index cb7babed12..672f61eac0 100644 --- a/src/cmd/src/datanode/builder.rs +++ b/src/cmd/src/datanode/builder.rs @@ -19,7 +19,7 @@ use catalog::kvbackend::MetaKvBackend; use common_base::Plugins; use common_meta::cache::LayeredCacheRegistryBuilder; use common_telemetry::info; -use common_version::{short_version, version}; +use common_version::{short_version, verbose_version}; use datanode::datanode::DatanodeBuilder; use datanode::service::DatanodeServiceBuilder; use meta_client::MetaClientType; @@ -67,7 +67,7 @@ impl InstanceBuilder { None, ); - log_versions(version(), short_version(), APP_NAME); + log_versions(verbose_version(), short_version(), APP_NAME); create_resource_limit_metrics(APP_NAME); plugins::setup_datanode_plugins(plugins, &opts.plugins, dn_opts) diff --git a/src/cmd/src/flownode.rs b/src/cmd/src/flownode.rs index bd8e411dd6..eb920a0a75 100644 --- a/src/cmd/src/flownode.rs +++ b/src/cmd/src/flownode.rs @@ -32,7 +32,7 @@ use common_meta::key::flow::FlowMetadataManager; use common_meta::key::TableMetadataManager; use common_telemetry::info; use common_telemetry::logging::{TracingOptions, DEFAULT_LOGGING_DIR}; -use common_version::{short_version, version}; +use common_version::{short_version, verbose_version}; use flow::{ get_flow_auth_options, FlownodeBuilder, FlownodeInstance, FlownodeServiceBuilder, FrontendClient, FrontendInvoker, @@ -279,7 +279,7 @@ impl StartCommand { None, ); - log_versions(version(), short_version(), APP_NAME); + log_versions(verbose_version(), short_version(), APP_NAME); create_resource_limit_metrics(APP_NAME); info!("Flownode start command: {:#?}", self); diff --git a/src/cmd/src/frontend.rs b/src/cmd/src/frontend.rs index d1827941e9..c7dd1a2eb2 100644 --- a/src/cmd/src/frontend.rs +++ b/src/cmd/src/frontend.rs @@ -33,7 +33,7 @@ use common_meta::heartbeat::handler::HandlerGroupExecutor; use common_telemetry::info; use common_telemetry::logging::{TracingOptions, DEFAULT_LOGGING_DIR}; use common_time::timezone::set_default_timezone; -use common_version::{short_version, version}; +use common_version::{short_version, verbose_version}; use frontend::frontend::Frontend; use frontend::heartbeat::HeartbeatTask; use frontend::instance::builder::FrontendBuilder; @@ -282,7 +282,7 @@ impl StartCommand { opts.component.slow_query.as_ref(), ); - log_versions(version(), short_version(), APP_NAME); + log_versions(verbose_version(), short_version(), APP_NAME); create_resource_limit_metrics(APP_NAME); info!("Frontend start command: {:#?}", self); diff --git a/src/cmd/src/lib.rs b/src/cmd/src/lib.rs index 997c691d68..1729135adc 100644 --- a/src/cmd/src/lib.rs +++ b/src/cmd/src/lib.rs @@ -112,7 +112,7 @@ pub trait App: Send { pub fn log_versions(version: &str, short_version: &str, app: &str) { // Report app version as gauge. APP_VERSION - .with_label_values(&[env!("CARGO_PKG_VERSION"), short_version, app]) + .with_label_values(&[common_version::version(), short_version, app]) .inc(); // Log version and argument flags. diff --git a/src/cmd/src/metasrv.rs b/src/cmd/src/metasrv.rs index 6b03913d5b..3cc0468069 100644 --- a/src/cmd/src/metasrv.rs +++ b/src/cmd/src/metasrv.rs @@ -22,7 +22,7 @@ use common_base::Plugins; use common_config::Configurable; use common_telemetry::info; use common_telemetry::logging::{TracingOptions, DEFAULT_LOGGING_DIR}; -use common_version::{short_version, version}; +use common_version::{short_version, verbose_version}; use meta_srv::bootstrap::MetasrvInstance; use meta_srv::metasrv::BackendImpl; use snafu::ResultExt; @@ -324,7 +324,7 @@ impl StartCommand { None, ); - log_versions(version(), short_version(), APP_NAME); + log_versions(verbose_version(), short_version(), APP_NAME); create_resource_limit_metrics(APP_NAME); info!("Metasrv start command: {:#?}", self); diff --git a/src/cmd/src/standalone.rs b/src/cmd/src/standalone.rs index 82b8d1c51e..a4328b5132 100644 --- a/src/cmd/src/standalone.rs +++ b/src/cmd/src/standalone.rs @@ -51,7 +51,7 @@ use common_telemetry::logging::{ LoggingOptions, SlowQueryOptions, TracingOptions, DEFAULT_LOGGING_DIR, }; use common_time::timezone::set_default_timezone; -use common_version::{short_version, version}; +use common_version::{short_version, verbose_version}; use common_wal::config::DatanodeWalConfig; use datanode::config::{DatanodeOptions, ProcedureConfig, RegionEngineConfig, StorageConfig}; use datanode::datanode::{Datanode, DatanodeBuilder}; @@ -485,7 +485,7 @@ impl StartCommand { opts.component.slow_query.as_ref(), ); - log_versions(version(), short_version(), APP_NAME); + log_versions(verbose_version(), short_version(), APP_NAME); create_resource_limit_metrics(APP_NAME); info!("Standalone start command: {:#?}", self); diff --git a/src/common/function/src/system/pg_catalog/version.rs b/src/common/function/src/system/pg_catalog/version.rs index 7be27fe9b2..586d52c334 100644 --- a/src/common/function/src/system/pg_catalog/version.rs +++ b/src/common/function/src/system/pg_catalog/version.rs @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::fmt; use std::sync::Arc; -use std::{env, fmt}; use common_query::error::Result; use common_query::prelude::{Signature, Volatility}; @@ -47,7 +47,7 @@ impl Function for PGVersionFunction { fn eval(&self, _func_ctx: &FunctionContext, _columns: &[VectorRef]) -> Result { let result = StringVector::from(vec![format!( "PostgreSQL 16.3 GreptimeDB {}", - env!("CARGO_PKG_VERSION") + common_version::version() )]); Ok(Arc::new(result)) } diff --git a/src/common/function/src/system/version.rs b/src/common/function/src/system/version.rs index bfab3f1334..64a4e2c490 100644 --- a/src/common/function/src/system/version.rs +++ b/src/common/function/src/system/version.rs @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::fmt; use std::sync::Arc; -use std::{env, fmt}; use common_query::error::Result; use common_query::prelude::{Signature, Volatility}; @@ -52,13 +52,13 @@ impl Function for VersionFunction { "{}-greptimedb-{}", std::env::var("GREPTIMEDB_MYSQL_SERVER_VERSION") .unwrap_or_else(|_| "8.4.2".to_string()), - env!("CARGO_PKG_VERSION") + common_version::version() ) } Channel::Postgres => { - format!("16.3-greptimedb-{}", env!("CARGO_PKG_VERSION")) + format!("16.3-greptimedb-{}", common_version::version()) } - _ => env!("CARGO_PKG_VERSION").to_string(), + _ => common_version::version().to_string(), }; let result = StringVector::from(vec![version]); Ok(Arc::new(result)) diff --git a/src/common/telemetry/Cargo.toml b/src/common/telemetry/Cargo.toml index dce74e723a..dd471c4f09 100644 --- a/src/common/telemetry/Cargo.toml +++ b/src/common/telemetry/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] backtrace = "0.3" common-error.workspace = true +common-version.workspace = true console-subscriber = { version = "0.1", optional = true } greptime-proto.workspace = true humantime-serde.workspace = true diff --git a/src/common/telemetry/src/logging.rs b/src/common/telemetry/src/logging.rs index 12543d62f6..bcc7bc4078 100644 --- a/src/common/telemetry/src/logging.rs +++ b/src/common/telemetry/src/logging.rs @@ -403,7 +403,7 @@ pub fn init_global_logging( resource::SERVICE_INSTANCE_ID, node_id.unwrap_or("none".to_string()), ), - KeyValue::new(resource::SERVICE_VERSION, env!("CARGO_PKG_VERSION")), + KeyValue::new(resource::SERVICE_VERSION, common_version::version()), KeyValue::new(resource::PROCESS_PID, std::process::id().to_string()), ])); diff --git a/src/common/version/Cargo.toml b/src/common/version/Cargo.toml index 63d7395f07..7aa2863d80 100644 --- a/src/common/version/Cargo.toml +++ b/src/common/version/Cargo.toml @@ -17,4 +17,5 @@ shadow-rs.workspace = true [build-dependencies] build-data = "0.2" +cargo-manifest = "0.19" shadow-rs.workspace = true diff --git a/src/common/version/build.rs b/src/common/version/build.rs index aaa1adc4b7..ef0530b52c 100644 --- a/src/common/version/build.rs +++ b/src/common/version/build.rs @@ -14,8 +14,10 @@ use std::collections::BTreeSet; use std::env; +use std::path::PathBuf; use build_data::{format_timestamp, get_source_time}; +use cargo_manifest::Manifest; use shadow_rs::{BuildPattern, ShadowBuilder, CARGO_METADATA, CARGO_TREE}; fn main() -> shadow_rs::SdResult<()> { @@ -33,6 +35,24 @@ fn main() -> shadow_rs::SdResult<()> { // solve the problem where the "CARGO_MANIFEST_DIR" is not what we want when this repo is // made as a submodule in another repo. let src_path = env::var("CARGO_WORKSPACE_DIR").or_else(|_| env::var("CARGO_MANIFEST_DIR"))?; + + let manifest = Manifest::from_path(PathBuf::from(&src_path).join("Cargo.toml")) + .expect("Failed to parse Cargo.toml"); + if let Some(product_version) = manifest.workspace.as_ref().and_then(|w| { + w.metadata.as_ref().and_then(|m| { + m.get("greptime") + .and_then(|g| g.get("product_version").and_then(|v| v.as_str())) + }) + }) { + println!( + "cargo:rustc-env=GREPTIME_PRODUCT_VERSION={}", + product_version + ); + } else { + let version = env::var("CARGO_PKG_VERSION").unwrap(); + println!("cargo:rustc-env=GREPTIME_PRODUCT_VERSION={}", version,); + } + let out_path = env::var("OUT_DIR")?; let _ = ShadowBuilder::builder() diff --git a/src/common/version/src/lib.rs b/src/common/version/src/lib.rs index e4cee2d3f4..6c22073b27 100644 --- a/src/common/version/src/lib.rs +++ b/src/common/version/src/lib.rs @@ -105,13 +105,17 @@ pub const fn build_info() -> BuildInfo { build_time: env!("BUILD_TIMESTAMP"), rustc: build::RUST_VERSION, target: build::BUILD_TARGET, - version: build::PKG_VERSION, + version: env!("GREPTIME_PRODUCT_VERSION"), } } const BUILD_INFO: BuildInfo = build_info(); pub const fn version() -> &'static str { + BUILD_INFO.version +} + +pub const fn verbose_version() -> &'static str { const_format::formatcp!( "\nbranch: {}\ncommit: {}\nclean: {}\nversion: {}", BUILD_INFO.branch, diff --git a/src/servers/src/postgres.rs b/src/servers/src/postgres.rs index 9ae3234785..047fcab98c 100644 --- a/src/servers/src/postgres.rs +++ b/src/servers/src/postgres.rs @@ -49,7 +49,7 @@ pub(crate) struct GreptimeDBStartupParameters { impl GreptimeDBStartupParameters { fn new() -> GreptimeDBStartupParameters { GreptimeDBStartupParameters { - version: format!("16.3-greptimedb-{}", env!("CARGO_PKG_VERSION")), + version: format!("16.3-greptimedb-{}", common_version::version()), } } }