-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[core.logging] Add ops logs to the KP logging system #88070
Merged
TinaHeiligers
merged 37 commits into
elastic:master
from
TinaHeiligers:logging/ops-metrics
Jan 27, 2021
Merged
Changes from all commits
Commits
Show all changes
37 commits
Select commit
Hold shift + click to select a range
b6bb9fd
POC for KP ops metrics logging
TinaHeiligers b575562
Adds jest integration test for metrics service
TinaHeiligers 7658509
Merge branch 'master' of github.com:elastic/kibana into logging/ops-m…
TinaHeiligers c730814
Adds documentation on KP implementation of ops metrics logs
TinaHeiligers a6e4ad9
Typo
TinaHeiligers 7f7782e
Merge branch 'master' into logging/ops-metrics
kibanamachine 69a0472
Merge branch 'master' into logging/ops-metrics
kibanamachine 874177f
Merge branch 'master' of github.com:elastic/kibana into logging/ops-m…
TinaHeiligers 5fbc957
Updates license headers
TinaHeiligers d3d2740
Uses new logger context and changes to ECS-compatible meta structure
TinaHeiligers 7e481a7
Uses inline snapshots
TinaHeiligers a11e3fb
Add config deprecation for logging.events.ops
TinaHeiligers 093a540
Uses real option for ops metrics deprecation test
TinaHeiligers e0306fa
Disable legacy ops logs when logging.verbose=true
TinaHeiligers 1a59360
Removes unused method
TinaHeiligers 34fe95a
removes unused import
TinaHeiligers 914beff
Updates docs
TinaHeiligers c513554
Merge branch 'master' of github.com:elastic/kibana into logging/ops-m…
TinaHeiligers a4df1eb
reformats message string construction to handle empty message
TinaHeiligers d3e1bda
Moves ecs kind and ecs category fields to event namespace, adds event…
TinaHeiligers 885c3e0
Moves root.shutdown to afterEach, removes unused code
TinaHeiligers e16f886
Moves test for log meta containing ECS fields to a unit test
TinaHeiligers f4eb382
Updates ops format table in the logging README
TinaHeiligers 27e0e0e
Updates metrics_service unit test snapshots
TinaHeiligers a7f737d
Merge branch 'master' into logging/ops-metrics
kibanamachine 8e0c58a
Moves custom fields into meta declaration
TinaHeiligers b9a7879
Deletes metrics_service jest integration test that is already covered…
TinaHeiligers 2e489bf
Type fixes
TinaHeiligers 48cb94c
Moves logger meta ECS type declarations to logging
TinaHeiligers 64b704e
Merge branch 'master' into logging/ops-metrics
kibanamachine f9bcc2d
removes unnecessary log, simplifies test
TinaHeiligers 5e7aad7
simplifies test after removing text log
TinaHeiligers 1714966
Updates logging README, explicitly types event fields
TinaHeiligers 56f267a
minor fix
TinaHeiligers ed5f6bf
Another logging README update
TinaHeiligers 2120a31
Merge branch 'master' into logging/ops-metrics
kibanamachine 91eb1ff
Merge branch 'master' into logging/ops-metrics
kibanamachine File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -103,6 +103,17 @@ const mapManifestServiceUrlDeprecation: ConfigDeprecation = (settings, fromPath, | |
return settings; | ||
}; | ||
|
||
const opsLoggingEventDeprecation: ConfigDeprecation = (settings, fromPath, log) => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I took a similar approach as to #87939 (comment) but am open to other ways of implementing it. |
||
if (has(settings, 'logging.events.ops')) { | ||
log( | ||
'"logging.events.ops" has been deprecated and will be removed ' + | ||
'in 8.0. To access ops data moving forward, please enable debug logs for the ' + | ||
'"metrics.ops" context in your logging configuration.' | ||
); | ||
} | ||
return settings; | ||
}; | ||
|
||
export const coreDeprecationProvider: ConfigDeprecationProvider = ({ rename, unusedFromRoot }) => [ | ||
unusedFromRoot('savedObjects.indexCheckTimeout'), | ||
unusedFromRoot('server.xsrf.token'), | ||
|
@@ -137,4 +148,5 @@ export const coreDeprecationProvider: ConfigDeprecationProvider = ({ rename, unu | |
rewriteBasePathDeprecation, | ||
cspRulesDeprecation, | ||
mapManifestServiceUrlDeprecation, | ||
opsLoggingEventDeprecation, | ||
]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License | ||
* and the Server Side Public License, v 1; you may not use this file except in | ||
* compliance with, at your election, the Elastic License or the Server Side | ||
* Public License, v 1. | ||
*/ | ||
|
||
/** | ||
* Typings for some ECS fields which core uses internally. | ||
* These are not a complete set of ECS typings and should not | ||
* be used externally; the only types included here are ones | ||
* currently used in core. | ||
* | ||
* @internal | ||
*/ | ||
|
||
export interface EcsOpsMetricsEvent { | ||
/** | ||
* These typings were written as of ECS 1.7.0. | ||
* Don't change this value without checking the rest | ||
* of the types to conform to that ECS version. | ||
* | ||
* https://www.elastic.co/guide/en/ecs/1.7/index.html | ||
*/ | ||
ecs: { version: '1.7.0' }; | ||
|
||
// base fields | ||
['@timestamp']?: string; | ||
labels?: Record<string, unknown>; | ||
message?: string; | ||
tags?: string[]; | ||
// other fields | ||
process?: EcsProcessField; | ||
event?: EcsEventField; | ||
} | ||
|
||
interface EcsProcessField { | ||
uptime?: number; | ||
} | ||
|
||
export interface EcsEventField { | ||
kind?: EcsEventKind; | ||
category?: EcsEventCategory[]; | ||
type?: EcsEventType; | ||
} | ||
|
||
export enum EcsEventKind { | ||
ALERT = 'alert', | ||
EVENT = 'event', | ||
METRIC = 'metric', | ||
STATE = 'state', | ||
PIPELINE_ERROR = 'pipeline_error', | ||
SIGNAL = 'signal', | ||
} | ||
|
||
export enum EcsEventCategory { | ||
AUTHENTICATION = 'authentication', | ||
CONFIGURATION = 'configuration', | ||
DATABASE = 'database', | ||
DRIVER = 'driver', | ||
FILE = 'file', | ||
HOST = 'host', | ||
IAM = 'iam', | ||
INTRUSION_DETECTION = 'intrusion_detection', | ||
MALWARE = 'malware', | ||
NETWORK = 'network', | ||
PACKAGE = 'package', | ||
PROCESS = 'process', | ||
WEB = 'web', | ||
} | ||
|
||
export enum EcsEventType { | ||
ACCESS = 'access', | ||
ADMIN = 'admin', | ||
ALLOWED = 'allowed', | ||
CHANGE = 'change', | ||
CONNECTION = 'connection', | ||
CREATION = 'creation', | ||
DELETION = 'deletion', | ||
DENIED = 'denied', | ||
END = 'end', | ||
ERROR = 'error', | ||
GROUP = 'group', | ||
INFO = 'info', | ||
INSTALLATION = 'installation', | ||
PROTOCOL = 'protocol', | ||
START = 'start', | ||
USER = 'user', | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
132 changes: 132 additions & 0 deletions
132
src/core/server/metrics/logging/get_ops_metrics_log.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License | ||
* and the Server Side Public License, v 1; you may not use this file except in | ||
* compliance with, at your election, the Elastic License or the Server Side | ||
* Public License, v 1. | ||
*/ | ||
|
||
import { OpsMetrics } from '..'; | ||
import { getEcsOpsMetricsLog } from './get_ops_metrics_log'; | ||
|
||
function createBaseOpsMetrics(): OpsMetrics { | ||
return { | ||
collected_at: new Date('2020-01-01 01:00:00'), | ||
process: { | ||
memory: { | ||
heap: { total_in_bytes: 1, used_in_bytes: 1, size_limit: 1 }, | ||
resident_set_size_in_bytes: 1, | ||
}, | ||
event_loop_delay: 1, | ||
pid: 1, | ||
uptime_in_millis: 1, | ||
}, | ||
os: { | ||
platform: 'darwin' as const, | ||
platformRelease: 'test', | ||
load: { '1m': 1, '5m': 1, '15m': 1 }, | ||
memory: { total_in_bytes: 1, free_in_bytes: 1, used_in_bytes: 1 }, | ||
uptime_in_millis: 1, | ||
}, | ||
response_times: { avg_in_millis: 1, max_in_millis: 1 }, | ||
requests: { disconnects: 1, total: 1, statusCodes: { '200': 1 } }, | ||
concurrent_connections: 1, | ||
}; | ||
} | ||
|
||
function createMockOpsMetrics(testMetrics: Partial<OpsMetrics>): OpsMetrics { | ||
const base = createBaseOpsMetrics(); | ||
return { | ||
...base, | ||
...testMetrics, | ||
}; | ||
} | ||
const testMetrics = ({ | ||
process: { | ||
memory: { heap: { used_in_bytes: 100 } }, | ||
uptime_in_millis: 1500, | ||
event_loop_delay: 50, | ||
}, | ||
os: { | ||
load: { | ||
'1m': 10, | ||
'5m': 20, | ||
'15m': 30, | ||
}, | ||
}, | ||
} as unknown) as Partial<OpsMetrics>; | ||
|
||
describe('getEcsOpsMetricsLog', () => { | ||
it('provides correctly formatted message', () => { | ||
const result = getEcsOpsMetricsLog(createMockOpsMetrics(testMetrics)); | ||
expect(result.message).toMatchInlineSnapshot( | ||
`"memory: 100.0B uptime: 0:00:01 load: [10.00,20.00,30.00] delay: 50.000"` | ||
); | ||
}); | ||
|
||
it('correctly formats process uptime', () => { | ||
const logMeta = getEcsOpsMetricsLog(createMockOpsMetrics(testMetrics)); | ||
expect(logMeta.process!.uptime).toEqual(1); | ||
}); | ||
|
||
it('excludes values from the message if unavailable', () => { | ||
const baseMetrics = createBaseOpsMetrics(); | ||
const missingMetrics = ({ | ||
...baseMetrics, | ||
process: {}, | ||
os: {}, | ||
} as unknown) as OpsMetrics; | ||
const logMeta = getEcsOpsMetricsLog(missingMetrics); | ||
expect(logMeta.message).toMatchInlineSnapshot(`""`); | ||
}); | ||
|
||
it('specifies correct ECS version', () => { | ||
const logMeta = getEcsOpsMetricsLog(createBaseOpsMetrics()); | ||
expect(logMeta.ecs.version).toBe('1.7.0'); | ||
}); | ||
|
||
it('provides an ECS-compatible response', () => { | ||
const logMeta = getEcsOpsMetricsLog(createBaseOpsMetrics()); | ||
expect(logMeta).toMatchInlineSnapshot(` | ||
Object { | ||
"ecs": Object { | ||
"version": "1.7.0", | ||
}, | ||
"event": Object { | ||
"category": Array [ | ||
"process", | ||
"host", | ||
], | ||
"kind": "metric", | ||
"type": "info", | ||
}, | ||
"host": Object { | ||
"os": Object { | ||
"load": Object { | ||
"15m": 1, | ||
"1m": 1, | ||
"5m": 1, | ||
}, | ||
}, | ||
}, | ||
"message": "memory: 1.0B load: [1.00,1.00,1.00] delay: 1.000", | ||
"process": Object { | ||
"eventLoopDelay": 1, | ||
"memory": Object { | ||
"heap": Object { | ||
"usedInBytes": 1, | ||
}, | ||
}, | ||
"uptime": 0, | ||
}, | ||
} | ||
`); | ||
}); | ||
|
||
it('logs ECS fields in the log meta', () => { | ||
const logMeta = getEcsOpsMetricsLog(createBaseOpsMetrics()); | ||
expect(logMeta.event!.kind).toBe('metric'); | ||
expect(logMeta.event!.category).toEqual(expect.arrayContaining(['process', 'host'])); | ||
expect(logMeta.event!.type).toBe('info'); | ||
}); | ||
}); |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Inspired by #87939
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Makes sense, assuming we for sure want to move forward with changing this behavior (I flagged this in my PR to be safe).