@@ -37,6 +37,7 @@ use tokio_util::sync::CancellationToken;
3737
3838use crate :: config:: Config ;
3939use crate :: helpers:: watch_subgraph_updates;
40+ use crate :: log_config_provider:: { LogStoreConfigProvider , LogStoreConfigSources } ;
4041use crate :: network_setup:: Networks ;
4142use crate :: opt:: Opt ;
4243use crate :: store_builder:: StoreBuilder ;
@@ -367,6 +368,7 @@ fn build_graphql_server(
367368 metrics_registry : Arc < MetricsRegistry > ,
368369 network_store : & Arc < Store > ,
369370 logger_factory : & LoggerFactory ,
371+ log_store : Arc < dyn graph:: components:: log_store:: LogStore > ,
370372) -> GraphQLQueryServer < GraphQlRunner < Store > > {
371373 let shards: Vec < _ > = config. stores . keys ( ) . cloned ( ) . collect ( ) ;
372374 let load_manager = Arc :: new ( LoadManager :: new (
@@ -380,6 +382,7 @@ fn build_graphql_server(
380382 network_store. clone ( ) ,
381383 load_manager,
382384 metrics_registry,
385+ log_store,
383386 ) ) ;
384387
385388 GraphQLQueryServer :: new ( logger_factory, graphql_runner. clone ( ) )
@@ -443,20 +446,121 @@ pub async fn run(
443446
444447 info ! ( logger, "Starting up" ; "node_id" => & node_id) ;
445448
446- // Optionally, identify the Elasticsearch logging configuration
447- let elastic_config = opt
448- . elasticsearch_url
449- . clone ( )
450- . map ( |endpoint| ElasticLoggingConfig {
451- endpoint,
452- username : opt. elasticsearch_user . clone ( ) ,
453- password : opt. elasticsearch_password . clone ( ) ,
454- client : reqwest:: Client :: new ( ) ,
455- } ) ;
449+ // Create log store configuration provider
450+ // Build LogStoreConfig from CLI args with backward compatibility
451+ let cli_config = if let Some ( backend) = opt. log_store_backend . as_ref ( ) {
452+ // New generic CLI args used
453+ match backend. to_lowercase ( ) . as_str ( ) {
454+ "elasticsearch" | "elastic" | "es" => {
455+ let url = opt
456+ . log_store_elasticsearch_url
457+ . clone ( )
458+ . or_else ( || {
459+ if opt. elasticsearch_url . is_some ( ) {
460+ warn ! (
461+ logger,
462+ "Using deprecated --elasticsearch-url, use --log-store-elasticsearch-url instead"
463+ ) ;
464+ }
465+ opt. elasticsearch_url . clone ( )
466+ } ) ;
467+
468+ url. map ( |endpoint| {
469+ let index = opt
470+ . log_store_elasticsearch_index
471+ . clone ( )
472+ . or_else ( || std:: env:: var ( "GRAPH_LOG_STORE_ELASTICSEARCH_INDEX" ) . ok ( ) )
473+ . or_else ( || std:: env:: var ( "GRAPH_ELASTIC_SEARCH_INDEX" ) . ok ( ) )
474+ . unwrap_or_else ( || "subgraph" . to_string ( ) ) ;
475+
476+ let timeout_secs = std:: env:: var ( "GRAPH_LOG_STORE_ELASTICSEARCH_TIMEOUT" )
477+ . or_else ( |_| std:: env:: var ( "GRAPH_ELASTICSEARCH_TIMEOUT" ) )
478+ . ok ( )
479+ . and_then ( |s| s. parse :: < u64 > ( ) . ok ( ) )
480+ . unwrap_or ( 10 ) ;
481+
482+ graph:: components:: log_store:: LogStoreConfig :: Elasticsearch {
483+ endpoint,
484+ username : opt
485+ . log_store_elasticsearch_user
486+ . clone ( )
487+ . or_else ( || opt. elasticsearch_user . clone ( ) ) ,
488+ password : opt
489+ . log_store_elasticsearch_password
490+ . clone ( )
491+ . or_else ( || opt. elasticsearch_password . clone ( ) ) ,
492+ index,
493+ timeout_secs,
494+ }
495+ } )
496+ }
497+
498+ "loki" => opt. log_store_loki_url . clone ( ) . map ( |endpoint| {
499+ graph:: components:: log_store:: LogStoreConfig :: Loki {
500+ endpoint,
501+ tenant_id : opt. log_store_loki_tenant_id . clone ( ) ,
502+ }
503+ } ) ,
504+
505+ "file" | "files" => opt. log_store_file_dir . clone ( ) . map ( |directory| {
506+ graph:: components:: log_store:: LogStoreConfig :: File {
507+ directory : std:: path:: PathBuf :: from ( directory) ,
508+ max_file_size : opt. log_store_file_max_size . unwrap_or ( 100 * 1024 * 1024 ) ,
509+ retention_days : opt. log_store_file_retention_days . unwrap_or ( 30 ) ,
510+ }
511+ } ) ,
512+
513+ "disabled" | "none" => None ,
514+
515+ other => {
516+ warn ! ( logger, "Invalid log store backend: {}" , other) ;
517+ None
518+ }
519+ }
520+ } else if opt. elasticsearch_url . is_some ( ) {
521+ // Old Elasticsearch-specific CLI args used (backward compatibility)
522+ warn ! (
523+ logger,
524+ "Using deprecated --elasticsearch-url CLI argument, \
525+ please use --log-store-backend elasticsearch --log-store-elasticsearch-url instead"
526+ ) ;
527+
528+ let index = opt
529+ . log_store_elasticsearch_index
530+ . clone ( )
531+ . or_else ( || std:: env:: var ( "GRAPH_LOG_STORE_ELASTICSEARCH_INDEX" ) . ok ( ) )
532+ . or_else ( || std:: env:: var ( "GRAPH_ELASTIC_SEARCH_INDEX" ) . ok ( ) )
533+ . unwrap_or_else ( || "subgraph" . to_string ( ) ) ;
534+
535+ let timeout_secs = std:: env:: var ( "GRAPH_LOG_STORE_ELASTICSEARCH_TIMEOUT" )
536+ . or_else ( |_| std:: env:: var ( "GRAPH_ELASTICSEARCH_TIMEOUT" ) )
537+ . ok ( )
538+ . and_then ( |s| s. parse :: < u64 > ( ) . ok ( ) )
539+ . unwrap_or ( 10 ) ;
540+
541+ Some (
542+ graph:: components:: log_store:: LogStoreConfig :: Elasticsearch {
543+ endpoint : opt. elasticsearch_url . clone ( ) . unwrap ( ) ,
544+ username : opt. elasticsearch_user . clone ( ) ,
545+ password : opt. elasticsearch_password . clone ( ) ,
546+ index,
547+ timeout_secs,
548+ } ,
549+ )
550+ } else {
551+ // No CLI config provided
552+ None
553+ } ;
554+
555+ let log_config_provider = LogStoreConfigProvider :: new ( LogStoreConfigSources { cli_config } ) ;
556+
557+ // Resolve log store (for querying) and config (for drains)
558+ // Priority: GRAPH_LOG_STORE env var → CLI config → NoOp/None
559+ let ( log_store, log_store_config) = log_config_provider. resolve ( & logger) ;
456560
457561 // Create a component and subgraph logger factory
458562 let logger_factory =
459- LoggerFactory :: new ( logger. clone ( ) , elastic_config , metrics_registry. clone ( ) ) ;
563+ LoggerFactory :: new ( logger. clone ( ) , log_store_config , metrics_registry. clone ( ) ) ;
460564
461565 let arweave_resolver = Arc :: new ( ArweaveClient :: new (
462566 logger. cheap_clone ( ) ,
@@ -573,6 +677,7 @@ pub async fn run(
573677 metrics_registry. clone ( ) ,
574678 & network_store,
575679 & logger_factory,
680+ log_store. clone ( ) ,
576681 ) ;
577682
578683 let index_node_server = IndexNodeServer :: new (
0 commit comments