Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
91293ed
Add get RED metrics tool
viduni94 Dec 24, 2025
e525791
Add API test
viduni94 Dec 24, 2025
54e72cd
Cleanup
viduni94 Dec 24, 2025
8ddb0f7
Remove comment
viduni94 Dec 24, 2025
06e8a96
Add comment
viduni94 Dec 24, 2025
e8d3760
Fix type
viduni94 Dec 24, 2025
b7989f8
Merge branch 'main' into red-metrics-tool
viduni94 Dec 29, 2025
048e060
Update oncechat references to agent builder
viduni94 Dec 29, 2025
dd11e56
Update oncechat references to agent builder
viduni94 Dec 29, 2025
5b996fe
Extend get_services tool to return services from logs and metrics
viduni94 Dec 29, 2025
f1203d1
Update test
viduni94 Dec 29, 2025
1eac6b7
Merge branch 'main' into red-metrics-tool
viduni94 Dec 29, 2025
97bd5d8
Update description of healthStatus param
viduni94 Dec 29, 2025
15469be
Fix
viduni94 Dec 29, 2025
b09a6a1
Cleanup
viduni94 Dec 29, 2025
726063f
Merge branch 'main' into red-metrics-tool
viduni94 Dec 30, 2025
62a223a
Apply dynamic rollup interval
viduni94 Dec 30, 2025
423900d
Return items directly
viduni94 Dec 30, 2025
ccf08f6
Determine document type dynamically
viduni94 Dec 30, 2025
a43586b
Check host and container too
viduni94 Dec 30, 2025
a74cd67
Update document type based on filter, groupby and handle high cardina…
viduni94 Dec 30, 2025
17aad78
Update test
viduni94 Dec 30, 2025
ae1a38b
Updated tool name
viduni94 Dec 30, 2025
e74f9f7
Address comments
viduni94 Dec 31, 2025
c0f1ac0
Address comments
viduni94 Dec 31, 2025
e408c63
Remove source and other fixes
viduni94 Dec 31, 2025
0f27102
Merge branch 'main' into red-metrics-tool
viduni94 Jan 2, 2026
394c42e
Rename filter to KqlFilter
viduni94 Jan 2, 2026
c660e80
Merge branch 'main' into red-metrics-tool
viduni94 Jan 5, 2026
a12d412
Remove custom logic for documentType
viduni94 Jan 5, 2026
72c793f
Move trace_metrics to agent_builder/tools folder
viduni94 Jan 5, 2026
e9331dc
Make getDurationFieldForTransactions call more readable
viduni94 Jan 5, 2026
cb8d54c
Add tests and readme for grouping by kubernetes pod
viduni94 Jan 5, 2026
9eb073a
Resolve conflicts
viduni94 Jan 7, 2026
5bd7bd0
Fix typo
viduni94 Jan 7, 2026
50df151
Merge branch 'main' into red-metrics-tool
arturoliduena Jan 7, 2026
9b0b2d9
Fix empty groupBy and fallback groupBy
viduni94 Jan 7, 2026
d838d00
Make groupBy required
viduni94 Jan 7, 2026
ee5afb7
Add test
viduni94 Jan 7, 2026
83a7bb5
Fix type
viduni94 Jan 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ export * from './tools/get_alerts/apm_errors';
export * from './tools/get_data_sources/data_sources';
export * from './tools/run_log_rate_analysis/log_rate_analysis_spike';
export * from './tools/get_anomaly_detection_jobs/anomalies';
export * from './tools/get_trace_metrics/trace_metrics';
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,19 @@
/**
* SCENARIO: Generated Services
*
* Story: Generates multiple services in different environments (production, staging, development)
* to verify `get_services` tool and its filtering capabilities.
* Story: Generates multiple services from APM and Logs in different environments
* (production, staging, development) to verify `get_services` tool and its filtering capabilities.
*
* APM Services:
* - `checkout-service` (production, nodejs)
* - `payment-service` (production, java) - 50% error rate
* - `frontend` (staging, rum-js)
* - `experimental-service` (development, ruby)
*
* Logs-only Services:
* - `log-processor` (production)
* - `data-ingestion` (staging)
*
* Validate via:
*
* ```
Expand All @@ -32,16 +37,17 @@
* ```
*/

import type { ApmFields, Timerange } from '@kbn/synthtrace-client';
import { apm } from '@kbn/synthtrace-client';
import type { ApmFields, LogDocument, Timerange } from '@kbn/synthtrace-client';
import { apm, log } from '@kbn/synthtrace-client';
import { createCliScenario } from '../../../../lib/utils/create_scenario';
import { withClient, type ScenarioReturnType } from '../../../../lib/utils/with_client';
import type { ApmSynthtraceEsClient } from '../../../../lib/apm/client/apm_synthtrace_es_client';
import type { LogsSynthtraceEsClient } from '../../../../lib/logs/logs_synthtrace_es_client';

