Skip to content

Commit

Permalink
Merge branch 'master' into uptime_a11y-tests
Browse files Browse the repository at this point in the history
  • Loading branch information
justinkambic committed May 7, 2020
2 parents 19c008d + 2903e2f commit af8734f
Show file tree
Hide file tree
Showing 20 changed files with 210 additions and 46 deletions.
10 changes: 8 additions & 2 deletions packages/kbn-dev-utils/src/ci_stats_reporter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ This class integrates with the `ciStats.trackBuild {}` Jenkins Pipeline function

To create an instance of the reporter, import the class and call `CiStatsReporter.fromEnv(log)` (passing it a tooling log).

#### `CiStatsReporter#metric(name: string, subName: string, value: number)`
#### `CiStatsReporter#metrics(metrics: Array<{ group: string, id: string, value: number }>)`

Use this method to record metrics in the Kibana CI Stats service.

Expand All @@ -19,5 +19,11 @@ import { CiStatsReporter, ToolingLog } from '@kbn/dev-utils';

const log = new ToolingLog(...);
const reporter = CiStatsReporter.fromEnv(log)
reporter.metric('Build speed', specificBuildName, timeToRunBuild)
reporter.metrics([
{
group: 'Build size',
id: specificBuildName,
value: sizeOfBuild
}
])
```
19 changes: 9 additions & 10 deletions packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,32 +84,31 @@ export class CiStatsReporter {
return !!this.config;
}

async metric(name: string, subName: string, value: number) {
async metrics(metrics: Array<{ group: string; id: string; value: number }>) {
if (!this.config) {
return;
}

let attempt = 0;
const maxAttempts = 5;
const bodySummary = metrics
.map(({ group, id, value }) => `[${group}/${id}=${value}]`)
.join(' ');

while (true) {
attempt += 1;

try {
await Axios.request({
method: 'POST',
url: '/metric',
url: '/v1/metrics',
baseURL: this.config.apiUrl,
params: {
buildId: this.config.buildId,
},
headers: {
Authorization: `token ${this.config.apiToken}`,
},
data: {
name,
subName,
value,
buildId: this.config.buildId,
metrics,
},
});

Expand All @@ -125,14 +124,14 @@ export class CiStatsReporter {
this.log.warning(
`error recording metric [status=${error.response.status}] [resp=${inspect(
error.response.data
)}] [${name}/${subName}=${value}]`
)}] ${bodySummary}`
);
return;
}

if (attempt === maxAttempts) {
this.log.warning(
`failed to reach kibana-ci-stats service too many times, unable to record metric [${name}/${subName}=${value}]`
`failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}`
);
return;
}
Expand Down
30 changes: 20 additions & 10 deletions packages/kbn-optimizer/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import 'source-map-support/register';

import Path from 'path';

import { run, REPO_ROOT, createFlagError, createFailError, CiStatsReporter } from '@kbn/dev-utils';
import { run, REPO_ROOT, createFlagError, CiStatsReporter } from '@kbn/dev-utils';

import { logOptimizerState } from './log_optimizer_state';
import { OptimizerConfig } from './optimizer';
Expand Down Expand Up @@ -82,9 +82,9 @@ run(
throw createFlagError('expected --scan-dir to be a string');
}

