@@ -38,7 +38,7 @@ const defaultLogsClickhouseClient = singleton(
3838) ;
3939
4040function initializeLogsSearchProjectorClickhouseClient ( ) {
41- const url = new URL ( env . LOGS_CLICKHOUSE_URL ?? env . CLICKHOUSE_URL ) ;
41+ const url = new URL ( env . LOGS_SEARCH_WRITER_CLICKHOUSE_URL ?? env . CLICKHOUSE_URL ) ;
4242 url . searchParams . delete ( "secure" ) ;
4343
4444 return new ClickHouse ( {
@@ -80,7 +80,9 @@ function getLogsListClickhouseSettings() {
8080}
8181
8282function initializeLogsClickhouseClient ( ) {
83- const url = new URL ( env . LOGS_CLICKHOUSE_URL ?? env . CLICKHOUSE_READER_URL ?? env . CLICKHOUSE_URL ) ;
83+ const url = new URL (
84+ env . LOGS_SEARCH_READER_CLICKHOUSE_URL ?? env . CLICKHOUSE_READER_URL ?? env . CLICKHOUSE_URL
85+ ) ;
8486 url . searchParams . delete ( "secure" ) ;
8587
8688 return new ClickHouse ( {
@@ -466,6 +468,39 @@ function initializeEventsClickhouseClient(): ClickHouse {
466468 } ) ;
467469}
468470
471+ /**
472+ * Logs-search dual-write destination (`LOGS_SEARCH_WRITER_CLICKHOUSE_URL`). Shares storage with the
473+ * events warehouse; a separate service keeps the extra insert stream off the events writer.
474+ * Undefined when unset, in which case the dual writer uses the events client.
475+ */
476+ const defaultLogsSearchClickhouseClient = singleton (
477+ "logsSearchClickhouseClient" ,
478+ initializeLogsSearchClickhouseClient
479+ ) ;
480+
481+ function initializeLogsSearchClickhouseClient ( ) : ClickHouse | undefined {
482+ if ( ! env . LOGS_SEARCH_WRITER_CLICKHOUSE_URL ) {
483+ return undefined ;
484+ }
485+
486+ const url = new URL ( env . LOGS_SEARCH_WRITER_CLICKHOUSE_URL ) ;
487+ url . searchParams . delete ( "secure" ) ;
488+
489+ return new ClickHouse ( {
490+ name : "logs-search-writer" ,
491+ url : url . toString ( ) ,
492+ keepAlive : {
493+ enabled : env . EVENTS_CLICKHOUSE_KEEP_ALIVE_ENABLED === "1" ,
494+ idleSocketTtl : env . EVENTS_CLICKHOUSE_KEEP_ALIVE_IDLE_SOCKET_TTL_MS ,
495+ } ,
496+ logLevel : env . EVENTS_CLICKHOUSE_LOG_LEVEL ,
497+ compression : {
498+ request : env . EVENTS_CLICKHOUSE_COMPRESSION_REQUEST === "1" ,
499+ } ,
500+ maxOpenConnections : env . LOGS_SEARCH_DUAL_WRITE_MAX_CONCURRENCY ,
501+ } ) ;
502+ }
503+
469504// ---------------------------------------------------------------------------
470505// Helpers
471506// ---------------------------------------------------------------------------
@@ -732,7 +767,11 @@ export class ClickhouseFactory {
732767 let defaultRepo = this . _eventRepositoryCache . get ( defaultKey ) ;
733768 if ( ! defaultRepo ) {
734769 const eventsClickhouse = getEventsClickhouseClient ( ) ;
735- defaultRepo = buildEventRepository ( store , eventsClickhouse ) ;
770+ defaultRepo = buildEventRepository (
771+ store ,
772+ eventsClickhouse ,
773+ defaultLogsSearchClickhouseClient
774+ ) ;
736775 this . _eventRepositoryCache . set ( defaultKey , defaultRepo ) ;
737776 }
738777 return { key : defaultKey , repository : defaultRepo } ;
@@ -786,11 +825,16 @@ const logsSearchDualWriteOrganizationIds = new Set(
786825 . filter ( Boolean )
787826) ;
788827
789- function buildEventRepository ( store : string , clickhouse : ClickHouse ) : ClickhouseEventRepository {
828+ function buildEventRepository (
829+ store : string ,
830+ clickhouse : ClickHouse ,
831+ logsSearchClickhouse ?: ClickHouse
832+ ) : ClickhouseEventRepository {
790833 switch ( store ) {
791834 case "clickhouse" : {
792835 return new ClickhouseEventRepository ( {
793836 clickhouse,
837+ logsSearchClickhouse,
794838 batchSize : env . EVENTS_CLICKHOUSE_BATCH_SIZE ,
795839 flushInterval : env . EVENTS_CLICKHOUSE_FLUSH_INTERVAL_MS ,
796840 maximumTraceSummaryViewCount : clampToEmergencySpanCap (
@@ -822,6 +866,7 @@ function buildEventRepository(store: string, clickhouse: ClickHouse): Clickhouse
822866 case "clickhouse_v2" : {
823867 return new ClickhouseEventRepository ( {
824868 clickhouse : clickhouse ,
869+ logsSearchClickhouse,
825870 batchSize : env . EVENTS_CLICKHOUSE_BATCH_SIZE ,
826871 flushInterval : env . EVENTS_CLICKHOUSE_FLUSH_INTERVAL_MS ,
827872 maximumTraceSummaryViewCount : clampToEmergencySpanCap (
0 commit comments