diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/index.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/index.ts index 84ae0392ce1d6..9f50cdee84e3f 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/index.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/index.ts @@ -9,7 +9,7 @@ export { ScopedClusterClient } from './src/scoped_cluster_client'; export { ClusterClient } from './src/cluster_client'; export { configureClient } from './src/configure_client'; -export { type AgentStore, AgentManager, type NetworkAgent } from './src/agent_manager'; +export { type AgentStatsProvider, AgentManager, type NetworkAgent } from './src/agent_manager'; export { getRequestDebugMeta, getErrorMessage } from './src/log_query_and_deprecation'; export { PRODUCT_RESPONSE_HEADER, diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.test.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.test.ts index 0f374bd8311e5..448bfe2674e8f 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.test.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.test.ts @@ -6,9 +6,12 @@ * Side Public License, v 1. */ -import { AgentManager } from './agent_manager'; import { Agent as HttpAgent } from 'http'; import { Agent as HttpsAgent } from 'https'; +import type { ElasticsearchClientsMetrics } from '@kbn/core-metrics-server'; +import { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; +import { getAgentsSocketsStatsMock } from './get_agents_sockets_stats.test.mocks'; +import { AgentManager } from './agent_manager'; jest.mock('http'); jest.mock('https'); @@ -17,6 +20,12 @@ const HttpAgentMock = HttpAgent as jest.Mock; const HttpsAgentMock = HttpsAgent as jest.Mock; describe('AgentManager', () => { + let logger: MockedLogger; + + beforeEach(() => { + logger = loggerMock.create(); + }); + afterEach(() => { HttpAgentMock.mockClear(); HttpsAgentMock.mockClear(); @@ -24,7 +33,7 @@ describe('AgentManager', () => { describe('#getAgentFactory()', () => { it('provides factories which are different at each call', () => { - const agentManager = new AgentManager(); + const agentManager = new AgentManager(logger); const agentFactory1 = agentManager.getAgentFactory(); const agentFactory2 = agentManager.getAgentFactory(); expect(agentFactory1).not.toEqual(agentFactory2); @@ -36,7 +45,7 @@ describe('AgentManager', () => { HttpAgentMock.mockImplementationOnce(() => mockedHttpAgent); const mockedHttpsAgent = new HttpsAgent(); HttpsAgentMock.mockImplementationOnce(() => mockedHttpsAgent); - const agentManager = new AgentManager(); + const agentManager = new AgentManager(logger); const agentFactory = agentManager.getAgentFactory(); const httpAgent = agentFactory({ url: new URL('http://elastic-node-1:9200') }); const httpsAgent = agentFactory({ url: new URL('https://elastic-node-1:9200') }); @@ -45,7 +54,7 @@ describe('AgentManager', () => { }); it('takes into account the provided configurations', () => { - const agentManager = new AgentManager(); + const agentManager = new AgentManager(logger); const agentFactory = agentManager.getAgentFactory({ maxTotalSockets: 1024, scheduling: 'fifo', @@ -68,7 +77,7 @@ describe('AgentManager', () => { }); it('provides Agents that match the URLs protocol', () => { - const agentManager = new AgentManager(); + const agentManager = new AgentManager(logger); const agentFactory = agentManager.getAgentFactory(); agentFactory({ url: new URL('http://elastic-node-1:9200') }); expect(HttpAgent).toHaveBeenCalledTimes(1); @@ -79,7 +88,7 @@ describe('AgentManager', () => { }); it('provides the same Agent if URLs use the same protocol', () => { - const agentManager = new AgentManager(); + const agentManager = new AgentManager(logger); const agentFactory = agentManager.getAgentFactory(); const agent1 = agentFactory({ url: new URL('http://elastic-node-1:9200') }); const agent2 = agentFactory({ url: new URL('http://elastic-node-2:9200') }); @@ -92,7 +101,7 @@ describe('AgentManager', () => { }); it('dereferences an agent instance when the agent is closed', () => { - const agentManager = new AgentManager(); + const agentManager = new AgentManager(logger); const agentFactory = agentManager.getAgentFactory(); const agent = agentFactory({ url: new URL('http://elastic-node-1:9200') }); // eslint-disable-next-line dot-notation @@ -105,7 +114,7 @@ describe('AgentManager', () => { describe('two agent factories', () => { it('never provide the same Agent instance even if they use the same type', () => { - const agentManager = new AgentManager(); + const agentManager = new AgentManager(logger); const agentFactory1 = agentManager.getAgentFactory(); const agentFactory2 = agentManager.getAgentFactory(); const agent1 = agentFactory1({ url: new URL('http://elastic-node-1:9200') }); @@ -115,20 +124,34 @@ describe('AgentManager', () => { }); }); - describe('#getAgents()', () => { - it('returns the created HTTP and HTTPs Agent instances', () => { - const agentManager = new AgentManager(); - const agentFactory1 = agentManager.getAgentFactory(); - const agentFactory2 = agentManager.getAgentFactory(); - const agent1 = agentFactory1({ url: new URL('http://elastic-node-1:9200') }); - const agent2 = agentFactory2({ url: new URL('http://elastic-node-1:9200') }); - const agent3 = agentFactory1({ url: new URL('https://elastic-node-1:9200') }); - const agent4 = agentFactory2({ url: new URL('https://elastic-node-1:9200') }); + describe('#getAgentsStats()', () => { + it('returns the stats of the agents', () => { + const agentManager = new AgentManager(logger); + const metrics: ElasticsearchClientsMetrics = { + totalQueuedRequests: 0, + totalIdleSockets: 100, + totalActiveSockets: 400, + }; + getAgentsSocketsStatsMock.mockReturnValue(metrics); + + expect(agentManager.getAgentsStats()).toStrictEqual(metrics); + }); + + it('warns when there are queued requests (requests unassigned to any socket)', () => { + const agentManager = new AgentManager(logger); + const metrics: ElasticsearchClientsMetrics = { + totalQueuedRequests: 2, + totalIdleSockets: 100, // There may be idle sockets when many clients are initialized. It should not be taken as an indicator of health. + totalActiveSockets: 400, + }; + getAgentsSocketsStatsMock.mockReturnValue(metrics); - const agents = agentManager.getAgents(); + expect(agentManager.getAgentsStats()).toStrictEqual(metrics); - expect(agents.size).toEqual(4); - expect([...agents]).toEqual(expect.arrayContaining([agent1, agent2, agent3, agent4])); + expect(logger.warn).toHaveBeenCalledTimes(1); + expect(logger.warn).toHaveBeenCalledWith( + 'There are 2 queued requests. If this number is constantly high, consider scaling Kibana horizontally or increasing "elasticsearch.maxSockets" in the config.' + ); }); }); }); diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.ts index 9f654216bdce8..3e414728b069a 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/agent_manager.ts @@ -9,6 +9,9 @@ import { Agent as HttpAgent, type AgentOptions } from 'http'; import { Agent as HttpsAgent } from 'https'; import type { ConnectionOptions, HttpAgentOptions } from '@elastic/elasticsearch'; +import type { Logger } from '@kbn/logging'; +import type { ElasticsearchClientsMetrics } from '@kbn/core-metrics-server'; +import { getAgentsSocketsStats } from './get_agents_sockets_stats'; const HTTPS = 'https:'; @@ -19,8 +22,14 @@ export interface AgentFactoryProvider { getAgentFactory(agentOptions?: HttpAgentOptions): AgentFactory; } -export interface AgentStore { - getAgents(): Set; +/** + * Exposes the APIs to fetch stats of the existing agents. + */ +export interface AgentStatsProvider { + /** + * Returns the {@link ElasticsearchClientsMetrics}, to understand the load on the Elasticsearch HTTP agents. + */ + getAgentsStats(): ElasticsearchClientsMetrics; } /** @@ -34,10 +43,10 @@ export interface AgentStore { * exposes methods that can modify the underlying pools, effectively impacting the connections of other Clients. * @internal **/ -export class AgentManager implements AgentFactoryProvider, AgentStore { - private agents: Set; +export class AgentManager implements AgentFactoryProvider, AgentStatsProvider { + private readonly agents: Set; - constructor() { + constructor(private readonly logger: Logger) { this.agents = new Set(); } @@ -69,8 +78,16 @@ export class AgentManager implements AgentFactoryProvider, AgentStore { }; } - public getAgents(): Set { - return this.agents; + public getAgentsStats(): ElasticsearchClientsMetrics { + const stats = getAgentsSocketsStats(this.agents); + + if (stats.totalQueuedRequests > 0) { + this.logger.warn( + `There are ${stats.totalQueuedRequests} queued requests. If this number is constantly high, consider scaling Kibana horizontally or increasing "elasticsearch.maxSockets" in the config.` + ); + } + + return stats; } } diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/cluster_client.test.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/cluster_client.test.ts index bcf5011395bf6..b64221b913c62 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/cluster_client.test.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/cluster_client.test.ts @@ -57,7 +57,7 @@ describe('ClusterClient', () => { logger = loggingSystemMock.createLogger(); internalClient = createClient(); scopedClient = createClient(); - agentFactoryProvider = new AgentManager(); + agentFactoryProvider = new AgentManager(logger); authHeaders = httpServiceMock.createAuthHeaderStorage(); authHeaders.get.mockImplementation(() => ({ diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.test.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.test.ts index fe511f46278d9..1784fa7a08662 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.test.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.test.ts @@ -54,7 +54,7 @@ describe('configureClient', () => { config = createFakeConfig(); parseClientOptionsMock.mockReturnValue({}); ClientMock.mockImplementation(() => createFakeClient()); - agentFactoryProvider = new AgentManager(); + agentFactoryProvider = new AgentManager(logger); }); afterEach(() => { diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/src/get_agents_sockets_stats.test.mocks.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/get_agents_sockets_stats.test.mocks.ts similarity index 100% rename from packages/core/metrics/core-metrics-collectors-server-internal/src/get_agents_sockets_stats.test.mocks.ts rename to packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/get_agents_sockets_stats.test.mocks.ts diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/src/get_agents_sockets_stats.test.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/get_agents_sockets_stats.test.ts similarity index 100% rename from packages/core/metrics/core-metrics-collectors-server-internal/src/get_agents_sockets_stats.test.ts rename to packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/get_agents_sockets_stats.test.ts diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/src/get_agents_sockets_stats.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/get_agents_sockets_stats.ts similarity index 95% rename from packages/core/metrics/core-metrics-collectors-server-internal/src/get_agents_sockets_stats.ts rename to packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/get_agents_sockets_stats.ts index e513528c07697..5c8b61cafe7be 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/src/get_agents_sockets_stats.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/get_agents_sockets_stats.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { NetworkAgent } from '@kbn/core-elasticsearch-client-server-internal'; import type { ElasticsearchClientsMetrics } from '@kbn/core-metrics-server'; +import type { NetworkAgent } from './agent_manager'; export const getAgentsSocketsStats = (agents: Set): ElasticsearchClientsMetrics => { const nodes = new Set(); diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/tsconfig.json b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/tsconfig.json index d43e5bcbe630d..2288caa55dea8 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/tsconfig.json +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/tsconfig.json @@ -21,6 +21,7 @@ "@kbn/logging-mocks", "@kbn/core-logging-server-mocks", "@kbn/core-http-server-mocks", + "@kbn/core-metrics-server", ], "exclude": [ "target/**/*", diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/index.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/index.ts index 0b66d449df013..86c9bbe6394fd 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/index.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/index.ts @@ -15,4 +15,4 @@ export type { DeeplyMockedApi, ElasticsearchClientMock, } from './src/mocks'; -export { createAgentStoreMock } from './src/agent_manager.mocks'; +export { createAgentStatsProviderMock } from './src/agent_manager.mocks'; diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/src/agent_manager.mocks.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/src/agent_manager.mocks.ts index 2fd8812b3aae0..2a43142477142 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/src/agent_manager.mocks.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/src/agent_manager.mocks.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import type { AgentStore, NetworkAgent } from '@kbn/core-elasticsearch-client-server-internal'; +import type { AgentStatsProvider } from '@kbn/core-elasticsearch-client-server-internal'; -export const createAgentStoreMock = (agents: Set = new Set()): AgentStore => ({ - getAgents: jest.fn(() => agents), +export const createAgentStatsProviderMock = (): jest.Mocked => ({ + getAgentsStats: jest.fn(), }); diff --git a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.mocks.ts b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.mocks.ts index 68a56ff28bc8d..d04b7dfda2b3e 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.mocks.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.mocks.ts @@ -10,7 +10,7 @@ import type { AgentManager } from '@kbn/core-elasticsearch-client-server-interna export const MockClusterClient = jest.fn(); export const MockAgentManager: jest.MockedClass = jest.fn().mockReturnValue({ - getAgents: jest.fn(), + getAgentsStats: jest.fn(), getAgentFactory: jest.fn(), }); diff --git a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.ts b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.ts index f523cfe8c4a8f..a145da71fab83 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.test.ts @@ -201,9 +201,9 @@ describe('#setup', () => { ); }); - it('returns an AgentStore as part of the contract', async () => { + it('returns an AgentStatsProvider as part of the contract', async () => { const setupContract = await elasticsearchService.setup(setupDeps); - expect(typeof setupContract.agentStore.getAgents).toEqual('function'); + expect(typeof setupContract.agentStatsProvider.getAgentsStats).toEqual('function'); }); it('esNodeVersionCompatibility$ only starts polling when subscribed to', async () => { diff --git a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.ts b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.ts index fddff84293140..c1396daf1aa66 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_service.ts @@ -66,7 +66,7 @@ export class ElasticsearchService this.config$ = coreContext.configService .atPath('elasticsearch') .pipe(map((rawConfig) => new ElasticsearchConfig(rawConfig))); - this.agentManager = new AgentManager(); + this.agentManager = new AgentManager(this.log.get('agent-manager')); } public async preboot(): Promise { @@ -120,7 +120,9 @@ export class ElasticsearchService } this.unauthorizedErrorHandler = handler; }, - agentStore: this.agentManager, + agentStatsProvider: { + getAgentsStats: this.agentManager.getAgentsStats.bind(this.agentManager), + }, }; } diff --git a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/types.ts b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/types.ts index b03b86c7bdd1c..c026b93943df5 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/types.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/types.ts @@ -12,7 +12,7 @@ import type { ElasticsearchServiceStart, ElasticsearchServiceSetup, } from '@kbn/core-elasticsearch-server'; -import type { AgentStore } from '@kbn/core-elasticsearch-client-server-internal'; +import type { AgentStatsProvider } from '@kbn/core-elasticsearch-client-server-internal'; import type { ServiceStatus } from '@kbn/core-status-common'; import type { NodesVersionCompatibility, NodeInfo } from './version_check/ensure_es_version'; import type { ClusterInfo } from './get_cluster_info'; @@ -22,7 +22,7 @@ export type InternalElasticsearchServicePreboot = ElasticsearchServicePreboot; /** @internal */ export interface InternalElasticsearchServiceSetup extends ElasticsearchServiceSetup { - agentStore: AgentStore; + agentStatsProvider: AgentStatsProvider; clusterInfo$: Observable; esNodesCompatibility$: Observable; status$: Observable>; diff --git a/packages/core/elasticsearch/core-elasticsearch-server-mocks/src/elasticsearch_service.mock.ts b/packages/core/elasticsearch/core-elasticsearch-server-mocks/src/elasticsearch_service.mock.ts index 26d81da24318c..4cfb3ecc45c32 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-mocks/src/elasticsearch_service.mock.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server-mocks/src/elasticsearch_service.mock.ts @@ -13,7 +13,7 @@ import { elasticsearchClientMock, type ClusterClientMock, type CustomClusterClientMock, - createAgentStoreMock, + createAgentStatsProviderMock, } from '@kbn/core-elasticsearch-client-server-mocks'; import type { ElasticsearchClientConfig, @@ -95,7 +95,7 @@ const createInternalSetupContractMock = () => { level: ServiceStatusLevels.available, summary: 'Elasticsearch is available', }), - agentStore: createAgentStoreMock(), + agentStatsProvider: createAgentStatsProviderMock(), }; return internalSetupContract; }; diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.test.ts b/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.test.ts index 49b5a4b71da53..5f75edc17235c 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.test.ts +++ b/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.test.ts @@ -6,13 +6,9 @@ * Side Public License, v 1. */ -import { Agent as HttpAgent } from 'http'; -import { Agent as HttpsAgent } from 'https'; import type { ElasticsearchClientsMetrics } from '@kbn/core-metrics-server'; -import { createAgentStoreMock } from '@kbn/core-elasticsearch-client-server-mocks'; -import { getAgentsSocketsStatsMock } from './get_agents_sockets_stats.test.mocks'; +import { createAgentStatsProviderMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { ElasticsearchClientsMetricsCollector } from './elasticsearch_client'; -import { getAgentsSocketsStats } from './get_agents_sockets_stats'; jest.mock('@kbn/core-elasticsearch-client-server-internal'); @@ -24,16 +20,12 @@ export const sampleEsClientMetrics: ElasticsearchClientsMetrics = { describe('ElasticsearchClientsMetricsCollector', () => { test('#collect calls getAgentsSocketsStats with the Agents managed by the provided AgentManager', async () => { - const agents = new Set([new HttpAgent(), new HttpsAgent()]); - const agentStore = createAgentStoreMock(agents); - getAgentsSocketsStatsMock.mockReturnValueOnce(sampleEsClientMetrics); + const agentStatsProvider = createAgentStatsProviderMock(); + agentStatsProvider.getAgentsStats.mockReturnValue(sampleEsClientMetrics); - const esClientsMetricsCollector = new ElasticsearchClientsMetricsCollector(agentStore); + const esClientsMetricsCollector = new ElasticsearchClientsMetricsCollector(agentStatsProvider); const metrics = await esClientsMetricsCollector.collect(); - expect(agentStore.getAgents).toHaveBeenCalledTimes(1); - expect(getAgentsSocketsStats).toHaveBeenCalledTimes(1); - expect(getAgentsSocketsStats).toHaveBeenNthCalledWith(1, agents); expect(metrics).toEqual(sampleEsClientMetrics); }); }); diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.ts b/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.ts index 278fd0218f8c0..bd6a86f23b3ed 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.ts +++ b/packages/core/metrics/core-metrics-collectors-server-internal/src/elasticsearch_client.ts @@ -7,16 +7,15 @@ */ import type { ElasticsearchClientsMetrics, MetricsCollector } from '@kbn/core-metrics-server'; -import type { AgentStore } from '@kbn/core-elasticsearch-client-server-internal'; -import { getAgentsSocketsStats } from './get_agents_sockets_stats'; +import type { AgentStatsProvider } from '@kbn/core-elasticsearch-client-server-internal'; export class ElasticsearchClientsMetricsCollector implements MetricsCollector { - constructor(private readonly agentStore: AgentStore) {} + constructor(private readonly agentStatsProvider: AgentStatsProvider) {} public async collect(): Promise { - return await getAgentsSocketsStats(this.agentStore.getAgents()); + return await this.agentStatsProvider.getAgentsStats(); } public reset() { diff --git a/packages/core/metrics/core-metrics-server-internal/src/metrics_service.test.ts b/packages/core/metrics/core-metrics-server-internal/src/metrics_service.test.ts index b29572eb37624..e129991a3576d 100644 --- a/packages/core/metrics/core-metrics-server-internal/src/metrics_service.test.ts +++ b/packages/core/metrics/core-metrics-server-internal/src/metrics_service.test.ts @@ -52,7 +52,7 @@ describe('MetricsService', () => { expect(OpsMetricsCollector).toHaveBeenCalledTimes(1); expect(OpsMetricsCollector).toHaveBeenCalledWith( httpMock.server, - esServiceMock.agentStore, + esServiceMock.agentStatsProvider, expect.objectContaining({ logger: logger.get('metrics') }) ); diff --git a/packages/core/metrics/core-metrics-server-internal/src/metrics_service.ts b/packages/core/metrics/core-metrics-server-internal/src/metrics_service.ts index 95a9dc09bba57..97a6111e96536 100644 --- a/packages/core/metrics/core-metrics-server-internal/src/metrics_service.ts +++ b/packages/core/metrics/core-metrics-server-internal/src/metrics_service.ts @@ -55,10 +55,14 @@ export class MetricsService this.coreContext.configService.atPath(OPS_CONFIG_PATH) ); - this.metricsCollector = new OpsMetricsCollector(http.server, elasticsearchService.agentStore, { - logger: this.logger, - ...config.cGroupOverrides, - }); + this.metricsCollector = new OpsMetricsCollector( + http.server, + elasticsearchService.agentStatsProvider, + { + logger: this.logger, + ...config.cGroupOverrides, + } + ); await this.refreshMetrics(); diff --git a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.test.ts b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.test.ts index 7c4682e4c24c0..c1920e56ce879 100644 --- a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.test.ts +++ b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.test.ts @@ -29,7 +29,7 @@ describe('OpsMetricsCollector', () => { beforeEach(() => { const hapiServer = httpServiceMock.createInternalSetupContract().server; - const agentManager = new AgentManager(); + const agentManager = new AgentManager(loggerMock.create()); collector = new OpsMetricsCollector(hapiServer, agentManager, { logger: loggerMock.create() }); mockOsCollector.collect.mockResolvedValue('osMetrics'); diff --git a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts index 8a10f4071b11b..2e358fc121bce 100644 --- a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts +++ b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts @@ -8,7 +8,7 @@ import { Server as HapiServer } from '@hapi/hapi'; import type { OpsMetrics, MetricsCollector } from '@kbn/core-metrics-server'; -import type { AgentStore } from '@kbn/core-elasticsearch-client-server-internal'; +import type { AgentStatsProvider } from '@kbn/core-elasticsearch-client-server-internal'; import { ProcessMetricsCollector, OsMetricsCollector, @@ -23,11 +23,15 @@ export class OpsMetricsCollector implements MetricsCollector { private readonly serverCollector: ServerMetricsCollector; private readonly esClientCollector: ElasticsearchClientsMetricsCollector; - constructor(server: HapiServer, agentStore: AgentStore, opsOptions: OpsMetricsCollectorOptions) { + constructor( + server: HapiServer, + agentStatsProvider: AgentStatsProvider, + opsOptions: OpsMetricsCollectorOptions + ) { this.processCollector = new ProcessMetricsCollector(); this.osCollector = new OsMetricsCollector(opsOptions); this.serverCollector = new ServerMetricsCollector(server); - this.esClientCollector = new ElasticsearchClientsMetricsCollector(agentStore); + this.esClientCollector = new ElasticsearchClientsMetricsCollector(agentStatsProvider); } public async collect(): Promise { diff --git a/src/cli_setup/utils.ts b/src/cli_setup/utils.ts index 36c08de4d422a..8f31c9eee03f7 100644 --- a/src/cli_setup/utils.ts +++ b/src/cli_setup/utils.ts @@ -49,7 +49,7 @@ export const elasticsearch = new ElasticsearchService(logger, kibanaPackageJson. logger, type, // we use an independent AgentManager for cli_setup, no need to track performance of this one - agentFactoryProvider: new AgentManager(), + agentFactoryProvider: new AgentManager(logger.get('agent-manager')), kibanaVersion: kibanaPackageJson.version, }); }, diff --git a/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts b/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts index f6760aa3264fc..346271affabf2 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts @@ -233,7 +233,9 @@ const getElasticsearchClient = async ( return configureClient(esClientConfig, { logger: loggerFactory.get('elasticsearch'), type: 'data', - agentFactoryProvider: new AgentManager(), + agentFactoryProvider: new AgentManager( + loggerFactory.get('elasticsearch-service', 'agent-manager') + ), kibanaVersion, }); };