const reportStatsName = flags['report-stats'];
if (reportStatsName !== undefined && typeof reportStatsName !== 'string') {
throw createFlagError('expected --report-stats to be a string');
const reportStats = flags['report-stats'] ?? false;
if (typeof reportStats !== 'boolean') {
throw createFlagError('expected --report-stats to have no value');
}

const config = OptimizerConfig.create({
Expand All @@ -103,22 +103,32 @@ run(

let update$ = runOptimizer(config);

if (reportStatsName) {
if (reportStats) {
const reporter = CiStatsReporter.fromEnv(log);

if (!reporter.isEnabled()) {
throw createFailError('Unable to initialize CiStatsReporter from env');
log.warning('Unable to initialize CiStatsReporter from env');
}

update$ = update$.pipe(reportOptimizerStats(reporter, reportStatsName));
update$ = update$.pipe(reportOptimizerStats(reporter, config));
}

await update$.pipe(logOptimizerState(log, config)).toPromise();
},
{
flags: {
boolean: ['core', 'watch', 'oss', 'examples', 'dist', 'cache', 'profile', 'inspect-workers'],
string: ['workers', 'scan-dir', 'report-stats'],
boolean: [
'core',
'watch',
'oss',
'examples',
'dist',
'cache',
'profile',
'inspect-workers',
'report-stats',
],
string: ['workers', 'scan-dir'],
default: {
core: true,
examples: true,
Expand All @@ -136,7 +146,7 @@ run(
--dist create bundles that are suitable for inclusion in the Kibana distributable
--scan-dir add a directory to the list of directories scanned for plugins (specify as many times as necessary)
--no-inspect-workers when inspecting the parent process, don't inspect the workers
--report-stats=[name] attempt to report stats about this execution of the build to the kibana-ci-stats service using this name
--report-stats attempt to report stats about this execution of the build to the kibana-ci-stats service using this name
`,
},
}
Expand Down
17 changes: 14 additions & 3 deletions packages/kbn-optimizer/src/report_optimizer_stats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ import { materialize, mergeMap, dematerialize } from 'rxjs/operators';
import { CiStatsReporter } from '@kbn/dev-utils';

import { OptimizerUpdate$ } from './run_optimizer';
import { OptimizerState } from './optimizer';
import { OptimizerState, OptimizerConfig } from './optimizer';
import { pipeClosure } from './common';

export function reportOptimizerStats(reporter: CiStatsReporter, name: string) {
export function reportOptimizerStats(reporter: CiStatsReporter, config: OptimizerConfig) {
return pipeClosure((update$: OptimizerUpdate$) => {
let lastState: OptimizerState | undefined;
return update$.pipe(
Expand All @@ -35,7 +35,18 @@ export function reportOptimizerStats(reporter: CiStatsReporter, name: string) {
}

if (n.kind === 'C' && lastState) {
await reporter.metric('@kbn/optimizer build time', name, lastState.durSec);
await reporter.metrics(
config.bundles.map(bundle => {
// make the cache read from the cache file since it was likely updated by the worker
bundle.cache.refresh();

return {
group: `@kbn/optimizer bundle module count`,
id: bundle.id,
value: bundle.cache.getModuleCount() || 0,
};
})
);
}

return n;
Expand Down
19 changes: 9 additions & 10 deletions packages/kbn-pm/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -43933,30 +43933,29 @@ class CiStatsReporter {
isEnabled() {
return !!this.config;
}
async metric(name, subName, value) {
async metrics(metrics) {
var _a, _b, _c, _d;
if (!this.config) {
return;
}
let attempt = 0;
const maxAttempts = 5;
const bodySummary = metrics
.map(({ group, id, value }) => `[${group}/${id}=${value}]`)
.join(' ');
while (true) {
attempt += 1;
try {
await axios_1.default.request({
method: 'POST',
url: '/metric',
url: '/v1/metrics',
baseURL: this.config.apiUrl,
params: {
buildId: this.config.buildId,
},
headers: {
Authorization: `token ${this.config.apiToken}`,
},
data: {
name,
subName,
value,
buildId: this.config.buildId,
metrics,
},
});
return;
Expand All @@ -43968,11 +43967,11 @@ class CiStatsReporter {
}
if (((_b = error) === null || _b === void 0 ? void 0 : _b.response) && error.response.status !== 502) {
// error response from service was received so warn the user and move on
this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] [${name}/${subName}=${value}]`);
this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] ${bodySummary}`);
return;
}
if (attempt === maxAttempts) {
this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric [${name}/${subName}=${value}]`);
this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}`);
return;
}
// we failed to reach the backend and we have remaining attempts, lets retry after a short delay
Expand Down
3 changes: 1 addition & 2 deletions src/dev/build/tasks/build_kibana_platform_plugins.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,10 @@ export const BuildKibanaPlatformPluginsTask = {
});

const reporter = CiStatsReporter.fromEnv(log);
const reportStatsName = build.isOss() ? 'oss distributable' : 'default distributable';

await runOptimizer(optimizerConfig)
.pipe(
reportOptimizerStats(reporter, reportStatsName),
reportOptimizerStats(reporter, optimizerConfig),
logOptimizerState(log, optimizerConfig)
)
.toPromise();
Expand Down
40 changes: 37 additions & 3 deletions src/dev/build/tasks/create_archives_task.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,38 @@
* under the License.
*/

import path from 'path';
import Path from 'path';
import Fs from 'fs';
import { promisify } from 'util';

import { CiStatsReporter } from '@kbn/dev-utils';

import { mkdirp, compress } from '../lib';

const asyncStat = promisify(Fs.stat);

export const CreateArchivesTask = {
description: 'Creating the archives for each platform',

async run(config, log, build) {
const archives = [];

// archive one at a time, parallel causes OOM sometimes
for (const platform of config.getTargetPlatforms()) {
const source = build.resolvePathForPlatform(platform, '.');
const destination = build.getPlatformArchivePath(platform);

log.info('archiving', source, 'to', destination);

await mkdirp(path.dirname(destination));
await mkdirp(Path.dirname(destination));

switch (path.extname(destination)) {
switch (Path.extname(destination)) {
case '.zip':
archives.push({
format: 'zip',
path: destination,
});

await compress(
'zip',
{
Expand All @@ -51,6 +65,11 @@ export const CreateArchivesTask = {
break;

case '.gz':
archives.push({
format: 'tar',
path: destination,
});

await compress(
'tar',
{
Expand All @@ -71,5 +90,20 @@ export const CreateArchivesTask = {
throw new Error(`Unexpected extension for archive destination: ${destination}`);
}
}

const reporter = CiStatsReporter.fromEnv(log);
if (reporter.isEnabled()) {
await reporter.metrics(
await Promise.all(
archives.map(async ({ format, path }) => {
return {
group: `${build.isOss() ? 'oss ' : ''}distributable size`,
id: format,
value: (await asyncStat(path)).size,
};
})
)
);
}
},
};

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ export const CalendarForm = ({
}
checked={isGlobalCalendar}
onChange={onGlobalCalendarChange}
disabled={saving === true || canCreateCalendar === false}
/>

{isGlobalCalendar === false && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
{
"url_name": "Process rate",
"time_range": "1h",
"url_value": "kibana#/dashboard/ml_auditbeat_docker_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))"
"url_value": "kibana#/dashboard/ml_auditbeat_docker_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))"
},
{
"url_name": "Raw data",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
{
"url_name": "Process explorer",
"time_range": "1h",
"url_value": "kibana#/dashboard/ml_auditbeat_docker_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))"
"url_value": "kibana#/dashboard/ml_auditbeat_docker_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))"
},
{
"url_name": "Raw data",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
{
"url_name": "Process rate",
"time_range": "1h",
"url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))"
"url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))"
},
{
"url_name": "Raw data",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
{
"url_name": "Process explorer",
"time_range": "1h",
"url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))"
"url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))"
},
{
"url_name": "Raw data",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"custom_urls": [
{
"url_name": "Raw data",
"url_value": "kibana#/discover?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:ff959d40-b880-11e8-a6d9-e546fe2bba5f,query:(language:kuery,query:\u0027customer_full_name.keyword:\u0022$customer_full_name.keyword$\u0022\u0027),sort:!('@timestamp',desc))"
"url_value": "kibana#/discover?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027ff959d40-b880-11e8-a6d9-e546fe2bba5f\u0027,query:(language:kuery,query:\u0027customer_full_name.keyword:\u0022$customer_full_name.keyword$\u0022\u0027),sort:!('@timestamp',desc))"
},
{
"url_name": "Data dashboard",
Expand Down
Loading

0 comments on commit af8734f

Please sign in to comment.