feat(clickhouse): wire Phase 4 stores with feature flags
Add conditional beans for ClickHouseDiagramStore, ClickHouseAgentEventRepository, and ClickHouseLogStore. All default to ClickHouse (matchIfMissing=true). PG/OS stores activate only when explicitly configured. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
package com.cameleer3.server.app.config;
|
package com.cameleer3.server.app.config;
|
||||||
|
|
||||||
|
import com.cameleer3.server.app.search.ClickHouseLogStore;
|
||||||
|
import com.cameleer3.server.app.storage.ClickHouseAgentEventRepository;
|
||||||
|
import com.cameleer3.server.app.storage.ClickHouseDiagramStore;
|
||||||
import com.cameleer3.server.app.storage.ClickHouseMetricsQueryStore;
|
import com.cameleer3.server.app.storage.ClickHouseMetricsQueryStore;
|
||||||
import com.cameleer3.server.app.storage.ClickHouseMetricsStore;
|
import com.cameleer3.server.app.storage.ClickHouseMetricsStore;
|
||||||
import com.cameleer3.server.app.storage.ClickHouseStatsStore;
|
import com.cameleer3.server.app.storage.ClickHouseStatsStore;
|
||||||
@@ -7,6 +10,7 @@ import com.cameleer3.server.app.storage.PostgresMetricsQueryStore;
|
|||||||
import com.cameleer3.server.app.storage.PostgresMetricsStore;
|
import com.cameleer3.server.app.storage.PostgresMetricsStore;
|
||||||
import com.cameleer3.server.core.admin.AuditRepository;
|
import com.cameleer3.server.core.admin.AuditRepository;
|
||||||
import com.cameleer3.server.core.admin.AuditService;
|
import com.cameleer3.server.core.admin.AuditService;
|
||||||
|
import com.cameleer3.server.core.agent.AgentEventRepository;
|
||||||
import com.cameleer3.server.core.detail.DetailService;
|
import com.cameleer3.server.core.detail.DetailService;
|
||||||
import com.cameleer3.server.core.indexing.SearchIndexer;
|
import com.cameleer3.server.core.indexing.SearchIndexer;
|
||||||
import com.cameleer3.server.app.ingestion.ExecutionFlushScheduler;
|
import com.cameleer3.server.app.ingestion.ExecutionFlushScheduler;
|
||||||
@@ -17,6 +21,7 @@ import com.cameleer3.server.core.ingestion.IngestionService;
|
|||||||
import com.cameleer3.server.core.ingestion.MergedExecution;
|
import com.cameleer3.server.core.ingestion.MergedExecution;
|
||||||
import com.cameleer3.server.core.ingestion.WriteBuffer;
|
import com.cameleer3.server.core.ingestion.WriteBuffer;
|
||||||
import com.cameleer3.server.core.storage.*;
|
import com.cameleer3.server.core.storage.*;
|
||||||
|
import com.cameleer3.server.core.storage.LogIndex;
|
||||||
import com.cameleer3.server.core.storage.StatsStore;
|
import com.cameleer3.server.core.storage.StatsStore;
|
||||||
import com.cameleer3.server.core.storage.model.MetricsSnapshot;
|
import com.cameleer3.server.core.storage.model.MetricsSnapshot;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
@@ -129,4 +134,31 @@ public class StorageBeanConfig {
|
|||||||
@Qualifier("clickHouseJdbcTemplate") JdbcTemplate clickHouseJdbc) {
|
@Qualifier("clickHouseJdbcTemplate") JdbcTemplate clickHouseJdbc) {
|
||||||
return new ClickHouseStatsStore(clickHouseJdbc);
|
return new ClickHouseStatsStore(clickHouseJdbc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── ClickHouse Diagram Store ──────────────────────────────────────
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnProperty(name = "cameleer.storage.diagrams", havingValue = "clickhouse", matchIfMissing = true)
|
||||||
|
public DiagramStore clickHouseDiagramStore(
|
||||||
|
@Qualifier("clickHouseJdbcTemplate") JdbcTemplate clickHouseJdbc) {
|
||||||
|
return new ClickHouseDiagramStore(clickHouseJdbc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── ClickHouse Agent Event Repository ─────────────────────────────
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnProperty(name = "cameleer.storage.events", havingValue = "clickhouse", matchIfMissing = true)
|
||||||
|
public AgentEventRepository clickHouseAgentEventRepository(
|
||||||
|
@Qualifier("clickHouseJdbcTemplate") JdbcTemplate clickHouseJdbc) {
|
||||||
|
return new ClickHouseAgentEventRepository(clickHouseJdbc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── ClickHouse Log Store ──────────────────────────────────────────
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnProperty(name = "cameleer.storage.logs", havingValue = "clickhouse", matchIfMissing = true)
|
||||||
|
public LogIndex clickHouseLogStore(
|
||||||
|
@Qualifier("clickHouseJdbcTemplate") JdbcTemplate clickHouseJdbc) {
|
||||||
|
return new ClickHouseLogStore(clickHouseJdbc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import org.opensearch.client.opensearch.indices.PutIndexTemplateRequest;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -31,6 +32,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
|
@ConditionalOnProperty(name = "cameleer.storage.logs", havingValue = "opensearch")
|
||||||
public class OpenSearchLogIndex implements LogIndex {
|
public class OpenSearchLogIndex implements LogIndex {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(OpenSearchLogIndex.class);
|
private static final Logger log = LoggerFactory.getLogger(OpenSearchLogIndex.class);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.cameleer3.server.app.storage;
|
|||||||
|
|
||||||
import com.cameleer3.server.core.agent.AgentEventRecord;
|
import com.cameleer3.server.core.agent.AgentEventRecord;
|
||||||
import com.cameleer3.server.core.agent.AgentEventRepository;
|
import com.cameleer3.server.core.agent.AgentEventRepository;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
@@ -11,6 +12,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
|
@ConditionalOnProperty(name = "cameleer.storage.events", havingValue = "postgres")
|
||||||
public class PostgresAgentEventRepository implements AgentEventRepository {
|
public class PostgresAgentEventRepository implements AgentEventRepository {
|
||||||
|
|
||||||
private final JdbcTemplate jdbc;
|
private final JdbcTemplate jdbc;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@ import java.util.Optional;
|
|||||||
* Uses {@code ON CONFLICT (content_hash) DO NOTHING} for idempotent inserts.
|
* Uses {@code ON CONFLICT (content_hash) DO NOTHING} for idempotent inserts.
|
||||||
*/
|
*/
|
||||||
@Repository
|
@Repository
|
||||||
|
@ConditionalOnProperty(name = "cameleer.storage.diagrams", havingValue = "postgres")
|
||||||
public class PostgresDiagramStore implements DiagramStore {
|
public class PostgresDiagramStore implements DiagramStore {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(PostgresDiagramStore.class);
|
private static final Logger log = LoggerFactory.getLogger(PostgresDiagramStore.class);
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ cameleer:
|
|||||||
metrics: ${CAMELEER_STORAGE_METRICS:postgres}
|
metrics: ${CAMELEER_STORAGE_METRICS:postgres}
|
||||||
search: ${CAMELEER_STORAGE_SEARCH:opensearch}
|
search: ${CAMELEER_STORAGE_SEARCH:opensearch}
|
||||||
stats: ${CAMELEER_STORAGE_STATS:clickhouse}
|
stats: ${CAMELEER_STORAGE_STATS:clickhouse}
|
||||||
|
diagrams: ${CAMELEER_STORAGE_DIAGRAMS:clickhouse}
|
||||||
|
events: ${CAMELEER_STORAGE_EVENTS:clickhouse}
|
||||||
|
logs: ${CAMELEER_STORAGE_LOGS:clickhouse}
|
||||||
|
|
||||||
security:
|
security:
|
||||||
access-token-expiry-ms: 3600000
|
access-token-expiry-ms: 3600000
|
||||||
|
|||||||
@@ -95,6 +95,12 @@ spec:
|
|||||||
value: "clickhouse"
|
value: "clickhouse"
|
||||||
- name: CAMELEER_STORAGE_STATS
|
- name: CAMELEER_STORAGE_STATS
|
||||||
value: "clickhouse"
|
value: "clickhouse"
|
||||||
|
- name: CAMELEER_STORAGE_DIAGRAMS
|
||||||
|
value: "clickhouse"
|
||||||
|
- name: CAMELEER_STORAGE_EVENTS
|
||||||
|
value: "clickhouse"
|
||||||
|
- name: CAMELEER_STORAGE_LOGS
|
||||||
|
value: "clickhouse"
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
|
|||||||
Reference in New Issue
Block a user