/**
* Configuration for a service to generate
* Configuration for an APM service to generate
*/
export interface ServiceConfig {
export interface ApmServiceConfig {
name: string;
environment: string;
agentName: string;
Expand All @@ -51,18 +57,27 @@ export interface ServiceConfig {
errorRate?: number; // 0-1, probability of failure
}

/**
* Configuration for a logs-only service to generate
*/
export interface LogsServiceConfig {
name: string;
environment?: string;
dataset?: string;
}

/**
* Generates APM service data.
* Can be used both by CLI (via default export) and by API tests (via direct import).
*/
export function generateServicesData({
export function generateApmServicesData({
range,
apmEsClient,
services,
}: {
range: Timerange;
apmEsClient: ApmSynthtraceEsClient;
services: ServiceConfig[];
services: ApmServiceConfig[];
}): ScenarioReturnType<ApmFields> {
const data = range
.interval('1m')
Expand All @@ -87,45 +102,94 @@ export function generateServicesData({
return withClient(apmEsClient, data);
}

export default createCliScenario(({ range, clients: { apmEsClient } }) => {
const services: ServiceConfig[] = [
{
name: 'checkout-service',
environment: 'production',
agentName: 'nodejs',
transactionName: 'POST /api/checkout',
transactionType: 'request',
duration: 150,
errorRate: 0,
},
{
name: 'payment-service',
environment: 'production',
agentName: 'java',
transactionName: 'POST /api/pay',
transactionType: 'request',
duration: 200,
errorRate: 0.5, // 50% error rate
},
{
name: 'frontend',
environment: 'staging',
agentName: 'rum-js',
transactionName: 'PAGE_LOAD /home',
transactionType: 'page-load',
duration: 500,
errorRate: 0,
},
{
name: 'experimental-service',
environment: 'development',
agentName: 'ruby',
transactionName: 'GET /test',
transactionType: 'request',
duration: 200,
errorRate: 0,
},
];
/**
* Generates logs data with service.name field.
* Can be used both by CLI (via default export) and by API tests (via direct import).
*/
export function generateLogsServicesData({
range,
logsEsClient,
services,
}: {
range: Timerange;
logsEsClient: LogsSynthtraceEsClient;
services: LogsServiceConfig[];
}): ScenarioReturnType<LogDocument> {
const logGenerators = services.map((serviceConfig) =>
range
.interval('1m')
.rate(5)
.generator((timestamp) =>
log
.create()
.message(`Log message from ${serviceConfig.name}`)
.logLevel('info')
.service(serviceConfig.name)
.dataset(serviceConfig.dataset ?? 'generic')
.defaults({
'service.name': serviceConfig.name,
...(serviceConfig.environment && {
'service.environment': serviceConfig.environment,
}),
})
.timestamp(timestamp)
)
);

return withClient(logsEsClient, logGenerators);
}

export default createCliScenario<ApmFields | LogDocument>(
({ range, clients: { apmEsClient, logsEsClient } }) => {
// APM services
const apmServices: ApmServiceConfig[] = [
{
name: 'checkout-service',
environment: 'production',
agentName: 'nodejs',
transactionName: 'POST /api/checkout',
transactionType: 'request',
duration: 150,
errorRate: 0,
},
{
name: 'payment-service',
environment: 'production',
agentName: 'java',
transactionName: 'POST /api/pay',
transactionType: 'request',
duration: 200,
errorRate: 0.5, // 50% error rate
},
{
name: 'frontend',
environment: 'staging',
agentName: 'rum-js',
transactionName: 'PAGE_LOAD /home',
transactionType: 'page-load',
duration: 500,
errorRate: 0,
},
{
name: 'experimental-service',
environment: 'development',
agentName: 'ruby',
transactionName: 'GET /test',
transactionType: 'request',
duration: 200,
errorRate: 0,
},
];

// Logs-only services
const logsServices: LogsServiceConfig[] = [
{ name: 'log-processor', environment: 'production' },
{ name: 'data-ingestion', environment: 'staging' },
];

const apmData = generateApmServicesData({ range, apmEsClient, services: apmServices });
const logsData = generateLogsServicesData({ range, logsEsClient, services: logsServices });

return generateServicesData({ range, apmEsClient, services });
});
return [apmData, logsData];
}
);
Loading