kibana/x-pack/test/apm_api_integration/common/config.ts
Cauê Marcondes fe22ac9928
[Synthtrace] Adding Entities support (#196258)
## known issue
```
- Transforms are not started by synthtrace. 
Because it duplicates data ingested by synthrace on signal indices. And it takes a long time to generate data.

- We are not able to open the Inventory page because of 👆🏻.
```
---

```
node scripts/synthtrace.js traces_logs_entities.ts --clean --live
```
or 
```
node scripts/synthtrace.js traces_logs_entities.ts --clean --from=2024-04-08T08:00:00.000Z --to=2024-04-08T08:15:00.000Z
```

docs produces by the new scenario:
```
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": ".entities.v1.latest.builtin_services_from_ecs_data",
        "_id": "2846700000000001",
        "_score": 1,
        "_source": {
          "service": {
            "name": "synth-node-trace-logs",
            "environment": "Synthtrace: traces_logs_entities"
          },
          "source_data_stream": {
            "type": [
              "traces",
              "logs"
            ]
          },
          "agent": {
            "name": [
              "nodejs"
            ]
          },
          "entity": {
            "id": "2846700000000001",
            "type": "service",
            "definitionId": "latest",
            "lastSeenTimestamp": "2024-10-15T08:56:20.562Z"
          },
          "event": {
            "ingested": "2024-10-15T08:56:20.562Z"
          }
        }
      },
      {
        "_index": ".entities.v1.latest.builtin_services_from_ecs_data",
        "_id": "2846700000000000",
        "_score": 1,
        "_source": {
          "service": {
            "name": "synth-java-trace",
            "environment": "Synthtrace: traces_logs_entities"
          },
          "source_data_stream": {
            "type": [
              "traces"
            ]
          },
          "agent": {
            "name": [
              "java"
            ]
          },
          "entity": {
            "id": "2846700000000000",
            "type": "service",
            "definitionId": "latest",
            "lastSeenTimestamp": "2024-10-15T08:56:20.562Z"
          },
          "event": {
            "ingested": "2024-10-15T08:56:20.562Z"
          }
        }
      },
      {
        "_index": ".entities.v1.latest.builtin_services_from_ecs_data",
        "_id": "2846700000000002",
        "_score": 1,
        "_source": {
          "service": {
            "name": "synth-go-logs",
            "environment": "Synthtrace: traces_logs_entities"
          },
          "source_data_stream": {
            "type": [
              "logs"
            ]
          },
          "agent": {
            "name": [
              "go"
            ]
          },
          "entity": {
            "id": "2846700000000002",
            "type": "service",
            "definitionId": "latest",
            "lastSeenTimestamp": "2024-10-15T08:56:20.562Z"
          },
          "event": {
            "ingested": "2024-10-15T08:56:20.562Z"
          }
        }
      }
    ]
  }
}
```
2024-10-15 16:21:32 +01:00

227 lines
7.9 KiB
TypeScript

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { ApmUsername } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/authentication';
import { createApmUsers } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/create_apm_users';
import {
ApmSynthtraceEsClient,
ApmSynthtraceKibanaClient,
LogsSynthtraceEsClient,
EntitiesSynthtraceEsClient,
createLogger,
LogLevel,
} from '@kbn/apm-synthtrace';
import { FtrConfigProviderContext, kbnTestConfig } from '@kbn/test';
import supertest from 'supertest';
import { format, UrlObject } from 'url';
import { MachineLearningAPIProvider } from '../../functional/services/ml/api';
import { APMFtrConfigName } from '../configs';
import { createApmApiClient } from './apm_api_supertest';
import { getApmSynthtraceEsClient, getApmSynthtraceKibanaClient } from './bootstrap_apm_synthtrace';
import {
FtrProviderContext,
InheritedFtrProviderContext,
InheritedServices,
} from './ftr_provider_context';
import { RegistryProvider } from './registry';
export interface ApmFtrConfig {
name: APMFtrConfigName;
license: 'basic' | 'trial';
kibanaConfig?: Record<string, any>;
}
async function getApmApiClient({
kibanaServer,
username,
}: {
kibanaServer: UrlObject;
username: ApmUsername | 'elastic';
}) {
const url = format({
...kibanaServer,
auth: `${username}:${kbnTestConfig.getUrlParts().password}`,
});
return createApmApiClient(supertest(url));
}
export type CreateTestConfig = ReturnType<typeof createTestConfig>;
export type ApmApiClientKey =
| 'noAccessUser'
| 'readUser'
| 'adminUser'
| 'writeUser'
| 'annotationWriterUser'
| 'noMlAccessUser'
| 'manageOwnAgentKeysUser'
| 'createAndAllAgentKeysUser'
| 'monitorClusterAndIndicesUser'
| 'manageServiceAccount'
| 'apmAllPrivilegesWithoutWriteSettingsUser'
| 'apmReadPrivilegesWithWriteSettingsUser';
export interface UserApiClient {
user: ApmApiClientKey;
}
export type ApmApiClient = Record<ApmApiClientKey, Awaited<ReturnType<typeof getApmApiClient>>>;
export interface CreateTest {
testFiles: string[];
servers: any;
servicesRequiredForTestAnalysis: string[];
services: InheritedServices & {
apmFtrConfig: () => ApmFtrConfig;
registry: ({ getService }: FtrProviderContext) => ReturnType<typeof RegistryProvider>;
logSynthtraceEsClient: (
context: InheritedFtrProviderContext
) => Promise<LogsSynthtraceEsClient>;
synthtraceEsClient: (context: InheritedFtrProviderContext) => Promise<ApmSynthtraceEsClient>;
entitiesSynthtraceEsClient: (
context: InheritedFtrProviderContext
) => Promise<EntitiesSynthtraceEsClient>;
apmSynthtraceEsClient: (context: InheritedFtrProviderContext) => Promise<ApmSynthtraceEsClient>;
synthtraceKibanaClient: (
context: InheritedFtrProviderContext
) => Promise<ApmSynthtraceKibanaClient>;
apmApiClient: (context: InheritedFtrProviderContext) => ApmApiClient;
ml: ({ getService }: FtrProviderContext) => ReturnType<typeof MachineLearningAPIProvider>;
};
junit: { reportName: string };
esTestCluster: any;
kbnTestServer: any;
}
export function createTestConfig(
config: ApmFtrConfig
): ({ readConfigFile }: FtrConfigProviderContext) => Promise<CreateTest> {
const { license, name, kibanaConfig } = config;
return async ({ readConfigFile }: FtrConfigProviderContext) => {
const xPackAPITestsConfig = await readConfigFile(
require.resolve('../../api_integration/config.ts')
);
const services = xPackAPITestsConfig.get('services');
const servers = xPackAPITestsConfig.get('servers');
const kibanaServer = servers.kibana as UrlObject;
const kibanaServerUrl = format(kibanaServer);
const esServer = servers.elasticsearch as UrlObject;
const synthtraceKibanaClient = getApmSynthtraceKibanaClient(kibanaServerUrl);
return {
testFiles: [require.resolve('../tests')],
servers,
servicesRequiredForTestAnalysis: ['apmFtrConfig', 'registry'],
services: {
...services,
apmFtrConfig: () => config,
registry: RegistryProvider,
apmSynthtraceEsClient: (context: InheritedFtrProviderContext) => {
return getApmSynthtraceEsClient(context, synthtraceKibanaClient);
},
logSynthtraceEsClient: (context: InheritedFtrProviderContext) =>
new LogsSynthtraceEsClient({
client: context.getService('es'),
logger: createLogger(LogLevel.info),
refreshAfterIndex: true,
}),
entitiesSynthtraceEsClient: (context: InheritedFtrProviderContext) =>
new EntitiesSynthtraceEsClient({
client: context.getService('es'),
logger: createLogger(LogLevel.info),
refreshAfterIndex: true,
}),
synthtraceKibanaClient: () => synthtraceKibanaClient,
apmApiClient: async (context: InheritedFtrProviderContext) => {
const { username, password } = servers.kibana;
const esUrl = format(esServer);
// Creates APM users
await createApmUsers({
elasticsearch: { node: esUrl, username, password },
kibana: { hostname: kibanaServerUrl },
});
return {
noAccessUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.noAccessUser,
}),
readUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.viewerUser,
}),
adminUser: await getApmApiClient({
kibanaServer,
username: 'elastic',
}),
writeUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.editorUser,
}),
annotationWriterUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmAnnotationsWriteUser,
}),
noMlAccessUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmReadUserWithoutMlAccess,
}),
manageOwnAgentKeysUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmManageOwnAgentKeys,
}),
createAndAllAgentKeysUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmManageOwnAndCreateAgentKeys,
}),
monitorClusterAndIndicesUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmMonitorClusterAndIndices,
}),
manageServiceAccount: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmManageServiceAccount,
}),
apmAllPrivilegesWithoutWriteSettingsUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmAllPrivilegesWithoutWriteSettings,
}),
apmReadPrivilegesWithWriteSettingsUser: await getApmApiClient({
kibanaServer,
username: ApmUsername.apmReadPrivilegesWithWriteSettings,
}),
};
},
ml: MachineLearningAPIProvider,
},
junit: {
reportName: `APM API Integration tests (${name})`,
},
esTestCluster: {
...xPackAPITestsConfig.get('esTestCluster'),
license,
},
kbnTestServer: {
...xPackAPITestsConfig.get('kbnTestServer'),
serverArgs: [
...xPackAPITestsConfig.get('kbnTestServer.serverArgs'),
...(kibanaConfig
? Object.entries(kibanaConfig).map(([key, value]) =>
Array.isArray(value) ? `--${key}=${JSON.stringify(value)}` : `--${key}=${value}`
)
: []),
],
},
};
};
}
export type ApmServices = Awaited<ReturnType<CreateTestConfig>>['services'];